MCP协议脚手架

MCP-FORGE是一个基于Node.js的现代、可扩展的服务器脚手架,用于构建使用模型上下文协议(MCP)的应用程序,提供会话管理、API密钥处理、实时仪表板和工具集成功能。

  • by proxysoul
  • TypeScript
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 Pouiiro/mcp-forge

使用说明

🛡 MCP-FORGE

用于模型上下文协议(MCP)的强大Node.js脚手架

现在有了持久的API密钥管理(SQLite)、带有密钥过期的实时仪表板和现代的TypeScript工具。


🚀 概述

MCP-FORGE是一个现代的、可扩展的Node.js服务器脚手架,用于使用模型上下文协议(MCP)构建应用程序。它提供了会话管理、API密钥处理、实时仪表板以及用于快速原型设计的简单工具集成。


✨ 特性

  • MCP服务器集成(官方MCP SDK)
  • 安全的API密钥管理
  • 自动会话生命周期和清理
  • 实时仪表板(服务器统计数据、日志、API密钥过期)
  • 自定义工具系统
  • Express.js中间件和路由
  • TypeScript支持
  • API键的SQLite数据库(better-sqlite3)
  • 现代开发工作流程 TSX
  • 用于格式化和起毛的生物特征

📋 目录


🛠 安装

先决条件

  • Node.js(v18+)
  • pnpm(推荐)或npm

注: 数据库文件 mcp.db 由git自动创建并忽略。

安装依赖项

pnpm install

🚀 快速开始

发展

pnpm run dev
# Uses tsx for fast TypeScript reloading

生产

pnpm start

⚡ 用法

启动时,MCP-FORGE会打印您的API密钥:

🔑 API Key for MCP (use as Authorization: Bearer <token>): sk-xxxxxxxx...
🕒 API Key Expires In: 23h 59m 59s

使用此键 Authorization 所有请求的标头。

示例:调用演示工具

基本问候语

{
  "method": "tools/call",
  "params": {
    "name": "say_hello",
    "arguments": {}
  }
}

回应:“你好,世界!”

个性化问候

{
  "method": "tools/call",
  "params": {
    "name": "say_hello",
    "arguments": {
      "name": "Alice"
    }
  }
}

回应:“你好,爱丽丝!”


🔧 配置

通过环境变量进行配置或 .env 文件:

变量 默认值 描述
MCP_API_KEY 生成 用于身份验证的API密钥
PORT 8000 服务器端口
MCP_DISABLE_AUTH false 禁用API密钥身份验证
MCP_KEY_PREFIX sk- 生成的API密钥的前缀
MCP_KEY_BYTE_LENGTH 32 API密钥的长度(字节)
MCP_DB_PATH MCP.DB neneneba API键的SQLite DB文件

API密钥被存储并在24小时后自动导出。


📦 api参考

主要出口产品

  • loadConfig() –加载服务器配置
  • generateApiKey(prefix, byteLength) –生成安全的API密钥
  • setApiKey(key, createdAt) –将API密钥存储在数据库中
  • getApiKey() –从数据库检索API密钥
  • isApiKeyExpired(createdAt) –检查过期时间
  • renewApiKey(config) –生成并存储新密钥
  • findAvailablePort(startPort) –查找开放端口
  • populateTools(server) –注册自定义工具
  • cleanupSession(sessionId) –清理会议

如何添加工具

所有工具定义见 src/tools.ts。要添加新工具,请编辑 populateTools 功能和使用 server.tool().


🧰 工具函数

_makeRequest

用于生成API请求(GET、POST、自定义方法、请求主体、头)的助手。

签字:

const _makeRequest = async <T>(
  api_url = API_URL,
  {
    method = "GET",
    headers = {},
    body = undefined,
  }: {
    method?: string;
    headers?: HeadersInit;
    body?: unknown;
  } = {}
): Promise<T | null>

GET示例:

const result = await _makeRequest<MyType>("https://api.example.com/data");

POST示例:

const result = await _makeRequest<MyType>("https://api.example.com/data", {
  method: "POST",
  body: { key: "value" },
  headers: { Authorization: "Bearer TOKEN" }
});

自动设置 Content-Type: application/json 对于非弦体。 返回解析的JSON或 null 错误。

示例:添加一个调用外部API的工具

// src/tools.ts
server.tool(
  "get_todos",
  "Retrieve a list of todos",
  {},
  async () => {
    const todos = await _makeRequest<Array<{ id: string; name: string }>>("https://api.example.com/todos");
    if (!todos || todos.length === 0) {
      return { content: [{ type: "text", text: "No todos found." }] };
    }
    return {
      content: [{ type: "text", text: todos.map(t => `ID: ${t.id}, Name: ${t.name}`).join("\n") }],
    };
  }
);

看 src/tools.ts 更多示例和细节。


🧪 测试

运行所有测试:

pnpm test
# All tests are TypeScript and cover DB logic, session management, and API endpoints.

🧹 代码质量

格式代码:

pnpm format
# Uses Biome for formatting

棉绒编码:

pnpm lint
# Uses Biome for linting

🤝 贡献

欢迎提交请求和问题!请在提交前运行测试和lint。

提示: 代码库完全是TypeScript,并使用SQLite进行持久的API密钥管理。看 src/db.ts 用于DB逻辑。


📄 许可证

麻省理工学院


MCP-FORGE --专为可扩展、上下文驱动的应用程序而设计。