MCP协议服务器

基于NestJS的MCP协议服务器,提供MCP元数据、JSON-RPC工具调用、提示、资源和Swagger文档端点。

  • by GeekQiaQia
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 GeekQiaQia/mcp-server

使用说明

MCP 服务器(基于 NestJS)

英语 | 中文

一个基于 NestJS 的服务器,实现了模型上下文协议(MCP)。它提供了用于 MCP 元数据、JSON-RPC 工具调用、提示、资源以及 Swagger 文档的端点。

概述

  • MCP 元数据: /.well-known/mcp.json
  • JSON-RPC 工具: POST /rpc
  • 提示: /prompts
  • 资源: /resources
  • Swagger UI: /docs

特点/功能

  • 自动注册来自(指定来源/路径的)工具 src/tools 通过扫描 *.tool.ts / *.tool.js。
    • 对象样式:默认导出符合 ToolDefinition (与 name, handler等
    • 类风格:导出一个类,使用 execute(params)。
    • 工具命名优先级(类风格):静态 toolName > 类 name > 文件名基础。
  • 统一的返回类型 Promise<unknown>; 处理器的结果被封装在 Promise.resolve(...)。
  • 全球 ValidationPipe 以及用于输入验证和类型安全的数据传输对象(DTO)。
  • Swagger 自动生成文档,便于快速检查和测试。

快速入门

pnpm install
pnpm run start:dev

然后访问:

  • Swagger:http://localhost:3000/docs
  • MCP 元数据:http://localhost:3000/.well-known/mcp.json
  • JSON-RPC: POST http://localhost:3000/rpc

JSON-RPC 示例

示例:调用添加工具(工具名称可能为 add-numbers 或者类静态(成员) toolName):

curl -X POST http://localhost:3000/rpc \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "method": "add-numbers",
    "params": { "a": 1, "b": 2 },
    "id": 1
  }'

如果你为类设置了一个静态名称:

export class AddNumbersTool {
  static toolName = 'add number';
  execute(params: { a: number; b: number }) {
    return params.a + params.b;
  }
}

然后使用“添加数字”方法进行调用。

添加一个工具

创建一个 *.tool.ts 在……下面 src/tools 使用任意一种风格:

  • 对象样式:
export default {
  name: 'echo',
  handler: (params: unknown) => Promise.resolve(params),
};
  • 班级风格:
export class WeatherTool {
  static toolName = 'weather';
  execute(params: { city: string }) {
    return { city: params.city, temperature: 26, condition: 'Sunny' };
  }
}

工具会自动注册,并且可以通过(某种方式)进行调用 /rpc。

结构(关键部分)

  • src/main.ts应用程序引导(或启动)、全局管道、Swagger
  • src/app.module.ts模块布线
  • src/tools/工具目录(自动注册)
  • src/rpc/JSON-RPC 控制器 & 数据传输对象 (DTO)
  • src/mcp/MCP元数据控制器
  • src/prompts/, src/resources/提示与资源API

笔记

  • 全球性的 AuthGuard 被设定为 APP_GUARD如果您需要身份验证/授权,请进行相应调整。
  • 确保工具名称唯一,以避免注册表覆盖。

许可证

麻省理工学院(MIT)