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;
}
關鍵特點:
- ✅ 執行真正的程式碼
- ✅ 連接資料庫(SQLite + LanceDB)
- ✅ 呼叫外部 API(Voyage AI Reranker)
- ✅ 處理複雜的業務邏輯
什麼是 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 當你需要:
- 資料庫操作 - CRUD、搜尋、embedding
- 外部 API 呼叫 - Reranker、LLM、第三方服務
- 複雜業務邏輯 - 不能用簡單 bash 完成的事
- 狀態管理 - 需要持久化資料
選擇 Skills 當你需要:
- 標準化流程 - 讓 AI 知道「何時、如何」使用工具
- 團隊知識共享 - 把最佳實踐寫成 Skill
- 快速部署 - 不想維護 server
- 教學指導 - 解釋複雜的工作流程
兩者並用(推薦):
- MCP Server 提供能力
- Skills 提供指導
- Progressive Disclosure 讓 AI 按需深入了解
深入解析: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 → 資料持久化 │
└─────────────────────────────────────────┘
如果你也在糾結這個問題,希望這篇文章能幫到你。