返回市场
MCP服务器

MCP服务器

作者:profullstack41 星标更新:2025-08-14

项目介绍

MCP Server(模型控制协议)

一个通用的、模块化的服务器,用于实现模型控制协议(MCP)。该服务器提供了一个框架,通过标准化的API来控制和与各种模型进行交互。

特性

  • 模块化架构,易于扩展
  • 动态模块加载
  • 核心模型管理功能
  • 标准化的模型控制API
  • 简单的配置系统
  • 日志工具
  • 增强的模块结构,具有明确的关注点分离
  • 支持带有依赖管理的package.json
  • 使用Mocha和Chai的全面测试基础设施
  • 强大的模块搜索功能
  • 在API响应中显示模块元数据

开始使用

先决条件

  • Node.js 18.x或更高版本
  • pnpm 10.x或更高版本

安装

# 克隆仓库
git clone https://github.com/yourusername/mcp-server.git
cd mcp-server

# 安装依赖
pnpm install

运行服务器

# 安装依赖
pnpm install

# 启动服务器
pnpm start

# 在开发模式下启动服务器(自动重载)
pnpm dev

默认情况下,服务器将在http://localhost:3000上运行。

测试服务器

仓库包括使用Mocha和Chai的全面测试:

# 运行所有测试
pnpm test

# 只运行模块测试
pnpm test:modules

# 运行所有测试(核心和模块)
pnpm test:all

测试基础设施包括:

  1. 对模块加载、路由和其他核心功能的核心服务器测试
  2. 每个模块功能的模块特定测试
  3. 测试中的ES模块支持
  4. 使用Sinon的模拟和存根工具

测试组织如下:

  • 核心测试在/test/core/
  • 模块测试在每个模块的test/目录中

这种全面的测试确保了代码质量,并且在进行更改时更容易检测到退化。

提交前钩子

仓库包含使用Husky和lint-staged的提交前钩子:

# 当您运行以下命令时,钩子会自动安装
pnpm install

提交前钩子:

  1. 对JavaScript文件运行ESLint
  2. 对所有暂存文件运行Prettier

这确保了提交到仓库的所有代码都遵循编码标准并保持代码质量。测试套件正在不断改进以提供更好的覆盖范围和可靠性,并将在更稳定后启用预提交钩子。

Docker支持

仓库包含Docker支持,便于容器化和部署:

# 使用Docker构建和运行
docker build -t mcp-server .
docker run -p 3000:3000 mcp-server

# 或使用Docker Compose
docker-compose up

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 - 使用特定模型执行推理

模块管理

  • GET /modules - 列出已安装的模块
  • GET /modules/:moduleId - 获取模块信息
  • GET /modules/search/:query - 按其package.json或元数据中的任何字段搜索模块

工具和资源

  • GET /tools - 列出可用工具
  • GET /resources - 列出可用资源

有关这些方法的详细信息,请参阅MCP标准方法

配置

配置存储在src/core/config.js中。您可以修改此文件以更改服务器设置。

示例

仓库包含几个示例,帮助您开始:

  • 客户端示例examples/client.js演示如何从客户端应用程序与MCP服务器交互。
  • 自定义模块示例examples/custom-module/展示了如何创建一个自定义模块,该模块向服务器添加计算器工具。

要运行客户端示例:

node examples/client.js

要使用自定义模块示例,将其复制到模块目录:

cp -r examples/custom-module src/modules/calculator

创建模块

模块是扩展MCP服务器的主要方式。每个模块都是一个独立的包,可以向服务器添加新功能。

模块结构

模块现在遵循一种增强的结构,具有更好的组织:

src/modules/your-module/
├── assets/          # 静态资产(图像、CSS等)
├── docs/            # 文档文件
├── examples/        # 示例用法
├── src/             # 源代码
│   ├── controller.js  # HTTP路由处理器
│   ├── service.js     # 业务逻辑
│   └── utils.js       # 实用函数
├── test/            # 测试文件
│   ├── controller.test.js
│   └── service.test.js
├── index.js         # 主模块文件,包含注册函数
├── package.json     # 模块元数据、依赖项和脚本
└── README.md        # 模块文档

每个模块应包含一个package.json文件,其中包含:

  • 名称、版本、描述
  • 作者和许可证信息
  • 依赖项和开发依赖项
  • 脚本(特别是用于测试)
  • 关键词和其他元数据

这种结构提供了更好的关注点分离,使测试更容易,并提高了模块的可发现性。

模块实现

主模块文件(index.js)必须导出一个register函数,当加载模块时将调用该函数:

/**
 * 将此模块注册到Hono应用
 * @param {import('hono').Hono} app - Hono应用实例
 */
export async function register(app) {
  // 注册路由、中间件等
  app.get('/your-module/endpoint', c => {
    return c.json({ message: '您的模块正在工作!' });
  });
}

// 可选:导出模块元数据
export const metadata = {
  name: '您的模块',
  version: '1.0.0',
  description: '您的模块描述',
  author: '您的名字',
};

示例模块

  • src/modules/example/中提供了一个简单的示例模块,以展示如何创建模块。
  • examples/custom-module/中提供了一个带有计算器工具的更复杂的示例。
  • src/modules/health-check/中提供了一个健康检查模块,用于系统监控。
  • src/modules/template/中提供了一个创建新模块的模板。

创建新模块

您可以使用提供的脚本创建新模块:

# 创建新模块
pnpm create-module

# 或指定模块名称
pnpm create-module my-module

该脚本将:

  1. src/modules/中创建一个新的模块目录
  2. 复制模板文件
  3. 用您的模块信息替换占位符
  4. 提供实施模块的下一步操作

模块搜索

MCP服务器包含强大的搜索功能,允许您根据其package.json或元数据中的任何信息查找模块。

搜索端点

  • GET /modules/search/:query - 搜索包含指定查询字符串的任何字段的模块

搜索示例

# 按名称或描述查找模块
curl http://localhost:3000/modules/search/craigslist

# 按依赖项查找模块
curl http://localhost:3000/modules/search/jsdom

# 按关键词查找模块
curl http://localhost:3000/modules/search/mcp

# 按作者查找模块
curl http://localhost:3000/modules/search/"MCP Server Team"

# 按许可证查找模块
curl http://localhost:3000/modules/search/ISC

JavaScript示例

// 函数按任何字段搜索模块
async function searchModules(query) {
  const response = await fetch(`http://localhost:3000/modules/search/${query}`);
  const data = await response.json();

  console.log(`找到${data.count}个匹配"${query}"的模块:`);
  data.results.forEach(module => {
    console.log(`- ${module.name} (${module.directoryName}):${module.description}`);
  });

  return data.results;
}

搜索是全面的,会在任何字段中找到匹配项,包括依赖项、关键词和其他元数据等嵌套对象。

文档

  • MCP标准方法:所有MCP服务器应实现的标准方法文档。
  • MCP接口:MCP协议的TypeScript接口定义。
  • 架构:MCP服务器架构概述。

许可证

ISC