Skip to content

🐛 fix(mcp): 收口全部 MCP 响应 JSON 序列化 - #164

Merged
ZhaoXingPeng merged 2 commits into
fix/161-shared-json-serializationfrom
fix/163-mcp-json-boundary
Sep 9, 2026
Merged

ZhaoXingPeng merged 2 commits into
fix/161-shared-json-serializationfrom
fix/163-mcp-json-boundary

Conversation

@ZhaoXingPeng

@ZhaoXingPeng ZhaoXingPeng commented Sep 8, 2026

Copy link
Copy Markdown
Owner

关联 Issue

Closes #163

本 PR 收口全部 MCP 响应入口的共享 JSON 序列化,覆盖 AI、发现、可观测性、Schema 算法、质量配置和服务器错误封装。

背景(Situation)

PR #162 已为查询和原子代码生成响应引入共享序列化器,但其他 MCP 组合 payload 仍可能直接调用标准库 JSON。驱动值进入这些路径时,客户端可能拿不到结构化成功响应或错误 envelope。

任务(Task)

统一所有 MCP 响应入口的 JSON 编码,保持工具字段、文本、缩进和未知对象显式失败语义不变,并补齐跨模块嵌套驱动值回归证据。

行动(Action)

  • 更新 database/ai_tools.py、discovery_tools.py、observability_tools.py、schema_algorithms_tools.py、standards_tools.py 和 server/mcp_server.py。
  • 统一使用 utils.json_serialization.dumps,保留 Decimal、日期时间、UUID、二进制和 timedelta 编码规则。
  • 增加 AI、发现、可观测性等嵌套 Decimal 回归测试。
  • 没有做:未修改 LLM 外部请求体、工具输入 schema、公共响应字段或数据库访问逻辑。

验证(Verification)

环境:Windows;Python 3.12.12;pytest 9.1.1;Ruff。

  • 单元测试:686 passed in 12.09s。
  • Ruff check:All checks passed。
  • 修改文件格式检查:6 files already formatted。
  • git diff --check:无输出。
  • 未连接真实数据库,未运行 Java/Maven。

实验与证据(Evidence)

固定在 AI、发现、可观测性等嵌套响应中注入 Decimal 1.25、0.875、2.5 和 3.75,回归测试确认共享序列化器输出可追踪 JSON。工具名称、字段结构和文本快照保持不变;未知对象继续进入显式 TypeError 路径。

兼容性、风险与回滚

公共 MCP 工具名、输入 schema、响应字段和人类可读文本保持不变。新工具若绕过共享序列化器仍可能复现问题,应单独修复;本 PR 不宣称性能收益,不涉及数据迁移。恢复提交 fc7732d 可回滚。后续在最终 main 基线复核依赖链,并继续清理开放串联 PR。

@ZhaoXingPeng
ZhaoXingPeng changed the base branch from main to fix/161-shared-json-serialization September 8, 2026 18:48
@ZhaoXingPeng

ZhaoXingPeng commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

实现完成(2026-09-09)

当前结论

已完成 Issue #163 的实现:MCP server 内所有面向客户端的 JSON 响应入口均收口到共享 utils.json_serialization.dumps。本提交依赖 PR #162 提供的驱动值编码合同,当前分支只新增本主题一个提交。

变更与设计取舍

  • 提交:fc7732d
  • 修改 AI、工具发现、可观测性、Schema 算法、质量配置和服务器错误响应模块;保留字段结构、中文文本、缩进和错误 envelope。
  • 共享序列化器继续编码 Decimal、日期时间、UUID、bytes/bytearray/memoryview 和 timedelta;未知对象继续抛 TypeError,避免静默转成不可追踪文本。
  • LLM SDK 请求体与日志序列化明确留在本主题之外;它们分别属于外部 API 和日志合同,不应随 MCP 响应实现一起改变。
  • 未新增 ADR:这是既有序列化器在同一 MCP 边界的实现覆盖,不改变模块边界或公共协议。

验证与证据

  • ruff check src/ tests/ scripts/All checks passed!
  • ruff format --check(本次受 changed-file gate 约束的 Python 文件):6 files already formatted
  • 新增 tests/unit/test_mcp_json_boundary.py,将嵌套 Decimal 注入 AI 推荐、工具发现和 server metrics payload,验证输出仍是可解析 JSON 且保留精确字符串值。

兼容性与下一步

  • 当前 PR base 为 fix/161-shared-json-serialization,对应 PR 🐛 fix(mcp): 统一跨工具驱动值 JSON 序列化 #162;待其合并后再将本 PR 以 main 为最终基线复核。
  • uv.lock 是用户未跟踪文件,未加入提交。
  • 尚未查询 CI,遵循约束在准备 squash merge 前只检查一次 required checks。

@ZhaoXingPeng

ZhaoXingPeng commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

验证完成(2026-09-09)

当前结论

本地验证已完成,686 个单元测试全部通过;新增跨模块驱动值回归通过。结果证明本次改动没有破坏现有工具响应合同,并覆盖了此前直接 json.dumps 路径无法处理的嵌套非基础值。

变更与设计取舍

  • 提交:fc7732d
  • 测试输入:AI 推荐 payload 含 Decimal("1.25")Decimal("0.875");发现结果含 Decimal("2.5");server metrics 含 Decimal("3.75")
  • 预期与实际:这些值经共享编码器输出为精确十进制字符串,json.loads 可正常解析;未知类型行为仍由共享 default 显式报错。
  • 没有运行真实 MySQL/PostgreSQL 或性能实验:本次只改 MCP 响应编码,不宣称数据库方言或吞吐收益。

验证与证据

  • 环境:Windows,.venv Python 3.12.12,pytest 9.1.1。
  • python -m pytest tests/unit/ -q686 passed in 12.09s
  • ruff check src/ tests/ scripts/All checks passed!
  • ruff format --check(6 个变更文件):6 files already formatted
  • git diff --check:无输出。
  • 原始测试报告由命令直接输出;未查询 CI,因用户要求只在准备合并前检查一次。

兼容性与下一步

  • 公共工具名、输入 schema、字段名和文本格式保持不变;回滚提交为 fc7732d
  • 合并顺序:先合并 PR 🐛 fix(mcp): 统一跨工具驱动值 JSON 序列化 #162,再以 main 为基线对本 PR 做一次 required checks 检查并 squash merge。
  • 若后续新增 MCP 工具绕过共享编码器,另开 Issue 追踪,不在本 PR 追加提交。

ZhaoXingPeng and others added 2 commits September 9, 2026 10:23
* 🐛 fix(codegen): 规范无前缀模板输出路径

* 🐛 fix(codegen): 统一分析结果与模板导入映射 (#168)

* 🐛 fix(codegen): 统一分析结果与模板导入映射

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射 (#170)

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射

* 🐛 fix(codegen): 补齐自增主键模板上下文标记 (#172)

* 🐛 fix(codegen): 补齐自增主键模板上下文标记

* 🐛 fix(generator): 修正遗留实体上下文自增标志 (#174)

* 🐛 fix(generator): 修正遗留实体上下文自增标志

* 🐛 fix(generator): 保留 Java 属性名内部大小写 (#176)

* 🐛 fix(generator): 保留 Java 属性名内部大小写

* 🐛 fix(template): 仅为自增主键启用 generated keys (#178)

* 🐛 fix(template): 仅为自增主键启用 generated keys

* 🐛 fix(codegen): 统一主键列表与列上下文 (#180)

* 🐛 fix(codegen): 统一主键列表与列上下文

* 🐛 fix(mcp): 统一描述与代码生成类型映射 (#182)

* 🐛 fix(mcp): 统一描述与代码生成类型映射

* 🐛 fix(codegen): 统一旧入口方言表名发现 (#184)

* 🐛 fix(codegen): 统一旧入口方言表名发现

* ♻️ refactor(codegen): 复用统一表名元数据合同 (#186)

* ♻️ refactor(codegen): 复用统一表名元数据合同

* 🐛 fix(codegen): 补齐批量分析表名上下文 (#188)

* 🐛 fix(codegen): 补齐批量分析表名上下文

* 🐛 fix(database): 持久化 SQLite execute_query 写入 (#190)

* 🐛 fix(database): 持久化 SQLite execute_query 写入

* 🐛 fix(governance): 对齐工具注册表数据库能力 (#192)

* 🐛 fix(governance): 对齐工具注册表数据库能力

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界 (#194)

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态 (#196)

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同 (#198)

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同

* 📚 docs(governance): 固化 GitHub 元数据正文门禁 (#200)

* 📚 docs(governance): 固化 GitHub 元数据正文门禁

* 🐛 fix(database): 回滚失败 SQLite 查询事务 (#202)

* 🐛 fix(database): 回滚失败 SQLite 查询事务

* 🐛 fix(schema): 规范图算法重复表输入 (#204)

* 🐛 fix(schema): 规范图算法重复表输入

* 🐛 fix(dependencies): 隔离版本分析状态 (#206)

* 🐛 fix(dependencies): 隔离版本分析状态

* 🐛 fix(cli): 统一解析 MCP 响应 (#208)

* 🐛 fix(cli): 统一解析 MCP 响应

* ✨ feat(connection): 增加 MCP 连接释放工具 (#210)

* ✨ feat(connection): 增加 MCP 连接释放工具

* ⚡ perf(mcp): 隔离同步数据库调用与事件循环 (#212)
@ZhaoXingPeng
ZhaoXingPeng force-pushed the fix/163-mcp-json-boundary branch from f233b4a to 0bef176 Compare September 9, 2026 02:25
@ZhaoXingPeng
ZhaoXingPeng merged commit 9b578f8 into fix/161-shared-json-serialization Sep 9, 2026
@ZhaoXingPeng
ZhaoXingPeng deleted the fix/163-mcp-json-boundary branch September 9, 2026 02:30
ZhaoXingPeng added a commit that referenced this pull request Sep 9, 2026
* 🐛 fix(mcp): 收口全部 MCP 响应 JSON 序列化

* 🐛 fix(codegen): 规范无前缀模板输出路径 (#166)

* 🐛 fix(codegen): 规范无前缀模板输出路径

* 🐛 fix(codegen): 统一分析结果与模板导入映射 (#168)

* 🐛 fix(codegen): 统一分析结果与模板导入映射

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射 (#170)

* 🐛 fix(mcp): 补齐 PostgreSQL 时间类型别名映射

* 🐛 fix(codegen): 补齐自增主键模板上下文标记 (#172)

* 🐛 fix(codegen): 补齐自增主键模板上下文标记

* 🐛 fix(generator): 修正遗留实体上下文自增标志 (#174)

* 🐛 fix(generator): 修正遗留实体上下文自增标志

* 🐛 fix(generator): 保留 Java 属性名内部大小写 (#176)

* 🐛 fix(generator): 保留 Java 属性名内部大小写

* 🐛 fix(template): 仅为自增主键启用 generated keys (#178)

* 🐛 fix(template): 仅为自增主键启用 generated keys

* 🐛 fix(codegen): 统一主键列表与列上下文 (#180)

* 🐛 fix(codegen): 统一主键列表与列上下文

* 🐛 fix(mcp): 统一描述与代码生成类型映射 (#182)

* 🐛 fix(mcp): 统一描述与代码生成类型映射

* 🐛 fix(codegen): 统一旧入口方言表名发现 (#184)

* 🐛 fix(codegen): 统一旧入口方言表名发现

* ♻️ refactor(codegen): 复用统一表名元数据合同 (#186)

* ♻️ refactor(codegen): 复用统一表名元数据合同

* 🐛 fix(codegen): 补齐批量分析表名上下文 (#188)

* 🐛 fix(codegen): 补齐批量分析表名上下文

* 🐛 fix(database): 持久化 SQLite execute_query 写入 (#190)

* 🐛 fix(database): 持久化 SQLite execute_query 写入

* 🐛 fix(governance): 对齐工具注册表数据库能力 (#192)

* 🐛 fix(governance): 对齐工具注册表数据库能力

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界 (#194)

* 🔒 security(mcp-apps): 收紧代码 diff 路径边界

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态 (#196)

* 🐛 fix(codegen): 对齐生成文件写入统计与结果状态

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同 (#198)

* ✨ feat(codegen): 统一 DTO 与 VO 生成选项合同

* 📚 docs(governance): 固化 GitHub 元数据正文门禁 (#200)

* 📚 docs(governance): 固化 GitHub 元数据正文门禁

* 🐛 fix(database): 回滚失败 SQLite 查询事务 (#202)

* 🐛 fix(database): 回滚失败 SQLite 查询事务

* 🐛 fix(schema): 规范图算法重复表输入 (#204)

* 🐛 fix(schema): 规范图算法重复表输入

* 🐛 fix(dependencies): 隔离版本分析状态 (#206)

* 🐛 fix(dependencies): 隔离版本分析状态

* 🐛 fix(cli): 统一解析 MCP 响应 (#208)

* 🐛 fix(cli): 统一解析 MCP 响应

* ✨ feat(connection): 增加 MCP 连接释放工具 (#210)

* ✨ feat(connection): 增加 MCP 连接释放工具

* ⚡ perf(mcp): 隔离同步数据库调用与事件循环 (#212)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant