Self-hosted service
bethington/ghidra-mcp avatar
bethington/ghidra-mcp

Ghidra MCP Server: 253 Tools, Convention Enforcement, and What the README Does Not Say

Ghidra MCP Server — 200+ MCP tools for AI-powered reverse engineering. GUI plugin + headless server, lazy tool loading, convention enforcement, batch operations, Ghidra Server integration, and Docker deployment.

3,814 stars134 forksJavaApache-2.0

At a glance

What is it?
bethington/ghidra-mcp bridges Ghidra to Model Context Protocol clients with 253 tools, a convention-enforcement layer, and both GUI and headless modes. The design bets that naming and typing rules belong in the tool layer, not in prompts. That bet has costs the README does not discuss.
Who is it for?
Adopt ghidra-mcp if your team already runs Ghidra 12.1.2 on Java 21 and wants an MCP client to rename, retype, and comment functions inside a live project, with the convention layer doing the tidying. Do not adopt it if you need a stable tool-name contract, if you cannot pin the Ghidra build, or if you only want read-only function listing, where a smaller server is easier to audit.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly Java, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem is not reading binaries, it is writing to them consistently

Most Ghidra MCP servers expose a read surface: list functions, decompile an address, fetch strings. That is enough for a chatbot that summarizes a binary and not enough for one that improves the database. The gap this project targets is the write path. The README states that the tool set includes full write access for renaming, typing, commenting, structure creation, script execution, P-code emulation, and live debugging, and that the count is 253 tools. The audience is therefore narrower than "anyone curious about reverse engineering": it is analysts and teams who already keep a Ghidra project as a living artifact and want an agent to maintain it. The second problem the README names is drift. Its convention-enforcement section opens with a concrete failure: six months in, a codebase contains ProcessItem, process_items, handleItem, and ItemProc, four functions doing the same thing, named by four different sessions. The project's answer is to move the rules out of prompts and style guides and into the tool layer itself. That is a defensible framing. It is also a claim about workflow, not about analysis quality, and the README does not present measurements to support it.

What convention enforcement actually does when you rename a function

The README describes a three-tier model. Auto-fix changes are applied silently; the example given is a count field on a uint32 being prefixed dwCount on save. Warn changes go through but return a warning; the example is processData producing a message that the name should be PascalCase with a verb, ProcessData. Reject changes are blocked with an explanation; the example is an undefined to undefined type change being refused as a no-op. Read that table carefully and you see the design intent: the tool is the arbiter, and the agent or engineer only supplies the intent. For an AI client this removes the need to paste naming rules into every prompt, which is a real token saving across long sessions. For a team it removes a class of review comment. The trade-off is that the enforcement lives inside the extension, so it is versioned with the extension. If you disagree with a rule, the README does not describe a configuration surface for overriding the tiers. There is also a subtlety in the warn example: the change still goes through. A warning that does not block is a nudge, and a model that ignores warnings will produce the same inconsistent names as before, just with a log line attached. The reject tier is where the actual guarantee sits, and the README's reject example is a no-op rather than a naming violation.

Tool count is a surface-area decision, not a quality score

The README states 253 MCP tools and describes lazy tool loading as a feature. Both facts matter together. A large tool surface gives an agent granular operations, but every tool is also a schema the client must carry and a name the model must choose correctly. The compatibility note in the README is the most informative paragraph in the whole document on this point: tool names are normalized for GitHub Copilot CLI and CAPI validation, exposed names use lowercase letters, digits, underscores, and hyphens only, and nested HTTP paths such as /debugger/status are advertised as names like debugger_status_2 when needed to avoid collisions. That means the advertised name of a tool is not a stable human-readable identifier derived from its path. It is a normalized, collision-avoiding label. If you write prompts or scripts that reference tool names directly, a path addition that introduces a collision can shift a suffix. The README does not state that names are guaranteed stable across releases. Treat the tool list as an interface that can move, and prefer letting the client discover tools at runtime over hardcoding names in your own automation.

Batch operations and cross-binary documentation transfer

Two mechanisms in the README are worth separating from the marketing around them. The first is batch operations, described as producing a 93% API call reduction. The README does not state the baseline against which that percentage is measured, so the number is best read as an indication that batching exists rather than as a benchmark you can plan around. What matters architecturally is that batching plus atomic transactions means a multi-function edit either lands or does not, which is the property you want when an agent is renaming across a binary. The second is cross-binary documentation transfer: SHA-256 function hash matching propagates documentation across binary versions. This is the feature with the clearest practical payoff for anyone maintaining analysis across patch releases, because it turns documentation into something that survives a version bump. It is also the feature with the most obvious failure mode. Hash matching on function content will not match a function whose code changed, which is exactly the function you most want re-documented. The README does not describe a similarity fallback or a review step before propagated comments are written. If you use this, plan to diff what was applied rather than assume the propagation was correct.

Getting it running: what the README actually specifies

The README pins the runtime targets in its badges: Python 3.10 through 3.13, Java 21, and Ghidra 12.1.2. Those are the constraints to check first, because a Ghidra extension is compiled against a Ghidra build and the README does not describe a compatibility range beyond that badge. The project ships as a Ghidra GUI plugin and a headless server, and the README states Docker deployment is supported for CI/CD pipelines and automated analysis at scale. The README gives the tool-name normalization rules but does not reproduce a full client configuration block, an install command sequence, or a list of configuration keys. If you need those, they are not in the material available here, and I am not going to invent them. What the README does make concrete is the operational shape: you either load the extension into a Ghidra instance you are already using, or you run the headless server against a project without the GUI. The headless path is the one that fits automation, and it is also the path where the absence of documented config keys is most felt, because a CI job needs a non-interactive way to point the server at a project and a port. Verify that from the repository itself before you design a pipeline around it.

Where this is the wrong tool

The clearest limitation is the coupling to a specific Ghidra version. The README advertises Ghidra 12.1.2 and Java 21. Ghidra releases move, and this project's release cadence shows it: v5.14.1, v5.14.2, then a major v6.0.0, with the last push dated 2026-09-04. A team on an older Ghidra for validation reasons, or on a newer one, is outside the documented target. The second limitation is the write surface. Full write access for renaming, typing, commenting, structure creation, and script execution means an agent can modify your project database. Script execution in particular is not a read operation. The README describes atomic transactions and graceful error handling, which reduce the blast radius of a failed batch, but atomicity is not the same as reversibility, and the README does not describe an undo or dry-run mode for agent-driven edits. If your workflow requires human review before any database mutation, this server's value proposition is largely unavailable to you. The third case is scale of intent: if you want an agent to answer questions about a binary, the 253-tool surface with write capability is more than you need and more than you want to audit. A read-only server is the smaller risk.

The alternative, and the actual difference in approach

The README itself frames the comparison: most Ghidra MCP implementations expose a handful of read-only tools. That is the alternative category, and the difference is not tool count. It is where the intelligence sits. A minimal read-only server treats Ghidra as a data source and puts all naming, typing, and documentation decisions in the model or the prompt. This project moves those decisions into the extension, so the model supplies intent and the tool supplies the contract. The consequences run in both directions. With the minimal server you can change conventions by editing a prompt, and you can run it against whatever Ghidra version you have, because there is far less code bound to Ghidra internals. With this project you get consistency across sessions and models without prompt engineering, plus batch writes and cross-binary propagation, at the cost of a pinned Ghidra version and a much larger surface to trust. Neither is strictly better. The choice depends on whether your bottleneck is model output consistency or your tolerance for an agent holding write access to an analysis database.

Maintenance cost, licensing, and what to verify before adoption

Maintenance cost here is dominated by the Ghidra version pin. Every Ghidra release is a potential compatibility event for a 253-tool extension, and the release history in the material (v5.14.1 in June 2026, v5.14.2 later that month, v6.0.0 in July) suggests active upkeep rather than a frozen artifact. Budget for the upgrade as part of your Ghidra upgrade, not as a separate background task. If you run the headless server in CI, the Docker path is the one to standardize on, because it lets you pin the Ghidra build the extension was compiled against instead of inheriting whatever a runner image provides. On licensing, the repository is Apache-2.0. That permits commercial use and modification and includes a patent grant, and it requires that you preserve notices and state changes. It does not resolve the question of what you may do with binaries you analyze, which is a separate matter and outside this project's scope. I am not giving legal advice; read the LICENSE file and, if you redistribute a modified extension, check the notice requirements yourself. The project also asks for sponsorship in the README, which funds compatibility updates and documentation according to that text; sponsorship is optional and does not change the licence terms. Before adopting, verify the Ghidra 12.1.2 and Java 21 targets against your environment, confirm how your MCP client handles the normalized tool names, and check whether your review process can live with agent-initiated writes to the project database.

Editorial conclusion

Adopt ghidra-mcp if your team already runs Ghidra 12.1.2 on Java 21 and wants an MCP client to rename, retype, and comment functions inside a live project, with the convention layer doing the tidying. Do not adopt it if you need a stable tool-name contract, if you cannot pin the Ghidra build, or if you only want read-only function listing, where a smaller server is easier to audit. Before committing, verify three things: that your Ghidra version matches the documented 12.1.2 target, that your MCP client tolerates the normalized tool names described in the compatibility note, and that the Apache-2.0 LICENSE file covers the extension and any bundled scripts you plan to redistribute.

Official sources

  1. bethington/ghidra-mcp on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Community notes

Community notes