使用说明
自定义MCP示例
概述
本项目演示了如何使用 模型上下文协议(MCP) 将工具逻辑与AI代理分离,使系统更加模块化和可维护。它包括:
- MCP服务器:托管客户端可以调用的各种工具(函数)。
- MCP客户端:连接到服务器,与用户交互,并让AI代理根据需要调用工具。
运作原理
-
MCP服务器
- 使用Express在Node.js上运行。
- 注册多个工具(如
addTwoNumbers,getCurrentTime,getBatteryStatus,以及getListofHugeFileInSystem). - 通过服务器发送事件(SSE)监听来自MCP客户端的连接。
-
MCP客户端
- 连接到MCP服务器。
- 使用Google Gemini AI生成响应。
- 当AI想要使用工具时,它会调用服务器上的工具并将结果返回给用户。
MCP服务器中包含的工具
- 添加两个数字:将两个数字相加。
- 获取当前时间:返回当前时间。
- 获取电池状态:显示Mac的电池状态。
- 获取HugeFileInSystem列表:列出桌面上的大文件。
MCP客户端如何连接和使用工具
- 客户端使用SSE连接到服务器。
- 当AI模型决定需要一个工具时,它会向服务器发送一个工具调用请求。
- 服务器执行该工具并返回结果。
- 客户端向用户显示结果并继续对话。
如何开始
1.安装依赖项
在两者中 server 和 client 文件夹,运行:
pnpm install
或
npm install
2.启动MCP服务器
cd server
node index.js
服务器将在以下时间运行 http://localhost:3001.
3.启动MCP客户端
cd client
node index.js
样本输入和输出
用户输入:
You: What is the current time?
AI输出:
AI: The current time is 2025-06-26T12:34:56.789Z
用户输入:
You: Add 5 and 7
AI输出:
AI: The sum of 5 and 7 is 12
为什么使用MCP?
- 关注点分离:工具在服务器上管理,而不是混合到您的AI代理代码中。
- 可扩展性在不改变AI逻辑的情况下添加、更新或删除工具。
- 标准化沟通:MCP定义了如何描述、调用工具以及如何格式化结果。
- 多代理支持:多个客户端/代理可以使用同一组工具。
没有MCP:
您需要在AI代理中硬编码工具逻辑和响应格式,这使得维护和扩展变得更加困难。
使用MCP:
你的AI代理只是描述它想做什么,服务器处理细节。
环境变量
创建一个 .env 文件在 client 带有Gemini API密钥的文件夹:
GEMINI_API_KEY=your-google-genai-key
SSE初学者分析
以下是当MCP客户端和服务器使用SSE通信时,真实网络捕获中发生的事情的清晰分解:
🔄 事件的完整序列
📨 步骤1:客户端发送 POST 请求
-
数据包#21
-
方法:
POST -
端点:
/messages?sessionId=... -
有效载荷: JSON-RPC
{ "method": "tools/call", "params": { "name": "getBatteryStatus", "arguments": {} }, "jsonrpc": "2.0", "id": 3 }
✅ 步骤2:服务器响应 HTTP/1.1 202 Accepted
- 数据包#23
- 这意味着:“我收到了你的请求,我会处理的,但不是现在。”
这通常发生在 实际结果将稍后流式传输或发送,通常用于异步或服务器发送的事件设置。
📤 步骤3:服务器推送响应(SSE风格)
-
数据包#25
-
服务器发送的原始TCP有效负载看起来像 服务器发送事件(SSE) 流:
event: message data: {"result":{"content":[{"type":"text","text":"Battery level is 92% and it is not charging."}]},"jsonrpc":"2.0","id":3}
🧠 释义:
- 这确认服务器正在使用 服务器发送事件(SSE) 推动结果 之后 初始的202响应。
- 客户端不会再次轮询或请求。相反,它 保持连接打开 一旦数据准备就绪,服务器就会推送数据。
🧩 沟通模式概述
| 步骤 | 角色 | 动作 |
|---|---|---|
| 1 | 客户端 | 发送 POST /messages 带有JSON-RPC有效载荷 |
| 2 | 服务器 | 响应如下 HTTP/1.1 202 Accepted |
| 3 | 服务器 | 稍后使用以下命令发送结果 服务器发送事件 事件类型 message |
| 4 | 客户端 | 确认推送的数据 |
✅ 为什么选择SSE?
使用 Content-Type: text/event-stream,服务器可以发送 持续或异步更新 通过单个长期HTTP连接。
这种方法在以下情况下是完美的:
- 结果需要时间(例如处理工具调用)。
- 需要实时进度或流媒体。
许可证
麻省理工学院