Skill vs MCP:扩展能力的两条路径 OpenClaw 给 AI 加能力有两条路:Skill 和 MCP。一个像"内在技能",把知识直接灌进 AI 的脑子里;一个像"外部装备",通过标准协议连接外部工具和数据源。选对了路径,开发效率高十倍;选错了,事倍功半。本节帮你彻底搞清楚两者的区别和适用场景。 本节地图 完成本节学习后,你将能够: 准确描述 Skill 和 MCP 各自的本质和运作方式 列出 MCP 的三大原语(Tools、Resources、Prompts)及其作用 根据具体需求判断应该使用 Skill 还是 MCP 设计 Skill + MCP 混合使用的扩展方案 估算技能对上下文窗口的 token 消耗 一、两种扩展哲学 用一个比喻来理解 Skill 和 MCP 的区别。
OpenClaw 给 AI 加能力有两条路:Skill 和 MCP。一个像"内在技能",把知识直接灌进 AI 的脑子里;一个像"外部装备",通过标准协议连接外部工具和数据源。选对了路径,开发效率高十倍;选错了,事倍功半。本节帮你彻底搞清楚两者的区别和适用场景。
完成本节学习后,你将能够:
用一个比喻来理解 Skill 和 MCP 的区别。
假设你在玩一个 RPG 游戏,想给角色增加"火焰"能力。有两种方式:
方式 A:学习火球术——这是角色内在的能力,随时可用,不需要额外装备,但占用技能槽位。
方式 B:装备火焰法杖——这是外部工具,需要装备后才能用,但可以随时切换,不占用技能槽。
在 OpenClaw 的世界里:
两者都能扩展 AI 的能力,但设计哲学、使用场景和实现方式完全不同。
Skill(技能)是 OpenClaw 的原生扩展机制。每个技能是一个文件夹,核心是一个 SKILL.md 文件,包含元数据和操作指令。
| 特点 | 说明 |
|---|---|
| 自包含 | 所有指令、脚本、资源打包在一个文件夹 |
| 上下文嵌入 | 技能指令直接加载到 AI 的系统提示中 |
| 工具导向 | 主要指导 AI 如何使用特定工具或完成特定任务 |
| 静态知识 | 封装的是领域知识、工作流程、最佳实践 |
OpenClaw 采用三层渐进式加载:
| 层级 | 内容 | 加载时机 | Token 成本 |
|---|---|---|---|
| 元数据 | name + description | 始终加载 | 约 100 词 |
| SKILL.md 正文 | 核心指令 | 技能触发时 | 不超过 5000 词 |
| 资源文件 | scripts / references / assets | AI 按需决定 | 无限制 |
关键特性是触发驱动——只有和当前任务相关的技能才会加载完整内容,其他技能只保留元数据。
| 适合 | 不适合 |
|---|---|
| 领域知识封装(金融模型、法律规则) | 动态数据源(实时 API、数据库查询) |
| 工作流程指导(多步骤操作) | 需要认证的外部服务 |
| 工具使用教程(CLI 命令、API 调用) | 大规模数据访问 |
| 企业专有知识(内部规范、代码库结构) | 频繁更新的内容 |
| 输出模板(文档格式、报告样式) | 需要实时响应的场景 |
MCP(Model Context Protocol,模型上下文协议)是一个开放标准协议,用于连接 AI 应用与外部系统。可以把它理解为 AI 的 USB-C 接口——一个通用的插口,能连接各种外部设备。
| 特点 | 说明 |
|---|---|
| 协议标准化 | 基于 JSON-RPC 2.0 的通用协议 |
| 网络通信 | 支持 STDIO(本地进程)和 HTTP(远程服务) |
| 客户端-服务器架构 | OpenClaw 作为客户端,连接多个 MCP 服务器 |
| 三大原语 | Tools(工具)、Resources(资源)、Prompts(提示模板) |
| 原语 | 用途 | 示例 |
|---|---|---|
| Tools | AI 可调用的函数 | query_database()、create_file() |
| Resources | 提供上下文的数据源 | 文件内容、数据库 Schema |
| Prompts | 可重用的交互模板 | 系统提示模板、Few-shot 示例 |
工具调用的请求和响应格式如下:
// 请求 { "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "weather_current", "arguments": { "location": "Beijing", "units": "metric" } } } // 响应 { "jsonrpc": "2.0", "id": 1, "result": { "content": [{ "type": "text", "text": "北京当前温度 22°C,多云" }] } }
| 适合 | 不适合 |
|---|---|
| 外部服务集成(GitHub、Slack) | 静态知识传递(教程、规范) |
| 数据访问(数据库、文件系统) | 工作流程指导(多步骤操作) |
| 动态数据源(实时 API) | 简单的本地脚本操作 |
| 需要认证的服务(OAuth、API Key) | 不需要与外部交互的纯知识 |
| 大规模数据访问 | 一次性操作 |
| 对比维度 | Skill | MCP |
|---|---|---|
| 本质 | 知识载体 | 通信协议 |
| 部署位置 | 本地文件夹 | 独立进程(本地或远程) |
| 通信方式 | 直接读取到上下文 | JSON-RPC 2.0 |
| 数据流向 | 静态指令 → AI | AI ↔ 服务器 ↔ 数据源 |
| Token 消耗 | 加载到上下文,消耗 token | 仅传输结果,低 token 消耗 |
| 适用数据 | 静态知识、工作流程 | 动态数据、实时 API |
| 更新频率 | 手动更新 | 实时或按需更新 |
| 开发复杂度 | 简单(写 Markdown) | 中等(需实现服务器逻辑) |
| 扩展性 | 受限于上下文窗口 | 无限制(独立服务器) |
| 跨平台 | OpenClaw 专用格式 | 跨所有 MCP 客户端 |
Skill 的 Token 成本:
每个技能的基础开销约为 97 字符加上 name、description、location 的长度。以 10 个技能为例,平均每个技能 name 15 字符、description 100 字符、location 50 字符:
总成本 = 195 + 10 x (97 + 15 + 100 + 50) = 2815 字符 ≈ 700 tokens
MCP 的 Token 成本:
MCP 的连接开销几乎为零(元数据不加载到上下文),调用成本只有工具调用的请求和响应。一次天气查询大约消耗 100-200 tokens。
结论:MCP 对上下文窗口的影响远小于 Skill。当技能数量很多时,这个差异更加明显。
Skill 开发流程:
预计耗时:30 分钟到 2 小时。
MCP 服务器开发流程:
预计耗时:4 小时到数天,取决于复杂度。
💡 提示:如果你只是想让 AI 按照特定流程完成一项任务,写一个 Skill 就够了,不用上 MCP。MCP 更适合需要连接外部系统、访问动态数据的场景。
| 需求 | 选择 | 原因 |
|---|---|---|
| PDF 文本提取和页面旋转 | Skill | 操作是确定性的,可用脚本封装,知识是静态的 |
| GitHub PR 管理 | MCP | 需要访问远程 API,数据实时变化,需要认证 |
| 企业知识库搜索 | MCP | 数据在外部系统,频繁更新,需要认证,数据量大 |
| 代码规范指南 | Skill | 规范是静态知识,需要详细指导和示例 |
| CI/CD 流程指导 | Skill | 工作流程是静态知识 |
| Jenkins 任务查询 | MCP | 动态数据,需要认证 |
| Kubernetes 集群状态 | MCP | 实时数据,远程 API |
实际项目中,Skill 和 MCP 往往是组合使用的。以构建一个 DevOps 助手为例:
| 能力 | 实现方式 | 原因 |
|---|---|---|
| CI/CD 流程指导 | Skill | 工作流程是静态知识 |
| Jenkins 任务查询 | MCP | 动态数据,需要认证 |
| 日志分析技巧 | Skill | 分析方法是静态知识 |
| 实时日志获取 | MCP | 动态数据,大数据量 |
| 部署规范 | Skill | 企业规范,静态知识 |
| K8s 集群状态 | MCP | 实时数据,远程 API |
配置示例:
{ "skills": { "entries": { "cicd-workflow": { "enabled": true }, "log-analysis": { "enabled": true }, "deployment-guide": { "enabled": true } }, "load": { "extraDirs": [ "./mcp-servers/jenkins", "./mcp-servers/k8s" ] } } }
⚠️ 注意:不要在 Skill 中硬编码外部 API 的调用逻辑。如果一个操作需要访问外部服务、处理认证、解析动态响应,那它应该用 MCP 来实现,而不是在 Skill 脚本中手动处理。
# 初始化 scripts/init_skill.py my-skill --path ~/.openclaw/workspace/skills --resources scripts,references # 编写 SKILL.md(核心步骤) # 添加 scripts/ 和 references/ # 打包 scripts/package_skill.py ~/.openclaw/workspace/skills/my-skill
# 初始化项目 npm init -y npm install @modelcontextprotocol/sdk
import { Server } from "@modelcontextprotocol/sdk/server/index.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; const server = new Server({ name: "my-mcp-server", version: "1.0.0" }); server.addTool({ name: "my_tool", description: "工具描述", inputSchema: { type: "object", properties: { param1: { type: "string" } } } }); const transport = new StdioServerTransport(); await server.connect(transport);
💡 提示:如果你之前没写过 MCP 服务器,建议先从官方示例入手,跑通一个最简单的 "Hello World" 级别的服务器,理解协议交互流程后再开发自己的业务逻辑。