loading…
Search for a command to run...
loading…
A native Model Context Protocol server for Ghidra. Includes GUI configuration and logging, 31 powerful tools and no external dependencies.
A native Model Context Protocol server for Ghidra. Includes GUI configuration and logging, 31 powerful tools and no external dependencies.
A powerful Ghidra extension that provides an MCP (Model Context Protocol) server, enabling AI assistants and other tools to interact with Ghidra's reverse engineering capabilities through a standardized API.
GhidrAssistMCP bridges the gap between AI-powered analysis tools and Ghidra's comprehensive reverse engineering platform. By implementing the Model Context Protocol, this extension allows external AI assistants, automated analysis tools, and custom scripts to seamlessly interact with Ghidra's analysis capabilities.
program_name parameterShameless self-promotion: GhidrAssist supports GhidrAssistMCP right out of the box.

Download the latest release:
.zip file (e.g., GhidrAssistMCP-v1.0.0.zip)Install the extension:
Enable the plugin:
Clone the repository:
git clone <repository-url>
cd GhidrAssistMCP
Point Gradle at your Ghidra install:
GHIDRA_INSTALL_DIR (environment variable), or pass -PGHIDRA_INSTALL_DIR=<path> when you run Gradle.Build + install:
Ensure Ghidra isn't running and run:
gradle installExtension
This copies the built ZIP into your Ghidra install ([GHIDRA_INSTALL_DIR]/Extensions/Ghidra) and extracts it into your Ghidra user Extensions folder (replacing any existing extracted copy).
If you need to override that location, pass -PGHIDRA_USER_EXTENSIONS_DIR=<path>.
Restart / verify:
Open the Control Panel:
Configure Server Settings:
localhost8080The Configuration tab allows you to:
GhidrAssistMCP provides 38 tools organized into categories. Several tools use an action-based API pattern where a single tool provides multiple related operations.
| Tool | Description |
|---|---|
get_binary_info |
Get basic program information (name, architecture, compiler, etc.) |
list_binaries |
List all open programs across all CodeBrowser windows |
assemble_code |
Assemble instruction text at an address and optionally patch it into program memory |
patch_bytes |
Patch raw bytes in program memory at a given address |
export_program |
Export the current program to disk (binary or original_file) (disabled by default) |
Security-sensitive tools:
import_fileandexport_programare disabled by default because they interact with the host filesystem. Enable them explicitly in the plugin configuration UI when needed.
| Tool | Description |
|---|---|
get_functions |
List functions with optional pattern filtering and pagination |
search_functions_by_name |
Find functions by name pattern |
get_function_statistics |
Comprehensive statistics for all functions |
analyze_function |
Get detailed function information (signature, variables, etc.) |
get_current_function |
Get function at current cursor position |
get_function_stack_layout |
Get stack frame layout with variable offsets |
get_basic_blocks |
Get basic block information for a function |
| Tool | Description |
|---|---|
get_imports |
List imported functions/symbols |
get_exports |
List exported functions/symbols |
get_strings |
List string references with optional filtering |
search_strings |
Search strings by pattern |
get_segments |
List memory segments |
get_namespaces |
List namespaces in the program |
get_relocations |
List relocation entries |
get_entry_points |
List all binary entry points |
| Tool | Description |
|---|---|
get_data_vars |
List data definitions in the program |
get_data_at |
Get hexdump/data at a specific address |
create_data_var |
Define data variables at addresses |
get_current_address |
Get current cursor address |
These tools bundle related operations behind a discriminator parameter (e.g., action, target, target_type, or format).
get_code - Code Retrieval Tool| Parameter | Values | Description |
|---|---|---|
format |
decompiler, disassembly, pcode |
Output format |
raw |
boolean | Only affects format: "pcode" (raw pcode ops vs grouped by basic blocks) |
classes - Class Operations Tool| Action | Description |
|---|---|
list |
List classes with optional pattern filtering and pagination |
get_info |
Get detailed class information (methods, fields, vtables, virtual functions) |
xrefs - Cross-Reference Tool| Parameter | Description |
|---|---|
address |
Find all references to/from a specific address |
function |
Find all cross-references for a function |
include_calls |
Include callers/callees (replaces separate call graph tool) |
struct - Structure Operations Tool| Action | Description |
|---|---|
create |
Create a new structure from C definition or empty |
modify |
Modify an existing structure with new C definition |
merge |
Merge (overlay) fields from a C definition onto an existing structure without deleting existing fields |
set_field |
Set/insert a single field at a specific offset without needing a full C struct (use field_name to name it) |
name_gap |
Convert undefined bytes at an offset/length into a named byte[]-like field (useful for “naming gaps”; uses field_name) |
auto_create |
Automatically create structure from variable usage patterns |
rename_field |
Rename a field within a structure |
field_xrefs |
Find cross-references to a specific struct field |
rename_symbol - Symbol Renaming Tool| Parameter | Values | Description |
|---|---|---|
target_type |
function, data, variable |
What kind of symbol to rename |
batch_rename - Batch Symbol Renaming ToolRename multiple symbols in one operation.
comments - Comment Management Tool| Action | Description |
|---|---|
get |
Get comment at an address |
set |
Set a comment at an address or on a function |
list |
List all comments |
remove |
Remove a comment |
variables - Variable Management Tool| Action | Description |
|---|---|
list |
List local variables for a function |
rename |
Rename a local variable or a global/data symbol using scope |
set_type |
Set data type for a local variable |
set_prototype |
Set function signature/prototype |
types - Type Management Tool| Action | Description |
|---|---|
list |
List all available data types |
get_info |
Get detailed data type information and structure definitions |
set |
Set data type at a specific address |
delete |
Delete a data type by name (optionally scoped by category) |
bookmarks - Bookmark Management Tool| Action | Description |
|---|---|
list |
List all bookmarks |
set |
Set a new bookmark |
remove |
Remove a bookmark |
| Tool | Description |
|---|---|
search_bytes |
Search for byte patterns in memory |
Long-running operations (decompilation, structure analysis, field xrefs) execute asynchronously:
| Tool | Description |
|---|---|
get_task_status |
Check status and retrieve results of async tasks |
cancel_task |
Cancel a running async task |
list_tasks |
List all pending/running/completed tasks |
GhidrAssistMCP exposes 6 static resources that can be read by MCP clients:
| Resource URI | Description |
|---|---|
ghidra://program/{name}/info |
Basic program information |
ghidra://program/{name}/functions |
List of all functions |
ghidra://program/{name}/strings |
String references |
ghidra://program/{name}/imports |
Imported symbols |
ghidra://program/{name}/exports |
Exported symbols |
ghidra://program/{name}/segments |
Memory segments |
Pre-built prompts for common analysis tasks:
| Prompt | Description |
|---|---|
analyze_function |
Comprehensive function analysis prompt |
identify_vulnerability |
Security vulnerability identification |
document_function |
Generate function documentation |
trace_data_flow |
Data flow analysis prompt |
trace_network_data |
Trace network send/recv call stacks for protocol analysis and network vulnerability identification |
compare_functions |
Diff two functions for similarity analysis |
reverse_engineer_struct |
Recover structure definitions from usage patterns |
{
"method": "tools/call",
"params": {
"name": "get_binary_info"
}
}
{
"method": "tools/call",
"params": {
"name": "get_functions",
"arguments": {
"pattern": "init",
"case_sensitive": false,
"limit": 50
}
}
}
get_code){
"method": "tools/call",
"params": {
"name": "get_code",
"arguments": {
"function": "main",
"format": "decompiler"
}
}
}
{
"method": "tools/call",
"params": {
"name": "classes",
"arguments": {
"action": "get_info",
"class_name": "MyClass"
}
}
}
{
"method": "tools/call",
"params": {
"name": "classes",
"arguments": {
"action": "list",
"pattern": "Socket",
"case_sensitive": false
}
}
}
{
"method": "tools/call",
"params": {
"name": "struct",
"arguments": {
"action": "auto_create",
"function_identifier": "0x00401000",
"variable_name": "ctx"
}
}
}
{
"method": "tools/call",
"params": {
"name": "struct",
"arguments": {
"action": "field_xrefs",
"structure_name": "Host",
"field_name": "port"
}
}
}
If multiple types share the same name across categories, pass category (or pass a full path in name starting with /).
{
"method": "tools/call",
"params": {
"name": "types",
"arguments": {
"action": "delete",
"name": "MyStruct",
"category": "/mytypes"
}
}
}
{
"method": "tools/call",
"params": {
"name": "rename_symbol",
"arguments": {
"action": "function",
"address": "0x00401000",
"new_name": "decrypt_buffer"
}
}
}
When working with multiple open programs, first list them:
{
"method": "tools/call",
"params": {
"name": "list_binaries"
}
}
Then specify which program to target using program_name:
{
"method": "tools/call",
"params": {
"name": "get_functions",
"arguments": {
"program_name": "target_binary.exe",
"limit": 10
}
}
}
GhidrAssistMCP uses a singleton architecture that enables seamless operation across multiple CodeBrowser windows:
Every tool response includes a context header:
[Context] Operating on: malware.exe | Active window: malware.exe
<tool response content>
or when targeting a different program:
[Context] Operating on: lib.so | Active window: main.exe | Total open programs: 3
<tool response content>
program_name is specified, tools automatically use the program from the active windowGhidrAssistMCP/
├── GhidrAssistMCPManager # Singleton coordinator for multi-window support
│ ├── Tracks all CodeBrowser windows
│ ├── Manages focus tracking
│ └── Owns shared server and backend
├── GhidrAssistMCPPlugin # Plugin instance (one per CodeBrowser window)
│ └── Registers with singleton manager
├── GhidrAssistMCPServer # HTTP MCP server (SSE + Streamable)
│ └── Single shared instance on port 8080
├── GhidrAssistMCPBackend # Tool management and execution
│ ├── Tool registry with enable/disable states
│ ├── Result caching system
│ ├── Async task management
│ └── Resource and prompt registries
├── GhidrAssistMCPProvider # UI component provider
│ └── First registered instance provides UI
├── cache/ # Caching infrastructure
│ ├── McpCache.java
│ └── CacheEntry.java
├── tasks/ # Async task management
│ ├── McpTaskManager.java
│ └── McpTask.java
├── resources/ # MCP Resources (6 total)
│ ├── ProgramInfoResource.java
│ ├── FunctionListResource.java
│ ├── StringsResource.java
│ ├── ImportsResource.java
│ ├── ExportsResource.java
│ └── SegmentsResource.java
├── prompts/ # MCP Prompts (7 total)
│ ├── AnalyzeFunctionPrompt.java
│ ├── IdentifyVulnerabilityPrompt.java
│ ├── DocumentFunctionPrompt.java
│ ├── TraceDataFlowPrompt.java
│ ├── TraceNetworkDataPrompt.java
│ ├── CompareFunctionsPrompt.java
│ └── ReverseEngineerStructPrompt.java
└── tools/ # MCP Tools (35 total)
├── Consolidated action-based tools
├── Analysis tools
├── Modification tools
└── Navigation tools
Consolidated Tools: Related operations are consolidated into single tools with a discriminator parameter:
get_code: format: decompiler|disassembly|pcodeclasses: action: list|get_infostruct: action: create|modify|merge|set_field|name_gap|auto_create|rename_field|field_xrefsrename_symbol: target_type: function|data|variablecomments: action: get|set|list|removevariables: action: list|rename|set_type|set_prototype with scope: auto|local|global for renametypes: action: list|get_info|set|deletebookmarks: action: list|set|removexrefs: address|function with include_calls parameterTool Interface Methods:
isReadOnly(): Indicates if tool modifies program stateisLongRunning(): Triggers async execution with task managementisCacheable(): Enables result caching for repeated queriesisDestructive(): Marks potentially dangerous operationsisIdempotent(): Indicates if repeated calls produce same resultGET /sse - SSE connection for bidirectional communicationPOST /message - Message exchange endpointGET /mcp - Receive Streamable HTTP eventsPOST /mcp - Initialize Streamable HTTP sessionDELETE /mcp - Terminate Streamable HTTP sessionsrc/main/java/ghidrassistmcp/
├── GhidrAssistMCPPlugin.java # Main plugin class
├── GhidrAssistMCPManager.java # Singleton coordinator
├── GhidrAssistMCPProvider.java # UI provider with tabs
├── GhidrAssistMCPServer.java # MCP server implementation
├── GhidrAssistMCPBackend.java # Backend tool/resource/prompt management
├── McpBackend.java # Backend interface
├── McpTool.java # Tool interface
├── McpEventListener.java # Event notification interface
├── cache/ # Caching system
├── tasks/ # Async task system
├── resources/ # MCP resources
├── prompts/ # MCP prompts
└── tools/ # Tool implementations
Implement McpTool interface:
public class MyCustomTool implements McpTool {
@Override
public String getName() { return "my_custom_tool"; }
@Override
public String getDescription() { return "Description"; }
@Override
public boolean isReadOnly() { return true; }
@Override
public boolean isLongRunning() { return false; }
@Override
public boolean isCacheable() { return true; }
@Override
public McpSchema.JsonSchema getInputSchema() { /* ... */ }
@Override
public McpSchema.CallToolResult execute(Map<String, Object> arguments, Program program) {
// Implementation
}
}
Register in backend:
// In GhidrAssistMCPBackend constructor
registerTool(new MyCustomTool());
# Clean build
gradle clean
# Build extension zip (written to dist/)
gradle buildExtension
# Install (extract) extension into the Ghidra user Extensions directory
gradle installExtension
# Uninstall (delete extracted directory from the Ghidra user Extensions directory)
gradle uninstallExtension
# Build/install with specific Ghidra path (required if GHIDRA_INSTALL_DIR isn't set)
gradle -PGHIDRA_INSTALL_DIR=/path/to/ghidra installExtension
# Debug build
gradle buildExtension --debug
io.modelcontextprotocol.sdk:mcp:0.17.111.0.20 (HTTP/SSE transport)2.18.3 (JSON processing)The Log tab provides real-time monitoring:
REQ: tool_name {parameters...}RES: tool_name {response...}Detailed logging in Ghidra's console:
curl http://localhost:8080/sseget_task_status to check task statelist_tasks to see all taskscancel_task if a task is stuckEnable debug logging by adding to Ghidra startup:
-Dlog4j.logger.ghidrassistmcp=DEBUG
git checkout -b feature-nameThis project is licensed under the MIT License - see the LICENSE file for details.
Questions or Issues?
Please open an issue on the project repository for bug reports, feature requests, or questions about usage and development.
Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"jtang613-ghidrassistmcp": {
"command": "npx",
"args": []
}
}
}