跳到主要内容

MCP Skills

· 阅读需 8 分钟
Wuji
AI Engineer

从 function tool 开始

2023 年之前,大语言模型只能做一件事:生成文本。你问它问题,它给你一段文字回答,仅此而已。它说的再好听,也只是「说」,不能「做」。

Function Call 的出现彻底改变了这个局面。它是 OpenAI 在 2023 年 6 月率先推出的一种能力,简单来说就是让 LLM 不仅能生成文字,还能告诉外界程序「我想调用某个函数,参数是这些」。

Function Call 的工作流程分四步。

第一步,定义函数

开发者预先告诉 LLM「你手边有哪些工具可以用」,用 JSON 格式描述每个函数的名字、功能说明和参数。比如你告诉它有一个 get_weather 函数,接收一个城市名参数,返回天气信息。

{
"tools": [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市的实时天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,比如:上海"
}
},
"required": ["city"]
}
}
}
]
}

第二步,模型判断

用户提问后,LLM 分析用户的意图,自己判断「要回答这个问题,我需要调用哪个函数」。如果用户问「上海今天天气如何」,LLM 会决定调用 get_weather,并生成参数 {"city": "上海"}

{
"tool_calls": [
{
"type": "function",
"function": {
"name": "get_weather",
"arguments": "{\"city\": \"上海\"}"
}
}
]
}

第三步,执行函数

注意,这一步非常关键,LLM 自己并不执行函数。它只是输出了「我想调用这个函数,参数是这些」的结构化指令。真正执行函数的是你的应用程序。你的代码拿到 LLM 返回的调用指令后,解析出 city=上海,去实际调用天气 API,拿到结果比如 22度,多云。

第四步,生成回答

你的代码把拿到的真实温度数据再次发给 LLM。LLM 这次有了客观数据支撑,就会用非常自然的人类语言回复你:今天上海天气是多云,气温大约 22 摄氏度。

MCP 的诞生

用 Function Call 的方式,你需要为每一个服务单独写适配代码,为 Slack 写一套函数定义和调用逻辑、为 Google Drive 写一套、为 GitHub 写一套、为数据库又写一套。

如果你有 N 个 AI 应用,要对接 M 个外部服务,就需要写 N × M 个定制集成。这在实际中完全不可扩展。更头疼的是,每个 LLM 厂商的 Function Call 格式还不完全一样,OpenAI 用 tool_calls,Anthropic 用 tool_use content block,参数结构也有差异。

为了解决这个问题,Anthropic 在 2024 年 11 月开源了 MCP(Model Context Protocol,模型上下文协议)。你可以把 MCP 理解为「AI 界的 USB-C 接口」。

MCP 是怎么工作的?

MCP 的架构很清晰,主要有三个角色。

  • 首先是 MCP Host(宿主),就是你使用的 AI 应用,比如 Claude Desktop、Cursor 编辑器、你自己开发的 Agent 应用。它是整个交互的发起方。
  • 然后是 MCP Client(客户端),它住在 Host 里面,负责跟 MCP Server 通信。你可以把它理解为"翻译官",Host 想要什么能力,Client 就去跟对应的 Server 沟通。
  • 最后是 MCP Server(服务端),它负责对外暴露具体的工具能力和数据资源。比如有一个 GitHub MCP Server,它能提供"搜索代码""创建 Issue""查看 PR"等工具。一个 Slack MCP Server 能提供"发送消息""搜索频道"等工具。

整个流程就是:用户在 AI 应用中提问 → AI 应用(Host)通过 MCP Client 发现有哪些可用工具 → AI 决定调用某个工具 → MCP Client 向对应的 MCP Server 发送请求 → Server 执行操作返回结果 → AI 基于结果生成回答。

Skills 是什么?

前面讲了 Function Call 让 Agent 能调用函数,MCP 让 Agent 用统一标准连接工具。但你有没有想过一个问题:Agent 知道怎么调用工具了,但它知道在什么场景下该用什么方法来解决问题吗?

打个比方。你给一个新来的实习生一把锤子、一把螺丝刀、一个扳手(这些是工具),但他可能还是不知道"修一把椅子应该先拧螺丝还是先敲钉子、用什么顺序和方法"。他缺的不是工具,而是经验和方法论,也就是"怎么做"的知识。

这就是 Skills(技能) 要解决的问题。

Skills 是一种自然语言指令文件,通常是 Markdown 格式,用来教 Agent"在什么场景下、按照什么方法、遵循什么规范来完成特定任务"。

在 Claude Code、Cursor 等 AI 工具中,Skills 通常以 SKILL.md 文件的形式存在。

Skills 的结构很简单:顶部有一段 YAML 格式的元数据,声明这个 Skill 什么时候应该被激活(比如"当用户要求代码审查时");下面是具体的行为指令,用自然语言写成。

---
name: Code_Review_Expert
description: 当用户要求进行代码审查时,自动触发此技能。
triggers:
- "帮我 review 一下这段代码"
- "代码审查"
---

# 身份设定
你是一个拥有 10 年开发经验的资深后端架构师,你极其看重代码的可读性、性能和安全性。

# 审查工作流
当你进行代码审查时,你必须严格按照以下步骤进行排查:
1. 看结构:检查代码是否符合单一职责原则,有没有超过 100 行的超长方法。
2. 查漏洞:重点检查是否存在 SQL 注入风险、越权访问风险或空指针异常风险。
3. 审性能:是否有在 for 循环里查数据库的愚蠢操作?是否有流对象没有及时 close 释放?
4. 给方案:你绝对不能只挑毛病,必须针对每个问题给出具体的修改建议,并且附带优化后的代码片段。

# 输出规范
语气要专业、极其直接,不要说废话。直接输出一份 Markdown 格式的审查报告,分点列出问题和修改方案。

Skills 的工作方式

Skills 的工作方式跟 Function Call 和 MCP 有本质不同。

Function Call 和 MCP 都是让 Agent "执行外部操作",调用 API、查询数据库、发送消息,这些操作发生在 Agent 外部。

而 Skill 不只是告诉 Agent 怎么想,它还能指导 Agent 怎么做,一个 Skill 可以在 SKILL.md 文件中通过 allowed-tools 字段声明它需要使用哪些工具,也可以打包可执行的脚本文件,甚至可以指导 Agent 去调用 MCP 工具或发起Function Call

具体来说,当 Agent 启动时,它会扫描可用的 Skills 列表。当用户提出请求时,Agent 判断有没有匹配的 Skill。如果有,Agent 就把这个 Skill 的内容加载到上下文中,然后按照 Skill 中的指令来思考和行动。

这就像给 Agent 「临时注入了一段专业经验」。没加载 Skill 之前,Agent 只有通用能力;加载了特定 Skill 之后,Agent 在这个领域就变成了专家。

Function Call、MCP、Skills 有什么区别

想象 Agent 是一个新入职的员工。Function Call 就是"打电话的能力",这个员工学会了怎么拿起电话、拨号、跟对方沟通。这是最基础的能力,没有这个能力他就没法跟外部世界互动。

MCP 就是"公司的通讯录和电话系统",它统一管理所有外部联系方式(供应商、合作伙伴、服务商),员工不需要自己记住每个人的电话号码和通话方式,直接查通讯录就行。新增一个联系人只要加到通讯录里,所有员工都能用。

Skills 就是"岗位培训手册",它告诉员工"遇到客户投诉应该按什么流程处理""做报表应该用什么模板和方法""跟供应商谈判要注意哪些要点"。它教的是做事的方法和规范,而不是打电话的技术。

如果用更技术的语言来说,三者的区别体现在几个维度上。

从解决的问题来看,Function Call 解决的是"LLM 怎么跟外部函数交互"这个最基础的问题。MCP 解决的是"怎么用统一标准管理大量工具"的集成问题。Skills 解决的是"Agent 怎么获得领域专业知识"的知识问题。

从运行位置来看,Function Call 的函数在你的应用程序中执行。MCP 的工具在外部的 MCP Server 中执行。Skills 完全在 Agent 的上下文窗口内生效,不涉及任何外部调用。

从技术本质来看,Function Call 是一种 API 协议,LLM 输出结构化的调用请求,应用程序执行后返回结果。MCP 是一种通信标准,定义了 Client 和 Server 之间如何发现和调用工具。Skills 是一种提示词扩展,用自然语言编写的行为指令,加载到 Agent 的上下文中。

从标准化程度来看,Function Call 在各 LLM 厂商之间格式不统一(OpenAI 和 Anthropic 的格式就不一样)。MCP 是统一的开放标准,跨厂商通用。Skills 目前还没有统一标准,各个 Agent 平台有自己的 Skill 格式。