🔗 MCP 协议完全实战指南
"世界上有一种协议叫 MCP,它像是 AI 和工具之间的翻译官。你说中文,它翻成代码;你想查数据,它递上结果。"
什么是 MCP?
MCP(Model Context Protocol,模型上下文协议)是连接 AI 模型与外部工具的标准协议。它定义了 AI 如何"发现"可用工具、如何"调用"这些工具、以及如何"理解"返回结果。
简单来说,MCP 就像是给 AI 装了一个 USB 接口——不管后面接的是硬盘、摄像头还是打印机,AI 都知道怎么和它对话。
为什么 MCP 很重要?
- 标准化 - 不同厂商的工具可以用统一方式接入
- 可发现 - AI 能自动了解有哪些工具可用
- 类型安全 - 参数和返回值都有明确定义
- 生态互通 - OpenClaw、Claude、GPT 都能用同一套工具
MCP 核心概念
1. Server(服务端)
提供工具能力的一方。可以是本地程序,也可以是远程服务。
2. Client(客户端)
使用工具的一方。在 OpenClaw 中,Agent 就是 MCP Client。
3. Tool(工具)
具体的功能单元,比如"搜索网页"、"读取文件"、"发送邮件"。
4. Resource(资源)
工具能访问的数据源,如数据库连接、API 密钥、文件路径等。
OpenClaw 中使用 MCP
配置 MCP Server
# mcp.config.json
{
"servers": [
{
"name": "filesystem",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/home/user/docs"],
"env": {
"NODE_ENV": "production"
}
},
{
"name": "brave-search",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-brave-search"],
"env": {
"BRAVE_API_KEY": "${BRAVE_API_KEY}"
}
}
]
}
在 Agent 中调用 MCP 工具
// 在 Agent 代码中使用 MCP
const { MCPClient } = require('openclaw/mcp');
class SearchAgent {
async init() {
this.mcp = new MCPClient();
await this.mcp.connect('brave-search');
}
async search(query) {
// AI 会自动选择合适的工具
const tools = await this.mcp.listTools();
console.log('可用工具:', tools.map(t => t.name));
// 调用 brave_web_search 工具
const result = await this.mcp.callTool('brave_web_search', {
query: query,
count: 10
});
return result.content;
}
}
// 使用示例
const agent = new SearchAgent();
await agent.init();
const results = await agent.search('OpenClaw MCP 教程');
开发自定义 MCP Server
基础 Server 结构
// my-mcp-server.js
const { Server } = require('@modelcontextprotocol/sdk/server');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio');
const server = new Server(
{ name: 'my-custom-server', version: '1.0.0' },
{ capabilities: { tools: {} } }
);
// 注册工具
server.setRequestHandler('tools/list', async () => {
return {
tools: [
{
name: 'calculate',
description: '执行数学计算',
inputSchema: {
type: 'object',
properties: {
expression: {
type: 'string',
description: '数学表达式,如 "2 + 2"'
}
},
required: ['expression']
}
}
]
};
});
// 处理工具调用
server.setRequestHandler('tools/call', async (request) => {
if (request.params.name === 'calculate') {
const { expression } = request.params.arguments;
try {
// 注意:生产环境请使用安全的计算库
const result = eval(expression);
return {
content: [{ type: 'text', text: String(result) }]
};
} catch (error) {
return {
content: [{ type: 'text', text: `计算错误: ${error.message}` }],
isError: true
};
}
}
throw new Error(`未知工具: ${request.params.name}`);
});
// 启动服务器
const transport = new StdioServerTransport();
server.connect(transport);
最佳实践
✅ MCP Server 设计原则
- 描述清晰 - 工具描述要准确,帮助 AI 理解何时使用该工具
- 参数精简 - 必填参数尽量少,可选参数提供合理默认值
- 错误具体 - 返回有意义的错误信息,帮助 AI 调整策略
- 结果结构化 - 使用 JSON 格式返回结构化数据
安全注意事项
// ✅ 安全的参数校验
const sanitize = require('validator');
async handleCalculate(args) {
const { expression } = args;
// 只允许数学表达式
if (!/^[\d+\-*/().\s]+$/.test(expression)) {
throw new Error('表达式包含非法字符');
}
// 限制长度
if (expression.length > 100) {
throw new Error('表达式过长');
}
// 使用安全的计算方式
return safeCalculate(expression);
}
MCP vs A2A:如何选择?
| 特性 | MCP | A2A |
|---|---|---|
| 定位 | 模型-工具协议 | Agent-Agent协议 |
| 通信方式 | 同步调用 | 异步消息 |
| 适用场景 | 工具调用、数据获取 | 多Agent协作 |
| 复杂度 | 低 | 高 |