MCP适配器模块

NestJS模块,用于集成模型上下文协议(MCP),使NestJS应用能够作为MCP服务器,向AI助手提供工具、资源和提示。

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

使用说明

@iludolf/mcp适配器

NestJS模块用于模型上下文协议(MCP)集成。使您的NestJS应用程序能够充当MCP服务器,向AI助手公开工具、资源和提示。

特性

  • 🔧 基于装饰器的API -使用 @McpTool, @McpResource, @McpPrompt 装饰器
  • 🚀 多个传输 -STDIO、SSE、HTTP支持
  • 🔄 SSE保持活力 -自动ping以防止连接超时
  • 📦 NestJS集成 -完全支持依赖注入
  • 🔌 异步配置 -使用 forRootAsync 使用ConfigService

安装

npm install @iludolf/mcp-adapter
# or
pnpm add @iludolf/mcp-adapter
# or  
yarn add @iludolf/mcp-adapter

对等依赖关系

确保您安装了以下对等依赖项:

npm install @modelcontextprotocol/sdk@^1.10.0 @nestjs/common @nestjs/core reflect-metadata rxjs zod
包 版本
@modelcontextprotocol/sdk ^1.10.0
@nestjs/common ^10.0.0 || ^11.0.0
@nestjs/core ^10.0.0 || ^11.0.0
reflect-metadata ^0.1.13 || ^0.2.0
rxjs ^7.0.0
zod ^3.0.0

快速开始

1.导入模块

import { Module } from "@nestjs/common"
import { McpModule, TransportType } from "@iludolf/mcp-adapter"

@Module({
  imports: [
    McpModule.forRoot({
      serverInfo: {
        name: "my-mcp-server",
        version: "1.0.0",
      },
      transport: TransportType.SSE, // or TransportType.STDIO
    }),
  ],
})
export class AppModule {}

2.创建MCP处理程序

import { Injectable } from "@nestjs/common"
import { McpTool, McpResource, McpPrompt } from "@iludolf/mcp-adapter"
import { z } from "zod"

@Injectable()
export class MyMcpHandlers {
  @McpTool({
    name: "calculator",
    description: "Performs basic arithmetic",
    paramsSchema: {
      operation: z.enum(["add", "subtract"]),
      a: z.number(),
      b: z.number(),
    },
  })
  async calculate(args: { operation: string; a: number; b: number }) {
    const result = args.operation === "add" 
      ? args.a + args.b 
      : args.a - args.b
    return { content: [{ type: "text", text: String(result) }] }
  }

  @McpResource({
    name: "config",
    uri: "config://app",
    description: "Application configuration",
  })
  async getConfig() {
    return {
      contents: [{
        uri: "config://app",
        mimeType: "application/json",
        text: JSON.stringify({ version: "1.0.0" }),
      }],
    }
  }

  @McpPrompt({
    name: "greeting",
    description: "Generate a greeting",
    arguments: [{ name: "name", required: true }],
  })
  async generateGreeting(params: { arguments: { name: string } }) {
    return {
      messages: [{
        role: "assistant",
        content: { type: "text", text: `Hello, ${params.arguments.name}!` },
      }],
    }
  }
}

3.注册处理程序提供者

@Module({
  imports: [McpModule.forRoot({ /* ... */ })],
  providers: [MyMcpHandlers],
})
export class AppModule {}

配置选项

McpModuleOptions

选项 类型 默认值 描述
serverInfo Implementation 必需 服务器名称和版本
serverOptions ServerOptions - MCP SDK服务器选项
transport TransportType STDIO 传输类型(STDIO、SSE、HTTP、无)
logger McpLogger DefaultMcpLogger 自定义记录器
basePath string "mcp" HTTP端点的基本路径
global boolean false 全局注册模块

异步配置

McpModule.forRootAsync({
  imports: [ConfigModule],
  useFactory: (config: ConfigService) => ({
    serverInfo: {
      name: config.get("MCP_NAME"),
      version: config.get("MCP_VERSION"),
    },
    transport: TransportType.SSE,
  }),
  inject: [ConfigService],
})

HTTP端点(SSE/HTTP传输)

使用SSE或HTTP传输时,以下端点可用:

端点 方法 描述
/{basePath}/sse GET SSE连接端点
/{basePath}/messages POST 消息处理端点
/{basePath}/health GET 健康检查端点

SSE保持活力

SSE连接每30秒自动发送一次保持活动ping,以防止超时错误(Body Timeout Error).这是透明处理的,不需要配置。

自定义记录器

import { McpLogger } from "@iludolf/mcp-adapter"

class MyLogger implements McpLogger {
  info(message: string, context?: string) { /* ... */ }
  warn(message: string, context?: string) { /* ... */ }
  error(message: string, context?: string, trace?: string) { /* ... */ }
  debug(message: string, context?: string) { /* ... */ }
}

McpModule.forRoot({
  serverInfo: { name: "my-server", version: "1.0.0" },
  logger: new MyLogger(),
})

兼容性

  • MCP-SDK:使用新 registerTool, registerPrompt, registerResource API(SDK 1.10.0+)
  • NestJS:与v10和v11兼容
  • Node.js:需要Node.js 18+

许可证

麻省理工学院