mcpField
C
Code Reason

Code Reason

本地服务
github.com/ph0smet开发工具619 周前更新

关于 Code Reason

Code Reason 是面向编码 Agent 的程序分析 MCP 服务,通过代码属性图查询数据流、调用关系与污点路径,帮助基于代码证据核实行为。支持 Java 和 Python。

主要功能

  1. 01构建代码属性图
  2. 02查询数据流可达性
  3. 03遍历函数调用关系
  4. 04追踪污点证据链
  5. 05扫描常见注入问题

适用场景

  1. 01核实输入是否到达 SQL 调用
  2. 02追查函数的调用者与被调用者
  3. 03检查源到敏感调用的完整路径

MCP 相关

通过 MCP 向编码 Agent 提供项目分析、调用图导航、数据流查询和污点分析工具,结果包含结构化位置、路径与证据。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

面向编码 Agent 的程序分析。

CI

与其通过 grep 猜测,不如用 code-reason 为你的 Agent 提供程序分析能力。

code-reason 是一个 MCP 服务,为编码 Agent 提供真正的程序分析原语,例如数据流可达性、调用图遍历和证据链构建,让它们能够基于事实验证代码行为,而不是凭空猜测。

为什么选择 code-reason

编码 Agent 擅长阅读代码,但难以回答涉及整个程序的问题:

  • 用户控制的输入真的会到达这个 SQL 调用吗?还是经过清理后数据流就中断了?
  • 整个代码库中究竟有哪些地方会调用这个函数?
  • 从源到汇的完整证据链是什么?

没有代码分析工具时,Agent 会通过手动 grep 追踪来回答这些问题。它可以阅读代码,却无法真正追踪数据流、遍历控制流图,或验证用户输入是否会到达汇点。问问任何现代编码 Agent,在没有工具时如何追踪污点,它们的回答大致都是:“我会阅读文件并查找字符串匹配。”

对于简单情况,这样做行得通。但遇到稍复杂的问题时,缺陷就会显现:变量别名、跨过程数据流、清理检查、框架注入的输入。Agent 仍然会给出答案,而且往往信心十足,但它需要阅读 6 个以上的文件才能确认一条链路,在推测上消耗上下文,还会悄无声息地漏掉那些它根本没想到要 grep 的数据流。对于安全敏感的工作,信心十足的错误答案比没有答案更危险,而这正是基于 grep 的追踪大规模运行时会产生的结果。

code-reason 弥补了这一差距。Agent 负责判断哪些内容值得关注;code-reason 则基于一次解析、可低成本查询的代码属性图,回答实际情况究竟如何。结果是:更确定、更节省 token、速度更快的 Agent,以及真正值得信赖的 Agent 安全工作流。

传统 SAST 工具会生成供人类分类处理的问题报告,而 code-reason 则向 Agent 提供底层分析原语,让 Agent 自行开展调查。

code-reason 基于 Fraunhofer AISEC 的 Code Property Graph 实现多语言数据流、控制流和污点分析,并使用 Kotlin MCP SDK 将这些能力封装成 Agent 可调用的工具。

你将获得

来自真实 Java 和 Python 代码库的内部试用:

  • 多步骤安全审查中,Agent 的 token 消耗减少 30-40%。 这主要得益于调用图查询;否则,手动确认通常需要 5-10 轮 grep。
  • 返回精简的结构化答案,而非文件内容转储。 调用图查询会以 JSON 返回可达方法;而 grep 加阅读的方式则迫使 Agent 阅读 6 个以上的文件才能确认一条链路。
  • 每个服务只需分析一次,查询次数不限。 reason_analyze_project 会构建一次 CPG;其他所有 reason_* 工具都能以很低的成本查询它。
  • 真实的证据链。 reason_trace_taint_path 会返回完整的源到汇路径,包括中间步骤和代码上下文,而不是“看起来可能有 SQLi”。

工作原理

code-reason 位于编码 Agent 与代码属性图之间。Agent 负责驱动;code-reason 提供解答。

   Coding agent (Claude Code, Cursor, ...)
              │  MCP over stdio
              ▼
       code-reason server
              │
              ▼
   Fraunhofer CPG (Java + Python frontends)
              │
              ▼
        Target codebase

典型的循环分为三个阶段:

  1. 分析。 Agent 调用 reason_analyze_project。CPG 会将目标代码库解析为多图:抽象语法、控制流、数据流和求值顺序都包含在一个可查询的结构中。

  2. 查询。 Agent 调用一个或多个 reason_* 工具,每个工具都会转换为一个专门的图操作:污点传播、调用图遍历、数据流可达性、证据链构建。

  3. 推理。 每个工具都会返回结构化结果(位置、路径、置信度、证据)。Agent 将这些结果与自身的上下文推理相结合,并决定接下来要询问什么。

Agent 提供意图和高层推理;code-reason 则根据实际图提供真实答案。无需 grep 后猜测,也无需倾倒过多上下文。

工具

code-reason 提供九个 MCP 工具,按用途分组:

分组工具用途
设置reason_analyze_project将项目解析为代码属性图
导航reason_find_entry_points定位 HTTP 处理程序、CLI 入口、框架钩子
导航reason_find_callers“谁调用了此函数?”
导航reason_find_callees“此函数调用了什么?”
数据流reason_query_dataflow在数据流图上进行正向/反向可达性查询
数据流reason_trace_taint_path任意两个位置之间完整的源到汇证据链
目录扫描(便捷工具)reason_scan_injections基于目录的污点分析(SQLi/XSS/命令注入)
目录扫描(便捷工具)reason_list_supported_checks列出内置漏洞检查项
目录扫描(便捷工具)reason_get_finding_detail扫描发现项的描述和修复建议

核心价值在于导航和数据流基础工具;Agent 可以组合使用这些工具,自行回答整个程序层面的问题。目录扫描工具是便捷的基线,可用于快速初步筛查;真正让它在实际代码库中发挥作用的,是 Agent 基于这些基础工具进行的自主推理。

先决条件

  • JDK 21

构建过程会从 Maven Central 和 Sonatype Central Snapshots 拉取 CPG 构件(在 CPG 11.x 作为稳定版本发布到 Central 之前,后者用于获取 main-SNAPSHOT)。无需检出其他同级代码库。

构建

./gradlew installDist

启动器位于 build/install/code-reason/bin/code-reason。

运行测试

./gradlew test

集成测试会使用小型 Java 和 Python 样例运行完整流水线。

Claude Code 设置

将 code-reason 添加到 .mcp.json(项目范围)或 ~/.claude/.mcp.json(全局):

{
  "mcpServers": {
    "code-reason": {
      "command": "/absolute/path/to/build/install/code-reason/bin/code-reason",
      "args": ["--stdio"]
    }
  }
}

重启 Claude Code;reason_* 工具就会出现在工具列表中。

示例工作流

典型的 Agent 驱动会话,通过组合基础工具生成证据:

  1. Agent 调用 reason_analyze_project 构建 CPG。
  2. Agent 调用 reason_find_entry_points,列出外部输入进入代码库的位置。
  3. 对于可疑入口点,Agent 使用 reason_find_callees 和 reason_query_dataflow 绘制下游影响范围。
  4. 当数据到达敏感调用时,Agent 调用 reason_trace_taint_path 获取完整的源到汇证据链。
  5. Agent 根据结构化结果推理其可利用性,并决定接下来要调查什么。

若要快速初步筛查,Agent 也可以调用 reason_scan_injections,利用内置目录发现候选数据流,然后使用 reason_trace_taint_path 逐一验证。

支持的语言

  • Java
  • Python

添加 build.gradle.kts 中相应的 cpg-language-* 依赖,即可启用其他 CPG 前端(C/C++、Go、TypeScript、JVM、LLVM、Ruby)。

状态

code-reason 为 v0.1.0 版本:处于早期阶段,属于研究级项目。每次推送和拉取请求都会触发 CI。当前构建固定使用 CPG main-SNAPSHOT;Fraunhofer 将 11.x 稳定版本发布到 Maven Central 后,构建将切换到该版本。

许可证

Apache 2.0。参见 LICENSE。

致谢

基于 Fraunhofer AISEC 的代码属性图(Code Property Graph) 构建。

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。