safety-eval-service-frontend/.cursor/skills/apifox-mcp/SKILL.md

138 lines
8.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

---
name: apifox-mcp
description: Reads OpenAPI Spec from Apifox project for API-driven code generation. Use when defining interfaces, implementing declareRequest, generating API client code, or when the user mentions Apifox, API documentation, or OpenAPI specs.
---
# Apifox MCP 工具
通过 `apifox-mcp-server` 将 Apifox 项目中的 OpenAPI Spec 提供给 AI用于按接口文档生成代码、实现 `declareRequest`、定义请求模型等。
## 数据源优先级(必读)
回答某条接口的字段、类型、结构,或据此写代码时:
1. **先用本地契约**:根据 **`path` + HTTP 方法** 按下文规则算出 `<operation-folder>`,检查项目根目录是否存在 **`.api/<operation-folder>/spec.json``type.d.ts`**。
2. **若两者皆存在****不得**为此接口调用 Apifox MCP`read_project_oas_*` / `read_project_oas_ref_resources_*` / `refresh_project_oas_*`)。直接用 Read 等工具读取上述文件,向用户说明内容或据此生成代码即可。
3. **仅在下述情况才调用 MCP**
- 本地 **无** 对应目录,或缺少 `spec.json` / `type.d.ts` 之一;
- 用户 **明确要求** 与 Apifox **同步 / 刷新 / 更新 / 对齐最新文档**(或同义表述);
- 用户 **点名** 要从 Apifox / OpenAPI 源拉取(而非使用仓库内 `.api`)。
4. MCP 拉取或修正接口后:按「`.api` 本地契约目录」**回写或新建** `spec.json``type.d.ts`,供下次走规则 12。
## Apifox `int64` 与 Java `Long`(前端精度,必读)
Java **Snowflake / 分布式 Long 主键** 常超出 `Number.MAX_SAFE_INTEGER`2^531。Apifox 从后端导入时往往把 `Long` 标成 OpenAPI 的 **`integer` + `format: int64`**,容易和「前端用 `number` / `Number(x)`」混在一起,导致 **ID 在 JS 里被静默改值**
落盘 `.api` 与写业务代码时:
1. **不要用 `Number()`、`parseInt`** 清洗仅用于透传的 **主键、外键类 Long ID**,除非你已确认值必然在安全整数范围内且后端只接受数字 JSON。
2. **优先在 `spec.json` / `type.d.ts` 里把这类字段写成 `string`(或与后端约定的字符串形态)**,并在 `description` 里注明「后端 Long / Apifox 显示 int64前端按字符串保证精度」。这样仓库内契约与实现一致也不会误导后续只读 OpenAPI 的自动化生成。
3. 若 Apifox 源 Spec 仍为 `integer`/`int64`,以 **本仓库 `.api` 校正后的类型** 为协作准绳;需要与文档门户完全一致时,再在 Apifox 里改模型或注明字符串序列化策略。
## 触发场景
- **默认**:用户问某接口详情或要对接实现时,若 `.api` 已有契约 → **只读本地文件**,不触发 MCP。
- **需调用 MCP 时**:本地无契约、不完整,或用户要求 **同步 Apifox / 刷新 Spec**;或用户明确要对照线上 OpenAPI。
- 其余:实现 `declareRequest`、表格列、表单字段、路径与参数说明等,**在有本地契约时均以 `.api` 为准**。
## 核心工具
调用前需查阅 `mcps/user-apifox/tools/*.json` 获取当前项目的工具名与参数 schema工具名可能带项目后缀`_qzukxd`)。
| 工具类型 | 用途 | 典型参数 |
|----------|------|----------|
| `read_project_oas_*` | 读取默认模块的 OpenAPI Spec 完整内容 | 无必需参数 |
| `read_project_oas_ref_resources_*` | 读取 Spec 内 `$ref` 引用的子文件内容 | `path`: 字符串数组,如 `["/paths/_get_pet.json"]` |
| `refresh_project_oas_*` | 从服务器重新下载最新 SpecApifox 有更新时) | 无必需参数 |
## 调用方式
使用 `call_mcp_tool` 调用,`server` 为 `user-apifox`
```json
{
"server": "user-apifox",
"toolName": "read_project_oas_qzukxd",
"arguments": {}
}
```
读取 `$ref` 引用文件示例:
```json
{
"server": "user-apifox",
"toolName": "read_project_oas_ref_resources_qzukxd",
"arguments": {
"path": ["/paths/_get_xxx.json", "/components/schemas/User.json"]
}
}
```
## 典型流程
1. **解析目标**:确定接口 `path`、HTTP 方法,算出 `<operation-folder>`(见下文章节)。
2. **本地命中**:若 `.api/<operation-folder>/`**已有** `spec.json``type.d.ts`**读这两个文件即完成**,不写 MCP向用户输出协议内容或继续写 `src/api` 等业务代码。
3. **本地未命中或用户要求同步**:再调用 `read_project_oas_*`(及按需 `read_project_oas_ref_resources_*`)解析 `paths` / `components`;必要时先 `refresh_project_oas_*`
4. **落盘**:新建或更新 `.api/<operation-folder>/spec.json``type.d.ts`
5. **生成业务代码**:按项目规范(`declareRequest`、`jjb-common-lib` http 等)在 `src/api` 等目录实现;类型可从 `.api/.../type.d.ts` 引用(纯 JS 项目可用 `jsconfig.json``include`TS 项目配置 `tsconfig.json``include` / `paths` 使 `.api` 可被解析)
## `.api` 本地契约目录(项目根目录)
从 Apifox MCP 解析某条接口后,**必须在仓库根目录**维护并行结构便于人机查阅、diff 与少刷 MCP。
### 目录结构
```text
.api/
<operation-folder>/
spec.json # OpenAPI 3.x 自包含片段paths + 本接口涉及的 components.schemas
type.d.ts # 与 spec 对齐的 TypeScript 声明(仅类型,不参与 declareRequest 逻辑)
```
### `<operation-folder>` 命名规则
1. 取 OpenAPI **`path`**,去掉首字符 `/`,其余 `/` 改为 **`-`**kebab-case 路径段串联)。
2. 末尾拼接 **HTTP 方法小写**`-get`、`-post`、`-put`、`-delete`、`-patch` 等。
**示例**
| path | method | 目录名 |
|------|--------|--------|
| `/ai/conversation/message/page` | GET | `ai-conversation-message-page-get` |
| `/ai/conversation/message/{id}` | GET | `ai-conversation-message-id-get`(若 Spec 中为字面量 `{id}`,文件夹名用字面量 `id`,与团队约定一致即可) |
同一路径多方法时:**每个方法单独一层目录**(如 `...-get``...-delete`)。
### `spec.json` 要求
- 顶层为合法 OpenAPI 3.x 文档最小子集:`openapi`、`info`(可简要说明同步来源)、`paths`**仅当前接口**)、`components.schemas`(仅当前接口响应/请求体引用的模型)。
- **禁止使用未解析的 `$ref` 指向仓库外文件**;从 MCP 取到的引用应 **内联展开** 或合并进本文件的 `components.schemas`
- `info.version` 可用 `1.0.0`;若 Apifox 有变更,以 **更新 spec + type** 为准。
### `type.d.ts` 要求
- 导出 **Query / Path / Body**(按接口实际存在项)及 **响应体** 中与业务相关的类型;命名可与后端 CO/VO 一致,或与 `spec.json` 中 schema 标题一致。
- 字段可选性、枚举用注释标出合法取值,与 `spec.json` **保持一致**。
- **`integer` / `int64`(尤其对应 Java `Long` 的主键/外键)**:在 JS 侧若存在超大整数风险,**本地契约与类型应使用 `string`**,不得默认定为 `number`见上文「Apifox int64 与 Java Long」。
- 文件顶部用简短注释标明 **METHOD + path**,并指向同目录 `spec.json`
### 与 MCP 的配合
- **`spec.json` + `type.d.ts` 齐全时**:视为权威快照,**禁止**仅为「再看一眼字段」而调用 MCP以 Read 工具输出的本地文件为准。
- **例外**:用户说 **同步/刷新/对齐 Apifox**,或本地缺一文件、或新接口尚未落盘 → 再调用 MCP**回写** 两个文件。
- **新增接口**:从 MCP 拉全量或按需拉 `$ref` 后,**新建**对应 `<operation-folder>`,勿与既有目录合并混淆。
## 最佳实践
- **先 `.api` 后 MCP**:有齐套本地契约则不调用 MCP见上文「数据源优先级」
- **调用 MCP 时先查 schema**:阅读 `mcps/user-apifox/tools/` 下对应工具 descriptor确认 `toolName``arguments`
- **同步意图**:仅当用户要求或本地缺失时 `refresh_project_oas_*` / 读 Spec通过后 **必更新** `spec.json``type.d.ts`
- **结合规范**:生成接口代码时遵循项目 `api-data-layer`、`11-接口与数据层规范` 等技能
## 前置条件
- mcp.json 中已配置 `apifox`,且 `--site-id`(或 `--project-id`)指向正确项目
- 私有部署需配置 `APIFOX_ACCESS_TOKEN` 或对应环境变量
- Spec 数据本地缓存Apifox 更新后需手动 `refresh`