Decompile, cross-reference and rename inside Ghidra from a chat.
- Started in our test
- ★ 11.6K GitHub stars
- 62 downloads a week
- Last commit 10 Oct 2026
At a glance
GhidraMCP pairs a Ghidra extension, which serves the open program over a small local HTTP server, with an MCP server that turns those endpoints into tools. The assistant can list functions, classes, imports and strings, decompile or disassemble a function, follow cross-references and write back better names, types and comments.
Unlike IDA Pro MCP it needs no paid licence: Ghidra is free. There is also a headless mode that imports and analyses a binary on its own through PyGhidra, with no Ghidra window open.
- Made by
- LaurieWired
- GitHub stars
- 11.6K
- Downloads
- 62 a week
- Last commit
- 10 Oct 2026
- Tools
- 30
- Runs on
- Your computer
Our check: We ran this exact config on 27 Oct 2026: it started and answered with 30 tools. The shared database ran "uvx ghidramcp". That PyPI name only holds a 0.0.dev0 placeholder, so we publish the install the project documents: straight from its GitHub source.
What's in the pod: its tools
We found 30 tools when we started it on 27 Oct 2026. 19 only read. The rest can change things, so keep your app's "ask before each tool call" setting on for them.
How we tested it: Started from the GitHub source without Ghidra running. It lists its tools on its own; calling them needs Ghidra open with the GhidraMCP extension.
Changes things11 tools · Can create, edit, send or delete.
| Tool | What it is for |
|---|---|
decompile_function | Decompiles a function by name into C-like pseudocode. |
decompile_function_by_address | Decompiles the function at an address, which avoids clashes between duplicate names. |
disassemble_function | Returns a function's instructions with addresses, bytes and comments. |
rename_data | Renames the label on a piece of data. |
rename_function | Renames a function by its current name. |
rename_function_by_address | Renames the function at an address. |
rename_variable | Renames a local variable or parameter in the decompiler view. |
set_decompiler_comment | Adds or clears a comment shown in the decompiler. |
set_disassembly_comment | Adds or clears an end-of-line comment in the disassembly. |
set_function_prototype | Sets a function's signature from a C prototype. |
set_local_variable_type | Sets the data type of a decompiler variable. |
Only reads19 tools · Looks things up and changes nothing.
| Tool | What it is for |
|---|---|
get_current_address | Returns the address you have selected in Ghidra's listing. |
get_current_function | Returns the function you have selected in Ghidra. |
get_function_by_address | Returns the function at an address: name, signature, range and calling convention. |
get_function_calls | Shows one level of the call graph: who calls a function and what it calls. |
get_function_xrefs | Lists the references to a function's entry point. |
get_program_info | Identifies the loaded program: format, architecture, compiler, image base, size and entry points. |
get_xrefs_from | Lists the references made from one instruction or data address. |
get_xrefs_to | Lists every reference to an address and the function each comes from. |
list_classes | Lists class namespaces. |
list_data_items | Lists defined data with address, label, type and value. |
list_exports | Lists exported symbols and entry points. |
list_functions | Lists functions with their entry addresses, optionally filtered by name. |
list_imports | Lists imported symbols and the libraries they come from. |
list_methods | An older name-only function list, kept for compatibility. |
list_namespaces | Lists every non-global namespace. |
list_segments | Lists memory blocks with their address ranges and permissions. |
list_strings | Lists strings found in the program, optionally filtered by their text. |
read_memory | Reads up to 4 KB of program memory as hex and ASCII. |
search_functions_by_name | Finds functions whose name contains a piece of text. |
Grouped and described by us. The README on GitHub lists the inputs each tool takes.
How clearly it describes its tools to your assistant
- Tools with a description
- 30 of 30
- Say if they change things
- 0 of 30
- Context it takes, at least
- ~1,400 tokens
No tool says whether it only reads or can change things, so your client treats them all alike: keep approvals on.
From the tool list it sent us. The token figure counts names, descriptions and input names; the full schemas your client loads add more.
Set it up
- Download the latest release zip from the GhidraMCP repository.
- In Ghidra choose File → Install Extensions, click +, pick the zip and restart Ghidra.
- Make sure GhidraMCPPlugin is ticked under File → Configure → Developer, then open a program in the CodeBrowser.
Pick your app for the exact snippet and where it goes.
Where it goes: claude_desktop_config.json (Settings → Developer → Edit Config)
{
"mcpServers": {
"ghidra": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/LaurieWired/GhidraMCP",
"ghidra-mcp",
"--ghidra-server",
"http://127.0.0.1:8080/"
]
}
}
}Where it goes: Your terminal, in the project folder
claude mcp add-json ghidra '{"command":"uvx","args":["--from","git+https://github.com/LaurieWired/GhidraMCP","ghidra-mcp","--ghidra-server","http://127.0.0.1:8080/"]}'Where it goes: ~/.cursor/mcp.json, or .cursor/mcp.json in a project
{
"mcpServers": {
"ghidra": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/LaurieWired/GhidraMCP",
"ghidra-mcp",
"--ghidra-server",
"http://127.0.0.1:8080/"
]
}
}
}Where it goes: .vscode/mcp.json in your project
{
"servers": {
"ghidra": {
"type": "stdio",
"command": "uvx",
"args": [
"--from",
"git+https://github.com/LaurieWired/GhidraMCP",
"ghidra-mcp",
"--ghidra-server",
"http://127.0.0.1:8080/"
]
}
}
}Where it goes: ~/.codeium/windsurf/mcp_config.json
{
"mcpServers": {
"ghidra": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/LaurieWired/GhidraMCP",
"ghidra-mcp",
"--ghidra-server",
"http://127.0.0.1:8080/"
]
}
}
}Where it goes: Not supported
ChatGPT only connects to remote servers by URL. This one runs on your computer, so use Claude, Cursor or VS Code.
Change the --ghidra-server address if you moved the plugin to another port under Edit → Tool Options.
New to this? See the setup guides for Claude Code, Cursor, Claude Desktop and ChatGPT.
Settings
Names are exactly as the project spells them. Required ones are marked.
| Setting | What it does |
|---|---|
--ghidra-serverCommand line flag | Where the GhidraMCP plugin's HTTP server is listening. Defaults to localhost port 8080.--ghidra-server http://127.0.0.1:8080/ |
--transportCommand line flag | Runs the MCP side as a streamable HTTP server for clients that connect by URL, together with --mcp-host and --mcp-port.--transport streamable-http --mcp-port 8081 |
--headlessCommand line flag | Imports and analyses a binary through PyGhidra with no Ghidra window open. Needs the headless extra, Python 3.10 to 3.13 and GHIDRA_INSTALL_DIR.--headless --binary /path/to/target |
--projectCommand line flag | In headless mode, keeps the Ghidra project between runs so renames and comments are saved.--project /path/to/project-dir |
GhidraMCP HTTP ServerConfig | The plugin's port, set in Ghidra under Edit → Tool Options. Change --ghidra-server to match. |
What it can touch
It can read
- The program open in Ghidra: functions, strings, imports, memory and decompiled code
It can change
- Names, types, prototypes and comments in the Ghidra project
Safer setup: It never runs the binary, and all its changes are annotations. Keep a copy of the Ghidra project if you want to compare the model's renames with your own.
Before you start
- Ghidra 12.1.4 with the GhidraMCP extension installed
- uv (for uvx), or Python 3.10 or newer
If it does not work
- Every tool returns a connection error
- Ghidra must be running with a program open in the CodeBrowser, and GhidraMCPPlugin must be enabled under File → Configure → Developer.
- The extension will not install
- Each release is built for one Ghidra version. Use the zip that matches your Ghidra (12.1.4 for the current release) or build it from source with Gradle and Java 21.
- Port 8080 is already taken
- Change the port in Edit → Tool Options → GhidraMCP HTTP Server and pass the same address to --ghidra-server.
- Headless mode fails on macOS
- Build Ghidra's decompiler once with support/gradle/gradlew buildNatives from the Ghidra folder.
Peas in a pod: similar servers
How GhidraMCP lines up against other developer tools servers on the shelf.
| Server | Tools | Runs on | Licence | Stars |
|---|---|---|---|---|
| GhidraMCP | 30 | Your computer | – | 11.6K |
| shadcn/ui MCP | 10 | Your computer | MIT | 3.1K |
| jCodeMunch | 6 | Your computer | LicenseRef-jCodeMunch-Dual-Use-1 | 2.8K |
| iOS Simulator MCP | 17 | Your computer | MIT | 2.2K |
| Desktop Commander | 25 | Your computer | MIT | 10.1K |
Questions
Do I need a paid tool?
No. Ghidra is free and open source from the NSA, and GhidraMCP is Apache-2.0.
GhidraMCP or IDA Pro MCP?
If you already own IDA Pro, IDA Pro MCP fits your workflow. If not, GhidraMCP gives you similar decompile, rename and cross-reference tools without a licence.
Can it analyse a file without opening Ghidra?
Yes, with --headless and --binary, which imports and analyses the file through PyGhidra.
Is it safe to point at malware?
It only analyses the file statically and never runs it. Still work in an isolated machine, as you would with any malware sample.
Something wrong on this page? Tell us.
