功能
共用的 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 接受和 claude mcp add-json 相同的 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 只用profile.TopLevelValue掃描器讀取其中的mcpServers值,在啟動流程中絕不解析整個檔案。~/.local/state/ccam/mcp/<name>/:seen檔案、sync-stamp和.claude.json的備份。
有兩種策略,由 ~/.config/ccam/config.toml 中的 mcp_strategy 設定。預設是 flag 策略:
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以 Claude Code 取代 ccam。
路徑以單一參數 --mcp-config=<path> 傳入,而不是兩個參數。Claude Code 的 --mcp-config 接受多個值,所以 claude --mcp-config a.json "prompt" 會把提示詞當成第二個設定檔讀取,並以 MCP config file not found 失敗。單一參數的寫法會在那裡結束,後面接的提示詞或 mcp list 這類子指令都能正常運作。Claude Code 會在帳號自己的伺服器之外再載入 --mcp-config 的伺服器;名稱衝突時,.claude.json 中的項目優先。flag 策略絕不寫入 .claude.json。
在工作階段中用 claude mcp add 新增的伺服器只會存到該帳號的 .claude.json。當下 ccam 看不到它,因為 Claude Code 已經取代了 ccam,所以它會在下次啟動時檢查。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 自己的鎖,也就是檔案旁邊以
mkdir建立的資料夾.claude.json.lock。它最多等待 2 秒,並和 Claude Code 的鎖函式庫一樣,把超過 10 秒的鎖視為已失效。 - 它把目前的
.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): …,並照常啟動。關於工作階段中新增伺服器的提示只屬於 flag 策略。
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登入一次,或用ccam migrate從~/.claude複製這些登入。群組絕不會取得登入檔案。 - 正在執行的帳號。
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這類名稱會被拒絕。