Можливості
Спільні сервери MCP
Цю сторінку перекладено з англійської машинним способом. Виправлення вітаються. Редагувати цю сторінку на GitHub
Claude Code зберігає користувацькі сервери MCP у .claude.json, тому самому файлі, що містить вхід облікового запису, тож цей файл не можна спільно використовувати між обліковими записами. ccam зберігає спільні сервери у файлі групи, mcp.json, і передає його кожному обліковому запису групи під час запуску. Використовуйте ccam mcp, щоб один раз додати сервер для всіх своїх облікових записів, і ccam mcp import, щоб перенести до інших сервер, який ви додали в межах одного сеансу.
Використання
ccam mcp add fs -- npx -y @modelcontextprotocol/server-filesystem ~/code # a local (stdio) server
ccam mcp add ctx --url https://mcp.context7.com/mcp --header 'Authorization: Bearer …'
ccam mcp add docs --url https://example.com/sse --transport sse
ccam mcp add db -e PGHOST=localhost -- pg-mcp # with an environment variable
ccam mcp add-json gh '{"type":"http","url":"https://api.githubcopilot.com/mcp/"}'
ccam mcp add tools -g team -- tools-mcp # into the group team
ccam mcp list # every group, and servers only one account has
ccam mcp remove ctx
ccam mcp import work # move work's own servers into its group
ccam mcp import work gh --force # replace the group's different ghЗміна застосовується з наступного запуску кожного облікового запису; запущені сеанси зберігають сервери, з якими вони стартували:
$ ccam mcp add fs -- npx -y @modelcontextprotocol/server-filesystem ~/code
✓ fs added in group default — applies from the next launch
$ ccam mcp list
group default (work, side)
ctx http https://mcp.context7.com/mcp
fs stdio npx -y @modelcontextprotocol/server-filesystem /home/me/code
only in account work: pgДодавання назви, яка вже є в групі, замінює її визначення й виводить updated замість added. Сервери потрапляють до облікового запису, лише якщо він спільно використовує MCP із цією групою (ccam share <name> --mcp on); коли жоден обліковий запис ще не використовує MCP спільно, add про це повідомляє.
Параметри
| Параметр | Дія | За замовчуванням |
|---|---|---|
-g, --group <group> |
цільова група для add, add-json і remove |
єдина група, через яку якийсь обліковий запис спільно використовує MCP, інакше default |
-- <command> [args…] (add) |
запускати цю команду як сервер stdio | |
--url <url> (add) |
URL віддаленого сервера (http/sse) | |
--transport <stdio|http|sse> (add) |
транспорт сервера з --url |
http |
--header <'Name: value'> (add) |
заголовок HTTP, можна повторювати | немає |
-e, --env <KEY=VALUE> (add) |
змінна середовища для сервера stdio, можна повторювати | немає |
--force (import) |
замінити відмінний сервер групи з тією самою назвою; для старого mcp.json створюється резервна копія |
вимкнено |
--keep-local (import) |
залишити записи в .claude.json облікового запису |
вимкнено |
-h, --help |
довідка для кожної команди | |
--dry-run (глобальний) |
враховується лише mcp list; add, add-json, remove і import відхиляють його й нічого не змінюють |
вимкнено |
add потребує або команди після --, або --url; інакше він завершується помилкою a command to run (after --) or --url is required. --header стосується серверів із --url, а --env — серверів із командою. add-json приймає той самий JSON, що й claude mcp add-json, і визначення має бути об'єктом із command або url. import завжди використовує групу, через яку обліковий запис спільно використовує MCP, а list показує всі групи, тож -g на них не впливає.
Як це працює
Задіяні файли:
~/.local/share/ccam/groups/<group>/mcp.json: спільні сервери,{"mcpServers": {…}}, формат, який читає--mcp-config. Він записується черезfsutil.AtomicWriteз режимом0600, бо записи серверів часто містять ключі API.~/.local/share/ccam/profiles/<name>/.claude.json: власний файл Claude Code із серверами облікового запису. ccam читає лише його значенняmcpServersза допомогою сканераprofile.TopLevelValueі ніколи не розбирає весь файл на шляху запуску.~/.local/state/ccam/mcp/<name>/: файлseen,sync-stampі резервні копії.claude.json.
Є дві стратегії, які задає mcp_strategy у ~/.config/ccam/config.toml. За замовчуванням діє стратегія прапорця:
launcher.applyMCPзнаходить групу MCP облікового запису.mcp.FlagArgsодним викликомstatперевіряє, щоmcp.jsonгрупи існує, не розбираючи його.Plan.InsertArgsставить--mcp-config=<path>одразу післяclaude, перед вашими аргументами, тож ваші власні--mcp-configчи--strict-mcp-configусе одно застосовуються поверх нього.mcp.NewLocalперевіряє, чи змінився.claude.jsonоблікового запису після останнього запуску, і лише тоді розбирає його сервери.syscall.Execзамінює ccam на Claude Code.
Шлях передається одним аргументом, --mcp-config=<path>, а не двома. --mcp-config у Claude Code приймає кілька значень, тож claude --mcp-config a.json "prompt" прочитав би запит як другий файл конфігурації й завершився б помилкою MCP config file not found. Форма з одним аргументом на цьому зупиняється, і запит чи підкоманда, як-от mcp list, що йде далі, працює. Claude Code завантажує сервери з --mcp-config додатково до власних серверів облікового запису; у разі збігу назв перемагає запис у .claude.json. Стратегія прапорця ніколи не записує .claude.json.
Сервер, доданий у сеансі через claude mcp add, потрапляє лише до .claude.json цього облікового запису. ccam не може побачити його в цей момент, бо Claude Code його замінив, тому перевіряє під час наступного запуску. Файл seen містить час зміни .claude.json і назви серверів, про які вже повідомлено. Коли час відрізняється, ccam порівнює назви з групою й один раз виводить підказку для кожного нового сервера, не чекаючи введення:
ccam: MCP servers only account work has: pg
To share them with other accounts: ccam mcp import work pgЗ mcp_strategy = "sync" сервери з'являються в claude mcp list і /mcp як звичайні користувацькі сервери, а ccam перед запуском записує їх у .claude.json кожного облікового запису:
mcp.Syncпорівнює час зміниmcp.jsonгрупи зsync-stamp. Якщо він не змінився,.claude.jsonоблікового запису не відкривається.- Він бере власне блокування Claude Code, теку
.claude.json.lockпоруч із файлом, створену черезmkdir. Він чекає до 2 секунд і вважає блокування, старіше за 10 секунд, застарілим, як це робить бібліотека блокувань Claude Code. - Він зберігає поточний
.claude.jsonдоbackups/у теці стану й залишає 5 найновіших копій. - Він задає кожен сервер групи в
mcpServers, видаляє сервери, які записав раніше і яких у групі вже немає, зберігає власні сервери облікового запису й атомарно записує файл з його початковим режимом. - Він записує нову позначку часу й назви, якими керує, і Claude Code запускається без
--mcp-config.
Синхронізація пропускається з повідомленням ccam: account work is already running, skipping MCP sync, коли сеанс облікового запису запущено, бо Claude Code переписує .claude.json, поки працює. Невдала синхронізація виводить ccam: MCP sync failed (launching anyway): … і все одно виконує запуск. Підказка про сервери, додані в сеансі, є лише в стратегії прапорця.
ccam mcp import переміщує власні сервери облікового запису до його групи:
ccam читає сервери облікового запису через mcp.LocalServers і порівнює кожен із сервером групи з тією самою назвою за допомогою mcp.SameDef, яка ігнорує порядок ключів і пробіли. Сервер, якого в групі немає або який має там те саме визначення, копіюється. Відмінний сервер пропускається, бо визначення групи використовують усі інші облікові записи:
Skipped gh: group default already has a different gh (`ccam mcp import work gh --force` replaces it)
✓ Copied to group default: pg
✓ Removed account work's own entries (.claude.json backed up)З --force сервер групи замінюється, а попередній mcp.json спершу зберігається до .ccam-backup/<time>/mcp.json усередині теки групи. Потім mcp.RemoveLocal видаляє скопійовані записи з .claude.json облікового запису під тим самим блокуванням і після створення резервної копії в теці стану. Це потрібно, бо в разі збігу назв запис облікового запису переміг би запис групи. --keep-local їх залишає.
Безпека та граничні випадки
- Входи. Сервери, що виконують вхід через OAuth, зберігають свої токени в
.credentials.jsonкожного облікового запису (mcpOAuth), а не в списку серверів, тож спільне використання сервера не робить спільним його вхід. Увійдіть один раз у кожному обліковому записі через/mcpабо скопіюйте входи з~/.claudeза допомогоюccam migrate. Група ніколи не отримує файлу входу. - Запущені облікові записи.
importкопіює до групи, але залишає власні записи запущеного облікового запису й повідомляє про це; виконайте його знову після завершення сеансу. Синхронізація пропускає запущені облікові записи. - Пошкоджені файли. Якщо
.claude.jsonне є дійсним JSON, синхронізація не чіпає його й повідомляє про помилку. Якщо взяти блокування за 2 секунди не вдається, ccam повідомляєcould not lock … (Claude Code is writing the file). - Облікові записи, які не використовують MCP спільно.
importвідмовляє й радить спершу виконатиccam share side --mcp on. - Назви груп.
-gприймає лише назву групи; вона стає текою вgroups/, тож назви на кшталт../xвідхиляються.