← 文章

別讓 MCP 吃掉你 Agent 的 Context

· 14 分鐘閱讀 · 811 次閱讀
五層架構 MCP CLI Context 管理 AI 工具鏈
架構決策記錄

別讓 MCP 吃掉

你 Agent 的 Context

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

痛點

我們遇到了什麼問題?

三個真實痛點逼出了這套五層架構:Token 爆量、MCP 進程爆炸、Tool 太多選不準。

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 成本比較

MCP 每輪背 1,600 tokens schema,CLI 是 0(不含實際 I/O)。

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

五層分別做什麼?

五層由上到下分別是 Skill(意圖路由)、MCP(寫操作)、CLI(讀操作)、SDK(唯一碰 HTTP 的封裝層)、Service(業務邏輯本體),上層一律 import 下層。

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 個 tool:search() 和 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 的動態工具集方案用同樣的思路篩選 tool,削減了 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」。

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

以前

主流做法:Agent + MCP

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

現在

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

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

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

結論

199 個工具,一套邏輯

讀走 CLI、寫走 MCP——199 個工具就靠這一條分界運作,人、腳本、AI 各取所需。
從 Token 爆量到社群風向驗證,每一步都是痛點逼出來的,改一處、全部同步。

// 決策鏈

痛點 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 個工具,一套邏輯,三種消費者
工具

先算你自己的 schema 帳單

上面那筆 40K tokens 是我的環境,換成你的數字結果會完全不同。填三個欄位,用本文引用過的兩個常數(每個 tool schema 約 200 tokens、業界建議每個 MCP server ≤ 10 tools)算出屬於你的每輪開銷與常駐進程數。全部在瀏覽器裡算,沒有任何資料送出去。

常數出處都在本文:200 tokens/schema 來自「8 tools × 200 tokens/schema = 1,600 tokens/turn」,進程數來自「3 sessions × 23 MCP servers = 69 個常駐進程」的線性關係,10 tools/server 是文中引的業界建議。這裡只算 schema 常駐開銷,不含實際 I/O——真實用量還要看你怎麼呼叫。

帶走這段

複製給你的 AI Agent

MCP tool schema 每輪都佔 token,但你多數的 tool 其實是「讀」——根本不用 schema。工具一多,光 schema 就吃掉幾萬 token,超過 10 個 LLM 選錯的機率還會上升。這篇的五層架構就是把「讀」趕下 CLI、只留「寫」給 MCP。

把下面貼給你的 AI,讓它先實地盤點你現在的 MCP 設定,再對照這套五層判斷哪些能搬:

我在看一篇講「五層架構省 MCP token」的文章 (https://blog.joneshong.com/zh/blog/five-layer-architecture), 作者把 AI 工具接入拆成五層,把讀操作趕下 CLI、只留寫操作給 MCP。 請先實地盤點我的專案,再照這套判斷我能搬哪些,別憑通則回答: 先查我的現況: 1. 列出我現在接了哪些 MCP server、每個 server 各有幾個 tool (超過 10 個的先標出來——本文說超過 10 個 LLM 選錯率就上升) 2. 逐一把這些 tool 分成「讀操作」跟「寫操作」兩堆 3. 估一下這些 tool 的 schema 每輪大概佔多少 token 再照這套五層架構(由下而上)判斷怎麼搬: - Service:業務邏輯本體(API + DB) - SDK:統一的 HTTP 封裝,上層 import SDK、不直接碰 HTTP - CLI:零 schema overhead 的通用介面,讀操作走這層 - MCP:只留給需要 typed schema 驗證的寫操作 - Skill:意圖路由層,自動判斷讀走 CLI、寫走 MCP 回我: - 哪幾個「讀」tool 可以直接搬去 CLI、預估各省多少 token - 我的 HTTP 呼叫邏輯有沒有散落各處、值不值得抽 SDK - 哪些 tool 能合併或用 sandbox 即時產生,砍掉常駐數量 如果我只接了一兩個 tool、schema 開銷根本不痛,直接說不用拆,別為了套架構硬拆。
參考資料

延伸閱讀

下面幾篇都實際讀過、也真的影響過決定,不是隨手蒐集的清單。

文章 為什麼重要
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 操作
✦ 帶走這段