一、开篇:两个工具,完全不同的定位
2025年10月和11月,Anthropic接连发布了Claude Skills 和Model Context Protocol (MCP) 。这两个工具都能扩展Claude的能力,但很多人把它们当成"一回事",这导致在选择和配置时走了弯路。
核心区别一句话概括:Skills是"工作流说明书",MCP是"工具接口标准"。
如果你想让Claude按照固定流程做事(比如"按什么格式写代码审查报告"),用Skills。
如果你想让Claude访问外部服务(比如GitHub、数据库、浏览器),用MCP。
如果你需要同时做这两件事?Skills + MCP协同才是终极方案。
本文从技术原理、实战配置、使用场景三个维度,帮你彻底搞懂两者的区别,并能根据任务类型做出正确选择。
二、核心概念:Skill vs MCP的本质差异
❧Claude Skills:打包的工作流
Claude Skill本质上是一个文件夹,包含指令、脚本和资源。当Claude认为某个Skill与当前任务相关时,会自动加载该Skill的内容到上下文。
文件夹结构
bash
skill-name/
├── SKILL.md # 必需:技能说明文件
├── scripts/ # 可选:辅助脚本
├── templates/ # 可选:文档模板
└── resources/ # 可选:参考资料
Progressive Disclosure:渐进式加载
这是Skills最聪明的设计。Claude不会在启动时加载所有Skills的完整内容,而是按需加载:
- 启动时 :只读取每个Skill的
name和description(几十个tokens) - 识别时:根据你的请求判断需要哪个Skill
- 加载时 :调用
Skill工具,读取该Skill的完整SKILL.md - 执行时 :如果有需要,再读取
scripts/或resources/下的文件
这意味着你可以有100个Skills,但每次对话只会加载相关的1-2个,上下文窗口不会被爆掉。
❧MCP Server:标准化的工具接口
MCP(Model Context Protocol)是一个开放标准协议,定义了AI模型如何与外部工具交互。MCP Server是一个运行在本地或远程的程序,通过stdio、HTTP或SSE协议向AI暴露工具。
三层架构
| 层级 | 能力 | 示例 |
|---|---|---|
| Tool层 | 可执行的操作 | add计数器、get_alerts天气预警 |
| Resource层 | 可读取的数据 | counter状态、forecast天气预报 |
| Prompt层 | 可用的模板 | analysis数据分析、format格式化 |
传输方式对比
| 传输方式 | 适用场景 | 配置示例 |
|---|---|---|
| stdio | 本地脚本 | "command": "python", "args": ["server.py"] |
| HTTP | Web服务 | "url": "http://localhost:3001/mcp" |
| SSE | 实时推送 | "url": "http://localhost:3001/mcp", "transport": "sse" |
三、技术对比:能力边界与适用场景
| 维度 | Claude Skills | MCP Server |
|---|---|---|
| 核心能力 | 固化工作方法论 | 暴露工具接口 |
| 输入输出 | 自然语言 → 自然语言 | 结构化调用 → 结构化返回 |
| 开发门槛 | 低(写markdown) | 中(需写Server代码) |
| 上下文消耗 | 高(加载完整指令) | 低(每次只返回调用结果) |
| 适用场景 | 固定流程任务 | 动态数据访问 |
| 典型用例 | 代码审查、文档生成 | GitHub操作、数据库查询 |
❧什么时候用Skills?
判断标准:任务是"如何做"还是"做什么"?
-
Skills :当你有固定的工作流程,需要AI按步骤执行时
- 示例:"按什么格式写技术教程"、"代码审查的5个步骤"
-
MCP :当你需要AI访问外部数据或服务时
- 示例:"查询GitHub的Issue"、"读取SQLite数据库"
❧什么时候用MCP?
判断标准:是否需要结构化输入输出?
-
MCP擅长:工具化操作
- 输入:JSON结构化参数(
{"value": 10}) - 输出:结构化结果(
{"total": 15}) - 优势:可组合、可测试、可缓存
- 输入:JSON结构化参数(
-
Skills擅长:文本化流程
- 输入:自然语言描述
- 输出:自然语言结果
- 优势:灵活、易读、易维护
四、实战1:创建你的第一个Claude Skill
❧场景:代码审查Skill
Step 1:创建文件夹结构
css
mkdir -p ~/.config/claude-code/skills/code-reviewer
cd ~/.config/claude-code/skills/code-reviewer
Step 2:编写SKILL.md
yaml
---
name: code-reviewer
description: 专注于代码质量和架构的审查工具
---
# Code Reviewer
## 何时使用
- 提交代码前进行自审
- 审查同事的PR
- 重构时的架构评估
## 审查清单
- [ ] 安全性:是否有注入风险
- [ ] 性能:是否有低效查询
- [ ] 可读性:命名是否清晰
- [ ] 测试覆盖:关键路径是否有测试
## 指令
1. **快速扫描**:标记明显问题(空catch块、硬编码密钥)
2. **架构分析**:评估设计模式、依赖关系
3. **性能检查**:查找N+1查询、未优化循环
4. **具体建议**:给出可执行的修改方案
Step 3:测试Skill
css
# 在Claude Code中测试
"使用code-reviewer审查这段代码:[你的代码]"
❧常见踩坑指南
| 问题 | 原因 | 解决方法 |
|---|---|---|
| Skill触发不稳定 | description不够明确 | 在请求中显式指定"使用xxx Skill" |
| 上下文消耗大 | SKILL.md内容太多 | 引用外部文件:参考 resources/checklist.md |
| 版本混乱 | Skill修改后没有生效 | 删除旧版本或重命名Skill文件夹 |
五、实战2:开发你的第一个MCP Server
❧场景:简单计数器MCP
Step 1:初始化项目
bash
mkdir mcp-counter && cd mcp-counter
npm init -y
npm install @modelcontextprotocol/sdk zod
Step 2:编写Server代码
javascript
// index.ts
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";
const server = new McpServer({
name: "Counter",
version: "1.0.0"
});
let counter = 0;
// 注册Tool:add
server.tool(
"add",
"Add a value to the counter",
{
value: z.number().describe("Value to add")
},
async ({ value }) => {
counter += value;
return {
content: [{
type: "text",
text: `Added ${value}, total is now ${counter}`
}]
};
}
);
// 注册Tool:reset
server.tool(
"reset",
"Reset the counter to 0",
{},
async () => {
counter = 0;
return {
content: [{
type: "text",
text: "Counter reset to 0"
}]
};
}
);
// 注册Resource:counter状态
server.resource(
"counter",
"Current counter value",
{ uri: "mcp://resource/counter" },
(uri) => {
return {
contents: [{ text: String(counter), uri: uri.href }]
};
}
);
// 启动Server
const transport = new StdioServerTransport();
await server.connect(transport);
Step 3:配置到Claude Code
在~/.config/claude-code/mcp.json中:
json
{
"mcpServers": {
"counter": {
"command": "node",
"args": ["index.ts"],
"cwd": "/path/to/mcp-counter"
}
}
}
Step 4:测试MCP Server
bash
# 使用MCP Inspector测试
npx @modelcontextprotocol/inspector node index.ts
❧MCP Server类型对比
| 类型 | 配置 | 适用场景 |
|---|---|---|
| stdio | "command": "python", "args": ["server.py"] |
本地脚本、简单工具 |
| HTTP | "url": "http://localhost:3001/mcp" |
Web服务、远程调用 |
| SSE | "url": "http://localhost:3001/mcp", "transport": "sse" |
实时推送、长连接 |
六、协同模式:Skills + MCP = 超能力
Skills和MCP不是互斥的,而是互补的。
❧案例:自动化PR代码审查
需求:每当创建PR时,自动调用代码审查流程。
配置方案:
perl
// oh-my-opencode.json
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "your_token"
}
}
}
}
Skill工作流:
markdown
1. 使用github MCP获取PR信息
↓
2. code-reviewer Skill审查代码(遵循固定流程)
↓
3. 生成审查报告
↓
4. 使用github MCP发布评论
实际调用示例:
less
用户:审查GitHub PR #123
Sisyphus:
1. 调用github MCP获取PR代码
2. 使用code-reviewer Skill审查(按固定流程)
3. 生成审查报告
4. 调用github MCP发布评论
七、使用场景判断树

❧判断流程
-
你的任务有固定流程吗?
- 是 → 使用Skills
- 否 → 进入下一步
-
你需要访问外部数据或服务吗?
- 是 → 使用MCP
- 否 → 可能都不需要,直接用Claude对话即可
-
你的任务是否既需要固定流程,又需要外部数据?
- 是 → Skills + MCP协同
八、最佳实践与成本优化
❧Skills优化建议
| 优化项 | 具体方法 | 效果 |
|---|---|---|
| 保持精简 | SKILL.md控制在1-2KB以内 | 减少上下文消耗 |
| 外部引用 | 引用resources/和scripts/ | 按需加载,避免一次性加载全部 |
| 版本控制 | 用git管理Skills | 追踪变更、回滚 |
❧MCP优化建议
| 优化项 | 具体方法 | 效果 |
|---|---|---|
| 批量操作 | 支持一次处理多个请求 | 减少调用次数,降低延迟 |
| 缓存常用数据 | 使用Resource机制 | 避免重复计算 |
| 错误处理 | 返回清晰的错误信息 | 方便调试和重试 |
❧成本对比案例
假设任务:审查1000行代码,生成审查报告。
方案1:单Agent(Claude Code)
markdown
全程用Claude 3.5 Sonnet:
- 代码扫描:50K tokens → $0.15
- 审查分析:30K tokens → $0.09
- 报告生成:20K tokens → $0.06
- 总计:100K tokens,**$0.30**
方案2:Skills + MCP协同
markdown
- github MCP获取代码:5K tokens → $0.00
- code-reviewer Skill(加载指令):2K tokens → $0.00
- Claude Sonnet审查:20K tokens → $0.06
- github MCP发布评论:1K tokens → $0.00
- 总计:28K tokens,**$0.06**
节省 :80% ,且结果更精准(Skill定义的流程更规范)。
九、常见问题与解决方案
❧Q1:Skill和MCP能不能一起用?
A:可以,而且这是推荐的模式。
Skill可以调用MCP提供的工具。例如:
code-reviewerSkill调用githubMCP获取PR信息data-analystSkill调用sqliteMCP读取数据库
❧Q2:Skill会被遗忘吗?
A:会,这是当前的一个限制。
Claude有时会"忘记"加载Skill,或者加载错Skill。
解决方法:
- 在请求中显式指定:"使用code-reviewer Skill审查这段代码"
- 简化Skill的description,让触发更准确
- 复用高频Skill,降低遗忘概率
❧Q3:MCP需要写代码,有更简单的方式吗?
A:官方提供了预置MCP服务器。
| 预置MCP | 功能 | 安装 |
|---|---|---|
server-memory |
短期记忆 | npx @modelcontextprotocol/server-memory |
server-filesystem |
文件系统访问 | npx @modelcontextprotocol/server-filesystem /path/to/files |
server-github |
GitHub操作 | npx @modelcontextprotocol/server-github |
server-sqlite |
SQLite数据库 | npx @modelcontextprotocol/server-sqlite /path/to/db.db |
❧Q4:Skill和MCP的性能对比如何?
A:MCP通常更快,但Skill更灵活。
- MCP:每次只返回结构化结果,上下文消耗小,响应快
- Skill:需要加载完整指令,上下文消耗大,但可以处理复杂逻辑
建议:
- 简单工具操作 → MCP
- 复杂流程推理 → Skills
- 混合任务 → Skills + MCP
❧Q5:如何调试Skills和MCP?
A:使用日志和调试工具。
| 工具 | 用法 |
|---|---|
| Claude Code日志 | 查看Skill加载、MCP调用过程 |
| MCP Inspector | 测试MCP Server的工具和资源 |
--verbose |
在配置中启用详细输出 |
十、总结与扩展
❧核心要点回顾
| 概念 | 本质 | 适用场景 |
|---|---|---|
| Claude Skills | 工作流说明书 | 固定流程任务(代码审查、文档生成) |
| MCP Server | 工具接口标准 | 动态数据访问(GitHub、数据库) |
| Skills + MCP | 超能力组合 | 复杂多阶段任务(自动化PR流程) |
❧进阶学习路径
深入Skills:
- 学习Progressive Disclosure最佳实践
- 掌握Skill的版本控制策略
- 探索Skill之间的协同调用
深入MCP:
- 开发自定义MCP Server
- 学习HTTP和SSE传输方式
- 理解Tool、Resource、Prompt的完整能力
深入学习资源:
- Claude Skills官方文档:docs.claude.com/en/docs/age...
- MCP协议规范:modelcontextprotocol.io/docs[2]
- awesome-claude-skills:github.com/anthropics/...
❧互动引导
你目前遇到的开发任务,更适合用Skill还是MCP?
- 固定流程(如代码审查、文档生成)→ 尝试创建你的第一个Skill
- 外部服务(如GitHub、数据库)→ 尝试配置你的第一个MCP Server
- 复杂任务(两者都需要)→ 思考如何让Skill调用MCP工具
欢迎在评论区分享你的实践经验,或者提问遇到的问题!
记住:Skills和MCP不是二选一的关系,而是可以协同的工具。理解它们的本质差异,你就能根据任务类型做出最优选择。