Ghidra MCP Server
If you find this useful, please ⭐ star the repo — it helps others discover it!
If Ghidra MCP saves you time, consider sponsoring the project. One-time and recurring support both help fund compatibility updates, production hardening, docs, and new tooling.
A production-ready Model Context Protocol (MCP) server that bridges Ghidra's powerful reverse engineering capabilities with modern AI tools and automation frameworks. 272 MCP tools, battle-tested AI workflows, and the most comprehensive Ghidra-MCP integration available — now including P-code emulation, live debugger integration, and PCode-graph data flow analysis.
Why Ghidra MCP?
Most Ghidra MCP implementations give you a handful of read-only tools and call it a day. This project is different — it was built by a reverse engineer who uses it daily on real binaries, not as a demo.
- 272 MCP tools — 3x more than any competing implementation. Not just read operations — full write access for renaming, typing, commenting, structure creation, script execution, P-code emulation, and live debugging.
- Battle-tested AI workflows — Proven documentation workflows (V5) refined across hundreds of functions. Includes step-by-step prompts, Hungarian notation reference, batch processing guides, and orphaned code discovery.
- Production-grade reliability — Atomic transactions, batch operations (93% API call reduction), configurable timeouts, and graceful error handling. No silent failures.
- Cross-binary documentation transfer — SHA-256 function hash matching propagates documentation across binary versions automatically. Document once, apply everywhere.
- Full Ghidra Server integration — Connect to shared Ghidra servers, manage repositories, version control, checkout/checkin workflows, and multi-user collaboration.
- Headless and GUI modes — Run with or without the Ghidra GUI. Docker-ready for CI/CD pipelines and automated analysis at scale.
- Opinionated by design — v5.0 moves naming conventions, type safety, and documentation standards into the tool layer. AI agents and human engineers produce consistent output without style guides in every prompt.
Convention Enforcement
You've been there: six months into a project you find ProcessItem, process_items, handleItem, and ItemProc in the same codebase — four functions doing the same thing, named by four different sessions or engineers with no shared contract. Fixing it takes longer than it should, and the problem will happen again.
v5.0 moves conventions from "things to remember" into the tool layer, where they can actually be enforced.
| Tier | Behavior | Example |
|---|---|---|
| Auto-fix | Applied silently | count field on a uint32 → auto-prefixed dwCount on save |
| Warn | Change goes through, warning returned | processData → "name should be PascalCase with a verb: ProcessData" |
| Reject | Change blocked with explanation | undefined → undefined type change → "no-op rejected, type unchanged" |
For AI agents, this means consistent output across every session, every model, every run — without pasting a style guide into every prompt. The tool knows the rules; the model just needs to make the call.
For teams, it eliminates the entire class of review comment that says "that's not our naming convention." Convention arbitration stays in the tool, not in code review.
For solo work at scale, analyze_function_completeness gives you a 0–100% score that measures honestly: structural deductions (unfixable compiler artifacts) are forgiven in your effective score, log-scaling prevents one bad category from burying everything else, and tiered plate comment quality means you know exactly what's missing and why.
🌟 Features
Core MCP Integration
- Full MCP Compatibility — Complete implementation of Model Context Protocol
- 272 MCP tools — Comprehensive API surface covering every aspect of binary analysis
- Production-Ready Reliability — Atomic transactions, batch operations, configurable timeouts
- Real-time Analysis — Live integration with Ghidra's analysis engine
Compatibility note: MCP tool names are normalized for GitHub Copilot CLI and CAPI validation. Exposed tool names use lowercase letters, digits, underscores, and hyphens only; nested HTTP paths such as
/debugger/statusare advertised as names likedebugger_status_2when needed to avoid collisions with static bridge tools.
Binary Analysis Capabilities
- Function Analysis — Decompilation, call graphs, cross-references, completeness scoring
- Data Flow Analysis — PCode-graph value propagation (forward / backward) from any variable or register
- Data Structure Discovery — Struct/union/enum creation with field analysis and naming suggestions
- String Extraction — Regex search, quality filtering, and string-anchored function discovery
- Import/Export Analysis — Symbol tables, external locations, ordinal import resolution
- Memory & Data Inspection — Raw memory reads, byte pattern search, array boundary detection
- Cross-Binary Documentation — Function hash matching and documentation propagation across versions
Dynamic Analysis (v5.4.0)
- P-code Emulation — Run any function in isolation via Ghidra's
EmulatorHelper; brute-force API hash resolution in milliseconds - Live Debugger Integration — 17 Java endpoints + 22 Python bridge tools over Ghidra's TraceRmi framework (dbgeng on Windows PE, gdb/lldb otherwise): attach, step, breakpoints, registers, memory reads, non-breaking function tracing, ASLR-aware static↔dynamic address translation
AI-Powered Reverse Engineering Workflows
- Function Documentation Workflow V5 — 7-step process for complete function documentation with Hungarian notation, type auditing, and automated verification scoring
- Batch Documentation — Parallel subagent dispatch for documenting multiple functions simultaneously
- Orphaned Code Discovery — Automated scanner finds undiscovered functions in gaps between known code
- Data Type Investigation — Systematic workflows for structure discovery and field analysis
- Cross-Version Matching — Hash-based function matching across different binary versions
Development & Automation
- Ghidra Script Management — Create, run, update, and delete Ghidra scripts entirely via MCP
- Multi-Program Support — Switch between and compare multiple open programs
- Batch Operations — Bulk renaming, commenting, typing, and label management (93% fewer API calls)
- Headless Server — Full analysis without Ghidra GUI — Docker and CI/CD ready
- Project & Version Control — Create projects, manage files, Ghidra Server integration
- Analysis Control — List, configure, and trigger Ghidra analyzers programmatically
🚀 Quick Start
Prerequisites
- Java 21 LTS (OpenJDK recommended)
- Apache Maven 3.9+
- Ghidra 12.1.2 (or compatible version)
- Python 3.10+ with uv (recommended) or pip + venv
Shared Ghidra Server users: Ghidra 12.1.2 clients require a Ghidra Server at 12.1, 12.0.5, or a newer compatible version. Upgrade the server before using this plugin from a 12.1 client.
Ghidra 12.1.2 ships Jython as an optional extension. Java scripts work by default, but
.pyscripts inghidra_scripts/require installing the Jython extension from File > Install Extensions and restarting Ghidra.
Installation
Recommended for all platforms: use
python -m tools.setupdirectly.
ensure-prereqsinstalls runtime Python requirements plus the Ghidra JARs needed in the local Maven repository.deploycopies the build output, installs the user-profile extension, and patches Ghidra user config.
-
Clone the repository:
git clone https://github.com/bethington/ghidra-mcp.git cd ghidra-mcp -
Recommended: run environment preflight first:
python -m tools.setup preflight --ghidra-path "F:\ghidra_12.1.2_PUBLIC" -
Build and deploy to Ghidra:
python -m tools.setup ensure-prereqs --ghidra-path "F:\ghidra_12.1.2_PUBLIC" python -m tools.setup build python -m tools.setup deploy --ghidra-path "F:\ghidra_12.1.2_PUBLIC"deploysaves/closes an already-running matching Ghidra instance when needed, installs the extension, starts Ghidra, waits for MCP health, and runs schema smoke checks. -
Optional strict/manual mode (advanced):
# Skip automatic prerequisite setup python -m tools.setup build python -m tools.setup deploy --ghidra-path "F:\ghidra_12.1.2_PUBLIC" -
Show command help:
python -m tools.setup --help -
Optional build-only mode (advanced/troubleshooting):
python -m tools.setup buildSupported build path:
python -m tools.setup builduses Maven under the hood and is the canonical workflow used by the repo tasks and docs.# Manual Maven build (requires Ghidra deps already installed in local .m2) mvn clean package assembly:single -DskipTests# Secondary/manual Gradle build path only (not used by tools.setup or VS Code tasks) GHIDRA_INSTALL_DIR=/path/to/ghidra gradle buildExtension
Installation (Linux — Ubuntu/Debian)
-
Clone the repository:
git clone https://github.com/bethington/ghidra-mcp.git cd ghidra-mcp -
Install system prerequisites (if not already installed):
sudo apt update && sudo apt install -y openjdk-21-jdk maven python3 python3-pip python3-venv curl jq unzipDebian/Kali/Ubuntu 23.04+ note (PEP 668): these distros mark the system Python as externally managed, so a bare
pip installfails witherror: externally-managed-environment. Don't work around it with--break-system-packages— it can corrupt apt-managed tooling. Instead use uv (recommended — it creates and manages a project-local.venvautomatically, and is what this repo's commands use):curl -LsSf https://astral.sh/uv/install.sh | sh uv run bridge-mcp-ghidra # resolves deps into .venv and starts the bridgeor a classic virtual environment:
python3 -m venv .venv && source .venv/bin/activate pip install -e . bridge-mcp-ghidra -
Run environment preflight:
python -m tools.setup preflight --ghidra-path ~/ghidra_12.1.2_PUBLIC -
Build and deploy to Ghidra (single command):
python -m tools.setup ensure-prereqs --ghidra-path ~/ghidra_12.1.2_PUBLIC python -m tools.setup build python -m tools.setup deploy --ghidra-path ~/ghidra_12.1.2_PUBLICThis will:
- Install Ghidra JAR dependencies into your local
~/.m2/repository - Build
GhidraMCP-<version>.zipwith Maven - Extract the extension to
~/.config/ghidra/ghidra_<version>_PUBLIC/Extensions/ - Update
preferenceswithLastExtensionImportDirectory - Install Python requirements
- Install Ghidra JAR dependencies into your local
-
Optional: setup only Maven dependencies:
python -m tools.setup install-ghidra-deps --ghidra-path ~/ghidra_12.1.2_PUBLIC -
Show command help:
python -m tools.setup --help
Linux paths: The extension is installed to
$HOME/.config/ghidra/ghidra_<version>_PUBLIC/Extensions/GhidraMCP/. Ghidra config files are in$HOME/.config/ghidra/ghidra_<version>_PUBLIC/.
Installation (macOS — Homebrew)
-
Install prerequisites:
brew install openjdk@21 maven python ghidra -
Clone the repository:
git clone https://github.com/bethington/ghidra-mcp.git cd ghidra-mcp -
Install Ghidra JARs into local Maven:
python -m tools.setup install-ghidra-deps \ --ghidra-path /opt/homebrew/opt/ghidra/libexec -
Build and deploy:
python -m tools.setup ensure-prereqs \ --ghidra-path /opt/homebrew/opt/ghidra/libexec python -m tools.setup build python -m tools.setup deploy \ --ghidra-path /opt/homebrew/opt/ghidra/libexecThe extension is installed to
~/Library/ghidra/ghidra_12.1.2_PUBLIC/Extensions/GhidraMCP/.Note:
--ghidra-versionis required when using the Homebrew path because the path contains no version string. -
Start Ghidra and enable the plugin:
/opt/homebrew/opt/ghidra/libexec/ghidraRunIn the main project window: Tools > GhidraMCP > Start MCP Server
-
Configure Cursor/Claude MCP (
~/.cursor/mcp.json):{ "mcpServers": { "ghidra": { "command": "uv", "args": ["run", "--directory", "/path/to/ghidra-mcp", "bridge-mcp-ghidra"] } } }
Installation (Arch Linux — AUR)
@Pandoriaantje maintains community AUR packages:
ghidra-mcp-git— tracksmainghidra-mcp— tracks tagged releases
Install with your AUR helper of choice, e.g.:
yay -S ghidra-mcp # or ghidra-mcp-git
Basic Usage
Option 1: Stdio Transport (Recommended for AI tools)
uv run bridge-mcp-ghidra # or: python -m bridge_mcp_ghidra
To add the bridge to Autohand Code from a cloned checkout:
autohand mcp add ghidra uv run --directory /path/to/ghidra-mcp bridge-mcp-ghidra
Add --scope project before ghidra to save the server in the current project's .autohand configuration instead of your user configuration.
Option 2: Streamable HTTP Transport (Recommended for web/HTTP clients)
uv run bridge-mcp-ghidra --transport streamable-http --mcp-host 127.0.0.1 --mcp-port 8081
MCP client config for the HTTP transport (add to your client's MCP config file):
{
"mcpServers": {
"ghidra-mcp-http": {
"url": "http://127.0.0.1:8081/mcp"
}
}
}
Browser-based clients (e.g. MCP Inspector)
work out of the box: the HTTP transports answer CORS preflight (OPTIONS) requests and expose
the mcp-session-id / mcp-protocol-version headers to scripts. Allowed origins mirror the
Host-header policy — loopback on any port is always permitted, plus the bind host and any
hosts listed in GHIDRA_MCP_ALLOWED_HOSTS.
Option 3: SSE Transport (Deprecated — use streamable-http instead)
uv run bridge-mcp-ghidra --transport sse --mcp-host 127.0.0.1 --mcp-port 8081
Bridge advanced flags
| Flag | Default | Description |
|---|---|---|
--transport |
stdio |
stdio (AI tools), streamable-http (web clients), sse (deprecated) |
--mcp-host |
127.0.0.1 |
Bind host for HTTP transports |
--mcp-port |
— | Port for HTTP transports |
--lazy |
off | Load only the default tool groups on connect. Faster startup, but MCP clients that don't support tools/list_changed will see an incomplete tool list. Not recommended for Claude Code. |
--no-lazy |
(default) | Load all tool groups immediately on connect. Required for most AI clients. |
--default-groups |
listing,function,program |
Comma-separated groups loaded on connect when --lazy is set. |
Strict program routing (multi-program safety)
Set GHIDRA_MCP_REQUIRE_PROGRAM_SELECTORS=1 to make the bridge refuse any program-scoped
call that omits a program selector, returning a clear error instead of letting the call
ride the server's shared "current program" (the one switch_program and the
active GUI tab move).
export GHIDRA_MCP_REQUIRE_PROGRAM_SELECTORS=1
uv run bridge-mcp-ghidra
Without this, a call that leaves program= out runs against whichever program
is current, which is fine for a single-program workflow but a hazard once
several programs are open: the call can read or edit the wrong binary with no
error. The hazard is worse when more than one client shares a server, since
each one moves that current-program global out from under the others.
With strict mode on, every program-scoped call must name its target. This
covers every selector that picks an open program: plain program= and the
cross-program tools' source_program/target_program or program_a/program_b
(declared required, but the server still falls back to the current program when
one arrives empty). A forgotten selector surfaces as a loud error on the first
bad call instead of a silent write to the wrong binary. Tools with no program
selector (open_program and close_program take path/name) are unaffected.
Off by default: with the variable unset the bridge sends calls unchanged.
Reducing tool-context overhead
The bridge exposes a large catalog. To keep the model's tool surface small, run
with --lazy (loads only listing,function,program on connect) and let the
model discover the rest on demand instead of registering everything:
search_tools("rename function")— keyword-search the entire catalog, including tools whose group isn't loaded. Each result says whether it's callable now and, if not, the exactload_tool_group(...)call to enable it.list_tool_groups()— list all categories and their load state.load_tool_group("datatype")/unload_tool_group("datatype")— load or drop a category at runtime.check_tools("rename_or_label,batch_set_comments")— confirm specific tools are callable right now.
search_tools works in both eager and --lazy modes, so agents that honor
tools/list_changed get full discovery without the upfront context cost.
Optional: Start the standalone debugger server
uv sync --group debugger
uv run python -m debugger
The debugger server listens on http://127.0.0.1:8099/ by default and is
required for the debugger_* proxy tools exposed by the MCP bridge.
Debugger server flags:
| Flag | Default | Description |
|---|---|---|
--port |
8099 |
HTTP server port |
--host |
127.0.0.1 |
Bind address (0.0.0.0 to expose on LAN) |
--exports-dir |
— | Path to a dll_exports/ directory for ordinal-to-name resolution |
--log-level |
INFO |
DEBUG, INFO, WARNING, or ERROR |
Set GHIDRA_DEBUGGER_URL in .env if you change the default port or host so the bridge can find it.
In Ghidra
- Start Ghidra and open a CodeBrowser window
- In CodeBrowser, enable the plugin via File > Configure > Configure All Plugins > GhidraMCP
- Optional: configure custom port via CodeBrowser > Edit > Tool Options > GhidraMCP HTTP Server
- Start the server via Tools > GhidraMCP > Start MCP Server
- The server runs on
http://127.0.0.1:8089/by default
Verify It's Working
# Quick health check
curl http://127.0.0.1:8089/check_connection
# Expected: "Connected: GhidraMCP plugin running with program '<name>'"
# Get version info
curl http://127.0.0.1:8089/get_version
Support This Project
If Ghidra MCP saves you engineering or reverse-engineering time, consider sponsoring the project.
- One-time sponsorship helps fund fixes, compatibility updates, and release work.
- Recurring sponsorship helps keep maintenance, docs, and production hardening moving.
- Company support helps prioritize long-term reliability for the bridge, headless server, debugger integration, and workflow tooling.
🔒 Security
GhidraMCP is designed for localhost-only development. The default configuration — HTTP server bound to 127.0.0.1, no authentication — is safe on a trusted single-user workstation and matches pre-v5.4.1 behavior.
If you expose the server beyond loopback, configure these three environment variables first. The server refuses to start on a non-loopback bind without a token.
| Env var | Effect |
|---|---|
GHIDRA_MCP_AUTH_TOKEN |
When set, every HTTP request must carry Authorization: Bearer <token>. Timing-safe comparison. /mcp/health, /health, /check_connection are exempt. |
GHIDRA_MCP_ALLOW_SCRIPTS |
Set to 1, true, or yes to enable /run_script_inline and /run_ghidra_script. Off by default as of v5.4.1 — these endpoints execute arbitrary Java against the Ghidra process. In headless mode this also triggers OSGi BundleHost initialization at server startup (Felix framework, ~hundreds of ms); leave it off if you don't need script execution. |
GHIDRA_MCP_FILE_ROOT |
When set to a directory path, filesystem-path endpoints (/load_program, /import_file, /open_project, /delete_file, etc.) canonicalize the input and require it to fall under this root. Prevents path-traversal. |
Name-quality enforcement is separate from security. By default,
rename_function_by_address and global write endpoints reject names that fail
the built-in quality gates, and struct field writes apply the built-in field
prefix convention. Disable the built-in convention layer with Edit > Tool
Options > GhidraMCP HTTP Server > Strict Naming Enforcement. The same Tool
Options checkbox covers rename_data, rename_global_variable,
set_global, the apply_data_type prefix/type guard, and struct-field
Hungarian prefix auto-fixes in create_struct, add_struct_field, and
modify_struct_field. The setting is read when the MCP server starts or
restarts. Function/global convention warnings are still returned when
enforcement is disabled.
Example: exposing to a private LAN with auth
export GHIDRA_MCP_AUTH_TOKEN=$(openssl rand -hex 32)
export GHIDRA_MCP_ALLOW_SCRIPTS=1 # only if your workflow needs it
export GHIDRA_MCP_FILE_ROOT=/srv/ghidra/inputs
java -jar GhidraMCPHeadless.jar --bind 0.0.0.0 --port 8089
Ghidra Server authentication
When connecting to a shared Ghidra Server, GhidraMCP can suppress the password dialog automatically. It resolves credentials in this order (first non-empty value wins):
Compatibility note: Ghidra 12.1.2 clients require Ghidra Server 12.1.2, 12.0.5, or a newer compatible server. Older shared servers are not safe targets for a 12.1 client upgrade.
GHIDRA_SERVER_PASSWORDenvironment variable (or.envfile in the Ghidra install directory or~)~/.ghidra-cred— single-line password file in your home directory<ghidra-install-dir>/.ghidra-cred
Username resolves similarly: GHIDRA_SERVER_USER env var → user.name system property.
If no password is found, Ghidra shows its normal GUI prompt. Set these in .env (see .env.template for the full block) to enable silent auth.
Migration from v5.4.0 → v5.4.1
- Script endpoints now default-off. If you relied on
/run_script_inlineor/run_ghidra_script, exportGHIDRA_MCP_ALLOW_SCRIPTS=1. This is a deliberate breaking change; the prior default was unsafe. - Localhost-only deployments need no changes. Auth, bind refusal, and path-root checks are all opt-in.
❓ Troubleshooting
"GhidraMCP" menu not appearing in Tools
Cause: Plugin not enabled or installed incorrectly.
Solution:
- Verify extension is installed: File > Install Extensions — GhidraMCP should be listed
- Enable the plugin: File > Configure > Configure All Plugins > GhidraMCP (check the box)
- Restart Ghidra after installation/enabling
Server not responding / Connection refused
Cause: Server not started or wrong port.
Solution:
- Ensure you started the server: Tools > GhidraMCP > Start MCP Server
- Check configured port: Edit > Tool Options > GhidraMCP HTTP Server
- Check if port is in use:
# Linux/macOS lsof -i :8089 # Windows netstat -ano | findstr :8089 - Look for errors in Ghidra console: Window > Console
pip install fails with error: externally-managed-environment
Cause: PEP 668. Debian-family distros (Debian 12+, Kali, Ubuntu 23.04+)
mark the system Python as externally managed, so global pip install is
blocked to protect apt-managed packages.
Solution: Use a virtual environment — never --break-system-packages.
The recommended path is uv, which manages a
project-local .venv automatically:
curl -LsSf https://astral.sh/uv/install.sh | sh
cd ghidra-mcp
uv run bridge-mcp-ghidra
Or a classic venv:
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
bridge-mcp-ghidra
python -m debugger fails with ModuleNotFoundError for pybag or comtypes
Cause: The standalone debugger server uses optional Windows-only Python dependencies that are not installed by default.
Solution:
uv sync --group debugger
uv run python -m debugger
If you have both a global Python and a project venv, make sure you install into and run from the same interpreter.
500 Internal Server Errors
Cause: Server-side exception, often due to missing program data.
Solution:
- Ensure a binary is loaded in CodeBrowser
- Run auto-analysis first: Analysis > Auto Analyze
- Check Ghidra console (Window > Console) for Java exceptions
- Some operations require fully analyzed binaries
404 Not Found Errors
Cause: Endpoint doesn't exist or wrong URL.
Solution:
- Verify endpoint exists:
curl http://127.0.0.1:8089/get_version - Check for typos in endpoint name
- Ensure you're using correct HTTP method (GET vs POST)
Python Ghidra scripts fail with "No script provider found"
Cause: In Ghidra 12.1.2, Jython support is no longer enabled by
default. .py scripts need the bundled Jython extension; Python 3
scripts should use PyGhidra instead of the Ghidra Script Manager.
Solution:
- In the Ghidra Front End, open File > Install Extensions.
- Check Jython, restart Ghidra, then refresh Script Manager.
- For new automation, prefer Java Ghidra scripts or PyGhidra.
Extension not appearing in Install Extensions
Cause: JAR file in wrong location.
Solution:
- Manual install location:
~/.ghidra/ghidra_12.1.2_PUBLIC/Extensions/GhidraMCP/lib/GhidraMCP.jar - Or use: File > Install Extensions > Add and select the ZIP file
- Ensure JAR/ZIP was built for your Ghidra version
Build fails with "Ghidra dependencies not found"
Cause: Ghidra JARs not installed in local Maven repository.
Solution:
# Windows (recommended)
python -m tools.setup install-ghidra-deps --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
📊 Production Performance
- MCP Tools: 272 tools fully implemented
- Speed: Sub-second response for most operations
- Efficiency: 93% reduction in API calls via batch operations
- Reliability: Atomic transactions with all-or-nothing semantics
- AI Workflows: Proven documentation prompts refined across hundreds of real functions
- Deployment: Automated version-aware deployment script
🛠️ API Reference
272 MCP tools backed by HTTP endpoints, grouped by catalog category. Generated from tests/endpoints.json by python -m tools.gen_readme_api_reference --write; the live schema at /mcp/schema is authoritative at runtime. Usage patterns: docs/prompts/TOOL_USAGE_GUIDE.md.
Program & Session Management
analysis_status- Get auto-analysis status for open programsclose_program- Close an open program by project path or namecreate_property_map- Create a user property map to store typed values keyed by addressdelete_property_map- Delete a user property map and all values it holdsexit_ghidra- Save and exit Ghidraget_address_spaces- List all physical and overlay address spaces in the program (overlays include is_overlay flag and overlayed_space name)get_current_program_info- Get current program infoget_language_metadata- Dump the program's language description: address spaces, registers, default symbols, endianness, pointer size (issue #192)get_program_options- Read all options in a program option group with types, current values, defaults, and descriptionsget_property- Read the value stored at an address in a property mapimport_file- Import a binary file from disk into the current Ghidra project and open itlist_open_programs- List open programslist_option_groups- List program option groups (e.glist_project_files- List project fileslist_properties- List (address, value) entries stored in a property map, with paginationlist_property_maps- List user-defined property maps — typed per-address key→value storesopen_program- Open program from projectreanalyze- Trigger full auto-analysis on a programremove_program_option- Remove an option from a program option groupremove_property- Remove the value stored at a single address in a property mapsave_all_programs- Save all open programssave_program- Save current programset_image_base- Set the base address of the program (rebases all addresses)set_program_option- Set a typed program optionset_property- Set a value at an address in a property mapswitch_program- Switch current program
Project Organization
create_folder- Create a folder in the projectdelete_file- Delete a file from the projectdelete_project- Delete a Ghidra projectlist_projects- List available Ghidra projectsmove_file- Move a file to another project foldermove_folder- Move a folder to another locationproject_info- Get detailed project info including running tools and open programs
Headless Project & Program Lifecycle
Available on the standalone headless server (GhidraMCPHeadlessServer).
archive_project- Archive the currently open project to a Ghidra-native .gar filecheckin_program- Check an open program back in to the shared Ghidra Server as a new versionclose_project- Close the currently open projectcreate_project- Create a new Ghidra projectexport_program- Export an open or project-resident program to a Ghidra Zip File (.gzf)get_project_info- Get info about the currently open projectimport_program- Import a Ghidra Zip File (.gzf) into the currently open project as a new DomainFile under target_folder (default '/')load_program- Load a binary file into the headless server for analysisload_program_from_project- Load program from Ghidra project (headless)open_project- Open an existing Ghidra project (.gpr file or directory)restore_project- Restore a Ghidra .gar archive into a fresh on-disk project atparent_dir/project_nameserver_status- Check headless server connection status
Listing & Enumeration
list_bookmarks- List bookmarkslist_calling_conventions- List available calling conventionslist_classes- List namespace/class nameslist_data_items- List defined datalist_data_items_by_xrefs- List data sorted by xref countlist_exports- List exported symbolslist_external_locations- List external locationslist_functions- List functions with addresseslist_functions_enhanced- List functions with metadatalist_globals- List global variableslist_imports- List imported symbolslist_methods- List all function names with paginationlist_namespaces- List all namespaceslist_scripts- List available Ghidra scriptslist_segments- List memory segmentslist_strings- List defined strings
Context & Lookups
get_current_address- Get cursor address (GUI only)get_current_function- Get function at cursor (GUI only)get_current_selection- Get highlighted address ranges in the CodeBrowser listing (GUI only)get_entry_points- Get program entry pointsget_enum_values- Get enumeration valuesget_external_location- Get external location detailsget_full_call_graph- Get full call graphget_function_by_address- Get function at addressget_function_call_graph- Get call graphget_function_callees- Get functions calledget_function_callers- Get calling functionsget_function_count- Return the number of functions in the loaded programget_function_jump_targets- Get jump targetsget_function_labels- Get labels in functionget_function_variables- List all variables in a functionget_struct_layout- Get structure layoutget_valid_data_types- Get valid data type names
Search
find_similar_functions- Find similar functionssearch_byte_patterns- Search for byte patternssearch_data_types- Search data typessearch_functions- Search functions by namesearch_functions_enhanced- Advanced function searchsearch_strings- Search defined strings by a regex/substring pattern
Decompilation & Disassembly
decompile_function- Decompile functiondisassemble_bytes- Disassemble byte rangedisassemble_function- Disassemble functionforce_decompile- Force fresh decompilation
Function Tags, Variables & Attributes
add_function_tag- Attach one or more tags to a functionbatch_add_function_tags- Attach tags to many functions in one transactionbatch_remove_function_tags- Detach tags from many functions in one transactionclear_flow_and_repair- Run Ghidra's GUI 'Clear Flow and Repair' action on a seed range: clears instruction flow reachable from the seed, then repairs function bodies and re-disassembles retained flow (ClearFlowAndRepairCmd with clear_data=false, clear_labels=false, repair=true)create_function_tag- Create a program-wide function tag definition with an optional commentdelete_function_tag- Delete a program-wide function tag definitionget_function_tags- List all tags assigned to a specific functionlist_class_members- List the member functions of a C++ classlist_function_tags- List all program-wide function tag definitions with their use countsremove_function_tag- Detach one or more tags from a functionsearch_functions_by_tag- List all functions that have a specified tag attachedset_decompiler_variable_type- Set a decompiler (high-level) variable or parameter type by nameset_function_no_return- Set no-return attributeset_function_tag_comment- Update the comment/description on an existing program-wide function tagset_function_this_type- Set the decompiler/database type of the implicit 'this' pointer (ECX on x86 __thiscall/__fastcall)set_variables- Set types and names for multiple variables atomically
Cross-References
add_memory_reference- Create a user-defined cross-reference between two memory addresses that the auto-analyzer can't infer (runtime-populated pointer tables, vtables, late-bound function pointers, missed jump/switch tables)get_bulk_xrefs- Get xrefs for multiple addressesget_function_xrefs- Get function cross-referencesget_xrefs_from- Get references from addressget_xrefs_to- Get references to addressremove_reference- Remove memory cross-reference(s) from one address to another — the inverse of add_memory_reference
Data Types & Structures
add_struct_field- Add struct fieldanalyze_global_completeness- Score a global variable's documentation completeness on a budgeted 0-100 scale — the data-address analog of analyze_function_completenessapply_data_type- Apply data typeaudit_global- Audit a global variable's documentation stateaudit_globals_in_function- Audit every global variable referenced from within a function in one callbatch_set_variable_types- Set multiple variable typesclone_data_type- Clone data typecreate_array_type- Create array typecreate_data_type_category- Create data type categorycreate_enum- Create enumerationcreate_function_signature- Create function signature typecreate_pointer_type- Create pointer typecreate_struct- Create structurecreate_typedef- Create typedefcreate_union- Create uniondelete_data_type- Delete data typeembed_struct_field- Replace a structure field with an embedded struct type by value (e.gget_data_type_size- Get data type size in bytesget_type_size- Get data type size and infoimport_data_types- Import data types from GDTlist_data_type_categories- List data type categorieslist_data_types- List data typesmodify_struct_field- Modify struct fieldmodify_struct_field_type- Set a structure field's type by name or offset (offset:N)move_data_type_to_category- Move data type to categoryrecreate_struct- Replace a structure in one step: optionally remove an existing same-named type, then create with fields JSON (same shape as create_struct)remove_struct_field- Remove struct fieldrename_data_type- Rename a data type (struct, union, enum, typedef) in place, preserving existing applications of itresize_struct- Grow or shrink an existing structure by total byte sizeresolve_duplicate_type- Find duplicate data types by simple name; delete unused /Demangler size-1 stubs when a larger canonical type exi
No comments yet
Be the first to share your take.