教程中心MCP 协议
进阶

MCP 协议实战:让 Agent 连接一切工具

2026.04.22· 55 分钟实战· 🎨 Cursor + 🌊 OpenClaw

Function Calling 只能让 Agent 调用你写好的函数。MCP(Model Context Protocol)是标准化的工具协议,让 Agent 像插 USB 一样连接任意工具——数据库、文件系统、浏览器、API,插上就能用。

💡 MCP 是 Anthropic 提出的开放协议,已成为 AI Agent 工具连接的事实标准。Cursor、OpenClaw 等主流产品均已支持。

理解 MCP:AI 的 USB 接口

1 MCP 的核心概念
MCP 架构:

┌─────────────┐     MCP 协议     ┌─────────────┐
│  AI Agent   │ ←──────────────→ │  MCP Server │
│  (Client)   │    标准通信       │  (工具端)    │
└─────────────┘                  └─────────────┘
                                      │
                                      ├── 🔧 工具 (Tools)
                                      │    可被调用的函数
                                      │
                                      ├── 📄 资源 (Resources)
                                      │    可读取的数据
                                      │
                                      └── 💬 提示 (Prompts)
                                           可复用的提示模板

类比理解:
- MCP Client = 电脑(需要使用工具)
- MCP Server = USB 设备(提供工具能力)
- MCP 协议 = USB 标准(统一的通信规则)

为什么需要 MCP?
- Function Calling:每个 Agent 自己定义工具 → 不通用
- MCP:统一的工具协议 → 写一次,所有 Agent 都能用

步骤一:搭建 MCP Server

2 用 Cursor 快速创建 MCP Server

在 Cursor 中创建一个简单的 MCP Server:

// 示例:天气查询 MCP Server

const { Server } = require("@modelcontextprotocol/sdk/server");
const { StdioServerTransport } = require("@modelcontextprotocol/sdk/server/stdio");

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",
            description: "城市名称,如'北京'"
          }
        },
        required: ["city"]
      }
    }
  ]
}));

// 处理工具调用
server.setRequestHandler("tools/call", async (request) => {
  if (request.params.name === "get_weather") {
    const city = request.params.arguments.city;
    // 调用真实天气 API
    const weather = await fetchWeatherData(city);
    return {
      content: [{ type: "text", text: JSON.stringify(weather) }]
    };
  }
});

// 启动服务
const transport = new StdioServerTransport();
await server.connect(transport);
⚡ 快速入门:不用从零写——MCP 官方提供了 TypeScript 和 Python SDK,几十行代码就能搭一个 Server。社区已有数百个现成的 MCP Server 可直接使用。

步骤二:注册工具与资源

3 设计工具接口
好的工具设计原则:

1. 单一职责
   ✅ get_weather(city) — 只查天气
   ❌ get_all_info(city) — 又查天气又查新闻

2. 参数明确
   ✅ city: string, days: integer(1-7)
   ❌ query: string(太模糊)

3. 返回结构化
   ✅ { temp: 22, condition: "晴", wind: "东南3级" }
   ❌ "北京今天22度晴东南风3级"(非结构化)

4. 错误清晰
   ✅ { error: "城市不存在", code: "CITY_NOT_FOUND" }
   ❌ { error: "失败" }

常用 MCP Server 清单:

📦 文件系统
   - 读写本地文件
   - 搜索文件和目录

📦 数据库
   - 查询 SQL / NoSQL 数据库
   - 支持 MySQL、PostgreSQL、MongoDB

📦 浏览器
   - Puppeteer / Playwright 驱动
   - 网页截图、表单填写、数据提取

📦 GitHub
   - 管理 Issue / PR
   - 搜索代码和仓库

📦 Slack / 飞书
   - 发送和读取消息
   - 管理频道和用户

步骤三:配置 MCP Client

4 在 Agent 中接入 MCP Server
OpenClaw MCP 配置:

mcp_servers:
  - name: weather
    command: node
    args: ["./mcp-servers/weather/index.js"]
    
  - name: database
    command: python
    args: ["./mcp-servers/database/server.py"]
    env:
      DB_URL: "postgresql://..."
      
  - name: browser
    command: npx
    args: ["@playwright/mcp@latest"]

Cursor MCP 配置(.cursor/mcp.json):
{
  "mcpServers": {
    "weather": {
      "command": "node",
      "args": ["./mcp-servers/weather/index.js"]
    },
    "database": {
      "command": "python",
      "args": ["./mcp-servers/database/server.py"],
      "env": {
        "DB_URL": "postgresql://..."
      }
    }
  }
}

配置后,Agent 自动获得所有 MCP 工具:
- 天气查询、数据库操作、浏览器自动化
- 无需写 Function Calling 定义
- MCP Server 更新后,Agent 自动获得新能力

步骤四:多 MCP Server 协同

5 让多个工具协同工作
多工具协同示例:

用户:"查一下北京明天天气,如果下雨就发 Slack 通知团队明天居家办公"

Agent 自动编排:
1. 调用 weather Server → get_weather("北京", 1)
   → 结果:明天中雨 🌧️
   
2. 判断:需要发通知
   
3. 调用 Slack Server → send_message(
     channel: "#team-notice",
     message: "🌧️ 明天北京中雨,建议居家办公"
   )
   → 通知发送成功

Agent 不需要预先知道这个流程,
MCP 让它能"看到"所有可用工具,
自主规划调用顺序。

安全边界:
- 每个 MCP Server 可以设置权限范围
- weather Server:只读,无风险
- database Server:只允许 SELECT,禁止写操作
- Slack Server:只能发到特定频道
- 浏览器 Server:限制访问域名白名单
6 资源共享与上下文传递
MCP 资源(Resources)用法:

资源是 MCP 中的只读数据,Agent 可以按需获取:

1. 文档资源
   URI: "docs://api-reference"
   → Agent 可以读取 API 文档来了解如何调用

2. 数据资源
   URI: "data://sales-2026-q1"
   → Agent 可以读取季度销售数据进行分析

3. 配置资源
   URI: "config://brand-voice"
   → Agent 可以读取品牌风格指南

vs. 工具(Tools):
- 工具:Agent 主动调用,执行操作
- 资源:Agent 按需读取,获取信息

MCP 提示(Prompts)用法:

预定义的提示模板,Agent 可以复用:
- "summarize-document" → 文档摘要模板
- "code-review" → 代码审查模板
- "translate" → 翻译模板

Agent 使用时可以传入变量:
prompt: "summarize-document"
arguments: { doc_uri: "docs://quarterly-report" }
🔗 MCP 生态正在快速发展。建议关注官方 MCP Hub(github.com/modelcontextprotocol),每周都有新的 Server 发布。

步骤五:自建企业 MCP Server

7 企业内部工具 MCP 化
企业内部 MCP Server 示例:

1. ERP 系统 Server
   工具:
   - query_inventory(sku) → 查库存
   - create_order(items, customer) → 创建订单
   - get_delivery_status(order_id) → 查物流

2. OA 系统 Server
   工具:
   - submit_leave(type, dates) → 提交请假
   - approve_request(request_id) → 审批
   资源:
   - "oa://org-chart" → 组织架构
   - "oa://policies" → 公司政策

3. 监控系统 Server
   工具:
   - get_alerts(severity) → 获取告警
   - ack_alert(alert_id) → 确认告警
   资源:
   - "monitor://dashboard" → 仪表盘数据

部署架构:
企业内网 → MCP Server → Agent
           ↑
    只在内网暴露
    Agent 通过安全网关访问
    所有调用走审计日志

进阶:MCP 最佳实践

8 企业级 MCP 使用指南
MCP 最佳实践清单:

1. 工具粒度
   - 太粗:一个工具做太多事 → 难以复用
   - 太细:一个工具只做一步 → 调用链太长
   - 合适:一个工具完成一个用户意图

2. 安全策略
   - 所有 MCP Server 必须有权限控制
   - 写操作需要人工确认
   - 敏感数据脱敏返回
   - 调用频率限制

3. 错误处理
   - Server 崩溃 → Agent 降级到无工具模式
   - 工具调用超时 → 30秒超时 + 重试1次
   - 参数校验失败 → 明确错误信息

4. 可观测性
   - 记录每次工具调用
   - 监控 Server 健康状态
   - 统计工具使用频率(优化常用工具)

5. 版本管理
   - 工具接口变更需要版本号
   - 向后兼容:新增参数有默认值
   - 废弃工具标记 deprecated,给迁移期