Skip to main content
Glama
waterofriver

ghidriff-mcp

by waterofriver

ghidriff-mcp

An MCP server that exposes ghidriff — the Ghidra binary diffing engine — as tools an AI agent can call.

Point it at an old and a new build of a binary and it drives Ghidra headlessly through ghidriff, then hands back structured results: match statistics, added/deleted/modified functions, per-function code diffs and the generated Markdown report — as JSON, not as a screenful of console noise.

CI License: MIT Python 3.10+ MCP

English | 简体中文


Contents

Related MCP server: GhidraMCP

Why this exists

ghidriff is excellent but it is a batch CLI: you invoke it, wait while Ghidra imports and analyses every input, and you get a Markdown report plus a large pdiff JSON on disk. That shape does not fit an agent loop, where you want to inspect a change, follow up on one function, and keep the reasoning in context.

This server closes that gap:

  • Jobs instead of blocking calls. Every diff runs in the background with an id, a log file and a persisted job.json, so a crash or restart does not lose the result.

  • Structured output. The pdiff JSON ghidriff writes is the source of truth; the server turns it into compact summaries and per-function details instead of dumping megabytes into the model's context.

  • Late-bound environment. The server does not need ghidriff or Ghidra in its own interpreter — it launches whichever interpreter or command you configure.

  • Honest errors. Ghidra's failure modes are translated into actionable messages: missing GHIDRA_INSTALL_DIR, a project path Ghidra refuses, a JVM out of memory, a missing pyghidra.

  • A boundary you control. The agent decides what to diff; you decide how the engine runs. See Security and trust model.

Requirements

Component

Version

Notes

Python

3.10+

for the MCP server itself

ghidriff

1.x

pip install ghidriff

Ghidra

11.x / 12.x

set GHIDRA_INSTALL_DIR

JDK

21+

Ghidra 12 requires a modern JDK

Ghidra and ghidriff do not have to live in the same interpreter as this server. If your MCP client runs the server from an isolated virtualenv, point GHIDRIFF_MCP_PYTHON at the interpreter that has ghidriff installed.

Tested against ghidriff 1.0.0, Ghidra 12.1.3 and JDK 21 on Windows, and in CI on Ubuntu, macOS and Windows with Python 3.10 and 3.13.

Install

pip install ghidriff-mcp

Or from source:

git clone https://github.com/waterofriver/ghidriff-mcp
cd ghidriff-mcp
pip install -e .

Verify the tool chain with the built-in self check:

ghidriff-mcp --check

It prints a JSON diagnosis of Ghidra, Java and ghidriff, with next steps for anything missing, and exits non-zero when the setup is not usable yet:

// ghidriff-mcp --check (trimmed for length)
{
  "ready": true,
  "checks": {
    "ghidra": { "ok": true, "detail": "Ghidra 12.1.3 at C:\\ghidra\\ghidra_12.1.3_PUBLIC (found via GHIDRA_INSTALL_DIR)" },
    "java": { "ok": true, "detail": "Java 21.0.12.1 (C:\\Program Files\\Microsoft\\jdk-21...\\bin\\java.exe)" },
    "ghidriff": { "ok": true, "detail": "ghidriff 1.0.0 importable by C:\\Python313\\python.exe" }
  },
  "problems": [],
  "next_steps": []
}

The same report is available to agents through the ghidriff_environment tool.

Configuration

Everything is environment driven.

Variable

Default

Purpose

GHIDRIFF_MCP_HOME

~/ghidriff-mcp-work

Root for run directories, Ghidra projects and diff output.

GHIDRA_INSTALL_DIR

auto-discovery

Path to the extracted Ghidra folder.

GHIDRIFF_MCP_PYTHON

the server's own interpreter

Interpreter that has ghidriff installed.

GHIDRIFF_MCP_COMMAND

Explicit ghidriff command line, e.g. ghidriff --max-ram-percent 40. Takes precedence over GHIDRIFF_MCP_PYTHON.

GHIDRIFF_MCP_TIMEOUT

3600

Default per-run timeout in seconds.

GHIDRIFF_MCP_MAX_JOBS

2

Maximum concurrent diffs (each one boots a JVM).

GHIDRIFF_MCP_EXTRA_ARGS

Raw ghidriff arguments appended to every run. Operator-only: this is where --no-symbols or --jvm-args belong, not in tool calls.

GHIDRIFF_MCP_LOG_LEVEL

INFO

ghidriff log level (DEBUG is very verbose).

Ghidra path rule. Ghidra refuses a project location containing a path element that starts with . (Path element starting with '.' is not permitted). Keep GHIDRIFF_MCP_HOME dot-free; if it is not, the server relocates the Ghidra project to the system temp directory and reports a warning instead of failing after a multi-minute import.

MCP client configuration

{
  "mcpServers": {
    "ghidriff": {
      "command": "C:\\path\\to\\venv\\Scripts\\python.exe",
      "args": ["-m", "ghidriff_mcp"],
      "env": {
        "GHIDRA_INSTALL_DIR": "C:\\ghidra\\ghidra_12.1.3_PUBLIC",
        "GHIDRIFF_MCP_PYTHON": "C:\\Python313\\python.exe",
        "GHIDRIFF_MCP_HOME": "C:\\ghidriff-work"
      }
    }
  }
}

HTTP transports are available for clients that prefer them:

ghidriff-mcp --transport streamable-http --host 127.0.0.1 --port 8765

Command-line flags: --check (self check), --workspace PATH and --ghidra-install-dir PATH (override the matching environment variables for this process), --transport, --host, --port, --version.

Tools

Thirteen tools, all prefixed ghidriff_ so an agent can tell them apart from other Ghidra-related servers.

Tool

What it does

ghidriff_environment

Verifies Ghidra, Java and ghidriff, and explains how to fix anything missing.

ghidriff_start_diff

Starts a diff in the background, returns a job_id immediately.

ghidriff_run_diff

Blocking convenience wrapper around the above.

ghidriff_job_status

Status, timing and log tail of one job.

ghidriff_job_result

Match statistics, function counts, names, artefacts.

ghidriff_job_log

The raw ghidriff log, tailed or paged.

ghidriff_job_cancel

Kills a running diff.

ghidriff_jobs

Job history (persisted in job.json, survives restarts).

ghidriff_list_runs

Diff artefacts on disk, workspace-wide or in one directory.

ghidriff_read_report

Page through the generated Markdown report.

ghidriff_function_detail

One changed function: metadata, code, and the code diff.

ghidriff_search_functions

Search changed functions by name.

ghidriff_settings

Effective configuration and environment variables.

ghidriff_start_diff accepts old_binary, one or more new_binaries, the engine (VersionTrackingDiff, SimpleDiff, StructualGraphDiff), output_dir, project_dir, summary, side_by_side, force_analysis, force_diff, bsim, bsim_full, min_func_len, max_section_funcs, base_address, no_symbols and timeout_s. Raw engine pass-through is deliberately not on this list — that lives in GHIDRIFF_MCP_EXTRA_ARGS.

Pass several newer binaries to get chained diffs (old → v2 → v3), and set summary=true to also diff old → newest. Use side_by_side=true if you want the per-function HTML diffs on disk.

How it works

MCP client ──stdio──▶ ghidriff-mcp ──subprocess──▶ ghidriff ──PyGhidra──▶ Ghidra (JVM)
                           │                            │
                           │                            └── writes <name>.ghidriff.md
                           │                                       json/<name>.ghidriff.json
                           └── job.json + ghidriff.log              json/<name>.ghidriff.matches.json
                               (structured summaries, paged reads)
  • The server never imports ghidriff, so a JVM crash cannot take it down, and cancelling a job is a single kill.

  • One run directory per job: <workspace>/runs/<job_id>/ containing job.json, ghidriff.log, ghidriff/ (output) and ghidra_projects/.

  • Child output is redirected into the log file through an inherited handle rather than a pipe, which keeps it streamable and works in environments where pipes are restricted.

  • pdiff JSON files are parsed lazily, capped in size and cached by mtime.

  • Relative paths in tool calls resolve against the workspace, so an agent never has to know the absolute layout of the machine.

Security and trust model

This server drives ghidriff locally with your own privileges on files you point it at. Before wiring it to an agent, know what it does and does not constrain:

  • No shell. Every command is an argv list built by the server and passed to exec-style process creation. Nothing is interpolated into a shell string, so file names and option values cannot become shell syntax.

  • The agent picks the target, you pick the engine. Tool arguments select which binaries to diff, which supported engine to use, and how much output to render. They cannot select the executable, its JVM arguments, or arbitrary extra CLI switches. That matters, because --jvm-args -javaagent:... would otherwise be a code-execution primitive one model decision away.

  • Option-like file names are neutralised. Binaries are passed after a -- separator, so a file named --force-analysis stays a file.

  • Binaries are untrusted input. Strings, symbol names, decompiled code and report text from a sample end up in the model's context. Treat all of it as data, never as instructions: a crafted binary can try to talk your agent into something. The same holds for anything else you feed the model.

  • Symbol lookups reach the network by default. ghidriff lets Ghidra resolve PDBs, and for PE files with PDB metadata that can mean a query to a symbol server (Microsoft's among them), which leaks a little about what you are analysing. Pass no_symbols=true, or set GHIDRIFF_MCP_EXTRA_ARGS=--no-symbols, for offline work.

  • File access is not confined. The server reads and writes wherever you point it, because binaries normally live outside the workspace. Use a dedicated workspace and do not hand an agent paths to files you would not want in a transcript.

  • Transports. stdio by default. The HTTP transports bind to 127.0.0.1 unless you pass --host, and they carry no authentication — treat a non-loopback bind as exposing the server to that network.

  • External tooling is the real attack surface. Ghidra parsing a hostile file is a much bigger risk than this wrapper. Keep ghidriff and Ghidra current, and run samples in a VM you can throw away.

Everything a run produces lives under GHIDRIFF_MCP_HOME, so that directory is the thing to review — and delete — when you are done.

Troubleshooting

Symptom

Cause and fix

Path element starting with '.' is not permitted

Ghidra rejected the project path. Set GHIDRIFF_MCP_HOME to a directory without dot-prefixed elements.

GHIDRA_INSTALL_DIR missing / Ghidra not found

Set it to the extracted Ghidra folder (the one containing support/).

No module named ghidriff

The launched interpreter lacks ghidriff: set GHIDRIFF_MCP_PYTHON or GHIDRIFF_MCP_COMMAND.

No module named 'pyghidra'

Install ghidriff with its dependencies (pip install ghidriff), not just the CLI.

First diff takes minutes

Expected: Ghidra imports and analyses every binary once. Later diffs reuse the Ghidra project unless force_analysis=true.

Symbols are disabled, but the symbol is already downloaded

You passed no_symbols=true for a binary whose PDB is already in the symbol store. Delete it or drop the flag.

OutOfMemoryError

Lower max_ram_percent, or diff smaller binaries.

Job stuck in queued

Another job holds a slot; GHIDRIFF_MCP_MAX_JOBS limits concurrent JVMs.

ghidriff exited 0 but no diff artefacts

The output directory was overridden, e.g. by GHIDRIFF_MCP_EXTRA_ARGS; check ghidriff_job_log.

above the 512 MB parse limit

The pdiff is too large to parse safely. Page through the Markdown report with ghidriff_read_report instead.

ghidriff_environment is slow the first time

It starts the configured interpreter next to a possibly running JVM; the probe has a 120s budget and reports a timeout rather than hanging.

Compared with GhidraMCP

GhidraMCP bridges a running Ghidra GUI to an agent: interactive decompilation, renaming, commenting. This server does the opposite job: batch, headless diffing between two builds, with no GUI and no open project. They complement each other, and the ghidriff_ prefix means an agent can use both at once.

Project layout

src/ghidriff_mcp/
  server.py      FastMCP tool surface and CLI entry point
  runner.py      ghidriff command construction and subprocess execution
  jobs.py        background job state machine, job.json persistence
  reports.py     pdiff / Markdown parsing, paging, size limits
  ghidra_env.py  Ghidra, Java and ghidriff discovery and diagnosis
  paths.py       workspace path resolution and Ghidra path rules
  config.py      environment-driven settings
tests/           unit, protocol-level and opt-in integration tests

Development

pip install -e ".[dev]"
pytest                       # 110 tests, no Ghidra needed
ruff check src tests
ruff format --check src tests

The Ghidra-dependent test is opt-in:

GHIDRIFF_MCP_INTEGRATION=1 GHIDRA_INSTALL_DIR=/path/to/ghidra pytest -m integration

It generates a pair of PE files (a pristine copy of a system binary and one whose entry point is patched) and asserts that at least one function is reported as modified.

License

MIT — see LICENSE.

This project contains no ghidriff source code and does not link against it. It invokes ghidriff (GPL-3.0) and Ghidra (Apache-2.0) as separate processes that you install yourself; those programs keep their own licenses.

Available Tools

13 tools
ghidriff_environmentA

Check that Ghidra, Java and ghidriff are installed and reachable.

Args: probe: also launch the ghidriff interpreter to confirm it can import ghidriff (adds up to a minute on a cold start).

ParametersJSON Schema
NameRequiredDescriptionDefault
probeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description must carry the burden of behavioral disclosure. It mentions the probe parameter's side effect (launching the interpreter and adding up to a minute) but does not state whether the tool is read-only, what it returns, or whether it has any side effects beyond the probe. The nature of 'checking' implies non-destructive, but this is not explicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured. It opens with a clear one-sentence purpose statement, then an 'Args:' block that explains the parameter. There is no redundancy or filler; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, with one parameter and an output schema (though not shown, it is indicated as present). The description covers the purpose and the parameter's behavior. It does not detail return values or error conditions, but these are presumably covered by the output schema. For a straightforward environment check, this is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has a single boolean parameter 'probe' with no description, and schema coverage is 0%. The description fully explains the parameter: it triggers launching the ghidriff interpreter to confirm importability and notes the cold-start delay. This adds significant meaning beyond the schema's bare definition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: checking that Ghidra, Java, and ghidriff are installed and reachable. It uses a specific verb ('Check') and identifies the exact resources. It is distinct from all sibling tools, which deal with diffing, job management, or report reading, so there is no ambiguity about what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description does not explicitly state when to use this tool versus alternatives. It implies a preflight environment check, but there is no mention of scenarios where it should or should not be used, nor does it name any sibling as an alternative. The context of sibling tools makes the purpose obvious, but explicit guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_function_detailA

Explain one changed function: metadata, code, and the code diff if modified.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFunction name (or part of it) to inspect.
job_idNoJob to read the pdiff from.
json_pathNoExplicit pdiff JSON path (alternative to job_id).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden. It communicates the expected deliverable and the conditional nature of the diff ('if modified'), and 'Explain' implies a read-only operation. However, it does not explicitly state that the tool is non-mutating, what prerequisites exist, or what happens when the named function is not found.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact sentence front-loads the action and scope, then lists the returned content with a useful condition. There is no filler, and every phrase contributes information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema and full parameter documentation reduce the burden, but with no annotations and many sibling tools, the description leaves the relationship to jobs/pdiff files implicit. It is minimally viable but would benefit from stating that it inspects a function from an existing diff and how to choose between job_id and json_path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter. The description adds no extra meaning beyond naming the resource ('one changed function'), so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Explain'), a clear resource ('one changed function'), and enumerates the contents (metadata, code, code diff). It is understandable in isolation, though it does not explicitly differentiate itself from siblings like ghidriff_read_report or ghidriff_search_functions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is implied: use this when a single changed function needs detailed inspection. However, the description gives no explicit guidance on when to prefer it over sibling tools, nor does it mention how job_id/json_path should be supplied or when one is preferred over the other.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_job_cancelA

Cancel a running diff job and kill its ghidriff process.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob id to cancel.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It explicitly states a side effect—killing the ghidriff process—which goes beyond merely saying 'cancel'. However, it does not address permission requirements, reversibility of the action, or behavior when the job is not running or the job_id is invalid, leaving notable gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with zero filler. It front-loads the primary action ('Cancel a running diff job') and then adds a relevant behavioral detail ('kill its ghidriff process') without redundancy. This is appropriately sized for the tool's simple scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity—one required parameter and an existing output schema—the description covers the essential action and side effect well. It could mention error cases or the need for a running job, but the presence of an output schema and the straightforward nature of cancellation make these minor omissions. Overall, it is sufficient for an agent to use the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the parameter job_id already has a meaningful description: 'Job id to cancel.' The tool description adds no additional context about the parameter, such as format or source, so the baseline of 3 applies without any extra semantic contribution.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Cancel' and identifies the resource as 'a running diff job', then adds a distinctive behavioral detail ('kill its ghidriff process') that sets it apart from read-only siblings like ghidriff_job_status and ghidriff_job_result. An agent can immediately understand the tool's core function without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage: call this tool when you want to stop a running diff job. However, it does not explicitly state when to use it versus alternatives, nor does it mention prerequisites such as the job being in progress or where to obtain the job_id from sibling tools like ghidriff_jobs. No exclusionary guidance is provided, leaving the agent to infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_job_logA

Read the ghidriff console log of a job, tailed or paged.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob id returned by ghidriff_start_diff.
max_linesNoMaximum lines returned when paging with start_line.
start_lineNoRead from this 1-based line instead of the tail.
tail_linesNoReturn only the last N lines (0 disables the tail).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the disclosure burden. It does reveal the operation is read-only and offers two access modes (tail or page), but it does not explain how tail_lines/start_line interact or whether a job must be running for the log to exist. This is moderate coverage for a read-only log tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single 12-word sentence that puts the verb and resource first and packs the two main access modes into a compact participial phrase. No filler or redundant restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple log-reader with a rich input schema and an output schema, the description plus schema is nearly sufficient. The only material gaps are explicit sibling differentiation and any job-state preconditions, which are not critical for selecting this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions cover 100% of parameters, including job_id provenance and the exact meaning of max_lines, start_line, and tail_lines. The description's 'tailed or paged' phrase loosely maps to those params but adds no new semantic detail beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Read') and resource ('the ghidriff console log of a job'), and distinguishes it from sibling result/status/read-report tools by naming the console-log resource. The tailed/paged qualifier adds further specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No statement about when to use this tool versus alternatives such as ghidriff_job_status, ghidriff_job_result, or ghidriff_read_report. The agent must infer from the word 'log' that this is the console-output access point, with no explicit exclusions or routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_job_resultA

Return the structured result of a finished (or running) diff job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob id returned by ghidriff_start_diff.
max_functionsNoCap on function names listed per category.
include_metadata_diffNoInclude old/new program metadata differences.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description must carry the behavioral burden. It does disclose that results are available for finished or running jobs, which is useful context, but it does not say whether the call blocks, returns partial data for running jobs, or what happens for an unknown job_id.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core action and object, no filler. It is appropriately sized for a simple retrieval tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The presence of an output schema and 100% schema coverage means return values and parameters are already documented. What is missing is guidance on selecting this tool over ghidriff_read_report or ghidriff_job_status, and any behavioral caveats such as partial results or blocking.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema already documents all three parameters (job_id, max_functions, include_metadata_diff) with descriptions, so the description need not repeat them. Baseline 3 applies; the description adds no parameter-specific meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Return') and target ('structured result of a finished (or running) diff job'), so an agent can tell this is the retrieval tool for diff output rather than status/log/report. It does not explicitly name sibling alternatives, but 'structured result' and 'job' scope already separate it from ghidriff_job_status, ghidriff_job_log, and ghidriff_read_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use it: after a diff job has been started and a result is desired, including while the job is still running. It gives no explicit exclusions or alternatives, leaving the agent to infer how this differs from ghidriff_read_report or ghidriff_job_status.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_jobsB

List diff jobs known to this server, newest first (survives restarts).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of jobs returned.
statusNoFilter by status: queued, running, succeeded, failed, cancelled, timeout.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It adds genuinely useful context beyond the name — that the job list persists across server restarts — but discloses nothing else about the operation, such as whether it is strictly read-only, any pagination behavior, or rate limits. The persistence fact is valuable but the disclosure is thin.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero waste: it packs the object scope, server scope, ordering, and persistence into 9 words. Every element earns its place, and the most decision-relevant trait ('survives restarts') is placed at the end as a parenthetical without bloating the core statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity list tool with 0 required parameters, 100% schema coverage, and an output schema, the description covers the essentials: what is listed, ordering, and persistence semantics. The notable gap is the unresolved differentiation from ghidriff_list_runs, which an agent may need to select the correct tool, but this is a minor omission given the output schema and complete parameter docs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents both 'limit' (max jobs returned) and 'status' (filter values queued/running/succeeded/failed/cancelled/timeout). The description adds no parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a precise resource ('diff jobs known to this server'), with ordering ('newest first') and a persistence qualifier ('survives restarts'). It implicitly distinguishes itself from the singular job_* siblings and from ghidriff_list_runs by emphasizing server-local persistent state, though it never names an alternative explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is given, and no sibling alternatives are mentioned. The usage context is only implied by the 'List' verb, and the relationship to the similarly-purposed ghidriff_list_runs and the job_* tools is left for the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_job_statusA

Report the state of one diff job, including a short log tail.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesJob id returned by ghidriff_start_diff.
log_tailNoHow many trailing log lines to include.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. It discloses that the tool returns state and a log tail, which is useful, but it doesn't mention whether the job is still running, whether it blocks, or what happens if the job_id is invalid. The output schema exists and likely covers return structure, but behavioral details like polling semantics are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the core purpose ('Report the state'), and the log tail detail is included without waste. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a status-checking tool with an output schema and only two parameters, the description is mostly adequate. However, with no annotations and no explicit guidance on how this differs from ghidriff_job_result or ghidriff_job_log, an agent might not know which tool to pick for a given need. The description could also clarify whether the tool is safe to poll repeatedly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters. The description adds the context that log_tail controls 'trailing log lines' and job_id comes from ghidriff_start_diff, but it doesn't add meaning beyond the schema's own descriptions. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reports the state of one diff job and includes a short log tail. It distinguishes itself from siblings like ghidriff_job_result and ghidriff_job_log by focusing on 'state' plus a log tail, though it doesn't explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is for checking a single job's status, and the schema references job_id returned by ghidriff_start_diff. However, it doesn't explicitly state when to use this over ghidriff_job_result, ghidriff_job_log, or ghidriff_jobs, leaving the agent to infer the distinction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_list_runsB

List diff outputs on disk, either from the run history or a given directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of artefacts returned.
directoryNoAlso scan this directory for diff artefacts.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the full burden of behavioral disclosure. It implies a read-only list operation but does not explicitly state there are no side effects, whether permissions are needed, or how directory scanning behaves. It also doesn't mention output ordering or any constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single clear sentence with no filler. The core action and sources are front-loaded, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with an output schema present, the description covers the essential behavior: what is listed and from where. It doesn't address edge cases like duplicate artifacts or recursive scanning, but these are likely covered by the output schema and are not critical for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% for both parameters, so the baseline is 3. The description clarifies that the directory parameter provides an alternate source of artifacts ('or a given directory'), which adds a bit of context beyond the schema's 'also scan this directory', but doesn't meaningfully extend parameter understanding.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action (list) and resource (diff outputs on disk), and identifies two sources: run history or a given directory. It distinguishes from sibling tools like ghidriff_jobs or ghidriff_read_report by focusing on diff artifacts on disk, though it doesn't explicitly name alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives such as ghidriff_jobs or ghidriff_job_result. The description only states what it does, not under what circumstances an agent should select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_read_reportC

Read a page of the generated Markdown diff report.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathNoExplicit Markdown report path.
job_idNoJob whose report should be read instead.
max_linesNoMaximum number of lines to return.
start_lineNo1-based first line to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure, but it only states a read operation. It does not explain line-range pagination semantics, defaults, error behavior, or what happens when neither argument is supplied. The word 'page' hints at slicing but leaves the mechanics implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The single sentence is tightly worded and front-loaded with the core action and resource. It has no filler, but its spareness means it does not earn the top score that richer, equally concise descriptions achieve.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The definition leaves important contextual gaps: all four parameters are optional with ambiguous precedence, and there is no guidance relating this tool to the job lifecycle or to sibling result/log tools. An output schema exists but is not shown, so the agent lacks a clear picture of return values or when to call this tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter (path, job_id, max_lines, start_line) is already documented in the input schema. The description adds no new semantic information beyond the generic 'page' concept, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Read a page of the generated Markdown diff report' provides a clear verb ('read') and resource ('page of the generated Markdown diff report'), and the word 'page' conveys pagination. It is distinct enough from siblings like ghidriff_job_result and ghidriff_job_log, though it does not explicitly name them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus ghidriff_job_result or ghidriff_job_log, nor on whether 'path' or 'job_id' should be preferred. The description gives no context about mutual exclusivity or precedence, leaving the choice entirely to the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_run_diffA

Run a diff and wait for it to finish (blocking convenience wrapper).

Prefer ghidriff_start_diff for large binaries: this call occupies the tool call for the whole analysis.

ParametersJSON Schema
NameRequiredDescriptionDefault
engineNoDiff engine: VersionTrackingDiff (default), SimpleDiff or StructualGraphDiff.VersionTrackingDiff
summaryNoAlso diff the oldest against the newest binary.
timeout_sNoOverall budget in seconds (default: server setting, 3600).
force_diffNoDiff even when architecture or symbols do not match.
no_symbolsNoTurn symbols off for analysis. Use it for offline/air-gapped work: ghidriff otherwise queries PDB symbol servers such as Microsoft's.
old_binaryYesPath to the older binary.
output_dirNoWhere to write diffs. Defaults to the job run directory.
new_binariesYesOne or more newer binaries, oldest first.
force_analysisNoRe-analyse every binary instead of reusing cached analysis.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses the blocking behavior ('wait for it to finish', 'occupies the tool call for the whole analysis'). Since no annotations are provided, the description carries the full burden of behavioral disclosure. It mentions the blocking aspect but could optionally add detail about timeout behavior or return semantics; however, the core blocking behavior is well conveyed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the primary purpose and then the usage caveat. Every sentence earns its place, and there is zero redundancy. The warning about large binaries is placed immediately after the purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, so return values are covered there. The description provides the essential blocking behavior and usage guidance. With 9 parameters, the schema covers them all, and the description tells the agent when to use this versus the sibling. It is complete enough for an agent to invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are documented in the input schema. The tool description adds no parameter-specific information beyond what the schema already provides. Baseline of 3 is appropriate because the schema handles parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Run'), a resource ('diff'), and its nature ('blocking convenience wrapper'). It distinguishes itself from the sibling ghidriff_start_diff by positioning as the blocking version of the same operation. This is clear and specific.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly tells the agent to 'Prefer ghidriff_start_diff for large binaries' and explains why (this call occupies the tool call for the whole analysis). This is direct guidance on when NOT to use this tool and when to choose an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_search_functionsC

Search the changed functions of a diff by name.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindsNoRestrict to added, deleted and/or modified.
limitNoMaximum number of hits.
queryYesSubstring to look for in function names (empty lists everything changed).
job_idNoJob to read the pdiff from.
json_pathNoExplicit pdiff JSON path (alternative to job_id).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral transparency. It implies a read-only search operation but does not disclose behavior such as return format, error conditions, or prerequisites (e.g., needing an existing diff/job).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no unnecessary words. The core purpose is front-loaded and easily parsed. It could be more informative, but it is not verbose or rambling.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description names the core concept ('changed functions of a diff') and the schema covers parameter semantics, while an output schema exists. However, it lacks usage context, such as how the tool relates to diff lifecycle or when to choose job_id vs json_path, leaving some gaps for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers all 5 parameters with descriptions (100% coverage), including details like query being a substring and json_path being an alternative to job_id. The description adds no parameter-level meaning beyond the schema, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Search') with a clear resource ('changed functions of a diff') and a method ('by name'). It clearly communicates the tool's purpose, though it does not explicitly differentiate it from sibling tools like ghidriff_function_detail.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is given on when to use this tool versus alternatives, or when not to use it. The description only states what it does, leaving the agent to infer context from sibling names and the schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_settingsA

Show the server configuration (workspace, interpreter, limits).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral transparency burden. The verb 'Show' clearly indicates a read-only, non-mutating operation, and the parenthetical lists what is exposed. However, it does not mention permissions, response behavior, or other side-effect context, so the disclosure is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It front-loads the action and resource, then adds the valuable scope details (workspace, interpreter, limits) in a compact parenthetical. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a parameterless read-only getter with an output schema present, the high-level description is largely sufficient. The main gap is the absence of any pointer to sibling tools or usage conditions, which leaves a small but real contextual hole when an agent must choose among related tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the input schema is effectively complete and there are no argument semantics for the description to clarify. This is the baseline case where the description does not need to compensate for missing parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource: 'Show the server configuration' with concrete facets in parentheses (workspace, interpreter, limits). It is clear, but it does not explicitly differentiate itself from the sibling tool ghidriff_environment, which could plausibly cover overlapping environment/configuration information.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as ghidriff_environment, nor any exclusions or conditions. The description implies it is the configuration accessor, but it does not help an agent choose between related tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ghidriff_start_diffA

Start a binary diff in the background and return a job id immediately.

Raw engine pass-through arguments are deliberately not accepted here: the agent decides what to diff, the operator decides how the engine runs, through GHIDRIFF_MCP_EXTRA_ARGS.

ParametersJSON Schema
NameRequiredDescriptionDefault
bsimNoEnable Ghidra BSIM function correlation (default: upstream default, on).
engineNoDiff engine: VersionTrackingDiff (default), SimpleDiff or StructualGraphDiff.VersionTrackingDiff
summaryNoAlso diff the oldest against the newest binary (only useful with 3+ binaries).
bsim_fullNoSlower but higher-quality BSIM matching.
timeout_sNoKill the run after this many seconds (default: server setting, 3600).
force_diffNoDiff even when architecture or symbols do not match.
no_symbolsNoTurn symbols off for analysis. Use it for offline/air-gapped work: ghidriff otherwise queries PDB symbol servers such as Microsoft's.
old_binaryYesPath to the older binary (relative paths resolve against the workspace).
output_dirNoWhere to write the report and pdiff JSON. Defaults to <run_dir>/ghidriff.
project_dirNoGhidra project location. Must not contain a path element starting with '.'.
base_addressNoBase address for both programs, e.g. '0x2000'.
min_func_lenNoMinimum function length considered for diffing.
new_binariesYesOne or more newer binaries, oldest first. Several entries produce chained diffs.
side_by_sideNoAlso emit side-by-side HTML code diffs (more disk, slower).
force_analysisNoRe-analyse every binary instead of reusing the Ghidra project (very slow).
max_section_funcsNoCap on functions rendered per report section.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavior. It reveals that the tool runs asynchronously and returns a job id, which is crucial. However, it does not mention error handling, whether the job runs in the same process, or dependencies like Ghidra being available. It could be more transparent about side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is exceptionally concise, with only three sentences. The key point (start a diff in background, return job id) is front-loaded, and the additional explanation about argument handling earns its place by preventing misuse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 16 parameters, the description's high-level guidance is sufficient because the schema covers parameters. The behavior of returning a job id is clear, and the output schema likely covers the return structure. However, it doesn't mention how to check job status or retrieve results, but sibling tools exist for that. Missing some edge cases like timeout defaults.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so the schema already explains each parameter. The description adds no additional parameter details. It only mentions the two required parameters (old_binary, new_binaries) implicitly via 'what to diff', which is minimal. The baseline is 3 given high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: start a binary diff in the background and return a job id immediately. It uses specific verbs and resources, and the contrast with the sibling 'ghidriff_run_diff' (likely synchronous) is implied by emphasizing 'background' and 'immediate'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly explains the division of responsibility: the agent decides what to diff, the operator decides how the engine runs via GHIDRIFF_MCP_EXTRA_ARGS. This clarifies when to use this tool versus ghidriff_run_diff, and warns against passing raw engine arguments.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 13 tool updatesv0.1.0
    • First observedghidriff_environment
    • First observedghidriff_function_detail
    • First observedghidriff_job_cancel
    • First observedghidriff_job_log
    • First observedghidriff_job_result
    • First observedghidriff_job_status
    • First observedghidriff_jobs
    • First observedghidriff_list_runs
    • First observedghidriff_read_report
    • First observedghidriff_run_diff
    • First observedghidriff_search_functions
    • First observedghidriff_settings
    • First observedghidriff_start_diff

TDQS

A3.7/5.0

Scored across 13 tools

Disambiguation4/5

Most tools have clearly distinct purposes: running diffs, managing jobs, and reading reports are separated well. However, ghidriff_start_diff vs ghidriff_run_diff and ghidriff_list_runs vs ghidriff_jobs could cause minor selection hesitation without careful reading.

Naming Consistency4/5

All tool names share the ghidriff_ prefix and use consistent snake_case, which makes the set feel cohesive. The pattern is mostly verb_noun, but ghidriff_settings, ghidriff_environment, and ghidriff_jobs are noun-only names, so it is not perfectly uniform.

Tool Count5/5

13 tools is well within the ideal range for this domain. The count covers environment checks, diff execution, job lifecycle management, and report exploration without feeling bloated.

Completeness5/5

The tool surface covers the full workflow: verifying prerequisites, configuring via settings, starting diffs asynchronously or synchronously, monitoring and canceling jobs, and inspecting generated reports and changed functions. There are no obvious dead ends or missing operations for the server's stated purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs to autonomously reverse engineer binaries using Ghidra's capabilities including decompilation, function analysis, automatic renaming, and BSim integration for function similarity matching.
    1
    AGPL 3.0
  • F
    license
    A
    quality
    D
    maintenance
    Enables binary comparison capabilities by leveraging IDA Pro and BinDiff to analyze similarities and differences between files. Users can perform automated function analysis to identify changed functions and compare original binaries against patched versions.
    1
    2
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Bridges Ghidra's reverse engineering capabilities with AI tools through 179 specialized tools for automated binary analysis and documentation. It supports full read/write access for function decompilation, renaming, and cross-binary documentation transfer in both GUI and headless modes.
    Apache 2.0