MCP 和 Skills 有什么区别?分别适用于什么场景?

魏远标 Lv7

参考答案

MCP 给 Agent 提供”工具”,Skills 给 Agent 提供”方法论”,两者解决的是完全不同层面的问题。

MCP 全称 Model Context Protocol,是一套标准化的工具调用协议,让 AI Agent 能调用外部服务。查数据库、调 API、读文件系统,都是通过 MCP 来实现的。它解决的是 Agent “能不能做”的问题。

Skills 是一套指令文档,告诉 Agent 遇到某类任务应该怎么做、按什么顺序做、要注意什么。它解决的是 Agent “会不会做”和”做得好不好”的问题。

MCP 相当于给厨师配了一套厨具,锅碗瓢盆、烤箱微波炉;Skills 相当于给厨师一本菜谱,红烧肉先焯水再上色,火候多大放多少料。光有工具不知道怎么用,做不出好菜;光有菜谱没有工具,也做不了饭。

维度 MCP Skills
本质 工具调用协议 指令知识文档
解决的问题 Agent 能力边界扩展 Agent 任务执行质量
运行时行为 发起外部调用,获取结果 注入上下文,引导决策
技术形态 客户端-服务端架构,JSON-RPC 通信 Markdown 文件,纯文本
开发成本 需要写代码,部署服务 主要写文档就行,可零代码、也可提供脚本
动态性 实时调用,结果随外部状态变化 静态知识,加载后不变

扩展知识

两者的协作关系

实际的 Agent 系统中,MCP 和 Skills 通常是配合使用的。看一个典型场景:

用户说:”帮我创建一个 MCP Server”

Agent 的处理流程是这样的:

首先系统识别出这是一个”创建 MCP Server”的任务,加载对应的 Skill。然后 Agent 读取 Skill 中定义的标准流程,包括创建项目结构、写 Server 代码、配置 Transport、注册 Tools 等步骤。在执行过程中,Agent 通过 MCP 协议调用文件系统工具来创建文件、调用终端工具来安装依赖。

Skill 决定了”做事的顺序和方法”,MCP 提供了”做事所需的工具”,两者缺一不可。

与其他相似概念的对比

面试中可能还会追问 Skills 和其他概念的区别,这里一并梳理。

Skills vs System Prompt

System Prompt 是全局性的,每次对话都会生效;Skill 是按需加载的,只在匹配到特定任务时才注入。如果所有知识都塞进 System Prompt,上下文会过长、Token 浪费严重。

Skills 的设计就是为了解决这个问题,把知识模块化,按需组装。

Skills vs RAG

RAG 侧重于”检索知识来回答问题”,检索粒度是知识片段 Chunk,产出的是信息。Skills 侧重于”加载流程来指导行动”,加载粒度是完整的操作文档,产出的是行为。

在 Agent 系统中,两者可能同时存在:Skill 告诉 Agent 怎么处理文档问答任务,RAG 负责在执行过程中检索具体知识。

Skills vs Function Calling

Function Calling 和 MCP 类似,都是让 LLM 能调用外部函数。Skills 和 Function Calling 处于不同层次:Function Calling 是能力层,管的是”能做什么”;Skills 是策略层,管的是”怎么做”。

什么时候用 Skills,什么时候用 MCP

给一个简单的判断标准:

1)想让 Agent 能做某件事,比如读数据库、发邮件、操作浏览器,上 MCP
2)想让 Agent 把某件事做好,比如按照团队规范写代码、按标准流程做 Code Review,上 Skills
3)大多数实际场景两者都需要,组合使用就对了

面试官追问

提问:MCP 的 JSON-RPC 通信具体是怎么回事?为什么不直接用 HTTP?

回答:MCP 底层用的是 JSON-RPC 2.0 协议,比裸 HTTP 更轻量,天然支持请求-响应和通知两种模式。HTTP 每次请求都带一堆 header,开销不小;JSON-RPC 只需要 method、params、id 三个字段就够了。另外 MCP 的传输层是可插拔的,本地 Agent 用 stdio 直接走标准输入输出,延迟极低;远程场景用 Streamable HTTP。

提问:如果一个 Skill 里需要调用某个 MCP 工具,但那个工具没装怎么办?

回答:这就涉及到 Agent 的容错设计了。好的做法是在 Skill 里声明工具依赖,执行前先检查所需的 MCP 工具是否可用。不可用的话有几种处理方式:一是 Agent 直接告诉用户缺少哪个工具,给出安装提示;二是 Skill 里提供降级方案,比如文件系统的 MCP 工具不可用时,退回到让用户手动创建文件。Cursor 目前的做法更简单粗暴,Skill 里写的工具调用如果失败了,Agent 会自动尝试其他方式完成,算是一种隐式的容错。

提问:团队里多个人的 Skills 文件冲突了怎么处理?

回答:Skills 文件本身就是普通的 Markdown 文件,放在项目仓库里跟着代码一起走版本控制。冲突了跟代码冲突一样,Git merge 解决。关键是要在团队层面建立规范,比如按职能划分 Skill 的 ownership,前端团队管前端相关的 Skill,后端团队管后端的,避免多人同时改同一个文件。Cursor 的做法是区分全局 Skills 和项目级 Skills,全局的放用户目录,项目级的放 .cursor/ 目录,天然隔离了个人偏好和项目规范。