- 添加 Dockerfile、docker-compose.yml 和 Jenkins 流水线配置 - 新增 MCP 原生集成模块 (mcp_native.py) - 移除旧的 mcp_bridge.py,更新依赖和文档 - 添加部署文档 (Docker 和服务器部署指南) Co-authored-by: Cursor <cursoragent@cursor.com>
369 lines
14 KiB
Markdown
369 lines
14 KiB
Markdown
# MCP 工具能力说明(AI 专用)
|
||
|
||
> **读者**:Codex / Claude / Cursor 等通过 `quality-inspection-platform` MCP 工作的 Agent。
|
||
> **目的**:在调用 `tools/list` 之外,提供「何时用哪个工具、按什么顺序、参数怎么填」的固定上下文。
|
||
> **维护**:工具以 `app/main.py` 中 `MCP_TOOL_SPECS` 和平台 `GET /mcp/tools` 为准;增删工具时请同步更新本文档。
|
||
> **重要**:某些 MCP 客户端可能缓存、裁剪或延迟刷新工具列表;不要仅凭当前客户端可见工具反向删减本文档能力。
|
||
|
||
---
|
||
|
||
## 0. Agent 必读(30 秒)
|
||
|
||
1. **先** `catalog_snapshot` 了解现有 apis / workflows / workflow_batches / mocks / folders / ssh_tree,避免重复创建。
|
||
2. **写操作与执行**必须带 `sto-` API Key(MCP 请求头 `Authorization: Bearer` 或 `X-API-Key`;HTTP 脚本可在 body 传 `api_key`,兼容旧名 `AI_TEST_API_KEY`)。
|
||
3. **接口**用 `api_upsert`;**流程**用 `workflow_upsert` 或 `workflow_patch_json`;**跑批**固定三步:`workflow_batch_create` → `workflow_batch_update` → `workflow_batch_run`。
|
||
4. **排障**:`workflow_run_get` 看 request/response → `workflow_run_loki_link` 查日志。
|
||
5. 如果当前客户端没有显示某个工具,先用 MCP `tools/list` 或 `GET /mcp/tools` 核对,再重启 MCP 客户端 / 会话。
|
||
6. 人类可读安装见 `docs/mcp_install.md`;curl 示例见 `docs/mcp_quickstart.md`。
|
||
|
||
### 0.1 工具来源与客户端刷新
|
||
|
||
- 权威工具清单来自后端 `app/main.py` 的 `MCP_TOOL_SPECS`,平台通过 `GET /mcp/tools` 对外暴露。
|
||
- 平台内置 Streamable HTTP MCP(`GET/POST /mcp`),`tools/list` 由 `MCP_TOOL_SPECS` 提供;兼容 HTTP 网关 `GET /mcp/tools`。
|
||
- Codex / Cursor / Claude 等客户端可能在会话启动时缓存工具列表;平台新增工具后,通常需要重启 MCP 客户端或重启会话。
|
||
- 如果客户端只显示部分工具,不代表平台没有该能力。先用 `/mcp/tools` 或本文档核对,再决定是否降级。
|
||
- Agent 更新本文档时,应以源码和 `/mcp/tools` 为准,不以单个客户端当前暴露的工具子集为准。
|
||
|
||
---
|
||
|
||
## 1. 平台在做什么
|
||
|
||
| 层级 | 含义 | MCP 主要工具 |
|
||
|------|------|----------------|
|
||
| 接口库 | 单个 HTTP API 定义(method、url、headers、body…) | `api_upsert`、`catalog_snapshot` |
|
||
| 工作流 | 多节点编排(HTTP / 条件 / 循环 / 提取) | `workflow_upsert`、`workflow_run` |
|
||
| 跑批 | 一次任务顺序执行多个工作流 | `workflow_batch_*` |
|
||
| 执行历史 | 每次运行的 request/response 快照 | `workflow_run_list`、`workflow_run_get` |
|
||
| Mock | 命名数据集,供节点 mock 使用 | `mock_upsert` |
|
||
|
||
**数据约定**:`url` 只存**路径**(如 `/api/user/{id}`),环境域名放在执行时的 `base_url`。
|
||
|
||
---
|
||
|
||
## 2. 鉴权
|
||
|
||
### 2.1 平台地址
|
||
|
||
Codex 等客户端在个人 MCP 配置中配置平台 URL 与 API Key,例如:
|
||
|
||
| 配置项 | 含义 | 示例 |
|
||
|--------|------|------|
|
||
| `url` | MCP 端点 | `http://10.20.30.42:8000/mcp` |
|
||
| `http_headers.Authorization` / `headers.Authorization` | `Bearer sto-...` | `Bearer sto-xxx` |
|
||
|
||
Agent 通过 MCP 工具访问平台;平台进程由质量检测平台项目或共享内网服务负责。兼容环境变量名 `AI_TEST_API_KEY` 仅适用于旧 HTTP 脚本,MCP 客户端请用请求头传 Key。
|
||
|
||
### 2.2 调用鉴权
|
||
|
||
| 类型 | 工具示例 | 无 Key 时 |
|
||
|------|----------|-----------|
|
||
| 只读 | `catalog_snapshot`、`workflow_get`、`workflow_run_list` | 以 superadmin 读全库(不推荐生产暴露) |
|
||
| 写入 | `api_upsert`、`workflow_upsert`、`folder_ensure`… | **401** |
|
||
| 执行 | `workflow_run`、`workflow_batch_run`、`ssh_script_run`、`workflow_run_replay` | **401** |
|
||
|
||
环境变量 `MCP_REQUIRE_API_KEY=true` 时,**所有**工具(含 `GET /mcp/tools`)均需 Key。
|
||
|
||
写操作与执行类工具必须使用有效 Key。不要把 Key 写入文档、日志或对话输出;只允许放在 MCP 配置、环境变量或请求头中。
|
||
|
||
---
|
||
|
||
## 3. 按场景选工具(决策表)
|
||
|
||
| 用户意图 | 推荐工具链 |
|
||
|----------|------------|
|
||
| 我不知道项目里有什么 | `catalog_snapshot` |
|
||
| 客户端看不到某个工具 | 查 `GET /mcp/tools` → 重启 MCP 客户端 / 会话 → 再调用 |
|
||
| 从 Apifox/文档批量建接口 | `folder_ensure` → 多次 `api_upsert`(或 `invoke-batch`) |
|
||
| 新建/改流程图 | `workflow_validate`(可选)→ `workflow_upsert` |
|
||
| 只改流程里某几个字段 | `workflow_patch_json` |
|
||
| 跑一条流程 | `workflow_run`(`base_url` + `workflow_id`) |
|
||
| 只调试一个节点 | `workflow_run_node` |
|
||
| 版本/回归一次跑多条流程 | `workflow_batch_create` → `workflow_batch_update` → `workflow_batch_run` → `workflow_batch_get` |
|
||
| 看某次执行详情 | `workflow_run_get`(`run_id`) |
|
||
| 看历史列表 | `workflow_run_list`(`workflow_id` / `batch_id`) |
|
||
| 失败后续跑 | `workflow_run_replay`(`run_id`) |
|
||
| 查服务端日志 | `workflow_run_loki_link`(`run_id` + `node_id`) |
|
||
| 看节点上次结果 | `workflow_node_status` 或 `workflow_get` |
|
||
| 快速看上次成败统计 | `workflow_analyze_last_run` |
|
||
| 准备 Mock 数据 | `mock_upsert` |
|
||
| 运维脚本 | `ssh_tree` → `ssh_script_upsert` → `ssh_script_run` |
|
||
|
||
---
|
||
|
||
## 4. 工具清单(按分类)
|
||
|
||
下文参数均为各工具的 **`arguments` 对象**(MCP `tools/call` 直接传该对象)。仅在使用 HTTP 网关时,外层再包一层 `{"tool":"<名称>","arguments":{...}}`,见 [mcp_quickstart.md](./mcp_quickstart.md)。
|
||
|
||
### 4.1 发现与目录
|
||
|
||
#### `catalog_snapshot`
|
||
|
||
- **用途**:一次拉取 apis、workflows、mocks、**workflow_batches**、folders、ssh_tree。
|
||
- **参数**:无。
|
||
- **何时用**:任务开始、批量导入前、避免重复 `api_upsert`。
|
||
|
||
#### `folder_ensure`
|
||
|
||
- **用途**:登记 apis 或 workflows 目录(空目录也可)。
|
||
- **参数**:`target`:`apis` | `workflows`;`path`:如 `auth/login`(不要前导 `/`)。
|
||
- **需 Key**:是。
|
||
|
||
#### `folder_list`
|
||
|
||
- **用途**:列出已登记目录。
|
||
- **参数**:可选 `target`。
|
||
|
||
#### `api_move_folder` / `workflow_move_folder`
|
||
|
||
- **用途**:移动资源到目录;workflow 目标目录须已 `folder_ensure`。
|
||
|
||
---
|
||
|
||
### 4.2 接口(API)
|
||
|
||
#### `api_upsert`
|
||
|
||
- **用途**:创建或更新接口定义。
|
||
- **必填**:`name`、`method`、`url`。
|
||
- **常用可选**:`api_id`(更新)、`folder_path`、`headers`、`body`、`query`、`path_params`、`timeout_seconds`。
|
||
- **需 Key**:是。
|
||
- **示例**:
|
||
|
||
```json
|
||
{
|
||
"tool": "api_upsert",
|
||
"arguments": {
|
||
"name": "用户登录",
|
||
"folder_path": "auth",
|
||
"method": "POST",
|
||
"url": "/api/login",
|
||
"headers": { "Content-Type": "application/json" },
|
||
"body": { "username": "admin", "password": "{{password}}" },
|
||
"query": {},
|
||
"path_params": {}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### 4.3 工作流(Workflow)
|
||
|
||
#### `workflow_upsert`
|
||
|
||
- **用途**:创建/更新完整 `definition`(Drawflow JSON)。
|
||
- **必填**:`name`、`definition`(`nodes`、`edges`、`variables`)。
|
||
- **需 Key**:是。
|
||
- **注意**:非空 `folder_path` 须先 `folder_ensure`(workflows)。
|
||
|
||
#### `workflow_get`
|
||
|
||
- **用途**:读取流程及各节点 `last_run`。
|
||
|
||
#### `workflow_patch_json`
|
||
|
||
- **用途**:对 `definition` / `variables` 等深度合并 patch;小改动优先于全量 upsert。
|
||
|
||
#### `workflow_validate`
|
||
|
||
- **用途**:检查节点 id、边是否引用合法;**upsert 前**建议调用。
|
||
|
||
#### `workflow_move_folder`
|
||
|
||
- **用途**:移动工作流到已登记目录。
|
||
|
||
#### `workflow_node_status`
|
||
|
||
- **用途**:单节点最近 `last_run`。
|
||
|
||
#### `workflow_analyze_last_run`
|
||
|
||
- **用途**:上次执行汇总(成功/失败节点 id);细节不足时再 `workflow_get`。
|
||
|
||
---
|
||
|
||
### 4.4 执行
|
||
|
||
#### `workflow_run`
|
||
|
||
- **用途**:执行整条工作流。
|
||
- **必填**:`workflow_id`。
|
||
- **可选**:`base_url`(环境根地址)、`fail_fast`(默认 true)。
|
||
- **需 Key**:是。
|
||
- **返回**:`status`、`variables`、`results[]`(含每节点 request/response)、`run_id`。
|
||
|
||
#### `workflow_run_node`
|
||
|
||
- **用途**:只跑一个节点(调试参数)。
|
||
- **必填**:`workflow_id`、`node_id`。
|
||
- **需 Key**:是。
|
||
|
||
#### `workflow_run_replay`
|
||
|
||
- **用途**:按历史 run 内保存的 definition 快照重放。
|
||
- **必填**:`run_id`。
|
||
- **需 Key**:是。
|
||
|
||
---
|
||
|
||
### 4.5 跑批(Batch)
|
||
|
||
| 步骤 | 工具 | 说明 |
|
||
|------|------|------|
|
||
| 1 | `workflow_batch_create` | 建草稿,可带 `name`、`base_url`、`fail_fast` |
|
||
| 2 | `workflow_batch_update` | **必填** `batch_id`;设置 `workflow_ids: [1,2,3]` |
|
||
| 3 | `workflow_batch_run` | 执行,仅 `draft` 可跑 |
|
||
| 4 | `workflow_batch_get` | 查看结果及关联 `run_id` |
|
||
|
||
辅助:`workflow_batch_list`(`status` 过滤:draft|running|success|failed|partial)。
|
||
|
||
**需 Key**:create/update/run 需 Key;get/list 只读。
|
||
|
||
---
|
||
|
||
### 4.6 执行历史与日志
|
||
|
||
#### `workflow_run_list`
|
||
|
||
- **参数**:可选 `workflow_id`、`batch_id`、`limit`、`after_id`。
|
||
- **返回**:`items[]` 摘要(无完整 body 时用 `workflow_run_get`)。
|
||
|
||
#### `workflow_run_get`
|
||
|
||
- **参数**:`run_id`。
|
||
- **返回**:含 `payload`(`results`、`variables`、`workflow_snapshot`)。
|
||
|
||
#### `workflow_run_loki_link`
|
||
|
||
- **参数**:`run_id`、`node_id`(HTTP 节点)。
|
||
- **返回**:`explore_url`、`logql`、时间窗;未配 `GENERAL_LOKI_EXPLORE_URL` 时 `enabled=false`。
|
||
|
||
---
|
||
|
||
### 4.7 Mock 与其它
|
||
|
||
#### `mock_upsert`
|
||
|
||
- **用途**:按 `name` 创建/更新 Mock 数据集(`data` 对象)。
|
||
- **需 Key**:是。
|
||
|
||
#### `mcp_tool_upsert`
|
||
|
||
- **用途**:平台内「自定义 MCP 工具配置」表,**不是** Codex / Claude / Cursor 所见的内置 MCP 工具列表本身。
|
||
|
||
#### SSH 系列
|
||
|
||
| 工具 | 用途 |
|
||
|------|------|
|
||
| `ssh_tree` | 主机与脚本树 |
|
||
| `ssh_script_get` | 读脚本内容 |
|
||
| `ssh_script_upsert` | 创建/更新内联 bash(`profile_id`+`name`+`content`) |
|
||
| `ssh_script_run` | 远端执行(**需 password**,需 Key) |
|
||
|
||
---
|
||
|
||
## 5. 工作流 definition 约定(简版)
|
||
|
||
```json
|
||
{
|
||
"nodes": [
|
||
{ "id": "n1", "position": {"x": 0, "y": 0}, "data": { "type": "http", "api_id": 1, "save_as": "resp1" } },
|
||
{ "id": "n2", "data": { "type": "extract", "source_var": "resp1", "field": "json.token", "save_as": "token" } }
|
||
],
|
||
"edges": [
|
||
{ "id": "e1", "source": "n1", "target": "n2", "data": { "branch": "success" } }
|
||
],
|
||
"variables": {}
|
||
}
|
||
```
|
||
|
||
| `data.type` | 说明 |
|
||
|-------------|------|
|
||
| `start` / `end` | 透传 |
|
||
| `http` | 引用 `api_id` 或内联 method/url/headers/body/query/path_params;支持 mock、expect |
|
||
| `extract` | 从 `source_var` 取 `field` 写入 `save_as` |
|
||
| `condition` | 出边 `branch`: `true` / `false`;支持 `left_mode=json_path` |
|
||
| `loop` | BODY 边进入子图;`while_*` 控制下一轮;DONE 边退出 |
|
||
|
||
变量替换:字符串中的 `{{token}}` 由 `variables` 注入。工作流级 `default_headers` 与节点 headers 合并,**节点覆盖同名 key**。
|
||
|
||
---
|
||
|
||
## 6. 调用协议
|
||
|
||
### 6.1 Codex / MCP 客户端(推荐)
|
||
|
||
- **端点**:`http://10.20.30.42:8000/mcp`(Streamable HTTP)
|
||
- **鉴权**:请求头 `Authorization: Bearer sto-...`(Codex 配置在个人 `config.toml` 的 `mcp_servers.<name>.http_headers`)
|
||
- **工具发现**:MCP 方法 `tools/list`(与 `MCP_TOOL_SPECS` 一致)
|
||
- **工具调用**:MCP 方法 `tools/call`(`name` + `arguments`)→ `content[0].text` 为 JSON 字符串,解析后字段为 `ok` / `tool` / `data` / `error`;失败时 `isError` 可能为 true
|
||
|
||
### 6.2 HTTP 网关(curl / CI)
|
||
|
||
- **发现**:`GET /mcp/tools` → `{ tools, require_api_key, ai_guide }`
|
||
- **单次**:`POST /mcp/invoke` → `{ ok, tool, data, error }`
|
||
- **批量**:`POST /mcp/invoke-batch` → `{ results: [...] }`,`stop_on_error: true` 时任一步失败即停
|
||
|
||
`ok=false` 时读 `error`,修正参数后重试;不要臆造未在 `tools/list` 中出现的工具名。
|
||
|
||
---
|
||
|
||
## 7. 推荐 Recipe
|
||
|
||
### R1:新建接口并跑通单接口流程
|
||
|
||
```
|
||
catalog_snapshot → folder_ensure(apis) → api_upsert
|
||
→ workflow_upsert → workflow_run → workflow_analyze_last_run
|
||
```
|
||
|
||
### R2:Apifox 迁移一批接口
|
||
|
||
```
|
||
catalog_snapshot → folder_ensure(apis, 模块路径)
|
||
→ invoke-batch: N × api_upsert → 核对 catalog
|
||
```
|
||
|
||
### R3:版本回归跑批
|
||
|
||
```
|
||
workflow_batch_create → workflow_batch_update(workflow_ids)
|
||
→ workflow_batch_run → workflow_batch_get
|
||
→ 对失败项 workflow_run_get + workflow_run_loki_link
|
||
```
|
||
|
||
### R4:失败节点最小修复
|
||
|
||
```
|
||
workflow_analyze_last_run → workflow_patch_json(只改变量/单节点 data)
|
||
→ workflow_run → 仍失败则 workflow_run_get 看 payload
|
||
```
|
||
|
||
---
|
||
|
||
## 8. 常见错误
|
||
|
||
| error / 现象 | 处理 |
|
||
|--------------|------|
|
||
| 401 MCP requires API Key | Codex:个人 `config.toml` 中配置 `Authorization: Bearer sto-...`;curl:请求头或 body `api_key` |
|
||
| workflow folder not registered | 先 `folder_ensure` workflows |
|
||
| 仅 draft 批次可执行 | 已对 running/success 的 batch 再 run |
|
||
| unknown mcp tool | `GET /mcp/tools` 刷新名称 |
|
||
| Loki enabled=false | 配置 `GENERAL_LOKI_EXPLORE_URL` |
|
||
| 重复接口 | 同 method+url 视为同一接口,更新时传 `api_id` |
|
||
|
||
---
|
||
|
||
## 9. 文档索引
|
||
|
||
| 文件 | 受众 |
|
||
|------|------|
|
||
| **本文** `docs/mcp_tools_for_ai.md` | **AI Agent(首选)** |
|
||
| `docs/mcp_quickstart.md` | 人类 + curl 示例 |
|
||
| `docs/mcp_install.md` | MCP Server 安装、Codex/内网/远程环境 |
|
||
| 项目根 `AGENTS.md` | Codex 自动加载的短指引 |
|
||
|
||
---
|
||
|
||
*文档版本:与 `MCP_TOOL_SPECS`(28 个工具)同步;接入方式为内置 Streamable HTTP `/mcp`,见 `docs/mcp_install.md`。*
|