api-docs-mcp-server
api-docs-mcp-server
将 OpenAPI / Swagger 接口文档暴露为 MCP (Model Context Protocol) 工具 的服务端。
框架无关(零 NestJS / 框架依赖),提供两种接入形态:
stdio 模式(CLI):
npx -y api-docs-mcp-server@latest --source=...,免安装直接拉起,供 Agent 智能体(Claude Code / Cursor / 其他 MCP 客户端)通过mcpServers配置使用HTTP 模式:
createMcpHttpHandlerExpress 中间件 / 原生 Node http,自托管服务,供远程 MCP 客户端连接
特性
5 个 MCP 工具:概览 / 搜索 / 详情 / 全量导出 / 刷新缓存
双规范支持:OpenAPI 3.x 与 Swagger 2.0(自动归一化为 3.x 视图)
$ref 递归展开:接口详情中数据模型引用直接展开为可读结构(循环引用标记
$ref-cycle)多数据源:URL 下载或本地文件(
.json/.yaml/.yml),20MB 上限内置缓存:TTL 5 分钟、LRU 最多 10 个源,支持手动强制刷新(失败保留旧缓存)
可注入依赖:自定义 axios 实例 / logger / 缓存参数
安装
要求 Node >= 18。
npm install api-docs-mcp-server终端用户无需安装:通过
npx -y api-docs-mcp-server@latest免安装直接运行(@latest保持最新版)。
快速开始
按使用场景二选一:
场景 | 推荐形态 |
本地 Agent(Claude Code / Cursor)直接接入 | stdio 模式 |
自托管服务,供远程 MCP 客户端调用 | HTTP 模式 |
完整示例:使用一个 OpenAPI 文档链接
以一个真实的 OpenAPI 文档链接为例,走一遍从接入到调用的完整流程。
1. 准备文档链接
以 Petstore 官方 OpenAPI 文档为例(其他任意 .json / .yaml / .yml 链接同理):
https://petstore.swagger.io/v2/swagger.json2. 接入 Agent(Claude Code / Cursor)
将链接作为默认文档源配置到 mcpServers:
{
"mcpServers": {
"petstore": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"api-docs-mcp-server@latest",
"--source=https://petstore.swagger.io/v2/swagger.json"
]
}
}
}3. 在对话中直接使用
配置完成后,Agent 即可基于该文档链接调用 MCP 工具:
用户提问 | Agent 触发的工具 | 返回结果 |
「这份文档里有哪些接口?」 |
| 接口总数、tags 分组统计 |
「查找用户登录的接口」 |
| 匹配的 path / summary / operationId |
「查看创建宠物接口的详细参数」 |
| 参数说明与 $ref 展开后的数据模型 |
临时切换文档:调用工具时传入
source参数即可覆盖默认链接,如{"source": "https://another.example.com/openapi.json"}。
方式一:stdio 模式(推荐,Agent 智能体接入)
无需安装到本地,直接通过 npx 拉起(@latest 保持最新版):
# 默认文档源为 URL
npx -y api-docs-mcp-server@latest --source=https://petstore.swagger.io/v2/swagger.json
# 或本地文件
npx -y api-docs-mcp-server@latest --source=./docs/openapi.yaml
# 自定义 server 名称/版本
npx -y api-docs-mcp-server@latest --source=https://xxx.com/v2/api-docs --name=my-api在 Cursor / Claude Code 的 mcpServers 配置中添加:
{
"mcpServers": {
"api-server": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"api-docs-mcp-server@latest",
"--source=https://xxx.com/v2/api-docs"
]
}
}
}说明:工具调用时也可通过
source参数传入其他文档地址(优先级高于 CLI 的--source默认值)。
CLI 参数
参数 | 说明 |
| 默认文档源(URL 或本地文件路径) |
| MCP server 名称(默认 |
| MCP server 版本号(默认 |
| 显示帮助 |
方式二:HTTP 模式(自托管服务)
Express
import express from 'express';
import { createMcpHttpHandler } from 'api-docs-mcp-server';
const app = express();
app.use(express.json()); // 交给 MCP 处理器前先解析 JSON body
app.use(
'/mcp',
createMcpHttpHandler({
defaultSource: 'https://petstore.swagger.io/v2/swagger.json', // 可选
})
);
app.listen(3000);
// MCP 端点: http://localhost:3000/mcp原生 Node http
import { createServer } from 'node:http';
import { createMcpHttpHandler } from 'api-docs-mcp-server';
const handler = createMcpHttpHandler(); // 无需 express.json(),内部自动解析 body
createServer(async (req, res) => {
await handler(req, res);
}).listen(3000);HTTP 模式下文档源可通过以下方式指定(优先级从高到低):
工具调用参数
source(如{"source": "https://.../openapi.json"})请求 URL 查询参数
?source=<文档地址>请求头
x-mcp-source: <文档地址>服务端默认源
createMcpHttpHandler({ defaultSource })
MCP 工具
工具 | 说明 |
| 文档概览:info / servers / tags 分组统计 / 接口总数 |
| 按关键词搜索接口(匹配 path / summary / description / tags / operationId) |
| 按 method + path 返回接口详情,$ref 递归展开 |
| 导出完整/分段文档(format: json/yaml, section: full/paths/schemas/info) |
| 强制刷新文档缓存(传 source 刷新单源,不传刷新全部缓存源) |
配置项
createMcpHttpHandler(options)
选项 | 类型 | 默认 | 说明 |
|
| - | 服务端默认文档源 |
|
| 自动创建 | 自定义服务实例(共享缓存 / 注入测试替身) |
|
|
| 日志器 |
|
| 10MB | HTTP 请求体大小上限(字节) |
|
|
| MCP 客户端看到的 server 元信息 |
new OpenapiService(options)
选项 | 类型 | 默认 | 说明 |
|
|
| 自定义 axios 实例(代理 / 拦截器 / 测试) |
|
|
| 日志器 |
|
| 20MB | 单个 spec 文件大小上限(字节) |
|
| 5 分钟 | 缓存有效期 |
|
| 10 | 最多缓存的数据源数量(LRU) |
startStdioServer(options)
库内嵌启动 stdio 模式 MCP server(与 CLI 同款逻辑,日志自动走 stderr):
import { startStdioServer } from 'api-docs-mcp-server';
const handle = await startStdioServer({
defaultSource: 'https://.../openapi.json',
serverInfo: { name: 'my-server' },
});
// 进程退出前调用 handle.close() 优雅关闭createMcpServer(service, options)
底层 API,直接构造注册好工具的 McpServer(可配合 StdioServerTransport / SSEServerTransport 等任意传输使用):
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { createMcpServer, OpenapiService } from 'api-docs-mcp-server';
const service = new OpenapiService({ defaultSource: 'https://.../openapi.json' });
const server = createMcpServer(service, { defaultSource: 'https://.../openapi.json' });
await server.connect(new StdioServerTransport());错误处理
所有文档源错误统一为 McpSourceError,携带机器可读的 kind 分类:
SOURCE_NOT_SPECIFIED/DOWNLOAD_FAILED/FILE_READ_FAILED/INVALID_EXTENSION/FILE_TOO_LARGEINVALID_DOCUMENT/UNSUPPORTED_METHOD/PATH_NOT_FOUND/METHOD_NOT_FOUNDBODY_TOO_LARGE/BODY_PARSE_FAILED
MCP 工具调用失败时以 isError: true 返回错误文本,HTTP 层错误返回 JSON-RPC 错误格式。
与 NestJS 的适配
本包不依赖 NestJS。在 NestJS 项目中接入只需一步:
// mcp.controller.ts
import { Controller, Post, Req, Res } from '@nestjs/common';
import { createMcpHttpHandler } from 'api-docs-mcp-server';
@Controller('mcp')
export class McpController {
@Post()
async handle(@Req() req, @Res() res) {
await createMcpHttpHandler({ defaultSource: '...' })(req, res);
}
}注意:Nest 路由层需要禁用
ValidationPipe对 MCP 请求体的校验(该端点的 body 是 JSON-RPC 消息,不是业务 DTO)。
License
MIT