把 YApi 装进终端和 Agent:@vtian/yapi-cli 的设计与实践

0 阅读4分钟

背景:接口文档不止给人看

团队用 YApi 管接口时,常见痛点是:查文档要切网页、联调要对照字段、写前端还要手抄类型。如果再把 AI 编码助手接进来,还需要一条稳定通路,让模型能「按需」读到真实接口定义,而不是整份文档塞进上下文。

@vtian/yapi-cli 的定位是:以 CLI 为唯一能力内核,在同一套逻辑上提供终端命令、MCP(Model Context Protocol)和 Cursor Skill,并支持多项目、多空间(多 baseUrl)配置,方便在 monorepo 或多后端场景下使用。

使用文档

www.npmjs.com/package/@vt…

核心能力一览

能力说明
联调 / 查详情按接口 ID 或 path 拉取接口信息,支持精简视图与带原始 schema 的完整视图
Mock根据响应体 JSON Schema 生成 mock 数据
TypeScript 类型从 schema 生成 TS 类型,可自定义基类型名
检索按分类列表、按关键词搜索标题/路径
多形态入口同一套逻辑:yapi 命令行、yapi-mcp 给支持 MCP 的客户端、Skill 给 Cursor 等 Agent 环境

架构:CLI 优先,MCP 只是薄适配层

从代码结构可以清楚看到分层:

  1. cli/core/service.ts
    真正的业务:listInterfacessearchInterfacesgetInterfaceDetailsgenerateMockDatagenerateTypes 等,内部调用 YApi 开放接口(如 project/getinterface/list_menuinterface/get),并结合 json-schema 模块做 mock 与类型生成。
  2. cli/api.ts
    基于 axios 的 HTTP 客户端工厂与各 API 封装,按 ResolvedProject 的 baseUrl 发请求。
  3. cli/public-api.ts
    对外暴露与 CLI/MCP 共用的函数式 API(再导出配置解析相关工具),保证 npm 包可被其他 Node 程序或 MCP 进程直接 import
  4. mcp/index.ts
    使用 @modelcontextprotocol/sdk 注册 yapi_searchyapi_listyapi_getyapi_mockyapi_types 等 tool,参数用 zod 描述,实现里一律调用 public-api 的同名能力。
    这样 MCP 层不包含重复业务逻辑,升级行为时只改一处。
  5. cli/index.ts
    Commander 注册子命令:configlist/lssearch/sgetmocktypes,与 MCP tool 一一对应。

整体可以理解为:YApi HTTP → service 层 →(CLI 子命令 | MCP tools | Skill 调 CLI/约定),避免「三套实现、三套 bug」。


配置设计:多项目 + 显式「活跃项目」

yapi.config.json 的设计兼顾了「配置复用」和「Agent 场景下的成本控制」:

  • baseUrl:全局默认;单个 project 可覆盖(例如本地联调指向 http://localhost:3000)。
  • projects:多个 projectId + token + 可选 projectName,避免每个项目重复写主机地址。
  • activeProjectIds:只有列在其中的 projectId 才会参与解析与查询。
    在源码里,resolveProjectById 会校验 ID 是否在 activeProjectIds 中,防止误扫未授权或不需要的项目,也减少 AI 侧无意义的全量遍历。

未显式指定 -p / projectId 时,多项目操作默认使用 activeProjectIds;需要「唯一项目」的命令(如 get/mock/types)在多个 active 项目时会要求你明确指定,避免歧义。


使用方式速览

终端:yapi config init 生成模板,yapi config list 查看解析到的配置路径与内容;yapi listyapi searchyapi getyapi mockyapi types 均支持 -p 与 --json 等选项(详见项目 README)。

MCP:在客户端配置里用 npx -y -p @vtian/yapi-cli yapi-mcp 启动 stdio 服务;若使用 fnm/nvm 等导致子进程没有 Node 环境,README 里给出了用 zsh -lic 包裹 npx 的写法。

Skill:npm run build 会产出 dist/yapi-skills.zip;可用官方脚本从 GitHub 拉取 zip 解压到 .agents/skills/yapi-cli-skill,与全局安装的 CLI 分步安装。

与旧项目 @vtian/yapi-mcp-server 在 Agent 里的用法保持一致,便于迁移;更细的接入说明可参考 README 中引用的掘金文章


技术栈与工程细节

  • TypeScript 编译到 dist/,双入口:yapiyapi-mcp
  • commander 做 CLI,axios 请求 YApi,zod 约束 MCP 入参,chalk 等用于终端输出。
  • MCP 进程里 stdout 专用于 JSON-RPC,启动时在 TTY 下用 stderr 提示「正在 stdio 监听」,避免破坏协议——这是写 MCP Server 时值得注意的细节。

小结与延伸

yapi-cli 的价值不在于「又一个查文档工具」,而在于:把 YApi 变成可编排的 API——终端脚本、CI、IDE 插件、MCP 客户端都能复用同一实现;activeProjectIds 则把「多项目」和「Agent 上下文节约」绑在一起,设计上是连贯的。