MCP Server(模型上下文协议服务器)是一个通用、模块化的服务器,用于实现 Model Context Protocol(MCP)。该项目旨在提供一个框架,通过标准化 API 控制与交互各种模型。
主要能力
- 模块化架构,便于扩展
- 动态模块加载
- 核心模型管理功能
- 标准化的模型上下文 API
- 简单的配置系统
- 日志工具
- 增强的模块结构,具有适当的关注点分离
- 支持带依赖管理的模块 package.json
- 使用 Mocha 和 Chai 的全面测试基础设施
- 强大的模块搜索功能
- API 响应中显示模块元数据
- 集成真实 AI 模型提供商(OpenAI、Stability AI、Anthropic、Hugging Face)
- 支持文本生成、图像生成和语音转文本模型
- 兼容模型的流式推理支持
使用方式
环境要求
- Node.js 18.x 或更高版本
- pnpm 10.x 或更高版本
该项目仅使用 ES Modules(ESM)。所有导入使用 import 语法而非 require()。
运行服务器
默认情况下,服务器将在 http://localhost:3000 启动。 复制示例环境文件并编辑 API 密钥: 至少需要添加要使用的模型提供商的 API 密钥。API 密钥获取地址:
- OpenAI: https://platform.openai.com/api-keys
- Stability AI: https://platform.stability.ai/account/keys
- Anthropic: https://console.anthropic.com/settings/keys
服务器没有全局认证层,因此任何能访问端口的东西都可以调用任何模块路由。涉及文件系统或发出站请求的模块受到以下约束:
- 模块令牌:具有副作用的路线通过 Authorization: Bearer <token> 或 X-API-Key: <token> 接受令牌。当变量未设置时,路线保持开放,并在启动时记录警告。
- 路径包含:readme-badges 根据 README_BADGES_ROOT(默认:工作目录)解析 readmePath 和 rootDir,并拒绝任何逃逸、目标为非 markdown 文件或通过符号链接到达外部的内容。scanner 以相同方式将导出限制在其报告目录中。
- 出站请求允许列表:获取调用者命名 URL 的模块会拒绝回环、链路本地(云元数据)、RFC1918、CGNAT 和其他非公共地址,解析主机名并检查每个返回的地址,并重新验证每个重定向跳。当模块与一个已知服务通信时,主机也会被允许列表。
- 跨源请求:CSRF_PROTECTION_ENABLED(默认 true)拒绝携带外来 Origin 头的状态更改请求,因此恶意网页无法驱动浏览器访问本地绑定的服务器。不发送 Origin 的客户端(curl、MCP 客户端、服务器到服务器调用)不受影响。在 CORS_ORIGINS 中列出受信任的浏览器源。如果服务器暴露在 localhost 之外,请在认证反向代理后面运行。
测试服务器
仓库包含使用 Mocha 和 Chai 的全面测试: 测试基础设施包括:
- 核心服务器测试(模块加载、路由和其他核心功能)
- 每个模块功能的模块特定测试
- 测试中对 ES 模块的支持
- 使用 Sinon 的模拟和打桩工具 测试组织方式:
- 核心测试在 /test/core/
- 模块测试在每个模块的 test/ 目录中
预提交钩子
仓库包含使用 Husky 和 lint-staged 的预提交钩子:
- 对 JavaScript 文件运行 ESLint
- 对所有暂存文件运行 Prettier
Docker 支持
仓库包含 Docker 支持,便于容器化和部署:
- 使用 Node.js 20 Alpine 作为基础镜像
- 暴露端口 3000
- 将模块目录挂载为卷,便于模块管理
- 包含健康检查
标准 MCP 方法
MCP 服务器实现了一组所有 MCP 服务器都应提供的标准化方法:
服务器信息
- GET / - 基本服务器信息
- GET /status - 详细服务器状态
- GET /health - 健康检查端点
- GET /metrics - 服务器指标
模型管理
- GET /models - 列出可用模型
- GET /model/:modelId - 获取模型信息
- POST /model/:modelId/activate - 激活特定模型
- POST /model/deactivate - 停用当前模型
- GET /model/active - 获取活动模型信息
- POST /model/infer - 使用活动模型进行推理
- POST /model/:modelId/infer - 使用特定模型进行推理
支持的模型类型示例:
- 使用 GPT-4 的文本生成
- 使用 Stable Diffusion 的图像生成
- 流式文本生成
模块管理
- GET /modules - 列出已安装模块
- GET /modules/:moduleId - 获取模块信息
- GET /modules/search/:query - 按 package.json 或元数据中的任何字段搜索模块
工具和资源
- GET /tools - 列出可用工具
- GET /resources - 列出可用资源
配置
配置从环境变量加载,存储在 src/core/config.js 中。最简单的配置方式是编辑项目根目录下的 .env 文件。 关键环境变量参见 sample.env 中的完整配置选项列表。
示例
仓库包含几个示例帮助入门:
- 客户端示例:examples/client.js 演示如何从客户端应用与 MCP 服务器交互。
- 自定义模块示例:examples/custom-module/ 展示如何创建向服务器添加计算器工具的自定义模块。 运行客户端示例: (具体命令暂未提供) 使用自定义模块示例,将其复制到 modules 目录: (具体命令暂未提供)
创建模块
模块是扩展 MCP 服务器的主要方式。每个模块是一个自包含的包,可以为服务器添加新功能。
模块结构
模块遵循增强结构,具有更好的组织。每个模块应包含 package.json 文件,包含:
- 名称、版本、描述
- 作者和许可证信息
- 依赖和开发依赖
- 脚本(尤其是测试)
- 关键词和其他元数据
模块实现
主模块文件(index.js)必须导出一个 register 函数,在模块加载时调用。
示例模块
- 简单示例模块在 mcp_modules/example/
- 带计算器工具的复杂示例在 examples/custom-module/
- 健康检查模块在 mcp_modules/health-check/
- 新模块模板在 mcp_modules/template/
创建新模块
可以使用提供的脚本创建新模块。脚本将:
- 在 mcp_modules/ 中创建新模块目录
- 复制模板文件
- 替换占位符为模块信息
- 提供实现模块的后续步骤
模块搜索
MCP 服务器包含强大的搜索功能,允许根据 package.json 或元数据中的任何信息查找模块。
搜索端点
- GET /modules/search/:query - 搜索任何字段中包含指定查询字符串的模块 搜索会全面匹配任何字段,包括依赖、关键词和其他元数据等嵌套对象。
模型提供商
MCP 服务器集成多个 AI 模型提供商:
- OpenAI 提供 GPT 模型用于文本生成,Whisper 用于语音转文本
- Stability AI 提供 Stable Diffusion 用于图像生成
- Anthropic 提供 Claude 模型用于文本生成
- Hugging Face 提供对数千个开源模型的访问
文档
- MCP Standard Methods:所有 MCP 服务器应实现的标准方法文档。
- MCP Interface:MCP 协议的 TypeScript 接口定义。
- Architecture:MCP 服务器架构概述。