radare2-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| RIZIN_PATH | No | Path to the Rizin executable. | rizin |
| ALLOWED_DIRS | No | Comma-separated directories from which binaries can be opened. Unrestricted if unset. | |
| R2_ANALYSIS_LEVEL | No | Analysis command run after opening a binary. | aaa |
| R2_COMMAND_TIMEOUT | No | Timeout in ms for individual r2 commands. | 30000 |
| RIZIN_COMMAND_TIMEOUT | No | Timeout in ms for individual Rizin commands. | 30000 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| analyze_binaryB | Open and analyze a binary file, returning architecture, platform, entry point, and binary metadata as JSON. |
| list_functionsA | List all functions identified by radare2 analysis with their names, addresses, sizes, and call conventions. |
| disassembleB | Disassemble instructions at the given address or function, returning assembly with opcodes and metadata. |
| decompile_functionA | Decompile a function to pseudo-C representation using the available decompiler backend. |
| list_stringsC | Extract printable strings from the binary with their addresses, sections, and lengths. |
| get_xrefsA | Get all cross-references to or from a specific address, identifying callers, callees, and data references. |
| list_importsA | List all imported functions and symbols with their addresses and library origins. |
| list_exportsB | List all exported functions and symbols with their addresses and types. |
| list_sectionsA | List all sections and segments in the binary with addresses, sizes, and permissions. |
| read_bytesB | Read raw bytes from a specific address in the binary, returned as hex string or formatted hexdump. |
| rename_functionA | Rename a function at the given address to a new user-defined name. |
| add_commentB | Add or update a comment at a specific address in the binary. |
| get_function_infoA | Get detailed metadata for a single function including cyclomatic complexity, stack frame, args, locals, and basic block count. |
| list_variablesB | List all local variables, stack variables, and arguments of a function. |
| write_bytesC | Patch bytes at a specific address in the binary using hex bytes or assembly instructions. |
| find_crypto_constantsA | Detect cryptographic constants (AES S-boxes, CRC tables, RSA constants, SHA magic numbers) in the binary. |
| list_resourcesA | List PE resources (icons, manifests, version info, embedded data) from the binary. |
| list_relocationsB | List all relocations in the binary with their addresses, types, and target symbols. |
| list_classesA | List classes and their methods from C++, Objective-C, Java, or Swift binaries. |
| triage_binaryA | Perform comprehensive one-shot binary triage: file info, sections, imports, exports, strings, functions, entry points, and security features in a single call. |
| analyze_function_deepA | Deep single-function analysis: disassembly, decompilation, variables, xrefs, callers, callees, strings, and complexity metrics in one call. |
| find_constraintsA | Extract comparisons, conditional branches, string references, and success/fail paths from a function — ideal for crackme and CTF challenge analysis. |
| trace_executionB | Trace execution using ESIL emulation, logging comparisons, branches, memory access, and register changes at each step. |
| find_vulnerabilitiesC | Scan a binary for common vulnerability patterns: dangerous API usage, buffer overflows, format strings, integer overflows, and missing bounds checks. |
| solve_crackmeA | Automatically attempt to solve a crackme by extracting constraints, identifying success/fail paths, and brute-forcing input character by character using ESIL emulation. |
| extract_iocsB | Extract Indicators of Compromise from a binary: IP addresses, URLs, domains, file paths, registry keys, email addresses, crypto wallets, and embedded payloads. |
| exploit_hunterB | Exploit development assistant: analyze security mitigations, find dangerous functions, collect ROP gadgets, map input sources, and suggest exploitation strategies. |
| diff_binariesA | Compare two binary versions: find added, removed, and changed functions, imports, strings, and show instruction-level diffs for modified functions. |
| file_format_analyzerA | Analyze binary file format structures: identify format via magic bytes, parse containers (RIFF/WebP, PNG, ZIP, JPEG, PDF), and show chunk hierarchy with offsets, sizes, and metadata. |
| esil_initA | Initialize the ESIL virtual machine with stack memory and return a persistent session_id for subsequent ESIL tool calls. The session preserves ESIL state (registers, memory, PC) across calls. |
| esil_destroyA | Destroy a persistent ESIL session and release its resources. Use this when you are done with an emulation session. |
| esil_list_sessionsA | List all active persistent ESIL sessions with their session IDs, binary paths, and creation times. |
| esil_stepB | Execute one or more instruction steps in the ESIL emulator and return the updated register state. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| esil_runA | Run ESIL emulation until a target address is reached, a breakpoint is hit, or maximum steps are exceeded. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| esil_get_registersA | Read all register values or a specific register from the ESIL virtual machine state. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| esil_set_registerA | Set a register value in the ESIL virtual machine. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| esil_get_memoryA | Read memory contents from the ESIL emulated memory space at a given address. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| esil_set_memoryA | Write data to the ESIL emulated memory space at a given address. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| esil_expressionB | Evaluate a raw ESIL expression string and return the result. If session_id is provided, uses a persistent session; otherwise creates a fresh session. |
| rzil_initA | Initialize the Rizin RzIL virtual machine and return a persistent session_id for subsequent RzIL tool calls. RzIL uses typed bitvectors (BAP Core Theory) for superior emulation fidelity compared to ESIL. |
| rzil_destroyA | Destroy a persistent RzIL session and release its resources. Use this when you are done with a Rizin emulation session. |
| rzil_list_sessionsA | List all active persistent RzIL emulation sessions with their session IDs, binary paths, and creation times. |
| rzil_stepA | Execute one or more instruction steps in the Rizin RzIL emulator and return VM change events and updated register state. Requires a persistent session from rzil_init. |
| rzil_runB | Run RzIL emulation until a target address is reached or maximum steps are exceeded. Uses aezsu for address targets. Requires a persistent session from rzil_init. |
| rzil_get_registersA | Read all register values or a specific register from the Rizin RzIL VM. Returns typed values including individual CPU flags (zf, cf, sf, etc.) as booleans — superior to ESIL which packs flags into a single register. |
| rzil_set_registerA | Set a register value in the Rizin RzIL virtual machine. Requires a persistent session from rzil_init. |
| rzil_get_memoryA | Read memory contents from the Rizin RzIL emulated memory space at a given address. Requires a persistent session from rzil_init. |
| rzil_set_memoryA | Write data to the Rizin RzIL emulated memory space at a given address. Requires a persistent session from rzil_init. |
| rzil_trace_stepA | Step the RzIL emulator and return detailed VM change events showing exactly which variables and memory locations were read or written. Uses aezse which outputs typed events like pc_write(old, new) and var_write(name, old, new). Superior to ESIL tracing because events are typed. |
| rzil_il_astA | Get the RzIL intermediate language AST for instructions at a given address. Each instruction is lifted to a typed RzIL expression tree with bitvector operations. This is unique to Rizin — r2 ESIL only has flat string expressions. |
| rz_typesA | List type definitions from the binary using Rizin separate typed JSON endpoints (tsj/tej/ttj/tuj). Returns structs, enums, typedefs, and unions with full member details. Superior to r2 which returns all types in a single flat list. |
| rz_symbolsB | List all symbols from the binary using Rizin. Returns enriched data including is_imported flag, library origin, flagname, and realname — more detail than r2 isj. |
| rz_libsA | List all linked libraries (DLLs/shared objects) from the binary using Rizin ilj. Returns a clean JSON array of library names. |
| rz_entrypointsA | List all entry points of the binary (program entry, TLS callbacks, etc.) using Rizin iej. Returns virtual address, physical address, and entry type. |
| rz_calling_conventionsA | List all calling conventions available for the binary architecture using Rizin afcl. Useful for understanding function signatures and ABI details. |
| shellcode_analyzeA | Analyze raw shellcode bytes by loading them as a memory blob, disassembling, and identifying syscalls and patterns. |
| disassemble_bytesA | Disassemble raw bytes into assembly instructions without loading a full binary. |
| search_bytesA | Search for a hex byte pattern across the binary and return all matching addresses. |
| search_stringC | Search for a string pattern in the binary and return all matching locations. |
| search_rop_gadgetsA | Search for ROP gadgets in the binary matching optional instruction constraints. |
| get_callgraphC | Get the call graph for a function showing all callers and callees as a structured graph. |
| get_control_flow_graphB | Get the control flow graph of a function as a JSON structure with basic blocks and edges. |
| r2_commandA | Execute a radare2 command directly and return the raw output. Only commands starting with these prefixes are allowed: a (analysis: aa, aaa, afl, af, ag, ax), p (print: pd, px, pf, pi), i (info: ij, iS, iE, ii, iz), s (seek), f (flags), / (search: /x, /R), e (eval/config), af (analysis functions), ag (analysis graphs), ax (analysis xrefs), CC (comments), dr (debug registers), om (open file map). Blocked characters: ; | > < ` ! ~ { } ( ) $ #!. |
| get_entropyB | Calculate entropy for the binary or specific sections to detect packed or encrypted regions. |
| debug_launchA | Launch a binary under the radare2 debugger and return a persistent session ID for subsequent debug commands. |
| debug_attachA | Attach the radare2 debugger to a running process by PID and return a persistent session ID. |
| debug_detachA | Detach from the debugged process, leaving it running, and close the debug session. |
| debug_set_breakpointC | Set a software breakpoint at the specified address in the debugged process. |
| debug_remove_breakpointA | Remove a breakpoint at the specified address or remove all breakpoints. |
| debug_list_breakpointsA | List all active breakpoints in the debug session with their addresses and status. |
| debug_continueA | Continue execution of the debugged process until a breakpoint is hit, an address is reached, or the process exits. |
| debug_stepA | Single-step the debugged process (step into or step over) and return the updated register state. |
| debug_get_registersA | Read all register values or a specific register from the debugged process. |
| debug_set_registerB | Set a register value in the debugged process. |
| debug_get_mapsA | List memory maps of the debugged process with addresses, sizes, and permissions. |
| debug_get_backtraceB | Get the call stack backtrace of the debugged process. |
| debug_get_threadsA | List all threads in the debugged process with their status. |
| debug_get_infoA | Get debug session information including PID, status, executable path, and command line. |
| debug_read_memoryA | Read memory from the debugged process at a specific address, returned as hex string or formatted hexdump. |
| debug_write_memoryC | Write memory in the debugged process at a specific address using hex bytes or a string. |
| debug_killA | Kill the debugged process and close the debug session. |
| debug_list_sessionsA | List all active debug sessions with their session IDs, targets, and PIDs. |
| analyze_typesA | List type definitions from binary analysis including structs, enums, and typedefs. |
| binary_headersB | Show PE/ELF/Mach-O headers with detailed field information. |
| hash_binaryA | Compute cryptographic hashes of the binary or a specific address range. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 85 tools
Many tools overlap in scope: analyze_types and rz_types both list type definitions, rz_symbols overlaps list_imports/list_exports, and the ESIL/RzIL families expose nearly identical operations. Descriptions help differentiate contexts, but the parallel emulation backends and broad composite tools like triage_binary and exploit_hunter create real selection ambiguity.
Most tools use snake_case and the debug_*, esil_*, and rzil_* families are internally consistent. However, the overall set mixes verb_noun patterns like analyze_binary and list_functions with noun_verb names like shellcode_analyze and file_format_analyzer, plus noun-only names like binary_headers, exploit_hunter, and r2_command.
85 tools is far beyond the 16-25 'heavy' range and well over the 50+ threshold for an extreme mismatch. The count is inflated by parallel ESIL/RzIL tool families, redundant symbol/type listings, and multiple one-shot composite analyzers that could be consolidated.
The server covers an exceptionally broad reverse-engineering workflow: loading/analysis, disassembly, decompilation, patching, searching, debugging, emulation, diffing, and vulnerability scanning. Minor gaps exist around lifecycle management, such as no explicit close/release of the analyzed binary, no save/export of patched output, and no comment removal, but agents can usually work around these.