动态MCP服务器框架

一个灵活、可扩展的框架,用于构建具有现代API密钥认证、用户管理和动态工具共享功能的模型上下文协议(MCP)服务器。

  • by scitara-cto
  • TypeScript
  • 本地部署
  • 11 星标
  • 更新于
在 GitHub 查看 scitara-cto/dynamic-mcp-server

使用说明

动态MCP服务器框架

一个灵活、可扩展的框架,用于构建具有现代API密钥认证、用户管理和动态工具共享的模型上下文协议(MCP)服务器。


🚀 概述

动态MCP服务器支持安全、用户感知和可扩展的AI工具服务器。它支持:

  • 基于API密钥的身份验证 (简单,与所有MCP客户端兼容)
  • 用户管理和授权 (MongoDB支持)
  • 基于会话、按用户加载工具
  • 工具共享和细粒度访问控制
  • 为下游项目提供可扩展的HTTP和数据库层

🌟 主要特点

  • 动态工具管理:在运行时创建、删除和授权工具——工具不仅限于启动时或代码中的静态定义。这实现了真正的运行时可扩展性,是与大多数其他MCP服务器的主要区别。
  • 用户管理:添加、更新、删除和列出用户;管理员引导;基于角色的访问。
  • 工具共享:与其他用户共享工具,管理访问级别,并接收实时更新。
  • 现代身份:简单的API密钥认证,MongoDB授权。
  • 可扩展性:在下游项目中添加自定义HTTP路由和MongoDB集合。
  • 基于会话的工具加载:工具是按用户会话加载的,而不是全局加载的。

🔑 身份验证(API密钥)

  • 为每个用户分配一个唯一的 apiKey (在用户创建时自动生成)。
  • 要进行身份验证,客户端必须提供 apiKey 通过查询参数OR头:
    • 查询参数: ?apiKey=your-key 或 ?apikey=your-key
    • 头球: x-apikey: your-key 或 apikey: your-key
  • 流式HTTP传输(现代): /mcp?apiKey=... 或 /mcp 带标题
  • 服务器通过查找以下内容对用户进行身份验证 apiKey 在数据库中。

🚀 传输协议

动态MCP服务器支持传统和现代MCP传输协议:

可流式HTTP传输

  • 协议版本: 2025-03-26
  • 端点: /mcp
  • 特性:现代、高效、单端点设计
  • 认证:查询参数 ?apiKey=your-key OR标题 x-apikey: your-key
  • 用法:建议用于新集成

� 文档

工具可见性模型: 默认情况下,所有工具对用户都是可见的。用户可以使用 hide-tool 和 unhide-tool 行动。看 用户管理 和 工具管理与共享 了解详情。


🛠️ 快速开始

看 入门指南 用于安装和基本使用。


📝 贡献

欢迎投稿!看 文件 了解更多详情。

📄 许可证

麻省理工学院


🧩 处理程序和工具注册(新模式)

工具现在通过注册 处理程序包每个处理程序包都对相关工具进行分组,并为工具执行提供一个处理程序函数。这是可扩展性和可维护性的推荐模式。

例子:

const myHandlerPackage = {
  name: "my-domain",
  tools: [
    {
      name: "my-tool",
      description: "A custom tool",
      inputSchema: {
        /* ... */
      },
      handler: { type: "my-domain", config: {} },
      rolesPermitted: ["user", "admin"],
    },
    // ...more tools...
  ],
  handler: async (args, context, config, toolName) => {
    // Dispatch logic based on toolName, if needed
  },
};

const server = new DynamicMcpServer({ name: "my-mcp", version: "1.0.0" });
await server.start();
await server.registerHandler(myHandlerPackage);

看 入门指南 和 例子 了解更多详情。


🧩 工具参数映射(config.args)

定义工具时,您可以使用 config.args 字段将用户提供的工具选项(来自inputSchema)映射到操作处理程序所需的参数。此映射支持:

  • 文字值(例如。, "country": "US")
  • 模板变量(例如。, "city": "{{location}}")
  • 嵌套对象和数组(所有模板都是递归解析的)

例子:

handler: {
  type: "weather-tools",
  config: {
    url: "https://api.openweathermap.org/data/2.5/weather",
    args: {
      queryParams: {
        appid: "{{OPENWEATHER_API_KEY}}",
        q: "{{location}}",
        units: "{{units}}"
      }
    }
  }
}

当调用该工具时,系统会自动解析所有 {{...}} 使用工具输入和环境变量在config.args中创建模板。处理程序接收合并和解析的参数,不需要手动映射。

看 工具编写 查看完整的细节和示例。