# Add to your Claude Code skills
git clone https://github.com/blacktop/ida-mcp-rsGuides for using mcp servers skills like ida-mcp-rs.
Last scanned: 5/19/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-05-19T07:45:33.800Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
macOS / Linux (via Homebrew)
brew install blacktop/tap/ida-mcp # Latest (IDA 9.3/9.3sp1)
brew install blacktop/tap/ida-mcp@9.2 # IDA 9.2
Windows (via Scoop)
scoop bucket add blacktop https://github.com/blacktop/scoop-bucket
scoop install blacktop/ida-mcp
Windows note: See the Windows platform setup section below for DLL discovery options.
macOS / Linux (via Nix)
nix shell github:blacktop/nur#ida-mcp \
--extra-experimental-features 'nix-command flakes'
Linux (via Snap)
sudo snap install ida-mcp
sudo snap connect ida-mcp:dot-idapro # grant access to ~/.idapro (license)
Strict confinement. Requires IDA Pro installed under
$HOME(installer default~/ida-pro-9.3). For IDA in/opt/or system paths, use Homebrew or Nix.
Direct download — grab the archive for your platform from GitHub Releases.
Build from source
See docs/BUILDING.md.
ida-mcp versions mirror IDA Pro versions (
v9.3.xfor IDA 9.3,v9.2.xfor IDA 9.2). A version mismatch is detected at startup with a clear error message. Scoop and NUR publish the latest version. For older IDA versions, use the matching GitHub Release or the versioned Homebrew cask.
Standard IDA installations in /Applications work automatically:
claude mcp add ida -- ida-mcp
If you see Library not loaded: @rpath/libida.dylib, set DYLD_LIBRARY_PATH to your IDA path:
claude mcp add ida -e DYLD_LIBRARY_PATH='/path/to/IDA.app/Contents/MacOS' -- ida-mcp
Supported paths (auto-detected):
/Applications/IDA Professional 9.3.app/Contents/MacOS/Applications/IDA Home 9.3.app/Contents/MacOS/Applications/IDA Essential 9.3.app/Contents/MacOS/Applications/IDA Professional 9.2.app/Contents/MacOSThe IDA installer defaults to ~/ida-pro-9.3 — the launcher script auto-detects this:
claude mcp add ida -- ida-mcp
For non-default install locations, set IDADIR:
claude mcp add ida -e IDADIR='/path/to/ida' -- ida-mcp
Resolution order: $IDADIR → ~/ida-pro-9.3 → /opt/ida-pro-9.3 and other RUNPATH fallbacks.
Option A — Install ida-mcp.exe into your IDA directory (simplest, no env setup needed):
# Copy the binary next to ida.dll / idalib.dll
copy ida-mcp.exe "C:\Program Files\IDA Professional 9.3\"
claude mcp add ida -- "C:\Program Files\IDA Professional 9.3\ida-mcp.exe"
Option B — Install via Scoop (auto-detects IDA and sets IDADIR):
scoop bucket add blacktop https://github.com/blacktop/scoop-bucket
scoop install blacktop/ida-mcp
claude mcp add ida -- ida-mcp
Option C — Set IDADIR manually:
# Persistent (survives reboots)
setx IDADIR "C:\Program Files\IDA Professional 9.3"
# Then restart your terminal
claude mcp add ida -- ida-mcp
Windows requires ida.dll and idalib.dll to be discoverable at startup. Placing ida-mcp.exe in the IDA directory is the easiest approach. Otherwise, the IDA directory must be on PATH or pointed to by IDADIR.
Common IDA paths:
C:\Program Files\IDA Professional 9.3C:\Program Files\IDA Pro 9.3C:\Program Files\IDA Home 9.3The binary links against IDA's libraries at runtime. Standard installation paths are auto-detected via baked RPATHs. For non-standard paths:
| Platform | Library | Fallback Configuration |
|----------|---------|------------------------|
| macOS | libida.dylib | DYLD_LIBRARY_PATH |
| Linux | libida.so | IDADIR (launcher reads it) or LD_LIBRARY_PATH |
| Windows | ida.dll | Place exe in IDA dir, set IDADIR, or add IDA dir to PATH |
claude mcp add ida -- ida-mcp
codex mcp add ida -- ida-mcp
gemini mcp add ida -- ida-mcp
Add to .cursor/mcp.json:
{
"mcpServers": {
"ida": { "command": "ida-mcp" }
}
}
Once configured, you can analyze binaries through your AI agent:
# Open a binary (returns quickly — analysis runs separately)
open_idb(path: "~/samples/malware")
# These work immediately, no analysis needed
list_functions(limit: 20)
disasm_by_name(name: "main", count: 20)
strings(limit: 10)
# For xrefs/decompile on large binaries, run analysis in background
analyze_funcs(background: true) # returns task_id
task_status(task_id: "analyze-1") # poll progress
# Decompile (requires Hex-Rays + completed analysis)
decompile(address: "0x100000f00")
# Discover more tools
tool_catalog(query: "find callers")
serve-http keeps the existing single in-process IDA worker by default. For
stateful multi-client HTTP/SSE usage, set --max-workers above 1 to route
sessions through child ida-mcp worker processes:
ida-mcp serve-http --bind 127.0.0.1:8765 --max-workers 4 --min-workers 1
Without --max-workers N, HTTP sessions still share one IDA context; a second
client opening another binary waits behind the first and then gets the normal
A database is already open error. Pooled startup logs include
Starting pooled HTTP router and MCP pooled HTTP server listening.
Each opened HTTP session leases one child worker until close_idb, HTTP
DELETE, session timeout, or server shutdown. close_idb releases the lease
immediately, but the child process may stay alive idle for reuse until
--worker-idle-timeout-secs elapses. If all workers are leased, new
open_idb/open_dsc calls fail with Worker pool exhausted so clients can
retry later. Pooled mode requires stateful HTTP sessions; --max-workers > 1
is rejected with --stateless.
If an SSE-capable client exits without sending close_idb or HTTP DELETE,
pooled mode closes the session after its standalone SSE stream disconnects and
the --worker-disconnect-grace-secs reconnect grace elapses.
POST-only clients do not always leave a stream for the server to observe, so
their orphaned sessions are reclaimed by --session-keep-alive-secs (default
1800 seconds). Lower it if you need faster pool reclaim for POST-only clients.
dyld_shared_cache analysisopen_dsc opens a single module from Apple's dyld_shared_cache. On first use it runs idat in the background to create the .i64 (this can take minutes). Subsequent opens are instant.
# Open a module from the DSC
open_dsc(path: "/path/to/dyld_shared_cache_arm64e", arch: "arm64e",
module: "/usr/lib/libobjc.A.dylib")
# If a background task was started, poll until done
task_status(task_id: "dsc-1")
# Load additional frameworks for cross-module references
open_dsc(path: "/path/to/dyld_shared_cache_arm64e", arch: "arm64e",
module: "/usr/lib/libobjc.A.dylib",
frameworks: ["/System/Library/Frameworks/Foundation.framework/Foundation"])
# Incrementally load another DSC dylib into an already-open database
dsc_add_dylib(module: "/usr/lib/libSystem.B.dylib")
# Incrementally load a DSC data/GOT/stub region by address
dsc_add_region(address: "0x180116000")
# After dsc_add_dylib/dsc_add_region, confirm analysis readiness
analysis_status()
Requirements:
idat binary (from IDA installation) must be available via $IDADIR or standard install pathsdscu plugin (bundled with IDA 9.x)run_script executes Python code in the open database via IDA's IDAPython engine. stdout and stderr are captured.
# Inline script
run_script(code: "import idautils\nfor f in idautils.Functions():\n print(hex(f))")
# Run a .py file from disk
run_script(file: "/path/to/analysis_script.py")
# With timeout (default 120s, max 600s)
run_script(code: "import ida_bytes; print(ida_bytes.get_bytes(0x1000, 16).hex())",
timeout_secs: 30)
All ida_* modules, idc, and idautils are available. See the IDAPython API reference.
ida-mcp exposes 71 tools (~10k tokens of tools/list payload). Frontier models with 1M context don't notice; smaller models and agents without lazy tool loading do. Filter the surface to only what you need:
| Flag | Env var | Effect |
|---|---|---|
| --toolsets=cat1,cat2 | IDA_MCP_TOOLSETS | Replaces "all tools" with the union of selected categories |
| `--tools=