多连接MCP服务器框架

一个基于SSE的多连接MCP服务器框架,为AI助手提供上下文和功能扩展能力,支持工具和权限管理。

  • by arrenxxxxx
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 arrenxxxxx/multiservermcp

使用说明

多服务器MCP

一种基于SSE的多连接MCP服务器框架,用于长连接通信。为AI助手提供上下文和功能扩展功能。 目前仅支持SSE模式。

🚀 MultiServerMCP——通过多连接服务器框架使AI助手具有扩展功能!

MultiServerMCP旨在提供一个强大的服务器框架,支持多个客户端连接到单个服务器,为人工智能助手提供高效的工具和权限管理。

🌟 主要特点

  • 支持在SSE模式下多个客户端连接到单个服务器
  • 按URL分组的工具和权限管理
  • 内置心跳机制,确保连接稳定
  • 简化工具注册流程
  • 与MCP协议完全兼容
  • 全球会议管理 SessionManager 随时随地访问客户端上下文
  • 方便的全局函数,通过sessionId检索请求参数和客户端上下文

📦 安装

npm install multi-server-mcp
# or
yarn add multi-server-mcp
# or
pnpm add multi-server-mcp

🚀 快速开始

完整服务器示例

import { z } from "zod";
import { MultiServerMCP } from "multi-server-mcp";
import { ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js";
import { getSseReqQuery } from "multi-server-mcp";

// Create MCP server with URL grouping enabled
const server = new MultiServerMCP(
  {
    name: "multi server",
    version: "1.0.0",
  },
  {
    enableUrlGroups: true,
  }
);

// Register a calculator tool that uses request parameters
server.tool("calc/add", { a: z.number(), b: z.number() }, async ({ a, b }, extra) => {
  console.log(extra);
  // Get query parameters from the SSE connection
  const reqQuery = getSseReqQuery(extra.sessionId as string);
  console.log(reqQuery);
  return {
    content: [{ type: "text", text: String(a + b) }],
  };
});

// Register a resource template
server.resource(
  "greeting",
  new ResourceTemplate("greeting://{name}", { list: undefined }),
  async (uri, { name }) => ({
    contents: [
      {
        uri: uri.href,
        text: `Hello, ${name}!`,
      },
    ],
  })
);

// Start the server
server
  .start({
    transportType: "sse",
  })
  .then(() => {
    console.log(`Server started`);
  })
  .catch((error) => {
    console.error(`Server start failed: ${error}`);
    process.exit(1);
  });

基本用法

import { MultiServerMCP } from 'multi-server-mcp';

// Create MCP server instance
const server = new MultiServerMCP({
  name: 'my-mcp-server',
  version: '1.0.0'
});

// Register a tool
server.tool('my-tool', async () => {
  return {
    content: [{ type: 'text', text: 'Tool executed successfully!' }]
  };
});

// Start the server
server.start({
  transportType: 'sse',
  sse: {
    port: 3000,
    endpoint: '/mcp',
    messagesEndpoint: '/mcp-messages'
  }
});

工具分组和权限管理

// Register a tool with grouping
server.tool('group1/group2/my-tool', async () => {
  return {
    content: [{ type: 'text', text: 'Tool executed successfully!' }]
  };
});

// Start server with permission management
server.start({
  transportType: 'sse',
  enableUrlGroups: true
});

在全球范围内访问客户端上下文

import { getSseReqQuery, getClientContextBySessionId } from 'multi-server-mcp';
import { z } from "zod";

// Register a tool that uses request parameters
server.tool("calc/add", { a: z.number(), b: z.number() }, async ({ a, b }, extra) => {
  // Get request parameters from the SSE connection
  const reqQuery = getSseReqQuery(extra.sessionId as string);
  console.log('Query parameters:', reqQuery);
  
  return {
    content: [{ type: "text", text: String(a + b) }],
  };
});

// In any part of your code, you can also access client's request parameters
function myFunction(sessionId: string) {
  // Get query parameters from the SSE connection request
  const reqQuery = getSseReqQuery(sessionId);
  console.log('Client query parameters:', reqQuery);
  
  // Get the full client context if needed
  const clientContext = getClientContextBySessionId(sessionId);
  if (clientContext) {
    console.log('Client URL groups:', clientContext.urlGroups);
    // Access any other client context properties
  }
}

🔧 开发指南

目前仅支持SSE模式。

支持的工具类型

  • 常规工具: server.tool()
  • 资源工具: server.resource()
  • 提示工具: server.prompt()

会话管理

这 SessionManager 提供了一个单例实例来管理客户端会话:

  • SessionManager.getInstance():获取单例实例
  • SessionManager.getInstance().getClientContext(sessionId):通过会话ID获取客户端上下文
  • SessionManager.getInstance().getReqQuery(sessionId):按sessionId获取请求查询参数
  • SessionManager.getInstance().getSessionCount():获取活动会话的计数

为方便起见,提供了以下全局函数:

  • getSseReqQuery(sessionId):按sessionId获取请求查询参数
  • getClientContextBySessionId(sessionId):通过会话ID获取客户端上下文

🤝 贡献

欢迎投稿、问题和功能请求!

📄 许可证

麻省理工学院