Ian Chou's Blog

MCP Tools vs Agent Skills:我到底需要哪一個?

MCP Tools vs Agent Skills:我到底需要哪一個?

前言:一個令人困惑的問題

最近我在整理 Career MCP Server 專案時,看到 Claude Code 發布了 Agent Skills 功能。我心想:

「太好了!可以把 MCP Tools 轉成 Skills,應該更簡單吧?」

結果深入研究後發現 — 這兩者根本不是同一個東西

這篇文章記錄我的探索過程,希望幫助有類似困惑的開發者。


快速對比表

面向 MCP Server Agent Skills
本質 獨立執行的 server 進程 Markdown 指令檔案
能力 真正執行程式碼、連接資料庫 指導 AI 如何使用現有工具
資料持久性 可管理資料庫、embedding 無法管理狀態
部署複雜度 需要啟動 server 只需放 .md 檔案
適用場景 需要真正執行邏輯 標準化 AI 工作流程

什麼是 MCP Server?

MCP (Model Context Protocol) 是 Anthropic 推出的標準,讓 AI 可以呼叫外部工具。

我的 Career MCP Server 做的事:

// 真正的程式邏輯
export async function searchMaterialByJdFocus(params: SearchParams) {
  // 1. 向量搜尋
  const vectorResults = await lanceDB.search(embedding);
  
  // 2. BM25 關鍵字搜尋
  const bm25Results = await bm25Index.search(query);
  
  // 3. Reranker 重排序
  const reranked = await voyageAI.rerank(combined);
  
  return reranked;
}

關鍵特點


什麼是 Agent Skills?

Agent Skills 是 Claude Code 2025 年推出的功能,本質上是 讓 AI 知道怎麼做事的說明書

一個 Skill 的結構:

---
name: pdf-processing
description: Extract text, fill forms, merge PDFs.
---

# PDF Processing

## Quick start
Extract text:
```python
import pdfplumber
with pdfplumber.open("doc.pdf") as pdf:
    text = pdf.pages[0].extract_text()

For form filling, see FORMS.md.


**關鍵特點**:
- ✅ 零部署,放檔案就能用
- ✅ 可以引用其他文件(Progressive Disclosure)
- ❌ 不能執行程式碼
- ❌ 不能管理資料庫

---

## 核心差異:「做事」vs「教 AI 怎麼做事」

讓我用比喻解釋:

| 角色 | MCP Server | Agent Skills |
|-----|------------|--------------|
| 比喻 | 工廠的機器 | 工廠的 SOP 手冊 |
| 職責 | 真正執行任務 | 告訴 AI 如何操作機器 |

### 實際例子

**MCP Server 做的事**:

AI: 請搜尋與 "distributed systems" 相關的履歷素材
MCP: [執行向量搜尋 + BM25 + Reranker]
MCP: 找到 5 筆結果,最相關的是...


**Skills 做的事**:

AI: 使用者想生成履歷
Skills: [讀取 SKILL.md]
Skills: 告訴 AI:「先用 save_jd_analysis 分析 JD,再用 verify_skill_coverage 檢查...」
AI: [根據指示呼叫 MCP tools]


---

## 我的解決方案:兩者並用

既然理解了差異,最佳方案是 **讓它們各司其職**:

### 專案結構

.claude/skills/resume-generation/
└── SKILL.md ← Skills:指導 AI 如何使用 MCP tools

.agent/prompts/
└── session-init.md ← 詳細的 7 步驟 SOP

mcp-server/
├── src/
│ ├── tools/ ← MCP:真正執行邏輯
│ │ ├── search-material.ts
│ │ ├── verify-skill-coverage.ts
│ │ └── ...
│ └── index.ts
└── data/career.db ← SQLite + Vector DB


### SKILL.md 內容(簡化版)

```markdown
---
name: resume-generation
description: Generate tailored resumes using career MCP tools.
---

# Resume Generation Skill

> 📖 完整工作流程:請參閱 session-init.md 獲取 7 步驟詳細 SOP。

## 可用的 MCP Tools

| Tool | Purpose |
|------|---------|
| `save_jd_analysis` | 分析 JD,提取 focus items |
| `search_material_by_jd_focus` | 搜尋匹配的履歷素材 |
| `verify_skill_coverage` | NLI 驗證技能覆蓋度 |

## 使用時機

當使用者說:
- 「幫我分析這個 JD」→ 使用 save_jd_analysis
- 「檢查我的技能覆蓋」→ 使用 verify_skill_coverage
- 「生成一份履歷」→ 執行完整 7 步驟流程

什麼時候用什麼?

選擇 MCP Server 當你需要:

  1. 資料庫操作 - CRUD、搜尋、embedding
  2. 外部 API 呼叫 - Reranker、LLM、第三方服務
  3. 複雜業務邏輯 - 不能用簡單 bash 完成的事
  4. 狀態管理 - 需要持久化資料

選擇 Skills 當你需要:

  1. 標準化流程 - 讓 AI 知道「何時、如何」使用工具
  2. 團隊知識共享 - 把最佳實踐寫成 Skill
  3. 快速部署 - 不想維護 server
  4. 教學指導 - 解釋複雜的工作流程

兩者並用(推薦):


深入解析:Skills 的內部運作機制

在研究過程中,我對 Skills 的觸發機制產生了好奇:它是用向量搜尋嗎?有本地的小 LLM 嗎?

Skills 觸發流程(根據 Anthropic 官方文件)

1. 啟動時:預載所有 Skill 的 name + description 到 system prompt

2. 使用者發送訊息

3. Claude(主 LLM)自己判斷哪個 Skill 相關

4. Claude 用 Bash tool 讀取 SKILL.md 內容
   → 例如:bash("cat pdf/SKILL.md")

5. 如需要,Claude 再讀取 Skill 附帶的其他檔案

關鍵發現

問題 答案
有本地小 LLM 嗎? ❌ 沒有
用向量搜尋嗎? ❌ 沒有
怎麼判斷相關? 主 Claude 自己判斷
description 放哪? 預載到 system prompt
內容怎麼讀? Claude 用 Bash tool 讀檔案

這表示 Skills 完全依賴 Claude 的語義理解能力,不需要任何本地計算。

Progressive Disclosure(漸進式揭露)

這是 Skills 的核心設計原則:

Level 1: name + description → 永遠在 system prompt(很省 token)
Level 2: SKILL.md 內容 → Claude 判斷相關時才讀
Level 3: 附帶的其他 .md → 需要時才讀

如果 Skills 很多怎麼辦?

Skills 數量 額外 Token 消耗 影響
5 個 ~250 tokens 幾乎無感
20 個 ~1,000 tokens 可接受
100 個 ~5,000 tokens 開始有影響

對於一般使用者(< 20 個 Skills),不用擔心。


Skills vs Custom Instructions

研究到這裡,我有個頓悟:

Skills 的 description 不就等於 Custom Instructions 嗎?只是放的地方不一樣!

對比分析

面向 Custom Instructions Skill Description
放的位置 System prompt System prompt
永遠載入? ✅ 全部內容 ✅ 只有 description
完整內容 全部載入 按需載入

關鍵差異:完整內容的處理

Custom Instructions (CLAUDE.md):
┌──────────────────────────────┐
│  全部 500 行都載入 system prompt │  ← 每次對話都消耗
└──────────────────────────────┘

Skills:
┌──────────────────────────────┐
│  description: 2 行 (永遠載入)   │  ← 很省
├──────────────────────────────┤
│  SKILL.md: 100 行 (按需讀取)    │  ← 相關時才載入
└──────────────────────────────┘

手動版 Skills

其實你完全可以在 Custom Instructions 裡這樣寫:

# CLAUDE.md

## 可用的知識文件

當使用者問到以下主題時,請讀取對應檔案:

| 主題 | 檔案位置 |
|-----|---------|
| 履歷生成 | `.agent/prompts/session-init.md` |
| PDF 處理 | `docs/pdf-guide.md` |

這樣做效果跟 Skills 一樣!差別只在於:

差異 Skills 系統 手動版
目錄自動產生 ✅ 自動掃描 ❌ 手動維護
格式標準化 ✅ YAML frontmatter ❌ 自己定義
可分享 ✅ Plugin marketplace ❌ 複製貼上

Skills 本質上就是一個「標準化 + 自動化」的框架


重要發現:Antigravity vs Claude Code 的 Skills 路徑

在實際測試過程中,我發現一個關鍵差異:

不同 AI Agent 使用不同的 Skills 路徑

AI Agent Skills 路徑
Claude Code .claude/skills/
Antigravity .agent/skills/

如何讓兩邊都能用?

最簡單的方法是兩邊都放一份

# Claude Code 路徑
.claude/skills/resume-generation/SKILL.md

# Antigravity 路徑
.agent/skills/resume-generation/SKILL.md

或者用 symlink:

ln -s ../.claude/skills .agent/skills

測試結果

當我問 Antigravity「What Skills are available?」時,它成功找到:

📄 resume-generation
Location: /path/to/.agent/skills/resume-generation/SKILL.md
Description: Generate tailored resumes and cover letters...

這證實 .agent/skills/ 是 Antigravity 的正確路徑


常見誤解

❌ 誤解 1:Skills 可以取代 MCP

真相:Skills 只能指導 AI 使用現有工具(grep, bash, read file 等),無法執行自定義邏輯。

❌ 誤解 2:MCP 比 Skills 更好

真相:兩者解決不同問題。簡單任務用 Skills 更輕量;複雜任務需要 MCP。

❌ 誤解 3:需要遷移现有 MCP 到 Skills

真相:不需要遷移。可以為現有 MCP tools 加一層 Skills 指導。


結論

問題 答案
需要開新 repo 嗎? 不需要
MCP tools 能變 Skills 嗎? 不能,它們是不同的東西
該怎麼做? 兩者並用,各司其職

我的最終架構:

┌─────────────────────────────────────────┐
│  AI Agent (Claude Code / Antigravity)   │
├─────────────────────────────────────────┤
│  SKILL.md → 告訴 AI 「何時、如何」       │
├─────────────────────────────────────────┤
│  MCP Server → 真正「執行」任務          │
├─────────────────────────────────────────┤
│  LanceDB + SQLite → 資料持久化          │
└─────────────────────────────────────────┘

如果你也在糾結這個問題,希望這篇文章能幫到你。


相關連結