深入解析MCP与agent skill
本文探讨了AI智能体技术从聊天模型向实用工具转型的关键挑战——如何安全高效地连接LLM与外部世界。重点介绍了模型上下文协议(MCP)这一开放标准,其通过三层架构(客户端-服务器-工具)实现"一次开发,到处使用"的目标。MCP提供三大核心原语:执行工具(Tools)、只读资源(Resources)和预设提示词(Prompts),并支持多种传输协议。文章还对比了MCP与Agent
在 AI 智能体技术飞速发展的今天,我们正见证着一场从"只会聊天的 LLM"向"能干活的智能体"的范式转移。这一转型的核心挑战在于:LLM 如何安全、高效地与外部世界连接?
本文将深入剖析业界最受关注的解决方案——模型上下文协议(Model Context Protocol, MCP),并探讨它与**智能体技能(Agent Skills)**之间的协作关系。
一、MCP 是什么?AI 界的"USB-C"标准
问题的由来
在 MCP 出现之前,将 AI 连接到数据库、API 或企业系统通常需要:
- 为每个数据源编写定制化的集成代码
- 针对不同 AI 应用重复开发相同的连接器
- 维护大量脆弱的"胶水代码"
MCP 的核心理念:建立一个开放标准,让 AI 应用与外部数据源之间的对接变得像插 USB-C 接口一样简单——一次开发,到处使用。
架构设计:三层分工明确
MCP 采用经典的客户端-服务器架构,包含三个核心角色:
┌─────────────────────────────────────────┐
│ 宿主 (Host) │
│ 如: Claude Desktop、VS Code │
│ ┌───────────────────────────────┐ │
│ │ MCP 客户端 (Client) │ │
│ │ 负责协议通信 │ │
│ └───────────┬───────────────────┘ │
└───────────────┼─────────────────────────┘
│ JSON-RPC 2.0
┌───────────▼───────────┐
│ MCP 服务器 (Server) │
│ ┌─────────────────┐ │
│ │ 工具 (Tools) │ │
│ │ 资源 (Resources)│ │
│ │ 提示词 (Prompts)│ │
│ └─────────────────┘ │
└───────────────────────┘
实际交互流程示例:
- 用户在 VS Code 中询问:“查询用户表结构”
- LLM 识别需要调用 MCP 工具
execute_sql - MCP客户端向 MCP 服务器发送 JSON-RPC 请求
- MCP服务器执行 SQL 查询并返回 JSON 格式结果
- MCP客户端收到后返回到LLM上下文中
- LLM 基于返回数据生成自然语言回复
⚠️注意:MCP服务器只与MCP客户端进行交互。
二、三大核心原语:构建能力的基础模块
MCP 服务器通过三类原语(Primitives)向 AI 暴露能力:
1. 工具(Tools)- LLM 的"执行手"
- 控制权:由 LLM 决定何时调用
- 特性:可以对外部系统进行操作(写数据库、发邮件、执行代码)
- 类比:REST API 的 POST 请求
代码示例(Python):
# 目前已经有了专门的类来实现MCP服务,如FASTMCP
@mcp.tool()
def execute_sql(query: str) -> str:
"""在生产数据库上执行只读 SQL 查询
Args:
query: 标准 SQL 语句(必须包含 LIMIT 子句)
"""
# 安全检查
if "LIMIT" not in query.upper():
raise ValueError("查询必须包含 LIMIT 以防止全表扫描")
return database.execute(query)
2. 资源(Resources)- 知识的"信息源"
- 控制权:由应用程序管理访问权限
- 特性:只读数据,不产生副作用
- 类比:REST API 的 GET 请求
典型用途:
- 本地文件内容(
file:///path/to/doc.md) - 实时日志流(
logs://production/errors) - 数据库表结构(
schema://users)
3. 提示词(Prompts)- 工作流的"模板引擎"
- 控制权:由用户选择和触发
- 特性:预设的指令框架,确保任务执行一致性
使用场景:
# 提示词:代码审查助手
请按以下标准审查代码:
1. 安全性:检查 SQL 注入、XSS 等漏洞
2. 性能:识别 N+1 查询、内存泄漏
3. 可维护性:评估命名规范、注释完整性
[用户代码将插入此处]
三、传输协议深度解析
MCP 服务器支持多种传输机制以适应不同部署场景:
stdio(标准输入输出)
适用场景:用于本地部署MCP服务,然后通过stdio协议进行本地自调用。如Claude Desktop与本地自己部署的MCP服务的调用。
关键限制:
# ❌ 错误示例 - 会破坏 JSON-RPC 通信
print("正在查询数据库...")
# ✅ 正确示例 - 使用标准错误输出调试
import sys
print("DEBUG: 查询参数=" + query, file=sys.stderr)
原因:stdio 模式下,标准输出(stdout)专用于传输 JSON-RPC 消息,print()等方法会将信息存储到stdin中从而破坏了传输的 JSON-RPC。任何非协议数据都会导致连接崩溃。
HTTP + SSE
组合优势:
- HTTP POST:客户端向远程MCP服务器发送指令,可以对MCP服务进行操作(如插入数据到数据库等)
- SSE(服务器发送事件):MCP服务器完成操作后推送实时更新(如进度条)到MCP客户端。
四、性能优化:渐进式上下文加载
Token 消耗控制策略
假设场景:接入 100 个 MCP 服务,每个服务提供 10 个工具。
传统做法(不可行):
- 将所有工具的完整文档一次性加载到上下文
- 估算 Token 消耗:100 × 10 × 50 = 50,000 tokens
MCP 的分层加载机制:
- 初始化阶段 - 仅传输元数据
{
"name": "execute_sql",
"description": "执行只读 SQL 查询",
"inputSchema": {
"type": "object",
"properties": {
"query": {"type": "string"}
}
}
}
- 调用阶段 - 按需加载详细数据
- LLM 根据元数据判断是否需要调用工具
- 仅当工具被触发时,实际数据才进入上下文
这里的设计思想类似于agent skill
Token 节省:初始阶段仅消耗约 5,000 tokens(减少 90%)
五、MCP 与 Agent Skills:策略与执行的完美配合
许多开发者混淆两者的定位。实际上,它们是互补关系:
对比矩阵
| 维度 | Agent Skills | MCP |
|---|---|---|
| 本质 | 知识与工作流(SOP) | 连接能力 |
| 表现形式 | Markdown 文档 | 代码服务器 |
| 作用对象 | 指导 LLM 的决策逻辑 | 提供 LLM 的执行手段 |
| 类比 | 企业操作手册 | API 接口 |
skill 仅仅会将skill中定义的信息加载到模型上下文中(当需要的时候),并不具备调用外部接口的能力。
协作示例:数据库审计智能体
Skill 文档(database-audit-skill.md):
# 数据库审计技能
## 核心原则
1. 所有查询必须包含 `LIMIT` 子句(最大 1000)
2. 禁止使用 `SELECT *`,必须明确列名
3. 敏感字段(如密码)需脱敏处理
## 工作流程
1. 解析用户需求 → 生成 SQL
2. 调用 MCP 工具(audit_query)执行查询
3. 格式化结果并标注风险点
MCP 服务器(执行层):
@mcp.tool()
def audit_query(sql: str) -> dict:
"""执行审计查询并返回风险评分"""
# Skill 的策略在这里被强制执行
validate_sql_safety(sql) # 检查 LIMIT、SELECT * 等
result = execute_with_monitoring(sql)
return {
"data": mask_sensitive_fields(result),
"risk_score": calculate_risk(sql)
}
协作逻辑:
- Skill 定义了"什么是安全的查询"(策略层)
- MCP 提供了"如何执行查询"的能力(执行层)
- LLM 先阅读 Skill 学习最佳实践,再通过 MCP 调用工具
六、实战部署:快速上手
场景 1:为 Claude Desktop 添加 GitHub 集成
步骤:
- 安装官方 MCP 服务器:
npm install -g @modelcontextprotocol/server-github
- 配置
claude_desktop_config.json:
{
"mcpServers": {
"github": {
"command": "mcp-server-github",
"env": {
"GITHUB_TOKEN": "your_token_here"
}
}
}
}
- 重启 Claude Desktop,测试查询:
"列出我的仓库中最近打开的 Issues"
场景 2:自定义 MCP 服务器(天气查询)
完整代码(TypeScript):
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
const server = new Server({
name: "weather-server",
version: "1.0.0"
}, {
capabilities: {
tools: {}
}
});
server.setRequestHandler("tools/list", async () => ({
tools: [{
name: "get_weather",
description: "获取指定城市的天气",
inputSchema: {
type: "object",
properties: {
city: { type: "string" }
},
required: ["city"]
}
}]
}));
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "get_weather") {
const weather = await fetchWeather(request.params.arguments.city);
return { content: [{ type: "text", text: JSON.stringify(weather) }] };
}
});
const transport = new StdioServerTransport();
await server.connect(transport);
七、生态现状与未来展望
MCP Registry:生态系统的催化剂
类似于 npm、PyPI,Anthropic 推出了 MCP Registry,提供官方验证的服务器:
热门集成:
- 生产力:Google Drive、Slack、Notion
- 开发工具:GitHub、GitLab、Sentry
- 数据库:PostgreSQL、MongoDB、Snowflake
- 监控:Prometheus、Datadog
未来趋势
-
企业级功能增强
- 细粒度权限控制(RBAC)
- 审计日志与合规性支持
- 多租户隔离
-
工具链完善
- 可视化配置工具
- 性能监控仪表板
- 自动化测试框架
-
跨模型兼容性
- OpenAI GPTs 支持 MCP
- 开源模型(Llama、Mistral)原生集成
总结
MCP 的诞生标志着 AI 生态系统迈向标准化与模块化时代。它不仅打破了模型的知识截止日期限制,更让企业能够以安全、可控的方式授权 AI 访问私有数据。
核心洞察:
- MCP 提供"手"(执行能力)
- Agent Skills 提供"脑"(决策逻辑)
- 两者结合才能构建真正强大的智能体
未来,构建企业级 AI 应用可能只需三步:
- 从 MCP Registry 挑选标准服务器
- 编写定制化的 Agent Skills
- 通过配置文件完成集成
下一步行动:
如果你想深入实践,推荐从以下方向入手:
- 官方文档
- GitHub 示例仓库
- 社区 Discord - 与全球开发者交流经验
更多推荐



所有评论(0)