Skip to main content
Glama
zhanghaha416

yapi-mcp-zhh

by zhanghaha416
README.md
# yapi-mcp-zhh

**YApi Mock MCP**:面向 [YApi](https://github.com/YMFE/yapi) 的 [MCP](https://modelcontextprotocol.io) 服务。在支持 MCP 的客户端里列出项目、搜索/新建接口、改 Mock(返回体、高级脚本、期望),并打 mock URL 确认是否生效。

包名与仓库均为 `yapi-mcp-zhh`。

需要:**Node.js 20+**,以及本机能访问目标 YApi(内网即可)。

## 架构

客户端只走 MCP;本进程把工具转成对 YApi 的 HTTP。stdio 和 HTTP 共用同一套 Tools / `YapiClient`。

![架构](docs/architecture.svg)

未配 `YAPI_BASE_URL` 或 `YAPI_DEMO=true` 时走演示,不写真实 YApi。`npm start` 额外提供浏览器演示台,和 MCP 是同一套 Tools。

## 能做什么 / 不能做什么

YApi Mock 生效顺序:**期望 > 高级脚本 > 接口返回体**。

| 能力 | 说明 | 鉴权 |
| --- | --- | --- |
| 列项目、搜接口 | 登录账号能看到的分组/项目 | 登录态 |
| 新建接口 | 标题、路径、方法、分类;可选顺带写返回体 | 登录态 |
| 读/改普通 Mock(`res_body`) | 接口编辑页里的返回数据 / JSON Schema | **项目 Token** |
| 读/改高级 Mock 脚本 | 官方 advanced-mock 插件,整段覆盖 | 登录态 |
| 增删改 Mock 期望 | 按请求参数匹配不同 JSON | 登录态 |
| 试打 Mock | `GET/POST …/mock/{projectId}{path}` | 一般不需要登录 |

**不会做:** 改请求参数文档、删接口、改项目设置、部署业务代码。

项目 Token 和登录密码不是一回事:Token 只管普通返回体;脚本和期望必须登录(或 Cookie)。

## 安装

```bash
git clone https://github.com/zhanghaha416/yapi-mcp-zhh.git
cd yapi-mcp-zhh
npm install
npm run build
```

编译后 stdio 入口:

```text
dist/server/mcp-stdio.js
```

请使用该文件的**绝对路径**。也可 `npm run mcp`(等价 `node dist/server/mcp-stdio.js`)。

## 接入方式

标准 MCP:本机用 **stdio**(客户端拉起 `dist/server/mcp-stdio.js`,不必 `npm start`),或连已启动的 **HTTP** `/mcp`。模板:[share/mcp.stdio.json](share/mcp.stdio.json)、[share/mcp.http.json](share/mcp.http.json)。

`command` 建议用 Node 20+ 的绝对路径,避免客户端默认到旧 Node。

stdio 配置骨架(改绝对路径和账号):

```json
{
  "mcpServers": {
    "yapi-mock": {
      "command": "node",
      "args": ["/absolute/path/to/yapi-mcp-zhh/dist/server/mcp-stdio.js"],
      "env": {
        "YAPI_BASE_URL": "http://yapi.example.com",
        "YAPI_PROJECT_TOKENS": "111:tokenA,222:tokenB",
        "YAPI_EMAIL": "you@example.com",
        "YAPI_PASSWORD": "your-password"
      }
    }
  }
}
```

### Cursor、Claude、Codex

这几家 JSON 几乎一样,都是 `mcpServers` + `command` / `args` / `env`(HTTP 则是 `url` + `headers`)。差别主要是**写到哪个文件**:

| 客户端 | 常见做法 |
| --- | --- |
| Cursor | `~/.cursor/mcp.json`,或 Settings → MCP → 编辑配置 |
| Claude Desktop | 官方 MCP 配置文件(同样贴上一段) |
| Codex | 按其 MCP 文档写入,字段与上面相同 |

保存后刷新 MCP 列表,应出现 `yapi-mock`。

### WorkBuddy

JSON 可以原样用上面这段,但入口不一样:

1. WorkBuddy → **Connections → Custom connections → Configure MCP**(会打开本机 `~/.workbuddy/mcp.json`)。
2. 把 `yapi-mock` 合并进去并保存。
3. 在连接管理里把该 MCP **打开开关**,工具才会进对话(只存文件、不打开开关,经常调不到)。

HTTP 模式把 `share/mcp.http.json` 里的 `url` / `Authorization` 写进同一文件即可。

### HTTP(一台机器给多人)

```bash
cp .env.example .env
# 填写 YApi 地址、Token、登录账号
# 连真 YApi 时必须设置 MCP_HTTP_AUTH_TOKEN(例如 openssl rand -hex 24)
npm install
npm run build
npm start
```

默认:

| 地址 | 用途 |
| --- | --- |
| `http://127.0.0.1:43181/mcp` | MCP(Streamable HTTP) |
| `http://127.0.0.1:43181/` | 本机演示台(浏览器) |

客户端示例:

```json
{
  "mcpServers": {
    "yapi-mock": {
      "url": "http://host:43181/mcp",
      "headers": {
        "Authorization": "Bearer <与服务器 MCP_HTTP_AUTH_TOKEN 相同>"
      }
    }
  }
}
```

写出的 Mock 都算**服务器上那个 YApi 账号**。不要把端口暴露到公网。

## 环境变量

可写在客户端 `env` 里,HTTP 模式也可写在 `.env`(见 `.env.example`)。

| 变量 | 必填 | 说明 |
| --- | --- | --- |
| `YAPI_BASE_URL` | 接真环境时必填 | YApi 源站,末尾不要 `/`。不填或 `YAPI_DEMO=true` 时走内存演示,不会写入真实 YApi |
| `YAPI_PROJECT_ID` | 否 | 工具省略 `projectId` 时的默认项目 |
| `YAPI_TOKEN` | 改普通返回体时需要 | 单个项目 Token(项目 → 设置 → Token) |
| `YAPI_PROJECT_TOKENS` | 多项目时推荐 | `项目ID:token`,逗号分隔。切项目不用改配置,对话里带项目 ID 即可 |
| `YAPI_EMAIL` / `YAPI_PASSWORD` | 列项目、新建接口、脚本、期望需要 | 域账号或邮箱都可以。默认先走 `/api/user/login_by_ldap`,失败再走 `/api/user/login` |
| `YAPI_LOGIN` | 否 | `auto`(默认)/ `ldap` / `password`。`domain` 等同 `ldap` |
| `YAPI_COOKIE` | 否 | 浏览器里的 `_yapi_token=…; _yapi_uid=…`,可代替密码 |
| `YAPI_INSECURE_TLS` | 否 | 内网 HTTPS 证书不受信任时设为 `true` |
| `YAPI_DEMO` | 否 | `true` 强制演示后端 |
| `PORT` | 否 | HTTP / 演示台端口,默认 `43181` |
| `MCP_HTTP_AUTH_TOKEN` | 连真 YApi 的 HTTP MCP 必填 | 客户端放在 `Authorization: Bearer` |

密钥只放在本地客户端配置或 `.env` 中,不要提交到 git。

## 工具一览

| 工具 | 做什么 |
| --- | --- |
| `yapi_list_projects` | 列出当前账号能看到的项目 |
| `yapi_search_interfaces` | 按标题、路径、方法搜索;`keyword` 为空则列出(受已知项目 ID 限制) |
| `yapi_create_interface` | 新建接口。不传分类时优先「公共分类」,否则第一个分类;可带 `resBody` |
| `yapi_get_interface_mock` | 读返回体和 mock URL |
| `yapi_update_interface_mock` | 写普通 Mock 返回体 |
| `yapi_get_advanced_mock` / `yapi_update_advanced_mock` | 读/覆盖高级脚本 |
| `yapi_list_mock_cases` / `yapi_save_mock_case` / `yapi_delete_mock_case` | Mock 期望 |
| `yapi_call_mock` | 请求 mock URL,确认写入是否生效 |

新建接口主要参数:`title`、`path`,可选 `method`(默认 GET)、`projectId`、`catId` / `catName`、`resBody`。

对话里可以这样试:

> 列出我能访问的 YApi 项目,再搜 /api/order/list  
> 在某项目新建 GET /mcp/ping,返回 `{"ok":true}`,并打一次 mock

## 仅本地演示

```bash
npm install
npm run build
npm start
```

打开 `http://127.0.0.1:43181`。数据在进程内存里。stdio 把 `YAPI_DEMO` 设为 `true`、或不设 `YAPI_BASE_URL`,效果相同。

开发热更新:`npm run dev`。

## 常见问题

**客户端起不来 MCP**  
stdio 的 `args` 不是绝对路径,或还没 `npm run build`。Node 版本低于 20 也会失败。

**搜接口不知道项目**  
配 `YAPI_PROJECT_ID`,或 `YAPI_PROJECT_TOKENS=项目ID:token`。也可以先调 `yapi_list_projects`(需要登录)。

**改返回体失败、改脚本提示请登录**  
普通返回体要项目 Token;脚本/期望/新建/列项目要 `YAPI_EMAIL` + `YAPI_PASSWORD` 或 `YAPI_COOKIE`。默认优先域账户(LDAP)登录,不通再试普通登录。

**切项目还要改配置吗**  
不用。把常用项目写进 `YAPI_PROJECT_TOKENS`。只有新项目要改普通返回体、且还没配过 Token 时才补一行。

**改了但前端还是旧数据**  
用 `yapi_call_mock` 打 `{YAPI_BASE_URL}/mock/{项目ID}{接口路径}`。浏览器缓存或本地代理没指到 YApi mock 时,页面不会变。

## 开发

```bash
npm test
npm run typecheck
```

协议实现:`@modelcontextprotocol/sdk`。stdio 入口 `src/server/mcp-stdio.ts`,HTTP 挂载 `src/server/mcp-http.ts`。

TDQS

A3.5/5.0

Scored across 11 tools

Disambiguation4/5

工具总体职责分明:普通 Mock、高级 Mock、Mock 期望、项目/接口查询分别有明确入口。唯一可能混淆的是 get_interface_mock 与 get_advanced_mock、update_interface_mock 与 update_advanced_mock,但描述中明确区分了普通与高级。

Naming Consistency5/5

全部工具统一使用 yapi_ 前缀 + 动词_名词的 snake_case 模式,如 list_projects、create_interface、save_mock_case,规律一致,易于预测。

Tool Count5/5

11 个工具围绕 YApi Mock 配置和项目/接口发现展开,数量适中,没有冗余或缺失明显的工具。

Completeness4/5

覆盖了普通 Mock 读写、高级 Mock 读写、Mock 期望的增删查、接口搜索/创建和项目列举,能支撑主要工作流。但缺少接口更新/删除等操作,若超出 Mock 配置场景会有缺口。

Maintenance

ActivityMaintained
ResponsivenessNo issues