這個單元解決什麼問題能用 CLI 完成的事,優先用 CLI;MCP 是 fallback,不是預設。這個單元講 CLI 與 MCP 的本質差異:token 成本、可組合性、可審計性、認證與狀態管理,解釋為何 CLI-first 是更穩健的預設策略,並給出「什麼條件才退回 MCP」的明確判準。最後用同一個工作流的 CLI vs MCP 對照 worked example 把差異量化。
學習目標
- 講清 CLI 與 MCP 在 token 成本、可組合性、可審計性、認證與狀態管理上的本質差異。
- 說出 CLI-first 策略的理由,並舉出具體的可組合性優勢(pipe、
--json、jq串接)。 - 判斷何時應 fallback 到 MCP(CLI 不可用、未認證、rate limit、無 CLI 對應)。
- 避免同一操作同時走 CLI 與 MCP,避免結果分裂與 token 浪費。
1. CLI 與 MCP 各是什麼
CLI(Command Line Interface)是既有的命令列工具:git、gh、docker、kubectl、psql、aws、npm、uv、make、jq 等。呼叫後直接輸出到 stdout / stderr,不需要額外協定層。
MCP(Model Context Protocol)是 2024 年由 Anthropic 提出的開放標準,定義「外部工具與資料源如何被 LLM 結構化地呼叫」[1]。MCP server 對外暴露 tools / resources / prompts 三類介面;MCP client(如 Claude Code、Cursor)連上後把工具掛入自己的 mcp__<server>__<tool> 命名空間。
兩者的角色定位差異:
2. 本質差異
2.1 Token 成本
MCP 的固定 context 成本:MCP server 連線後,其工具描述(tool schema)會進入模型 context。即便 tool search 預設開啟讓 schema 延後載入,已被 Claude 發現的 tool 仍佔用對話輪次的 context [1]。 CLI 的可變 context 成本:CLI 沒有預載的 schema。Bash tool 的 schema 是固定的、不隨你跑了什麼指令而變大。真正的成本只在 stdout 進入 context 的那一刻,而 stdout 是你可控的(用 head、tail、jq -c '.[0]' 預先裁剪)。
實測估算(粗略,量級用):一個簡單 MCP 工具呼叫的單次 token 成本包含「schema 觸發 + 結構化 JSON 回應」兩個部分;同等的 CLI 呼叫,schema 成本是 0,回應可以裁到只剩一行 JSON。對 200k 脈絡視窗,差距看起來小;對一天跑幾十次的工作流,每月差距是數萬 token 級別。
2.2 可組合性
CLI 是 shell-native:每個 CLI 的輸出可被另一個 CLI 透過 pipe 串接,形成高密度資訊萃取。mcp__<server>__<tool> 呼叫獨立,輸出回 context 後 Claude 決定下一步。一個跨四步的 pipeline 會吃四次 schema 觸發、四次完整回應。
2.3 可審計性
CLI 指令明文可見、可記錄於 shell history。auditd、syscall、bash history 都能稽核。CI 環境下 git log 內的 run: 段也是確定性紀錄。
MCP 呼叫在 agent 執行層,需要額外日誌機制(Hook、Subagent log)才可追蹤(04-6 Hooks 提供部分支援,但不是預設)。對合規需求高的場景(金融、醫療、學術審查),CLI 的可審計性是結構性優勢。
2.4 認證與狀態管理
CLI 沿用作業系統層級認證:gh auth login、aws configure、gcloud auth login 把 token 存進 OS keychain 或 ~/.config 對應目錄;後續指令自動帶認證。Claude Code 的 Bash tool 對認證檔的讀取權限可由 permissions.deny 細部管控 [2]。
MCP 認證是各 server 自己的事:HTTP server 走 OAuth(04-9 MCP 整合 詳述);stdio server 透過 env 傳 key;多數 server 沒有 session 狀態,但部分(如 Notion 編輯、Atlassian 變更)有。狀態管理更複雜,需要個別 server 理解。
3. 為何 CLI-first
把上面的差異收斂成四個具體理由:- CLI 是該生態的官方正規用法。
gh是 GitHub 官方 CLI、kubectl是 K8s 官方 CLI、aws是 AWS 官方 CLI。文件完整、版本穩定、社群覆蓋廣、與上游版本同步。繞過它等於繞過一條已經有人維護的正路。 - 輸出格式可控。
gh pr list --json number,title,state精準到欄位;MCP 呼叫回傳整個結構化物件,你要的欄位與不要的欄位都進 context。 - 不額外吃 context。Bash tool schema 是固定的;MCP 工具描述隨 server 數量線性增加。
- 除錯路徑清晰。CLI 失敗有明確 exit code 與 stderr;MCP 失敗的診斷路徑因 server 而異(協議錯誤、認證過期、工具不存在都不同)。
沒有官方明文「CLI first」指引截至 2026-06,Anthropic 官方文件並未在 [permissions] 與 [MCP] 章節使用「CLI first」字樣 [1, 2]。「CLI 優先」是本 Playbook 從官方架構推導出來的實務策略:Bash 是核心工具類型、唯讀指令免 prompt、權限精細到指令前綴。這些設計本身就把 Bash 放在最高槓桿位置,CLI-first 是順著這條路走。
4. 何時用 MCP(fallback 觸發條件)
CLI-first 是預設。只有滿足下列任一條件才切換到 MCP:5. Worked example:同一操作走 CLI 與走 MCP
5.1 情境
查詢某 GitHub repo 的最新 10 筆 open PR,列出編號、標題、作者、是否為 draft。5.2 CLI 路徑
- stdout 一次輸出,可直接
| head、| wc -l、| column -t後處理。 - 失敗時 exit code 非 0,stderr 明確(「API rate limit exceeded」、「auth required」)。
- token 成本:0 schema 載入 + 約 800 token 結構化輸出(10 筆 PR 的 JSON)。
- 對 Claude 而言,Bash tool 的 schema 早已常駐,不會因這次呼叫而增加。
5.3 MCP 路徑
假設已裝 GitHub 官方 MCP server(mcp__github__list_pull_requests):
- tool schema 進入 context(tool search 預設開啟所以是觸發時載入,但載入就要佔 context)。
- 回傳是完整結構化物件(可能含
head、base、user等你用不到的欄位),通常 1,500-3,000 token。 - 你要「draft 狀態」這種衍生欄位,要 Claude 在 context 內再運算一次。
- 失敗時的錯誤訊息因 server 設計而異,部分 server 對人類不友善。
5.4 對照重點
6. 反模式:CLI 與 MCP 混用
最常見的隱性 bug 來源。具體場景:gh 端的 CI 跑了一次、MCP 端的 CI 又跑了一次。狀態分裂。
規則:
- 一個操作選定一條路:今天用 CLI 就 CLI、用 MCP 就 MCP,整個 session 一致。
- fallback 切換後不回頭:CLI 不可用才切 MCP,不要「兩邊都試看看哪個行」。
- 跨 session 也要標明:在
CLAUDE.md寫「本專案統一用ghCLI,不裝 GitHub MCP server」,給 session 一致的預設。
7. 工具對照
命名澄清Claude Code 的 Bash tool 是 agent 呼叫 shell 的介面;
claude CLI 是呼叫 Claude Code 本身的命令。兩者層級不同。各工具的 MCP 設定細節見 04-9 MCP 整合。Cursor 為第三方 IDE(Anysphere),本 Playbook 僅短提一欄。動手做
30 分鐘練習
- 建 CLI-first checklist(10 分鐘):列出你工作流中常見的 10 個操作(查 issue、查 PR、跑測試、看 log、查 DB、deploy 等),逐一標記「有 CLI 可用」「需 MCP fallback」「內建工具就夠」。這份清單是下個 session 開工的預設。
- 同一操作雙路對照(15 分鐘):選一個你常用的操作(如查 GitHub issue),先用 CLI 完成(記下 token 估算:用
wc -w或wc -c大致估算 stdout 大小),再用 MCP 完成(看 context 中實際佔多少 token)。差距量化,決定哪一條作為預設。 - 混用偵測(5 分鐘):翻
~/.bash_history與最近 session 的 transcript,找出有沒有 CLI 與 MCP 並存呼叫同一服務的痕跡。標記、決定要不要統一。
常見誤區
自我檢核
通過本單元的標準
- 面對一個新的整合需求,你能在 30 秒內判斷「CLI 可用還是需要 MCP」嗎?說出判斷依據。
- 你能否列出至少三條 CLI 相對 MCP 的具體優勢?每條配一個真實例子。
- 你目前 session(或最近一個 session)有沒有 CLI 與 MCP 混用同一服務的情況?列出、決定要不要統一。
- 你的
CLAUDE.md有沒有寫明 CLI-first 偏好?若沒有,現在補一段。
來源與延伸閱讀
事實主張依官方文件,快變動項標註截至 2026-05。- [1] Anthropic, “Connect Claude Code to tools via MCP,” code.claude.com, 2026. [Online]. Available: https://code.claude.com/docs/en/mcp (截至 2026-06;MCP transport、scope、tool search)
-
[2] Anthropic, “Configure permissions,” code.claude.com, 2026. [Online]. Available: https://code.claude.com/docs/en/permissions (截至 2026-06;Bash tool 為核心工具、唯讀指令清單、allow / deny / ask 規則的
Bash(specifier)形式、shell 識別子指令) - [3] OpenAI, “Codex CLI,” developers.openai.com, 2026. [Online]. Available: https://developers.openai.com/codex (截至 2026-06;codex CLI 基本指令、—approval-mode、沙箱執行、MCP config.toml 設定位置)
- [4] Google, “Gemini CLI,” google-gemini.github.io, 2026. [Online]. Available: https://google-gemini.github.io/gemini-cli/ (截至 2026-06;gemini CLI 指令、shell 工具、—sandbox、MCP settings.json 設定、GEMINI_API_KEY 認證)
- [5] GitHub Docs, “GitHub Copilot CLI,” docs.github.com, 2026. [Online]. Available: https://docs.github.com/en/copilot/how-tos/copilot-cli (截至 2026-06;gh copilot suggest / explain、gh auth login、~/.copilot/mcp-config.json)
- [6] Cursor, “MCP,” cursor.com, 2026. [Online]. Available: https://cursor.com/docs/cli/mcp (截至 2026-06;.cursor/mcp.json 與 ~/.cursor/mcp.json 位置、stdio 與 Streamable HTTP transport)
- MCP 整合設定見 04-9 MCP 整合。
- 內建工具盤點見 04-8 各家 AI 的內建工具與功能。
CLAUDE.md撰寫見 04-1 CLAUDE.md 與記憶檔。- Shell 工具的供應鏈風險見 03-3 安全、隱私與供應鏈風險。
- Bash 的可審計性與權限收斂見 04-6 Hooks。