
ReVa MCP Server: Ghidra Reverse Engineering with Claude, Cursor and Other Apps
Lets your assistant decompile, trace and annotate programs in Ghidra, alongside you or on its own.
ReVa lets Claude, Cursor and other assistants work inside Ghidra for you: decompile functions, follow references, rename and retype things, add comments and compare two versions of a program. It runs on your own computer, either next to your open Ghidra window or without one. It can run Python scripts and edit your Ghidra project, so treat it like giving the assistant a keyboard.
Good for
- Malware analysts who want help triaging unknown binaries
- Security researchers auditing closed-source software and firmware
- CTF players and students learning to read compiled code
- Teams comparing two builds of a program to see what changed
Works in
12 should work
Tap an app to see how to set it up and any known problems.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Supports local MCP servers.
Client does not support this transport.
Client does not support this transport.
Install ReVa MCP
Claude Code
- 1
Copy this prompt.
Add the ReVa MCP server to Claude Code. Run this command: claude mcp add --scope user --transport http ReVa -- http://localhost:8080/mcp/message Then check that it loaded and tell me if I need to sign in or restart.
- 2
Paste it into Claude Code. It shows the change and asks before running it.
Requires Ghidra 12.0 or newer, ReVa extension installed and both plugins enabled, Ghidra open with a project.
Read-only mode: There is no read-only mode. Turn tool groups off in Ghidra's ReVa Tool Groups options, or add --disable-tool-group scripting to the mcp-reva command.
Pick Assistant mode to work next to a Ghidra window: install the extension zip that matches your Ghidra version from the releases page, enable "ReVa Application Plugin" in the Project view and "ReVa Plugin" in the Code Browser, then keep Ghidra open with a project. Pick Headless mode for automation: set GHIDRA_INSTALL_DIR, install the Python launcher, and your app starts Ghidra for you. The launcher imports reva.headless, a class from the ReVa Ghidra extension, so install the extension in Ghidra first. Requires Python 3.10 or newer for the launcher. Connect only what you need: there is no read-only mode.
From the project README. Source.
Tools
Shows a function as C-like code, a few lines at a time
Decompiles one function with Ghidra and returns a slice of its lines, 50 by default, so a large function does not flood the chat. It can add the lists of callers and callees in the same answer.
Try: “Decompile the function at 0x401000 and explain what it does.”
Read ·
get-decompilationSearches every function's code for a pattern
Looks through the decompiled code of the whole program for a pattern and returns function names and line numbers. Calls and data references are better found with the cross-reference tool.
Try: “Find functions whose decompiled code contains "strcpy".”
Read ·
search-decompilationShows the code of every function that calls one
Decompiles all callers of a target function in one go, with the call sites highlighted if you ask. It shows how a function is used across the program.
Try: “Show me how everything that calls decrypt_buffer uses it.”
Read ·
get-callers-decompiledShows the code of every function that touches an address
Decompiles all functions that reference an address or symbol, code and data references included. Good for following a global variable.
Try: “Decompile everything that references the global g_config.”
Read ·
get-referencers-decompiledLists functions in the program
Returns functions a page at a time. Count them first with get-function-count to plan the paging.
Try: “List the first 100 functions in this program.”
Read ·
get-functionsCounts the functions in the program
Returns the total number of functions so the assistant can plan how many pages to read.
Try: “How many functions does this program have?”
Read ·
get-function-countFinds functions with names like a given one
Lists functions ordered by how close their names are to the one you give, a page at a time.
Try: “Find functions with names similar to parse_header.”
Read ·
get-functions-by-similarityLists symbols in the program
Returns symbols such as functions, labels and data names a page at a time.
Try: “List the symbols in this program.”
Read ·
get-symbolsCounts the symbols in the program
Returns the total number of symbols, to plan paging through get-symbols.
Try: “How many symbols are there?”
Read ·
get-symbols-countLists text strings, with search and regex
Returns strings a page at a time. You can filter with a regular expression or sort by closeness to a search string.
Try: “Show strings that look like URLs.”
Read ·
get-stringsCounts the strings in the program
Returns the total number of strings so the assistant knows how many pages to read.
Try: “How many strings does this binary contain?”
Read ·
get-strings-countShows what points to or from a location
Finds references to or from an address, symbol or function, in one or both directions, with optional decompiled context around each.
Try: “Show everything that references the function at 0x401000.”
Read ·
find-cross-referencesLists the outside functions the program uses
Returns the imported functions from external libraries, which shows at a glance what APIs a binary relies on.
Try: “List the imports and highlight any network or crypto APIs.”
Read ·
list-importsLists what the program offers to others
Returns the exported functions and data a binary makes available to other modules.
Try: “List everything this library exports.”
Read ·
list-exportsFinds where an imported function is called
Finds every place a named import is called, including calls that go through thunk stubs.
Try: “Where is CreateProcessA called?”
Read ·
find-import-referencesFollows a wrapper to the real function
Follows a chain of thunk functions, which just jump elsewhere, to the function that does the work.
Try: “Resolve the thunk at 0x401020 to its real target.”
Read ·
resolve-thunkLists the program's memory sections
Returns the memory blocks with their addresses, sizes and permissions.
Try: “Show the memory blocks and which ones are executable.”
Read ·
get-memory-blocksReads bytes at an address
Reads memory from the loaded program at an address and returns the bytes.
Try: “Read 64 bytes at 0x404000.”
Read ·
read-memoryShows the data defined at an address
Returns the data item at an address or symbol, with its type and value.
Try: “What data is defined at 0x404010?”
Read ·
get-dataFinds where a number is used in code
Finds instructions that use a specific constant as an immediate value. Useful for magic numbers, error codes and buffer sizes.
Try: “Find where the constant 0x1337 is used.”
Read ·
find-constant-usesFinds numbers within a range used in code
Finds constants between two values used in instructions, such as 400 to 599 for HTTP errors.
Try: “Find constants between 400 and 599 in the code.”
Read ·
find-constants-in-rangeLists the most used numbers in code
Returns the most frequent constants in the program, skipping tiny values from 0 to 255 by default as noise.
Try: “Which constants are used most often?”
Read ·
list-common-constantsShows callers and callees around a function
Builds the call graph around a function, both who calls it and what it calls, down to a depth you pick.
Try: “Show the call graph around main, two levels deep.”
Read ·
get-call-graphShows a call tree up or down from a function
Returns a tree of callers or callees from a function and marks loops it finds.
Try: “Show the call tree below handle_request.”
Read ·
get-call-treeFinds functions that call all of several others
Finds functions that call every function in a list. These are often dispatch points or main loops.
Try: “Find functions that call both init_crypto and send_packet.”
Read ·
find-common-callersTraces where a value came from
Follows the data dependency chain backward from an address to find its origins, such as constants, parameters or memory loads.
Try: “Trace where the value passed to send at 0x401200 comes from.”
Read ·
trace-data-flow-backwardTraces where a value goes
Follows a value forward to its uses, such as stores, function calls and returns.
Try: “Trace where the return value at 0x401100 is used.”
Read ·
trace-data-flow-forwardFinds reads and writes of a variable
Lists every read and write of a variable inside a function.
Try: “Show every place the variable local_20 is used in main.”
Read ·
find-variable-accessesReads a C++ virtual function table
Reads the table of function pointers at an address and lists each slot with its index and offset. It helps with C++ class layouts.
Try: “Analyze the vtable at 0x405000.”
Read ·
analyze-vtableFinds which vtables hold a function
Finds the tables that contain a pointer to a function, with the slot positions.
Try: “Which vtables contain the function at 0x401500?”
Read ·
find-vtables-containing-functionFinds indirect calls through a vtable slot
Finds indirect calls that could reach a function through its vtable slot. The offset matching is tuned for x86 and x64 instructions.
Try: “Find callers of the virtual method at 0x401500.”
Read ·
find-vtable-callersShows one structure's layout
Returns a structure or union with its members and a C version of its layout.
Try: “Show the layout of the structure Session.”
Read ·
get-structure-infoLists structures and unions
Lists the structures and unions in the program, with optional filtering and paging.
Try: “List all structures whose name contains "Header".”
Read ·
list-structuresChecks a C structure definition
Checks a C-style structure definition for errors without creating anything.
Try: “Check whether this struct definition parses.”
Read ·
validate-c-structureLists data type libraries
Returns the data type archives available for a program.
Try: “Which data type archives are available?”
Read ·
get-data-type-archivesLists types from a data type library
Returns the data types in one archive.
Try: “List the types in the generic_clib archive.”
Read ·
get-data-typesLooks up a type by its name
Finds a data type from its string form, such as "char *".
Try: “Look up the type "unsigned long long".”
Read ·
get-data-type-by-stringFinds code Ghidra missed as functions
Finds addresses in executable memory with valid instructions that are referenced but not defined as functions, through calls or data pointers.
Try: “Find code that looks like functions but is not defined as one.”
Read ·
get-undefined-function-candidatesReads comments at an address or range
Returns comments set at an address or across an address range.
Try: “Show the comments between 0x401000 and 0x401200.”
Read ·
get-commentsSearches comments for text
Finds comments that contain the text you give.
Try: “Search the comments for "TODO".”
Read ·
search-commentsReads bookmarks at an address or range
Returns bookmarks at an address or within an address range.
Try: “Show my bookmarks in this program.”
Read ·
get-bookmarksSearches bookmarks
Finds bookmarks by text, type, category or address range.
Try: “Search bookmarks in the category "crypto".”
Read ·
search-bookmarksLists bookmark categories
Returns the categories used for a bookmark type.
Try: “Which bookmark categories exist?”
Read ·
list-bookmark-categoriesShows which program is open in Ghidra
Returns the program currently active in the Ghidra window. It only exists when Ghidra is running with its window, not in headless mode.
Try: “Which program am I looking at in Ghidra?”
Read ·
get-current-programLists every program open in Ghidra
Returns all programs open across Ghidra tools. It only exists when Ghidra is running with its window, not in headless mode.
Try: “Which programs are open right now?”
Read ·
list-open-programsLists files and folders in the Ghidra project
Returns the files and folders in the current project so the assistant can pick a program to work on.
Try: “List the files in this Ghidra project.”
Read ·
list-project-filesLists Ghidra's automatic analyzers
Returns the analyzers that apply to a program with their descriptions and whether they are on. The names feed the analysis tool.
Try: “Which analyzers are available for this program?”
Read ·
list-analyzersChecks on a running analysis job
Reports progress of a background analysis job, with new log lines and the live function count.
Try: “How is the analysis going?”
Read ·
analysis-statusSummarizes what changed between two programs
Returns counts and a ranked list of the most changed matching functions between two programs. It is the starting point for comparing two versions.
Try: “Summarize what changed between version 1 and version 2.”
Read ·
diff-summaryLists changed, added or removed functions
Lists function differences for one category (changed, added, removed or identical), a page at a time, with size changes and callee changes.
Try: “List the functions removed in the new version.”
Read ·
diff-list-functionsCompares one function side by side
Shows decompiled differences for a matched pair of functions with changed lines, similarity and both signatures.
Try: “Show how parse_header changed between the two versions.”
Read ·
diff-functionShows strings added or removed
Lists strings that were added or removed between the two programs, a useful hint for updates or protocol changes.
Try: “Which strings differ between the two builds?”
Read ·
diff-stringsShows data added or removed
Lists defined data added or removed between source and destination.
Try: “What data differs between the two programs?”
Read ·
diff-dataChecks on a running comparison job
Polls a background comparison or markup job and returns new log lines and, when done, the result.
Try: “Is the comparison finished?”
Read ·
diff-statusLists saved comparison sessions
Lists stored comparison sessions, each with its two programs and the matching methods run so far.
Try: “Which comparisons have I already run?”
Read ·
diff-list-sessionsAdds or updates a comment at an address
Writes a comment of a chosen type (pre, end-of-line, post, plate or repeatable) at an address, as notes for you and the assistant.
Try: “Add a comment at 0x401000 saying this is the entry of the license check.”
Write ·
set-commentRenames variables in decompiled code
Renames variables inside a decompiled function so the code reads better.
Try: “Rename the variables in parse_header to something meaningful.”
Write ·
rename-variablesChanges the types of variables in decompiled code
Sets new data types for variables in a decompiled function.
Try: “Change the type of local_20 in parse_header to unsigned int.”
Write ·
change-variable-datatypesAdds a comment to a line of decompiled code
Puts a comment on a given line of decompiled code, stored at the matching address.
Try: “Comment line 14 of parse_header: validates the magic number.”
Write ·
set-decompilation-commentSets a function's signature
Sets or updates a function's signature from a C-style declaration. It can also create a function that does not exist yet.
Try: “Set the prototype of 0x401000 to int parse_header(char *buf, int len).”
Write ·
set-function-prototypeDefines a function at an address
Creates a function at an address and lets Ghidra work out its body, parameters and return type.
Try: “Create a function at 0x401800.”
Write ·
create-functionManages function tags
Gets, sets, adds, removes or lists tags that group functions. Setting or removing replaces tags that were there.
Try: “Tag the functions that handle networking as "network".”
Delete ·
function-tagsGives data a type at an address
Applies a data type to an address or symbol.
Try: “Apply the type Session to the data at 0x404010.”
Write ·
apply-data-typeNames an address
Creates a label at an address.
Try: “Create a label called config_table at 0x404010.”
Write ·
create-labelCreates or replaces a structure from C
Parses a C-style definition and creates the structure. If one with that name exists it is replaced and its fields rebuilt.
Try: “Create this struct from its C definition.”
Write ·
parse-c-structureLays a structure over data
Applies a structure to the data at an address.
Try: “Apply the structure Session at 0x404010.”
Write ·
apply-structureImports all structures from a C header file
Reads an entire C header file from your computer and creates every structure in it.
Try: “Parse the header ~/work/protocol.h and import its structures.”
Write ·
parse-c-headerDeletes a structure
Removes a structure from the program after checking for uses in signatures, variables and memory. Forcing it deletes despite those uses.
Try: “Delete the unused structure TestStruct.”
Delete ·
delete-structureAdds or updates a bookmark
Sets a bookmark at an address to mark an important place.
Try: “Bookmark 0x401000 as "license check".”
Write ·
set-bookmarkRemoves a bookmark
Deletes a specific bookmark.
Try: “Remove the bookmark at 0x401000.”
Delete ·
remove-bookmarkRemoves a comment
Deletes a specific comment at an address.
Try: “Remove the comment at 0x401000.”
Delete ·
remove-commentImports files or folders into the project
Imports a file, directory or archive from your computer into the Ghidra project. It does not analyze by default, and it can do so if told.
Try: “Import /bin/ls into the project and analyze it.”
Write ·
import-fileRuns Ghidra's automatic analysis
Starts analysis as a background job and saves the result. Small programs finish inside the wait time, and larger ones return a job id to poll.
Try: “Analyze the imported program.”
Write ·
analyze-programStops a running analysis
Asks a running analysis job to stop. The work done so far is still saved.
Try: “Cancel the analysis.”
Write ·
analysis-cancelChanges the program's processor type
Changes the processor architecture of an existing program.
Try: “Change the processor of this program to ARM:LE:32:v8.”
Write ·
change-processorCommits a program to version control
Checks a program in to version control with a commit message.
Try: “Check in the program with the message "renamed crypto functions".”
Write ·
checkin-programWrites a debug bundle to disk
Creates a zip file with system information, Ghidra and ReVa settings, server status, open programs and logs, and returns its path. Check what it contains before sharing it.
Try: “Capture debug info so I can report an issue.”
Write ·
capture-reva-debug-infoStarts a comparison of two programs
Matches two analyzed programs using Ghidra's Version Tracking and keeps the result as a saved session. Big programs run as a background job.
Try: “Compare program A with program B.”
Write ·
diff-create-sessionRefines a comparison with another matching method
Runs one more matching method over what is still unmatched in an existing session, to find more matches.
Try: “Run another matching pass over the unmatched functions.”
Write ·
diff-add-correlatorCopies names and comments from one program to another
Applies names, prototypes, types and comments from the source to the destination for matches above a confidence floor. Weaker matches come back as proposals to review.
Try: “Copy names and comments from the old build to the new one.”
Write ·
diff-transfer-markupCopies markup for one matched function
Applies names, types and comments for exactly one matched function pair to the destination program.
Try: “Apply the markup for this one matched function.”
Write ·
diff-apply-matchStops a running comparison job
Asks a running comparison or markup job to stop. A cancelled markup transfer is rolled back.
Try: “Cancel the comparison.”
Write ·
diff-cancelDeletes a saved comparison
Permanently deletes a saved comparison session. Nothing else removes sessions.
Try: “Delete the comparison between A and B.”
Delete ·
diff-delete-sessionLists Ghidra scripts
Lists Python scripts in Ghidra's script folders, with filtering and paging.
Try: “List my Ghidra scripts.”
Files ·
list-scriptsReads a script's source
Returns a script's source with line numbers, in chunks.
Try: “Show me the script FindCrypto.py.”
Files ·
read-scriptCreates or replaces a script file
Creates a script or fully replaces one in a writable script folder. System script folders are read-only.
Try: “Write a script that lists all functions larger than 1 KB.”
Write ·
write-scriptEdits part of a script file
Replaces exact text in an existing script. It errors if the text is missing or matches more than one place unless told to replace all.
Try: “Fix the typo in FindCrypto.py.”
Write ·
edit-scriptRuns Python inside Ghidra
Runs a Python script against a program in Ghidra's PyGhidra runtime and returns its output, duration and whether it timed out. A script can do anything Python can do on your computer, not just read the program. It needs Ghidra started through PyGhidra, as the mcp-reva command does.
Try: “Run a script that prints every function with more than 20 callers.”
Runs code ·
run-script
Read from the source code
Permissions
high risk · 5 things to watch
High risk
By default the assistant can run any Python on your computer through the script tool and change anything in your Ghidra project, and there is no read-only mode. Switch off the Scripting group unless you need it, and open unknown samples only on a machine you can afford to lose.
What it can do
- Read your data
- Create and change things
- Delete things
- Read-only mode
Watch out for
The script tool runs any Python on your machine
run-script is on by default and the README says scripting tools are allowed in the default setup. Turn the Scripting group off if you do not need it, because write-script and edit-script also change script files that Ghidra can run. github.com
It can change and delete things in your project
Tools rename variables, retype data, create or replace structures, import files, change a program's processor and check programs in. Others delete comments, bookmarks, structures, function tags and saved comparisons. Back up the project first. github.com
The Ghidra port has no sign-in by default
In assistant mode the server listens on 127.0.0.1 port 8080 with the API key off, so any program on your computer can call its tools. If you let it listen on a public address, turn on the API key or disable scripting, as the README says. github.com
Opening hostile files has risks of its own
Our advice: analyze malware only in a virtual machine or another isolated system, and keep your Ghidra project there. github.com
It reads and writes files you point it at
import-file and parse-c-header read paths on your computer, and the debug tool writes a zip of logs and settings. Check that zip before you share it. github.com
Security advisories
No published security advisories as of Nov 1, 2026.
Technical details
| Turning on read-only | There is no read-only mode. You can turn tool groups off in Ghidra's "ReVa Tool Groups" options, or pass --disable-tool-group (for example scripting) to mcp-reva, but rename, retype, import and check-in tools stay in the Core Analysis group. |
|---|---|
| Talks to | None by default: the server listens on 127.0.0.1 port 8080. Whatever a script you let the assistant run connects to |
| Sign-in and keys | No account. An optional API key, sent in the X-API-Key header, is off by default. The mcp-reva command generates a random key for its private connection to Ghidra. |
| Data retention | Your edits are saved in the Ghidra project. In headless mode the project is temporary and removed at the end of the session. |
Questions
Is ReVa official?
No. It is a community project by cyberkaida and is not made by the Ghidra project. You install Ghidra yourself and ReVa adds to it.
Which Ghidra version does it need?
Ghidra 12.0 or newer. Each release ships one extension zip per Ghidra version, so download the one that matches yours.
What is the ReVa MCP server URL?
In assistant mode it is http://localhost:8080/mcp/message while Ghidra is open. You can change the port in the Ghidra settings from the project view.
What is the difference between assistant mode and headless mode?
Assistant mode connects your app to a Ghidra window you already have open, so you and the assistant work on the same project. Headless mode starts Ghidra for you with no window and uses a temporary project, which suits automation. Two tools that read the open window do not exist in headless mode.
Can ReVa run read-only?
No. You can switch tool groups off, but the Core Analysis group still holds tools that rename, retype, import and check in. Work on a copy of the project if you want to protect the original.
Can ReVa delete things?
Yes. It can remove comments, bookmarks, function tags, structures and saved comparisons from your project. A script can do far more, so switch off the Scripting group if you do not need it.
Does my binary leave my computer?
ReVa itself runs locally. The decompiled code and strings it returns go to whichever AI assistant you connect, so use a model your organization approves for sensitive samples.
Is ReVa free?
Yes. It is Apache 2.0 licensed and needs no account or API key. The AI assistant you connect may have its own cost.
How do I add ReVa to Claude?
Claude Code is the recommended client. Install the extension in Ghidra, then use the Claude Code tab in the install box. The repo also offers a Claude Code marketplace with ReVa skills for triage, deep analysis and crypto analysis.
Information
updated Nov 3, 2026
- Publisher
- Community
- Package
reverse-engineering-assistant- Registry
- PyPI
- Transport
- Streamable HTTP, stdio
- Auth
- None
- Version
- 7.3.1
- License
- Apache-2.0
- Last commit
- Oct 27, 2026
- Open issues
- 15
Sources
Docs, issue trackers and discussions this page is built from. Issues, quotes and findings above link to their own source.
Show all 8Hide
- ReVa README (v7.3.1) · github.com
- ReVa mcp-reva CLI (v7.3.1) · github.com
- ReVa launcher source (imports reva.headless) · github.com
- ReVa McpServerManager.java (v7.3.1) · github.com
- ReVa ProjectToolProvider.java (v7.3.1) · github.com
- ReVa ScriptToolProvider.java (v7.3.1) · github.com
- ReVa ConfigManager.java (v7.3.1) · github.com
- ReVa ApiKeyAuthFilter.java (v7.3.1) · github.com