code-reason

MCP server that gives coding agents program-analysis primitives — data flow, call graphs, taint analysis — so they reason from ground truth instead of grep-and-guess. (same as the GitHub About — keeps your messaging consistent across the web).

Program analysis for your coding agents.

CI

Instead of grep-and-guess, provide your agents program analysis capabilities with code-reason.

code-reason is an MCP server that gives coding agents real program-analysis primitives — data-flow reachability, call-graph traversal, evidence-chain construction — so they verify code behavior from ground truth instead of speculation.

Why code-reason

Coding agents are good at reading code, but they struggle with whole-program questions:

  • Does user-controlled input actually reach this SQL call, or does sanitization cut the flow off?
  • Who really invokes this function across the codebase?
  • What is the complete evidence chain from source to sink?

Without a code-analysis tool, the agent answers these by manual grep-based tracing. It can read code, but it can't actually trace data flow, walk a control graph, or verify that user input reaches a sink. Ask any modern coding agent how it traces taint without a tool, and the answer is some variant of "I read files and follow string matches."

That works for simple cases. The cracks show on anything non-trivial — aliased variables, inter-procedural flow, sanitization checks, framework-injected inputs. The agent still produces an answer, often with high confidence, but it's reading 6+ files to confirm a single chain, burning context on speculation, and silently missing flows it never thought to grep for. For security-sensitive work, a confident wrong answer is more dangerous than no answer at all — and that's exactly what grep-based tracing produces at scale.

code-reason closes the gap. The agent stays in charge of what's interesting; code-reason answers what's actually true — backed by a code property graph parsed once and queried cheaply. The result: agents that are more deterministic, more token-efficient, and faster — and agentic security workflows you can actually trust.

Where traditional SAST tools produce findings reports for humans to triage, code-reason exposes the underlying analysis primitives for an agent to drive its own investigation.

Built on Fraunhofer AISEC's Code Property Graph for multi-language data-flow, control-flow, and taint analysis, and the Kotlin MCP SDK to expose those capabilities as agent-callable tools.

What you get

From dogfood sessions on real Java and Python codebases:

  • 30-40% fewer agent tokens on multi-step security reviews, mostly from call-graph queries that would otherwise take 5-10 grep iterations to confirm by hand.
  • Compact structured answers, not file dumps. A call-graph query returns reachable methods in JSON; the grep-and-read equivalent forces the agent to read 6+ files to confirm one chain.
  • One analysis pass per service, unlimited queries. reason_analyze_project builds the CPG once; every other reason_* tool queries it cheaply.
  • Real evidence chains. reason_trace_taint_path returns the full source-to-sink path with intermediate steps and code context — not "looks like SQLi maybe."

How it works

code-reason sits between the coding agent and a code property graph. The agent drives — code-reason answers.

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

A typical loop runs in three phases:

  1. Analyze. The agent calls reason_analyze_project. CPG parses the target codebase into a multi-graph: abstract syntax, control flow, data flow, and evaluation order — all in one queryable structure.

  2. Query. The agent calls one or more reason_* tools, each of which translates to a focused graph operation: taint propagation, call-graph traversal, data-flow reachability, evidence-chain construction.

  3. Reason. Each tool returns a structured result (locations, paths, confidence, evidence). The agent combines those results with its own contextual reasoning and decides what to ask next.

The agent provides the intent and high-level reasoning; code-reason provides ground-truth answers against the actual graph. No grep-and-guess, no oversized context dumps.

Tools

code-reason exposes nine MCP tools, grouped by purpose:

GroupToolPurpose
Setupreason_analyze_projectParse a project into a code property graph
Navigationreason_find_entry_pointsLocate HTTP handlers, CLI entries, framework hooks
Navigationreason_find_callers"Who calls this function?"
Navigationreason_find_callees"What does this function call?"
Data flowreason_query_dataflowForward/backward reachability over the data-flow graph
Data flowreason_trace_taint_pathFull source-to-sink evidence chain between any two points
Catalog scan (convenience)reason_scan_injectionsCatalog-driven taint analysis (SQLi/XSS/command injection)
Catalog scan (convenience)reason_list_supported_checksEnumerate built-in vulnerability checks
Catalog scan (convenience)reason_get_finding_detailDescription + remediation for a scan finding

The marquee value is the navigation and data flow primitives — the agent composes them to answer whole-program questions on its own. The catalog scan tools are a convenience baseline for quick first-pass triage; the agent's own reasoning over the primitives is what makes the difference on real codebases.

Prerequisites

  • JDK 21

The build pulls CPG artifacts from Maven Central and Sonatype Central Snapshots (the latter for main-SNAPSHOT until CPG 11.x lands as a stable release on Central). No sibling checkouts required.

Build

./gradlew installDist

The launcher lands at build/install/code-reason/bin/code-reason.

Running tests

./gradlew test

Integration tests run the full pipeline against small Java and Python fixtures.

Claude Code setup

Add code-reason to your .mcp.json (project-scoped) or ~/.claude/.mcp.json (global):

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

Restart Claude Code; the reason_* tools will appear in its tool list.

Example workflow

A typical agent-driven session — primitives composing into evidence:

  1. Agent calls reason_analyze_project to build the CPG.
  2. Agent calls reason_find_entry_points to enumerate where external input enters the codebase.
  3. For a suspicious entry point, agent uses reason_find_callees and reason_query_dataflow to map the downstream reach.
  4. When the data reaches a sensitive call, agent calls reason_trace_taint_path for the full source-to-sink evidence chain.
  5. Agent reasons about exploitability from the structured result and decides what to investigate next.

For quick first-pass triage, the agent can also call reason_scan_injections to surface candidate flows from the built-in catalog, then verify each one with reason_trace_taint_path.

Supported languages

  • Java
  • Python

Additional CPG frontends (C/C++, Go, TypeScript, JVM, LLVM, Ruby) can be enabled by adding the corresponding cpg-language-* dependency in build.gradle.kts.

Status

code-reason is v0.1.0 — early, research-grade. CI runs on every push and pull request. The build is currently pinned to CPG main-SNAPSHOT; this will move to a stable 11.x release once Fraunhofer publishes one to Maven Central.

License

Apache 2.0. See LICENSE.

Acknowledgments

Built on Fraunhofer AISEC's Code Property Graph.

Related Servers