模型控制协议服务器

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

  • by profullstack
  • JavaScript
  • 本地部署
  • 45 星标
  • 更新于
在 GitHub 查看 profullstack/mcp-server

使用说明

MCP服务器(模型控制协议)

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

特性

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

入门指南

先决条件

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

安装

# Clone the repository
git clone https://github.com/yourusername/mcp-server.git
cd mcp-server

# Install dependencies
pnpm install

运行服务器

# Install dependencies
pnpm install

# Start the server
pnpm start

# Start the server in development mode (with auto-reload)
pnpm dev

服务器将于启动http://localhost:3000默认情况下。

测试服务器

该存储库包括使用Mocha和Chai的全面测试:

# Run all tests
pnpm test

# Run only module tests
pnpm test:modules

# Run all tests (both core and modules)
pnpm test:all

测试基础设施包括:

  1. 核心服务器测试模块加载、路由和其他核心功能
  2. 针对每个模块功能的模块特定测试
  3. 支持测试中的ES模块
  4. 用Sinon嘲笑和抨击公用事业

测试以结构化的方式组织:

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

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

预提交钩子

存储库包括使用Husky和lint-stage的预提交钩子:

# The hooks are automatically installed when you run
pnpm install

预提交挂钩:

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

这确保了提交到存储库的所有代码都遵循编码标准并保持代码质量。测试套件正在不断改进,以提供更好的覆盖率和可靠性,一旦它变得更加稳定,将在预提交挂钩中启用。

Docker支持

该存储库包括Docker支持,便于容器化和部署:

# Build and run with Docker
docker build -t mcp-server .
docker run -p 3000:3000 mcp-server

# Or use 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

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

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

创建模块

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

模块结构

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

src/modules/your-module/
├── assets/          # Static assets (images, CSS, etc.)
├── docs/            # Documentation files
├── examples/        # Example usage
├── src/             # Source code
│   ├── controller.js  # HTTP route handlers
│   ├── service.js     # Business logic
│   └── utils.js       # Utility functions
├── test/            # Test files
│   ├── controller.test.js
│   └── service.test.js
├── index.js         # Main module file with register function
├── package.json     # Module metadata, dependencies, and scripts
└── README.md        # Module documentation

每个模块应包括 package.json 文件包含:

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

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

模块实施

主模块文件(index.js)必须导出a register 加载模块时将调用的函数:

/**
 * Register this module with the Hono app
 * @param {import('hono').Hono} app - The Hono app instance
 */
export async function register(app) {
  // Register routes, middleware, etc.
  app.get('/your-module/endpoint', c => {
    return c.json({ message: 'Your module is working!' });
  });
}

// Optional: Export module metadata
export const metadata = {
  name: 'Your Module',
  version: '1.0.0',
  description: 'Description of your module',
  author: 'Your Name',
};

示例模块

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

创建新模块

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

# Create a new module
pnpm create-module

# Or with a module name
pnpm create-module my-module

脚本将:

  1. 在中创建新的模块目录 src/modules/
  2. 复制模板文件
  3. 用模块信息替换占位符
  4. 提供实现模块的后续步骤

模块搜索

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

搜索端点

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

搜索示例

# Find modules by name or description
curl http://localhost:3000/modules/search/craigslist

# Find modules by dependency
curl http://localhost:3000/modules/search/jsdom

# Find modules by keyword
curl http://localhost:3000/modules/search/mcp

# Find modules by author
curl http://localhost:3000/modules/search/"MCP Server Team"

# Find modules by license
curl http://localhost:3000/modules/search/ISC

JavaScript示例

// Function to search modules by any field
async function searchModules(query) {
  const response = await fetch(`http://localhost:3000/modules/search/${query}`);
  const data = await response.json();

  console.log(`Found ${data.count} modules matching "${query}":`);
  data.results.forEach(module => {
    console.log(`- ${module.name} (${module.directoryName}): ${module.description}`);
  });

  return data.results;
}

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

文档

  • MCP标准方法:记录所有MCP服务器应实施的标准方法。
  • MCP接口:MCP协议的TypeScript接口定义。
  • 建筑:MCP服务器架构概述。

许可证

国际协调委员会