這份報告整理了目前對你環境的分析結果,目標是解決:Claude Code 多個 session 反覆啟動相同 MCP server,造成記憶體與程序數量膨脹。報告同時納入你關心的部署現實:是否一定要 Docker、是否會打架、如果隔離部署,MCP 服務應該如何整合。
目前你的 Claude Code 工作模式會同時保留多個 session,而每個 session 都會依照 .claude.json 中的 mcpServers 設定,各自啟動一份 stdio MCP server。這不是單一 bug,而是目前 stdio transport 的自然結果。
grok-search、DrissionPageMCP、contextweaver)會被重複啟動多份。grok-search 與 DrissionPageMCP 子程序樹。| 服務類型 | 程序數 | 約略 RSS | 解讀 |
|---|---|---|---|
| grok-search MCP server | 22 | 約 1347.9 MiB | 查詢型服務,最適合先做共享化。 |
| DrissionPage MCP server | 22 | 約 800.9 MiB | 狀態型服務,最容易打架,不適合先粗暴共享。 |
| contextweaver mcp | 7 | 約 684.8 MiB | 讀多寫少,適合 daemon 化共用。 |
| gemini-image-generator MCP server | 7 | 約 592.5 MiB | 可共享,但要有併發與輸出隔離。 |
| github-pages MCP server | 7 | 約 354.5 MiB | 不是最大 RAM 熱點,但有外部副作用。 |
| Codex session trees | 2 個活躍 session | 約 809.1 MiB | 每個 Codex session 也會各自帶起自己的 MCP 子程序樹,與 Claude 的問題在結構上相同,但目前規模較小。 |
809.1 MiB RSS,並且每個 session 都會各自帶起 grok-search 與 DrissionPageMCP 子程序。因此這不是 Claude 專屬現象,而是多個 agent/CLI 對 stdio MCP 的共同模式。Claude Session ── stdio ──> light proxy ──> local MCP fabric/router ──> shared backend
這個 shared backend 可以:
因此正確的設計不是「所有 MCP 都放 Docker」,而是:
Claude Sessions
│
▼
lightweight MCP proxies (host)
│
▼
Local MCP Fabric / Router (host-native daemon)
│
├── Host-native services
│ ├── contextweaver-daemon
│ ├── github-pages-daemon
│ └── drission-orchestrator
│
└── Optional containers
├── grok-search-daemon
└── gemini-image-daemon
| MCP | 建議位置 | 原因 | 是否先容器化 |
|---|---|---|---|
contextweaver | Host | 要讀本機 repo,路徑與權限在主機上最自然。 | 否 |
github-pages | Host | 依賴本機 gh/git 認證環境。 | 否 |
DrissionPageMCP | Host | 依賴本機瀏覽器、GUI、debug port、下載路徑。 | 否,且不建議早期容器化 |
grok-search | Host 或 Docker | 查詢型、弱狀態、最容易做 singleton。 | 可考慮 |
gemini-image-generator | Host 或 Docker | 可共享,但要控制輸出與併發。 | 可考慮 |
你提出的顧慮是正確的:如果全 Docker 化,就會帶來每個服務都要額外部署、維護與整合的成本。雖然那不是每個 Claude session 都部署一次,但仍然是每個 backend 一份部署責任。
DrissionPageMCP 類型服務與本機瀏覽器整合困難。grok-search、gemini-image-generator)選擇性容器化。這裡的關鍵不是讓 Claude 直接碰容器,而是讓 Claude 仍然只碰 stdio proxy。
Claude Code -> stdio proxy -> host router/fabric -> containerized backend
有,而且在結構上與 Claude 的現象一致,只是目前規模較小。
| 項目 | 觀察結果 |
|---|---|
| 活躍 Codex session | 2 個 |
| Codex session tree 總 RSS | 約 809.1 MiB |
| Session A tree | 約 318.8 MiB,包含 codex + grok-search + DrissionPageMCP |
| Session B tree | 約 490.3 MiB,包含 codex + grok-search + DrissionPageMCP |
| 結論 | Codex 也存在 per-session 啟動 MCP 子程序的模式,因此未來若要平台化,不應只解 Claude,也應把 Codex 納入同一個 local MCP fabric 設計。 |
| 面向 | safx/Wrap-MCP | ragieai/mcp-gateway |
|---|---|---|
| 核心定位 | 透明 MCP proxy | Ragie 專用多租戶 gateway |
| 與你問題的貼合度 | 高 | 低 |
| 對 stdio MCP 的理解 | 直接相關 | 不是主要場景 |
| 對 singleton/shared backend 的啟發 | 高 | 中 |
| Docker / service 化參考 | 一般 | 較完整 |
| 是否適合直接作為你的主方案 | 較適合 | 不適合 |
grok-searchcontextweaver這類通常可以共享 singleton backend,只要做好 request routing 與 rate limit。
gemini-image-generatorgithub-pages這類要加:
DrissionPageMCP這類不要直接共享同一個 browser/tab。應改成:
drission-proxy -> drission-orchestrator -> worker pool -> per-session browser contexts
grok-search-proxy、contextweaver-proxygrok-search、contextweaver 改成 host-native daemongemini-image-generator 與 github-pagesdrission-orchestratorgrok-search 或 gemini-image-generator 真有依賴治理需求,再搬進 Dockergrok-search:最適合共享,收益高,風險低。contextweaver:讀多寫少,適合 daemon 化。gemini-image-generator:需做併發限制。DrissionPageMCP:一定要做 orchestrator,而不是單例共用瀏覽器。你要解的不是「要不要 Docker」,而是「如何把 per-session MCP 啟動改成 shared backend」。
最務實的路線不是全 Docker,也不是維持現狀,而是: