你用 3 周时间构建了工具、RAG、审批流、权限系统。现在问题来了:这些能力只能给你自己的 Agent 用。如果同事想用 Claude Desktop、Cursor 或另一个 Agent 来调用你的工具,他们怎么接入?今天我们用 MCP 把答案做出来。
场景还原:
你已经有:
search_kb - 搜索知识库create_ticket - 创建工单get_user_info - 查询用户信息同事 A 用 Claude Desktop,同事 B 用 Cursor AI,同事 C 在做自己的 Python Agent。他们都想用你的 tools。
没有 MCP 时,你要做什么?
有 MCP 后:
引导问题:
MCP = Model Context Protocol
Anthropic 在 2024 年发布,定义了 LLM 和外部工具/数据源之间的标准接口。
三个核心概念:
MCP Server 提供的能力:
| 能力 | 说明 | 例子 |
|---|---|---|
| Tools | LLM 可以调用的函数 | search_kb, create_ticket |
| Resources | LLM 可以读取的数据 | 文件、数据库记录 |
| Prompts | 预定义的 prompt 模板 | 系统 prompt、few-shot 示例 |
今天我们主要实现 Tools。
Transport = MCP Client 和 Server 如何通信
stdio transport(本地进程):
SSE transport(HTTP 网络):
今天先实现 stdio(更容易验证),理解 SSE 的设计。
MCP 基于 JSON-RPC 2.0。先理解消息格式:
预期输出:
创建配置文件 ~/.config/claude/claude_desktop_config.json(Mac 路径):
验证步骤:
search_kb 工具SSE 和 stdio 的选择原则:
| 概念 | 说明 |
|---|---|
| MCP Protocol | Anthropic 发布的开放标准,基于 JSON-RPC 2.0 |
| stdio transport | 通过 stdin/stdout 通信,适合本地工具 |
| SSE transport | 通过 HTTP + Server-Sent Events,适合网络服务 |
| Tool Definition | 包含名称、描述、InputSchema(JSON Schema 格式) |
| InputSchema | 告诉 LLM 工具的参数结构,LLM 自动生成正确的调用 |
| isError | 工具返回错误时设为 true,LLM 会知道调用失败 |
为什么 MCP 用 JSON Schema 描述参数?
运行前,问自己:
tools/list 和 tools/call 分别做什么?InputSchema 有什么作用?(引导 LLM 生成正确参数)isError: true 和 JSON-RPC 的 error 字段有什么区别?(前者是业务错误,后者是协议错误)cmd/mcp/main.goinitialize + tools/list + tools/call 消息并验证输出claude_desktop_config.jsonsearch_kb 回答一个问题MCP_USER_ID)isError: true + 清晰的错误消息list_tickets 工具:列出当前用户的工单get_ticket_status 工具:查询单个工单状态Q: MCP Server 挂了怎么办?Claude Desktop 会报什么错?
A: Claude Desktop 会显示工具不可用,聊天仍然可以继续(只是没有工具)。可以在 Server 里加健康检查和自动重启:
Q: 如果工具执行时间很长(比如 10 秒),MCP 会超时吗?
A: MCP 没有强制超时,但 Claude Desktop 有自己的超时设置。建议:
Q: 一个 MCP Server 能注册多少个工具?
A: 协议上没有限制,但实践中建议 < 20 个。太多工具会让 LLM 困惑,也会消耗更多 context(每个工具的描述都会进 prompt)。分类管理:按功能域拆分成多个 MCP Server。
Q: 如何让 LLM 在合适的时机调用工具,而不是乱调用?
A: 好的工具描述 + 好的系统 prompt:
关联:MCP 的工具调用链可以看作图的遍历。Agent 收到任务后,可能需要按顺序调用多个工具,每步的结果决定下一步怎么走——类似在网格上搜索单词,不能走回头路。
复杂度:O(rows × cols × 4^L),L = word 长度
关联:多个 MCP Server 可以互相调用(Server A 的工具内部调用 Server B)。Number of Provinces 用并查集统计有多少个独立的连通分量——类似判断你的 MCP 工具依赖图里有几个独立的服务簇。
关联:MCP 工具的参数解析。当 LLM 生成工具调用参数时,一个模糊的输入可能有多种解析方式——类似数字编码的字符串有多少种解码方案。
明天是 Week 3 的集成日:
准备问题: