Skip to content

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

Description

@ZhaoXingPeng

版本与环境

  • 受影响路径:database/ai_tools.py、discovery_tools.py、observability_tools.py、schema_algorithms_tools.py、standards_tools.py、server/mcp_server.py。
  • 运行时:Python 3.10+,MCP stdio/HTTP 响应边界。
  • 数据库:使用固定驱动值 stub 复现,不需要真实数据库凭据。
  • 安装方式:仓库虚拟环境,PYTHONPATH=src。

问题与预期行为

PR #162 已将数据库查询与原子代码生成响应切换到共享 JSON 序列化器,但其他 MCP 响应模块仍直接调用标准库 json.dumps。Decimal、日期时间、UUID、二进制等驱动值进入组合 payload 后,可能在 MCP 边界触发 TypeError,客户端无法获得结构化响应。

预期行为:所有 MCP 响应入口使用 utils.json_serialization.dumps;已支持驱动值按共享合同编码,未知对象继续显式失败,不静默丢数据。

最小复现

在 AI、工具发现或可观测性响应的嵌套 payload 中注入 Decimal("1.25"),调用对应 handler 的 JSON 响应路径。修复前会命中直接 json.dumps 并抛出 TypeError;预期由共享编码器生成有效 JSON。

验收标准

  • 指定 MCP 响应模块全部使用共享序列化器。
  • Decimal、日期时间、UUID、bytes/memoryview 和 timedelta 的回归测试通过。
  • 未知对象仍显式抛出 TypeError。
  • 公共工具名、输入 schema、字段结构和文本格式不变。
  • 相关单元测试、Ruff、格式检查和 git diff --check 通过。

非目标、风险与安全

本 Issue 不修改 LLM 外部请求体、日志 JSON、工具输入 schema、数据库查询或既有类型映射。风险是遗漏的新工具仍可能绕过共享入口;后续新增 MCP 工具必须复用该序列化器。不得在复现或报告中粘贴凭据、连接串或完整数据库输出。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions