模型上下文协议工具集

一个基于Model Context Protocol (MCP)的模块化工具集,用于分离AI代理与工具逻辑,提升系统可维护性和扩展性。

  • by r00tshaim
  • JavaScript
  • 本地部署
  • 更新于
在 GitHub 查看 r00tshaim/mcp-client-server

使用说明

自定义MCP示例

概述

本项目演示了如何使用 模型上下文协议(MCP) 将工具逻辑与AI代理分离,使系统更加模块化和可维护。它包括:

  • MCP服务器:托管客户端可以调用的各种工具(函数)。
  • MCP客户端:连接到服务器,与用户交互,并让AI代理根据需要调用工具。

运作原理

  1. MCP服务器

    • 使用Express在Node.js上运行。
    • 注册多个工具(如 addTwoNumbers, getCurrentTime, getBatteryStatus,以及 getListofHugeFileInSystem).
    • 通过服务器发送事件(SSE)监听来自MCP客户端的连接。
  2. 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连接。

这种方法在以下情况下是完美的:

  • 结果需要时间(例如处理工具调用)。
  • 需要实时进度或流媒体。

许可证

麻省理工学院