Skip to main content
Glama
README.md
# knife4j-mcp

一个基于 Node.js + TypeScript 的标准 MCP server(stdio),用于读取 Knife4j / Swagger 多模块接口文档,并为 Agent 提供结构化接口查询能力。

它适合这样的场景:

- 文档入口不是单个 OpenAPI spec,而是 Knife4j 聚合页
- 需要先从 `/swagger-resources` 获取模块列表
- 每个模块再去拉自己的 `/v2/api-docs`
- 文档可能受 Basic Auth 或自定义 Header 保护
- Agent 需要根据路径、关键词、tag、字段线索快速定位接口

## 使用方式

```bash
SWAGGER_RESOURCES_URL=http://127.0.0.1:3301/swagger-resources \
npx -y @chaselen/knife4j-mcp
```

如果文档受保护,也可以一起传认证信息:

```bash
SWAGGER_RESOURCES_URL=http://127.0.0.1:3301/swagger-resources \
SWAGGER_BASIC_AUTH=demo:demo \
npx -y @chaselen/knife4j-mcp
```

说明:

- 已发布到 npm,可直接通过 `npx` 启动
- 要求 Node.js >= 20
- 这是一个 stdio MCP server,通常由 MCP Client 拉起,而不是手动长期在终端里交互运行

## MCP Client 接入

这个包不只支持 Codex,也支持 Claude Code、OpenCode,以及其他支持本地 stdio MCP 的客户端。

本质上都可以抽象成下面这组启动参数:

```json
{
  "command": "npx",
  "args": ["-y", "@chaselen/knife4j-mcp"],
  "env": {
    "SWAGGER_RESOURCES_URL": "http://127.0.0.1:3301/swagger-resources",
    "SWAGGER_BASIC_AUTH": "demo:demo"
  }
}
```

### Codex CLI

```bash
codex mcp add knife4j-swagger \
  --env SWAGGER_RESOURCES_URL=http://127.0.0.1:3301/swagger-resources \
  --env SWAGGER_BASIC_AUTH=demo:demo \
  -- npx -y @chaselen/knife4j-mcp
```

### Claude Code

CLI 添加方式:

```bash
claude mcp add knife4j-swagger \
  --env SWAGGER_RESOURCES_URL=http://127.0.0.1:3301/swagger-resources \
  --env SWAGGER_BASIC_AUTH=demo:demo \
  -- npx -y @chaselen/knife4j-mcp
```

如果你偏好项目级配置,也可以在项目根目录放一个 `.mcp.json`:

```json
{
  "mcpServers": {
    "knife4j-swagger": {
      "command": "npx",
      "args": ["-y", "@chaselen/knife4j-mcp"],
      "env": {
        "SWAGGER_RESOURCES_URL": "http://127.0.0.1:3301/swagger-resources",
        "SWAGGER_BASIC_AUTH": "demo:demo"
      }
    }
  }
}
```

### OpenCode

在 `opencode.json` 或 `opencode.jsonc` 中加入:

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "knife4j-swagger": {
      "type": "local",
      "command": ["npx", "-y", "@chaselen/knife4j-mcp"],
      "enabled": true,
      "environment": {
        "SWAGGER_RESOURCES_URL": "http://127.0.0.1:3301/swagger-resources",
        "SWAGGER_BASIC_AUTH": "demo:demo"
      }
    }
  }
}
```

### 其他客户端

如果你的 MCP 客户端支持本地 stdio server,通常只要把下面三类信息按它自己的格式填进去即可:

- `command`: `npx`
- `args`: `["-y", "@chaselen/knife4j-mcp"]`
- `env`: `SWAGGER_RESOURCES_URL`、`SWAGGER_BASIC_AUTH`、`SWAGGER_HEADERS` 等环境变量

## 环境变量

### 必填

- `SWAGGER_RESOURCES_URL`
  - Knife4j / Swagger 聚合入口地址,用来读取模块列表。
  - 这个地址通常就是平台暴露出来的 `/swagger-resources`,例如:`http://127.0.0.1:3301/swagger-resources`
  - server 启动后会先请求它,再根据返回结果继续拉取每个模块自己的 Swagger / OpenAPI 文档。
  - 注意:这里填的不是某个单独模块的 `/v2/api-docs` 或 `/v3/api-docs`,而是“模块目录入口”。

### 可选

- `SWAGGER_BASE_URL`
  - 用于补全 `swagger-resources` 里返回的相对路径。
  - 如果模块文档地址是 `/api/user/v2/api-docs` 这种相对路径,server 会拿它和 `SWAGGER_BASE_URL` 进行拼接。
  - 未设置时,默认回退到 `SWAGGER_RESOURCES_URL` 的基址。
  - 常见场景是:`swagger-resources` 和真实文档地址不在同一个基址下,或者经过了网关改写。
- `SWAGGER_BASIC_AUTH`
  - 访问 Swagger 文档时使用的 HTTP Basic Auth 账号密码。
  - 这个值会同时用于请求 `SWAGGER_RESOURCES_URL` 和每个模块的 spec 文档。
  - 格式是 `username:password`,例如:`demo:demo`
  - 不需要带 `Basic ` 前缀,程序会自动转成 `Authorization: Basic ...` 请求头。
  - 如果你的文档地址本身不需要登录认证,可以不填。
- `SWAGGER_HEADERS`
  - 额外附带到所有文档请求上的自定义 HTTP Header。
  - 适合需要 Token、租户标识、环境标识这类网关头的场景。
  - 格式是 JSON 字符串,例如:`{"X-Env":"dev","X-Token":"abc"}`
  - 这些 Header 会和 Basic Auth 一起生效;如果两者都配置了,请求会同时带上。
- `SWAGGER_MODULE_ALLOWLIST`
  - 只加载指定模块,其他模块会被忽略。
  - 适合模块很多、只想给 Agent 暴露其中一部分接口时使用。
  - 格式为逗号分隔,例如:`sample-account,sample-auth`
  - 这里填写的名称应与 `swagger-resources` 返回的模块名一致。
- `CACHE_TTL_MS`
  - 内存缓存有效期,单位是毫秒。
  - 默认值是 `300000`,也就是 5 分钟。
  - 在缓存有效期内,查询会直接复用已加载的索引;过期后会在下次刷新时重新拉取远端文档。
- `SWAGGER_REQUEST_TIMEOUT_MS`
  - 单次请求 `swagger-resources` 或模块 spec 的超时时间,单位是毫秒。
  - 默认值是 `15000`,也就是 15 秒;必须是大于 0 的数字。
- `SWAGGER_FETCH_CONCURRENCY`
  - 同时拉取模块 spec 的最大请求数。
  - 默认值是 `8`,允许设置为 `1` 到 `100` 之间的整数。
  - 模块很多或上游网关有连接数限制时,可以适当调低。
- `SWAGGER_EXTERNAL_REF_LIMIT`
  - 单个模块最多自动加载的外部 `$ref` JSON 文档数。
  - 默认值是 `32`,允许设置为 `0` 到 `200`;设置为 `0` 可关闭外部引用加载。
  - 外部文档使用与主 spec 相同的 Basic Auth、自定义 Header 和请求超时配置。
- `SWAGGER_EXTERNAL_REF_ORIGINS`
  - 允许加载跨 origin 外部 `$ref` 的白名单,使用逗号分隔,例如:`https://schemas.example.com,http://localhost:8080`。
  - 默认只允许与当前模块 spec 同 origin 的外部引用,避免把认证 Header 转发到未授权地址。
  - 白名单按 origin 匹配,配置中的路径会被忽略;只支持 HTTP 和 HTTPS。
- `LOG_LEVEL`
  - 日志级别。
  - 当前设为 `debug` 时会输出更多拉取和解析过程日志,便于排查文档地址、认证或 JSON 格式问题。

### 一个更完整的例子

```bash
SWAGGER_RESOURCES_URL=https://gateway.example.com/swagger-resources \
SWAGGER_BASIC_AUTH=swagger_user:swagger_password \
SWAGGER_HEADERS='{"X-Env":"prod","X-Tenant":"platform"}' \
SWAGGER_MODULE_ALLOWLIST=system-user,system-auth \
npx -y @chaselen/knife4j-mcp
```

## MCP Tools

对外只提供 4 个核心 tools:

- `list_specs`:列出模块、spec 地址、加载状态和接口数量
- `find_api`:按关键词、path、tag、module、method、接口类型和弃用状态搜索接口
  - 支持 `offset` + `limit` 分页
  - `total` 表示全部命中数,`returned` 表示本页数量,`hasMore` 表示是否还有后续结果
  - 相同相关性分数下使用稳定排序,便于可靠翻页
- `get_api_detail`:获取单个接口的完整详情,并递归展开请求/响应 schema
  - 默认保持完整兼容输出
  - 传入 `includeRaw: false` 可省略递归结果中的 `raw` 和顶层 `rawOperation`,减少 Agent 上下文占用
- `refresh_specs`:强制刷新 `swagger-resources` 和所有模块 spec

## 功能

- 支持读取 Knife4j / Swagger 多模块聚合文档
- 支持 Basic Auth 和自定义 Header
- 支持 Swagger 2.0,并尽量兼容 OpenAPI 3
- 支持按路径、关键词、tag、method 等条件搜索接口
- 在刷新阶段预计算路径别名和全文搜索文本,减少查询时的重复解析
- `get_api_detail` 可使用原始短路径、规范化路径或可唯一匹配的完整网关路径
- 支持通过 `get_api_detail` 获取完整接口详情,并递归展开请求/响应 schema
- 详情会显式返回 `operationId`、弃用状态、认证要求、servers、externalDocs、callbacks 和 security schemes
- 请求与响应详情支持 examples、encoding、响应 headers 与 links
- Schema 展开支持 OpenAPI 3.1 nullable 类型、default、const、examples、读写属性、discriminator 和常用校验约束
- 支持自动加载并打包跨文件 `$ref`,同时限制外部文档数量
- OpenAPI 3.1 `webhooks` 会作为 `kind: "webhook"` 的接口参与搜索
- 支持模块 allowlist、缓存 TTL 和手动刷新
- 单个模块加载失败不会影响其他模块可用
- 刷新发生临时失败时保留该模块上一次成功的索引,并在模块状态中标记 `stale`
- 聚合入口刷新失败时继续提供上一次成功的完整索引,并标记整体与模块状态为 `stale`
- 模块 spec 使用可配置的并发上限拉取,避免刷新时瞬间压高网关连接数
- 无效 spec 和重复模块名会被隔离并显示为失败状态

## 兼容性边界

- 支持 Swagger 2.x、OpenAPI 3.0 和常用 OpenAPI 3.1 JSON Schema 字段。
- 本地 JSON Pointer 与 HTTP(S) JSON 外部 `$ref` 可以递归展开;不解析 YAML、`file:` 或其他协议。
- 循环引用会保留为带 `ref` / `refName` 的节点,避免无限递归。
- `callbacks`、`links`、`securitySchemes` 等复杂扩展会保留结构化原始定义;请求和响应的主要 Schema 会进一步展开。

## 开发与验证

```bash
npm install
npm test
npm pack --dry-run
```

- `npm test` 会构建项目并运行 parser、registry、HTTP 配置和 MCP 内存传输集成测试。

## 最小可运行示例

仓库自带一个 mock 的多模块 Swagger 服务。

### 1. 启动 mock 文档服务

```bash
MOCK_SWAGGER_BASIC_AUTH=demo:demo npm run mock:swagger
```

默认地址:

- `http://127.0.0.1:3301/swagger-resources`
- `http://127.0.0.1:3301/sample-account/v2/api-docs`
- `http://127.0.0.1:3301/sample-auth/v2/api-docs`
- `http://127.0.0.1:3301/demo/sample-notify/v3/api-docs`

### 2. 构建 MCP server

```bash
npm run build
```

### 3. 运行 smoke test

```bash
SWAGGER_RESOURCES_URL=http://127.0.0.1:3301/swagger-resources \
SWAGGER_BASIC_AUTH=demo:demo \
npm run test:smoke
```

这个脚本会通过 MCP stdio client 依次调用:

- `tools/list`
- `list_specs`
- `find_api`
- `get_api_detail`

它会自动完成一次 `list_specs -> find_api -> get_api_detail` 的最小联调验证。

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

Each tool serves a distinct purpose: search, detail retrieval, listing, and refreshing. No overlap or ambiguity.

Naming Consistency5/5

All tool names follow a consistent 'verb_noun' pattern (find_api, get_api_detail, list_specs, refresh_specs).

Tool Count5/5

With 4 tools, the server is well-scoped for its purpose of API documentation browsing. Each tool is necessary.

Completeness4/5

Covers key operations (search, detail, listing, refresh). Minor gap: no raw spec retrieval, but described as unnecessary.

Maintenance

ActivityStale
ResponsivenessNo issues