Recursos
Servidores MCP compartilhados
Esta página foi traduzida automaticamente do inglês. Correções são bem-vindas. Editar esta página no GitHub
O Claude Code mantém os servidores MCP de usuário no .claude.json, o mesmo arquivo que guarda o login da conta, então esse arquivo não pode ser compartilhado entre contas. O ccam mantém os servidores compartilhados em um arquivo de grupo, mcp.json, e o entrega a todas as contas do grupo na inicialização. Use ccam mcp para adicionar um servidor uma única vez para todas as suas contas, e ccam mcp import para levar às outras um servidor que você adicionou dentro de uma sessão.
Uso
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 ghUma alteração vale a partir da próxima inicialização de cada conta; as sessões em execução mantêm os servidores com que começaram:
$ 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: pgAdicionar um nome que o grupo já tem substitui a definição dele e imprime updated em vez de added. Os servidores só chegam a uma conta se ela compartilha MCP com esse grupo (ccam share <name> --mcp on); quando nenhuma conta compartilha MCP ainda, o add avisa.
Opções
| Opção | O que faz | Padrão |
|---|---|---|
-g, --group <group> |
grupo de destino de add, add-json e remove |
o único grupo pelo qual alguma conta compartilha MCP; caso contrário, default |
-- <command> [args…] (add) |
executa este comando como um servidor stdio | |
--url <url> (add) |
URL de um servidor remoto (http/sse) | |
--transport <stdio|http|sse> (add) |
transporte de um servidor --url |
http |
--header <'Name: value'> (add) |
cabeçalho HTTP; pode ser repetida | nenhum |
-e, --env <KEY=VALUE> (add) |
variável de ambiente de um servidor stdio; pode ser repetida | nenhuma |
--force (import) |
substitui um servidor do grupo com o mesmo nome que seja diferente; o mcp.json antigo ganha backup |
desativado |
--keep-local (import) |
mantém as entradas no .claude.json da conta |
desativado |
-h, --help |
ajuda de cada comando | |
--dry-run (global) |
respeitado apenas por mcp list; add, add-json, remove e import o recusam e não alteram nada |
desativado |
add precisa de um comando depois de -- ou de --url; caso contrário, falha com a command to run (after --) or --url is required. --header vale para servidores --url, e --env para servidores de comando. add-json aceita o mesmo JSON que claude mcp add-json, e a definição precisa ser um objeto com command ou url. import sempre usa o grupo pelo qual a conta compartilha MCP, e list mostra todos os grupos, então -g não os altera.
Como funciona
Os arquivos envolvidos:
~/.local/share/ccam/groups/<group>/mcp.json: os servidores compartilhados,{"mcpServers": {…}}, o formato que--mcp-configlê. Ele é gravado comfsutil.AtomicWritee modo0600, porque as entradas de servidores costumam conter chaves de API.~/.local/share/ccam/profiles/<name>/.claude.json: o arquivo do próprio Claude Code com os servidores da conta. O ccam lê só o valormcpServerscom o scannerprofile.TopLevelValuee nunca analisa o arquivo inteiro no caminho de inicialização.~/.local/state/ccam/mcp/<name>/: o arquivoseen, osync-stampe os backups do.claude.json.
Há duas estratégias, definidas por mcp_strategy em ~/.config/ccam/config.toml. A padrão é a estratégia flag:
launcher.applyMCPencontra o grupo de MCP da conta.mcp.FlagArgsverifica com um únicostatque omcp.jsondo grupo existe, sem analisá-lo.Plan.InsertArgscoloca--mcp-config=<path>logo depois declaude, antes dos seus próprios argumentos, então as suas opções--mcp-configou--strict-mcp-configcontinuam valendo por cima.mcp.NewLocalverifica se o.claude.jsonda conta mudou desde a última inicialização e só então analisa os servidores dele.syscall.Execsubstitui o ccam pelo Claude Code.
O caminho é passado como um único argumento, --mcp-config=<path>, e não como dois. O --mcp-config do Claude Code aceita vários valores, então claude --mcp-config a.json "prompt" leria o prompt como um segundo arquivo de configuração e falharia com MCP config file not found. A forma de um argumento termina ali, e um prompt ou um subcomando como mcp list que venha em seguida funciona. O Claude Code carrega os servidores de --mcp-config além dos da própria conta; em um conflito de nomes, vale a entrada do .claude.json. A estratégia flag só grava no .claude.json para o Remote Control.
claude remote-control (rc) não aceita --mcp-config, e as sessões dele leem os servidores só do .claude.json. Para ccam work rc, o ccam deixa a opção de fora e, em um terminal, pergunta se deve copiar os servidores do grupo para o .claude.json, com um backup, como a estratégia sync faz. Ele pergunta até existir uma cópia e, depois, só quando o mcp.json do grupo mudar (Remote Control). Como essa cópia prevalece sobre --mcp-config em um conflito de nomes, ccam mcp add, add-json, remove e import atualizam as cópias que outras contas do grupo têm:
$ ccam mcp add ctx --url https://mcp.context7.com/mcp
✓ ctx added in group default — applies from the next launch
✓ Updated the copy in account side's .claude.json (made for Remote Control)Um servidor adicionado dentro de uma sessão com claude mcp add vai apenas para o .claude.json dessa conta. O ccam não consegue vê-lo nesse momento, porque o Claude Code o substituiu, então ele verifica na próxima inicialização. O arquivo seen guarda o horário de modificação do .claude.json e os nomes de servidores já informados. Quando o horário é diferente, o ccam compara os nomes com o grupo e imprime uma dica para cada servidor novo, uma única vez, sem esperar entrada:
ccam: MCP servers only account work has: pg
To share them with other accounts: ccam mcp import work pgCom mcp_strategy = "sync", os servidores aparecem em claude mcp list e em /mcp como servidores comuns de usuário, e o ccam os grava no .claude.json de cada conta antes da inicialização:
mcp.Synccompara o horário de modificação domcp.jsondo grupo com osync-stamp. Se ele não mudou, o.claude.jsonda conta nem é aberto.- Ele obtém o bloqueio do próprio Claude Code, a pasta
.claude.json.lockao lado do arquivo, criada commkdir. Ele espera até 2 segundos e considera abandonado um bloqueio com mais de 10 segundos, como faz a biblioteca de bloqueio do Claude Code. - Ele salva o
.claude.jsonatual embackups/na pasta de estado e mantém os 5 mais recentes. - Ele define cada servidor do grupo em
mcpServers, remove os servidores que gravou antes e que o grupo não tem mais, mantém os servidores próprios da conta e grava o arquivo de forma atômica, com o modo original. - Ele registra o novo carimbo e os nomes que gerencia, e o Claude Code inicia sem
--mcp-config.
A sincronização é pulada, com ccam: account work is already running, skipping MCP sync, quando uma sessão da conta está em execução, porque o Claude Code reescreve o .claude.json enquanto roda. Uma sincronização que falha imprime ccam: MCP sync failed (launching anyway): … e inicia mesmo assim. A dica sobre servidores adicionados dentro de uma sessão existe só na estratégia flag.
ccam mcp import move os servidores próprios de uma conta para o grupo dela:
O ccam lê os servidores da conta com mcp.LocalServers e compara cada um com o servidor de mesmo nome do grupo usando mcp.SameDef, que ignora a ordem das chaves e os espaços. Um servidor que o grupo não tem, ou que tem com a mesma definição, é copiado. Um diferente é ignorado, porque a definição do grupo é a que todas as outras contas usam:
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)Com --force, o servidor do grupo é substituído, e o mcp.json anterior é salvo antes em .ccam-backup/<time>/mcp.json dentro da pasta do grupo. Depois, mcp.RemoveLocal remove as entradas copiadas do .claude.json da conta, com o mesmo bloqueio e depois de um backup na pasta de estado. Isso é necessário porque, em um conflito de nomes, a entrada da conta prevaleceria sobre a do grupo. --keep-local as mantém.
Segurança e casos especiais
- Logins. Servidores que fazem login com OAuth guardam os tokens no
.credentials.jsonde cada conta (mcpOAuth), não na lista de servidores, então compartilhar um servidor não compartilha o login dele. Entre uma vez em cada conta com/mcpou copie os logins do~/.claudecomccam migrate. O grupo nunca recebe um arquivo de login. - Contas em execução.
importcopia para o grupo, mas mantém as entradas próprias de uma conta em execução e avisa; execute-o de novo depois que a sessão terminar. A sincronização pula as contas em execução. - Cópias para o Remote Control. A cópia de uma conta em execução não é alterada:
Note: account side is running, so the copy in its .claude.json stays as it was until its next Remote Control launch.Commcp_strategy = "sync", nada precisa ser atualizado, porque cada inicialização sincroniza. - Arquivos corrompidos. Se o
.claude.jsonnão for um JSON válido, a sincronização não mexe nele e informa o erro. Se o bloqueio não puder ser obtido em 2 segundos, o ccam informacould not lock … (Claude Code is writing the file). - Contas que não compartilham MCP.
importse recusa e pede que você executeccam share side --mcp onantes. - Nomes de grupos.
-gaceita apenas um nome de grupo; ele vira uma pasta emgroups/, então nomes como../xsão recusados.