项目简介

本项目是一个基于 Model Context Protocol (MCP) 构建的后端服务器实现,旨在为LLM(大型语言模型)应用提供结构化的上下文信息和功能扩展能力。它使用 Vercel 作为部署平台,Redis 作为消息队列,实现了 MCP 协议的关键特性,例如工具注册和调用,并通过 Server-Sent Events (SSE) 与客户端进行实时通信。

主要功能点

  • 资源 (Resources) 管理: 虽然代码中没有显式展示资源管理功能,但 MCP 服务器的架构设计允许未来轻松扩展资源管理能力。
  • 工具 (Tools) 注册与执行: 允许开发者注册自定义工具,并通过 MCP 协议供 LLM 客户端调用,实现外部功能扩展。示例代码中已包含一个 "echo" 工具。
  • Prompt 模板 (Prompts) 支持: 代码架构支持 Prompt 模板的定义和渲染,但具体实现需要根据实际应用场景进行扩展。
  • 基于 Redis 的消息队列: 使用 Redis 作为消息队列,处理客户端请求和服务器响应,支持高并发和可扩展性。
  • Server-Sent Events (SSE) 通信: 使用 SSE 协议与客户端建立持久连接,实现实时的双向通信,符合 MCP 协议对传输协议的要求。
  • Vercel 部署: 针对 Vercel 平台优化部署流程,方便用户快速部署和使用 MCP 服务器。

安装步骤

  1. 安装 Node.js 和 pnpm: 确保你的开发环境已安装 Node.js (18+) 和 pnpm 包管理器。
  2. 安装依赖: 克隆仓库到本地后,在项目根目录下运行 'pnpm install' 安装项目依赖。
    pnpm install
  3. 配置环境变量: 复制 '.env.example' 文件并重命名为 '.env',根据你的 Redis 服务器配置修改 '.env' 文件中的环境变量。
    cp .env.example .env
    REDIS_URL=redis://localhost:6379  # 你的 Redis 服务器连接 URL,例如本地 Redis 或云 Redis 服务
    PORT=3000                        # 服务器监听端口,默认为 3000
    DEBUG=false                      # 调试模式开关
  4. 启动开发服务器: 运行 'pnpm dev' 命令启动本地开发服务器。
    pnpm dev

服务器配置 (MCP 客户端)

MCP 客户端需要配置以下信息以连接到 My-MCP Server:

{
  "serverName": "my-mcp-server",  // MCP 服务器名称,可自定义
  "command": "pnpm",             // 启动服务器的命令,这里使用 pnpm
  "args": [                       // 启动服务器命令的参数
    "exec",                       // pnpm exec 命令,用于执行脚本
    "ts-node",                    // 使用 ts-node 运行 TypeScript 代码
    "api/index.ts"                // 服务器入口文件路径
  ],
  "transports": [                 // 配置支持的传输协议
    {
      "type": "sse",              // 使用 Server-Sent Events 协议
      "url": "http://localhost:3000/sse", // SSE 端点 URL,根据实际部署地址修改
      "messageUrl": "http://localhost:3000/message?sessionId={sessionId}" // 消息端点 URL,sessionId 会在客户端连接时动态替换
    }
  ]
}

参数注释:

  • 'serverName': MCP 服务器的名称,客户端用于标识连接的服务器。
  • 'command': 启动 MCP 服务器的可执行命令,例如 'node'、'pnpm'、'python' 等。
  • 'args': 传递给启动命令的参数列表,用于指定服务器的入口文件、运行模式等。
  • 'transports': 配置客户端与服务器通信的传输协议,本项目实现了 SSE 传输。
    • 'type': 传输协议类型,本项目为 'sse' (Server-Sent Events)。
    • 'url': SSE 连接端点的 URL,客户端通过此 URL 建立 SSE 连接。
    • 'messageUrl': 消息发送端点的 URL,客户端通过 POST 请求向此 URL 发送消息。'{sessionId}' 是占位符,客户端会在建立连接后将其替换为实际的会话 ID。

注意: 上述配置中的 'url' 和 'messageUrl' 假设服务器运行在本地 3000 端口。如果部署到 Vercel 或其他平台,请将 'localhost:3000' 替换为实际的服务器地址。

基本使用方法

  1. 启动 MCP 服务器: 按照安装步骤启动 My-MCP Server。
  2. 运行 MCP 客户端: 使用任何支持 MCP 协议的客户端,并按照 "服务器配置" 中的 JSON 配置连接到 My-MCP Server。
  3. 调用工具: 在 MCP 客户端中,可以使用注册的工具 (例如示例中的 "echo" 工具)。客户端发送符合 MCP 协议的 JSON-RPC 请求,服务器会处理请求并返回 JSON-RPC 响应。
  4. 添加新工具: 编辑 'api/server.ts' 文件,在 'initializeMcpApiHandler' 函数中,使用 'server.tool()' 方法注册新的工具,并定义工具的参数和执行逻辑。
// api/server.ts  (示例 - 添加一个新的工具)
import { z } from "zod";
import { initializeMcpApiHandler } from "../lib/mcp-api-handler";

const handler = initializeMcpApiHandler(
  (server) => {
    // ... 现有的 echo 工具 ...

    server.tool("greet", { name: z.string() }, async ({ name }) => ({ // 注册名为 "greet" 的新工具
      content: [{ type: "text", text: 'Hello, ${name}!' }],          // 工具执行逻辑:返回包含问候语的文本内容
    }));
  },
  {
    capabilities: {
      tools: {
        echo: {
          description: "Echo a message",
        },
        greet: {                                                      // 声明新工具的 capabilities
          description: "Say hello to someone",
        },
      },
    },
  }
);

export default handler;

修改 'api/server.ts' 后,需要重启服务器才能使新的工具生效。

信息

分类

AI与计算