Ian Chou's Blog

CLI 取代 MCP Tools:2026 年 AI Agent 的最佳實踐

CLI 取代 MCP Tools:2026 年 AI Agent 的最佳實踐

TL;DR


Part 1:為什麼 CLI 比 MCP 更適合 AI Agent?

1.1 MCP 的問題

我原本的 Career RAG 專案用 MCP Server 提供工具,但遇到一些痛點:

問題 說明
Schema 佔 Token 每個 MCP tool 的 JSON Schema 需要載入 context
伺服器維護 需要啟動獨立進程,偶爾會掛
延遲 HTTP/SSE 通訊比本地指令慢
除錯困難 MCP 錯誤訊息不直觀

1.2 CLI 的優勢

面向 MCP Tools CLI in Skills
Schema 描述 佔 token LLM 自動 cli --help 學用法
部署 伺服器維護 本地指令,零依賴
延遲 HTTP/SSE 即時 shell
Vector Index MCP call lancedb-cli search --hybrid 一行搞定

關鍵洞察:LLM 天生就懂 CLI。它見過無數 --help 輸出,知道怎麼組合參數。相比之下,MCP Schema 是「新語言」,需要額外描述。

1.3 我的遷移:MCP → CLI + Skills

Before(MCP)

// mcp-server/index.ts
server.setRequestHandler("search_material", async (params) => {
  // 複雜的 MCP 協議處理
});

After(CLI + Skills)

# 直接執行
bun run search-material-cli.ts --focus "AI" --limit 5
# SKILL.md
## 搜尋素材
cd mcp-server && bun run search-material-cli.ts --focus "{query}" --limit 5

結果


2.1 常見誤解

"每次搜尋都要先跑 MCP Tool Search 嗎?"

不是! Skills 單獨就能處理 vector index。MCP Tool Search 只在 Skills 內 MCP tools 太多時才介入優化。

2.2 分工對比

階段 Skills(單獨用) 加 MCP Tool Search(Scale 時)
Metadata YAML desc/keywords 匹配 query 同左,但工具 schema 懶搜尋
Vector Index SKILL.md 指令執行 MCP schema 只載相關
觸發 自動(語意匹配) Skills 先觸發,內部優化
Token 超低(省 85%)
情境 需要 Tool Search?
MCP Tools < 5 個 ❌ Skills 夠用
MCP Tools 5-10 個 🟡 自動判斷
MCP Tools > 10 個 ✅ 自動啟用
Schema 佔 context > 10% ✅ 強制啟用

我的案例:只有 LanceDB + 少數工具,Skills 直接跑,不需要 Tool Search。


Part 3:Lazy Loading 機制詳解

3.1 傳統 vs Lazy Loading

傳統(全載)

啟動 Claude Code
↓
全載 MCP schema + Skills 內容
↓
67k tokens 消耗
↓
用戶提示

Lazy Loading

啟動 Claude Code
↓
只載 metadata index (YAML desc + keywords)
↓
~30 tokens 消耗
↓
用戶提示 "搜 Kubernetes deploy"
↓
語意匹配 metadata(0.1s,無向量查詢)
↓
觸發 LanceDB skill
↓
**才** 執行 CLI / MCP call(<100ms)
↓
context 只塞 top-5 chunks(~2k tokens)

3.2 實測數據

在我的 Career RAG 專案中:

指標 傳統 Lazy Loading 節省
啟動 token ~5k ~200 96%
每次搜尋 token ~8k ~2k 75%
冷啟動延遲 ~2s ~0.3s 85%

3.3 Lazy Loading 的關鍵

  1. Metadata Index:啟動時只載 SKILL.md 的 YAML frontmatter
  2. 語意匹配:用戶 query 與 metadata 的 description/keywords 匹配
  3. On-demand Loading:匹配後才讀完整 SKILL.md 內容
  4. 工具延遲載入:只在執行時載入相關 MCP schema

Part 4:實作指南 — Vector Index with CLI

4.1 建立 CLI

// search-material-cli.ts
import { searchMaterialByJdFocus } from "./src/tools/search-material.js";

const args = parseArgs(process.argv);
const results = await searchMaterialByJdFocus({
  focus: args.focus,
  limit: args.limit,
  use_bm25: true,
  use_reranking: true,
});

console.log(JSON.stringify(results, null, 2));

4.2 建立 Skill

---
name: resume-material-search
description: Search resume materials using hybrid vector + BM25 search
keywords: ["vector", "search", "resume", "material", "lancedb"]
---

# Resume Material Search

## 使用方式

```bash
cd mcp-server && bun run search-material-cli.ts \
  --focus "{query}" \
  --skills "{skills}" \
  --limit 5

輸出格式

JSON array with: id, text, relevance_score, skills


### 4.3 測試 Lazy Loading

```bash
# 確認版本
claude --version  # 需要 2.1.9+

# 列出 Skills
claude skills list

# 測試匹配
claude "搜尋 Kubernetes 相關履歷素材"
# → 自動觸發 resume-material-search skill
# → 執行 CLI
# → 回傳結果

Part 5:架構選擇決策樹

你的工具數量?

├── 1-3 個工具
│   └── ✅ 純 CLI + Skills,不需要 MCP
│
├── 3-10 個工具
│   ├── 工具間需要共享狀態?
│   │   ├── 是 → MCP Server
│   │   └── 否 → CLI + Skills
│   └── 需要跨 IDE 共用?
│       ├── 是 → MCP Server
│       └── 否 → CLI + Skills
│
└── 10+ 個工具
    └── MCP Server + Tool Search 自動優化

我的選擇

Career RAG 專案有 7 個工具,全部用 CLI + Skills:

工具 原本 現在
save_jd_analysis MCP save-jd-cli.ts
search_material MCP search-material-cli.ts
verify_skill_coverage MCP verify-skill-cli.ts
... ... ...

好處


關鍵學習

  1. CLI 是 LLM 的母語:它見過無數 --help,比 MCP Schema 更直觀
  2. Skills 已足夠:大多數場景不需要 MCP Tool Search
  3. Lazy Loading 是關鍵:省 85% token,啟動快 6 倍
  4. 遷移成本低:把 MCP handler 包成 CLI,Skills 寫呼叫方式
  5. Simon Willison 說得對:"幾乎所有 MCP 都能 CLI 取代"

相關資源