← 文章

別讓 MCP 吃掉你 Agent 的 Context

· 12 min read · 245 次閱讀
五層架構 MCP CLI Context 管理 AI 工具鏈
架構決策記錄

別讓 MCP 吃掉

你 Agent 的 Context

199 個工具、每輪 schema 開銷 40K tokens——直到我們用五層架構砍掉 90%。
Service → SDK → CLI → MCP → Skill,讓 AI Agent 用最少的 token 做最多的事。

痛點

我們遇到了什麼問題?#

這不是先想好五層再實作的——是從三個真實痛點自然演化出來的。

1

Token 爆量#

Playwright MCP 每次呼叫消耗大量 token。即使不使用,tool schema 仍佔用 context window每輪都在付帳。

替換成 Playwright CLI 後:

-98% Token 使用量
2

MCP 進程爆炸#

每開一個 Claude Code session,所有 MCP server 進程等比複製

3 sessions × 23 MCP servers
= 69 個常駐進程
// RAM 和 CPU 線性吃滿
3

Tool 太多選不準#

單一 MCP server tool 數量過多時,LLM 的工具選擇準確率下降

業界最佳實踐:每個 MCP server ≤ 10 tools

8 tools × 200 tokens/schema = 1,600 tokens/turn(不管用不用)

數據

Token 成本比較#

不同呼叫方式的每輪 token 開銷(不含實際 I/O)

1,600
MCP(8 個工具)
每輪 schema 開銷(tokens)
0
CLI 透過 Bash
每輪 schema 開銷(tokens)
80K
50 輪對話
累計浪費在未使用的 schema
2
Cloudflare Code Mode
整個 IDE 只用 2 個工具
架構

五層分別做什麼?#

每一層服務不同的消費者,由上到下逐層依賴。

Skill
意圖路由層——根據操作類型決定走 CLI 還是 MCP,是 AI 工作流的入口
🤖 AI 編排器 / 自動化流程
MCP
寫操作 + typed schema return——LLM 需要 JSON schema 驗證輸入
🤖 Claude Code (tool call)
CLI
讀操作的通用介面——零 schema overhead,任何能跑 shell 的都能用
👤🤖📋 人 / AI / Cron / Script
SDK
唯一的 HTTP 邊界封裝——CLI 和 MCP 都 import SDK,不碰 HTTP
🐍 Python 程式 / Notebook
Service
業務邏輯本體——FastAPI routes + business logic + DB
⚙️ 模組間內部呼叫

核心原則:Bug Fix 自動傳播——修一個 SDK bug,CLI 和 MCP 同時修好。 沒有 SDK 這層的話,每個消費者各自實作 HTTP + auth + error handling = 維護地獄。

// 依賴方向(上層 import 下層)

Skill ──invoke──► CLI (讀) / MCP (寫)
MCP  ──import──► SDK ──HTTP──► Service
CLI  ──import──► SDK ──HTTP──► Service

// SDK 是唯一碰 HTTP 的地方
// 改 SDK = 所有上層消費者同步更新
消費者矩陣

為什麼少一層都不行?#

消費者 最佳接入層 理由
其他 Core Module Service 同進程內直接呼叫 services.py,零 overhead
Python 腳本 / Notebook SDK 程式化存取,完整 error handling
人(終端) CLI --help 可發現、pipe 可組合
AI Coding Agent
Claude Code / Codex CLI / Gemini CLI
CLI (讀) / MCP (寫) 讀走 Bash = 零 schema;寫需要 typed input
排程系統 CLI shell command 是排程的通用語言
AI 工作流 Skill 高階意圖路由,自動選擇 CLI 或 MCP

「CLI 是零 overhead 的萬用接口——任何能跑 shell 的東西都能用,
而 MCP 只有支援 MCP protocol 的 client 才能用。」

演化歷程

我們是怎麼走到這裡的?#

不是預先設計的——是一步步從痛點演化出來的。

發現期 — Playwright MCP

Token 爆量的第一個教訓#

Playwright MCP 的 tool schema 極大,每輪對話注入 system prompt。即使那一輪沒用到瀏覽器,照樣消耗 token。替換成 Playwright CLI 後,token 用量下降 98%。

領悟:能走 CLI 的就不該走 MCP。

擴展期 — MCP 進程爆炸

多開 session 的乘法災難#

隨著 MCP server 數量增長到 23 個,每多開一個 Claude Code session 就等比複製所有進程。3 個 session = 69 個常駐進程。解決方案:導入 mcpproxy 聚合 + 將讀操作卸載到 CLI。

領悟:減少 MCP server / tool 數量是必要的。

驗證期 — Cloudflare Code Mode

業界最極端的 tool 壓縮#

Cloudflare 的 Code Mode MCP 只暴露 2 個 toolsearch()execute()。其他所有操作都在沙盒裡即時撰寫。證明了 tool 數量和能力成反比。

領悟:我們不走那麼極端,但同樣的原則——tool 越少越好。

成熟期 — 實戰驗證

新模組完整走完五層#

Backend → SDK → CLI → MCP → Skill,缺一層就造成下游整合斷裂。有了 BaseClient DRY 模式後,新增模組的邊際成本遞減,但每多一層的可組合性是永久收益。

領悟:五層不是負擔,是複利。

Sandbox Pattern

拋棄式 Tools — 沙盒補位#

不是所有操作都需要永久的 tool。受 Cloudflare Code Mode 啟發,批量操作在沙盒中即時撰寫,不佔 MCP tool slot。

永久 Tool(五層覆蓋)#

高頻、穩定、需要 discoverability 的操作

  • search — 每天高頻使用
  • create — 需要 typed schema 驗證
  • render — 複雜參數組合

✓ 值得維護成本 ✓ 有 --help ✓ 可測試

拋棄式 Tool(Sandbox)#

低頻、一次性、或探索性的批量操作

  • 批量掃描 + 聚合(3+ API 呼叫)
  • 一次性資料轉換
  • 探索性腳本(用完即丟)

✓ 零 schema overhead ✓ 不佔 tool slot ✓ 即寫即用

// Cloudflare 的極端解法 vs 務實解法

Cloudflare: 2 permanent tools + sandbox 即時寫所有操作
務實派:  ≤10 permanent tools/server + sandbox 補位低頻操作

// 共同原則:永久 tool 是稀缺資源,不值得佔位的就用 sandbox

判斷標準:一個操作值不值得成為永久 tool?
→ 每週使用 ≥ 3 次 + 參數組合複雜 + 需要 discoverability → 五層覆蓋
→ 否則 → sandbox 即時寫,用完即丟

比較

如果不用五層?#

替代方案 問題 後果
只有 Service 只能 HTTP 呼叫 AI agent、cron、CLI 使用者全部要自己寫 HTTP client
Service + MCP Token overhead + 進程爆炸 23 servers × 3 sessions = 69 進程,schema 每輪吃 token
Service + CLI 寫操作缺 typed schema LLM 傳錯參數、沒有 input validation
全部走 MCP CLI 使用者被排除 Codex CLI、Gemini CLI、cron 全部無法接入
各層獨立實作 HTTP 沒有 SDK 統一 改一處漏一處,Ghost Parameter 反模式叢生
實作範例

用 Agent SDK 自己控制 Tool 注入#

如果你用 Agent SDK 自建 client,可以在應用層完全控制哪些 tool schema 進入 LLM 的 context——不需要等平台支援。Speakeasy 的動態工具集方案就是這個做法,做到 96% token 削減。

# 虛擬碼示意

all_tools = mcp_server.tools_list()    # 收到 199 個(protocol 層)
relevant = bm25_filter(all_tools, query) # 你自己過濾到 5 個
response = client.messages.create(
    tools=relevant,                # 只送 5 個給 LLM
)

不過濾(預設行為)#

199 個 tool schema 全部塞進 tools[]

~40K tokens/輪

BM25 過濾後#

每次只送最相關的 5-10 個 tool

~2K tokens/輪

關鍵區分:MCP protocol 層的 tools/list 回傳全部工具——這改不了。
但你的 client 決定放什麼進 API 的 tools[]——這完全你控制
用 Claude Code 等現成 client?它幫你全塞。自建 client?你自己篩。

成本分析

實作成本其實很低#

SDK#

繼承 BaseClient,每個方法一行封裝。錯誤處理、認證、基底路徑全部 DRY。

CLI#

匯入 SDK 的指令封裝。統一簽名、分頁用共用解析器。

MCP#

SDK 封裝 + 工具定義。只包寫操作 + 結構化回傳,讀操作不需要。

「邊際成本遞減,可組合性是長期收益——但維護成本也是長期的。」

⚠ 這套做法的代價#

多維護三套封裝#

SDK、CLI、MCP 三層都在包同一份邏輯。API 改了,三層都要跟著改。團隊小的時候可控,人多了就要靠自動化測試兜住。

除錯路徑變長#

出 bug 要先判斷問題在哪一層:是 Service 邏輯錯、SDK 參數漏傳、CLI 解析有誤、還是 MCP schema 沒更新。層越多,排查越慢。

不是所有模組都值得#

內部用的小工具不需要五層。只有被多種消費者使用的核心模組才值得投資。過度套用反而是負擔。

外部驗證

OpenCLI 社群的風向轉變#

這不是我們自己在喊的方向——整個開源社群正在往 CLI 靠攏

OpenCLI 把網站和桌面應用轉成標準化 CLI;CLI-Anything 要讓所有軟體都能被 Agent 透過 CLI 操作。越來越多開發者在問「有沒有 CLI」而不是「有沒有 API」。

原因很直接:整個產業正在進入 Agentic CLI 時代。當 AI coding tool 全都能跑 shell,CLI 自然成為跨工具的最大公約數

以前#

主流做法:Agent + MCP

所有工具都走 MCP,schema 全塞 context,tool 越多越慢

現在#

演化做法:Agent + Skill(調用 CLI / MCP)

Skill 按需路由——讀操作走 CLI 零開銷,寫操作才走 MCP

不是 CLI 復興——是 AI 時代重新發現了 CLI 的價值。

結論

199 個工具,一套邏輯#

從 Token 爆量的第一課到社群的風向驗證——每一步都是痛點逼出來的。
五層不是官僚,是讓人、腳本、和 AI 各取所需,改一處、全部同步

// 決策鏈

痛點 1: Playwright MCP token 爆量
  → CLI 省 98% token

痛點 2: 多開 CC → 進程等比增長
  → mcpproxy 聚合 + CLI 卸載讀操作

痛點 3: Tool 太多 LLM 選不準
  → ≤10 tools/server + sandbox 補位

驗證 1: Cloudflare 只用 2 tools 跑整個 IDE
  → 同原則,我們更務實

驗證 2: OpenCLI 社群轉向 CLI-first
  → AI 時代,CLI 是跨工具最大公約數

// 歸納
Service → SDK → CLI → MCP → Skill
199 個工具,一套邏輯,三種消費者
帶走這段

複製給你的 AI Agent#

把下面這段話貼給你的 AI coding agent,讓它幫你評估現有架構、規劃改造方向。

幫我評估目前專案的 AI 工具接入方式,看有沒有優化 token 開銷的空間。 背景:MCP tool schema 每輪都會注入 context,不管有沒有用到都佔 token。當工具數量多的時候,光 schema 就可能吃掉幾萬 tokens。 有一套「五層架構」的做法可以參考(由下而上): 1. Service — 業務邏輯本體(API + DB),模組間直接呼叫 2. SDK — 統一的 HTTP 封裝,上層都 import SDK 而不直接碰 HTTP 3. CLI — 零 schema overhead 的通用介面,讀操作走這層 4. MCP — 只留給需要 typed schema 驗證的寫操作 5. Skill — 意圖路由層,自動判斷讀走 CLI、寫走 MCP 幾個可以評估的方向: - 哪些現有的 MCP tool 其實是讀操作,可以改走 CLI 省掉 schema 開銷? - 有沒有工具可以合併或用 sandbox 即時產生,減少常駐 tool 數量? - HTTP 呼叫邏輯是否散落各處,有沒有機會抽成 SDK 統一管理? - 每個 MCP server 的 tool 數量是否超過 10 個?超過的話 LLM 選擇準確率會下降 先幫我盤點一下現狀,列出可以快速改善的地方。
參考資料

延伸閱讀#

這些是我們在摸索過程中實際參考過、借鑑過的資源。

文章 為什麼重要
Code Mode: Give Agents an Entire API in 1,000 Tokens Cloudflare 實測只用 2 個 tool 跑整個 IDE,token 開銷減少 81%。驗證了「tool 越少越好」的原則
Your MCP Server Is Eating Your Context Window Apideck 分析 MCP schema 如何吃掉 context,提出 CLI 作為替代方案——80 tokens prompt vs 數萬 tokens schema
Advanced Tool Use — Anthropic Engineering Anthropic 官方承認 tool schema 佔用 context 的問題,推出 Tool Search 機制實現 85% context 削減
How We Reduced Token Usage by 100x: Dynamic Toolsets Speakeasy 的動態工具集方案,做到 96% input token 削減
MCPProxy — MCP Gateway 開源 MCP 聚合閘道,用 BM25 索引動態發現工具,支援數百個 server + 數千個 tool
Welcome to the Agentic CLI Era The New Stack 報導 AI coding tool 全面轉向 CLI 的產業趨勢
OpenCLI — Universal CLI Hub 專為 AI Agent 設計的通用 CLI 中心,把網站、桌面應用轉換成標準化 CLI
CLI-Anything — Making ALL Software Agent-Native 香港大學研究:讓所有軟體都能被 AI Agent 透過 CLI 操作
✦ 帶走這段