Files
th-hotel-simple/docs/project/integrations/superagent-mcp/inbound-diagnostics.md
2026-07-22 23:43:54 +07:00

134 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# TH Hotel SuperAgent MCP 入站诊断链路
## 1. 文档信息
| 项目 | 内容 |
| --- | --- |
| 文档版本 | 0.1 |
| 日期 | 2026-07-22 |
| 状态 | 已落地第一版 |
| 适用范围 | `POST /mcp` 的 SuperAgent MCP 请求排障、参数还原和安全审计 |
## 2. 背景
SuperAgent 通过 MCP `th_hotel_submit_task_results` 提交业务结果时,当前后端只接受 M002 V4
`params.arguments`,并把通过 V4 transport 校验的 payload 交给本系统
`ReservationAiTaskIntakeService`
当业务入站失败时,如果只看到最终错误,例如 `SOURCE_MESSAGE_NOT_FOUND`
`MCP_SUBMIT_PAYLOAD_INVALID`,很难判断问题来自:
- SuperAgent 实际传入的 MCP 参数。
- MCP submit adapter 的转换逻辑。
- 本系统业务入站校验或数据状态。
本 checkpoint 增加 MCP 入站诊断链路,只为联调排障和受控审计提供证据,不改变原有业务处理
逻辑。
## 3. 设计原则
- 诊断记录不是业务事实,不参与订单、任务、卡片、来源通知或 OPERA 流转。
- `/mcp` 原有鉴权、body size、tools/call、adapter、业务 Service 调用顺序不变。
- 诊断写入失败时不得影响 MCP 原响应;只能记录安全 warn 日志。
- 普通日志只输出诊断 ID、tool、外部 source message id、安全错误码和安全错误摘要。
- 不在普通前端业务接口暴露 MCP 原始请求体、邮件正文、附件 URL、AI raw payload 或 Secret。
- 查询类 MCP tool 的响应可能包含受控正文,第一版不保存完整响应,只保存响应安全摘要。
## 4. 第一版诊断表
新增表:
```text
platform_superagent_mcp_call_diagnostic
```
字段口径:
| 字段 | 中文说明 |
| --- | --- |
| `id` | MCP 调用诊断 ID |
| `jsonrpc_id` | JSON-RPC request id 的安全文本表示 |
| `method_name` | JSON-RPC method例如 `tools/call` |
| `tool_name` | MCP tool 名称,例如 `th_hotel_submit_task_results` |
| `mcp_client_id` | 调用方机器身份,第一版固定 `superagent-mcp` |
| `request_body_bytes` | 原始请求体 UTF-8 字节数 |
| `request_body_sha256` | 原始请求体 SHA-256用于不暴露正文时定位同一次请求 |
| `raw_body_json` | 原始 MCP JSON-RPC 请求体,受控诊断字段 |
| `arguments_json` | `params.arguments` 原始 JSON受控诊断字段 |
| `adapted_payload_json` | submit adapter 转换后送入业务入站层的 JSON非 submit 或转换失败为空 |
| `mapping_diagnostics_json` | submit adapter 诊断V4-only 模式下通常为空对象,旧 V3 事件索引映射已废弃 |
| `response_summary_json` | MCP 响应安全摘要,不保存完整查询结果或正文 |
| `call_status` | `RECEIVED``SUCCEEDED``FAILED` |
| `safe_error_code` | 安全错误码,例如 `SOURCE_MESSAGE_NOT_FOUND` |
| `safe_error_summary` | 安全错误摘要不包含邮件正文、HTML、附件 URL 或 Secret |
| `source_message_external_id` | 从 submit 入参中尽力提取的外部来源消息 ID |
| `hotel_id` | 后端解析出的系统酒店 ID解析失败时为空 |
| `created_at` / `updated_at` | UTC 创建 / 更新时间 |
## 5. 诊断写入时机
| 阶段 | 行为 |
| --- | --- |
| 鉴权失败 | 不写诊断表,避免为未授权请求保存原始数据 |
| body 超限 | 不写诊断表,直接返回原有 body too large 错误 |
| JSON 解析失败 | 鉴权通过后写入失败诊断,保存 body hash 和 raw body |
| tools/list / query tool | 写入原始请求和参数,只保存响应安全摘要 |
| submit adapter 成功 | 补写 `adapted_payload_json``mapping_diagnostics_json`V4-only 模式下 `adapted_payload_json` 通常与 `arguments_json` 相同 |
| submit adapter 失败 | 保留 `arguments_json`,记录 adapter 安全错误码 |
| 业务入站失败 | 保留 `arguments_json` 和可用的 `adapted_payload_json`,记录业务安全错误码 |
| 调用成功 | 标记 `SUCCEEDED`,保存响应安全摘要 |
因此,鉴权通过且 body 未超限的旧 V2 / V3 submit payload 会写入本表,`call_status=FAILED`
`safe_error_code=MCP_SUBMIT_V4_REQUIRED``adapted_payload_json` 为空;这表示请求已被 MCP
adapter 拒绝,没有进入业务入站 Service。
## 6. 排障 SQL
按外部 SourceMessage ID 查询 SuperAgent 传入的原始 MCP 参数:
```sql
SELECT
id,
created_at,
call_status,
method_name,
tool_name,
source_message_external_id,
safe_error_code,
safe_error_summary,
arguments_json,
adapted_payload_json,
mapping_diagnostics_json
FROM platform_superagent_mcp_call_diagnostic
WHERE source_message_external_id = '<external_message_id>'
ORDER BY created_at DESC, id DESC;
```
按诊断 ID 查看一次请求的原始 envelope
```sql
SELECT
id,
request_body_sha256,
raw_body_json,
response_summary_json
FROM platform_superagent_mcp_call_diagnostic
WHERE id = <diagnostic_id>;
```
## 7. 与现有链路关系
- REST `POST /api/integrations/superagent/task-results` 仍使用现有 batch / transition 追踪。
- MCP `th_hotel_submit_task_results` 会同时拥有 MCP 入站诊断和业务 batch / transition 追踪;如果返回 `MCP_SUBMIT_V4_REQUIRED`,说明 SuperAgent 仍提交旧 V2/V3 schema不会进入业务写入 Service。
- Debug EML、AgentBus dispatch run 不改原逻辑;如果 SuperAgent 最终通过 MCP 回写,才进入本诊断表。
- 第一版不新增前端页面和查询接口DB 权限和运维访问由部署环境控制。
## 8. 安全说明
`raw_body_json``arguments_json``adapted_payload_json` 可能包含 SuperAgent 产出的邮件摘录、
客户姓名、业务线索或附件 ID因此
- 不写入普通应用日志。
- 不通过前端业务接口返回。
- 不提交为测试夹具中的真实客户数据。
- 生产使用时需要控制数据库访问权限,并在上线前确认保留周期。