ida-pro-mcp-enhancement
CLAUDE.md554 starsChanged 8 months agoMITView on GitHub
Guidance for working in this repository. IDA Pro MCP Server: exposes IDA Pro / idalib functionality to MCP clients. Main pieces: - src/idapromcp/server.py: MCP server entrypoint - src/idapromcp/idalibserver.py: headless idalib server - src/idapromcp/idamcp/: IDA/plugin-side APIs Important API modules: - apicore.py: IDB metadata, functions, strings, imports - apianalysis.py: decompilation, disassembly, xrefs, paths, pattern search - apimemory.py: bytes/ints/strings, patching - apitypes.py: structs, type inference, type application - apimodify.py: comments, renaming, asm patching - apistack.py: stack frame operations - apisigmaker.py: signature creation, scanning,…
We split this CLAUDE.md into the rules it gives an agent
9 rules. About 0 are common, 6 are distinctive, and 3 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈6
Distinctive · estimate
This author's own choices. Worth a look.
3
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 29
All IDA SDK calls must run on the main thread.
- Very specific: line 44
Use full type hints and Annotated[...] descriptions.
- Very specific: line 56
Use shared pagination / filtering helpers from utils.py
- Distinctive: line 96
Use the headless test runner:
- Distinctive: line 123
Prefer semantic assertions, not weak "field exists" checks
- Distinctive: line 124
Prefer round-trip tests for mutating APIs
- Distinctive: line 125
If tests expose clearly wrong API behavior, fix the API instead of weakening the test
- Distinctive: line 130
When adding generic tests, also try a non-fixture binary to avoid ELF-specific assumptions:
- Very specific: line 158
If IDA uses the wrong Python, use idapyswitch
≈ “Common” is an estimate: at least 1 in 5 of the 25,680 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
CLAUDE.md
Guidance for working in this repository.
What this project is
IDA Pro MCP Server: exposes IDA Pro / idalib functionality to MCP clients.
Main pieces:
src/ida_pro_mcp/server.py: MCP server entrypointsrc/ida_pro_mcp/idalib_server.py: headless idalib serversrc/ida_pro_mcp/ida_mcp/: IDA/plugin-side APIs
Important API modules:
api_core.py: IDB metadata, functions, strings, importsapi_analysis.py: decompilation, disassembly, xrefs, paths, pattern searchapi_memory.py: bytes/ints/strings, patchingapi_types.py: structs, type inference, type applicationapi_modify.py: comments, renaming, asm patchingapi_stack.py: stack frame operationsapi_sigmaker.py: signature creation, scanning, xref signatures (uses sigmaker.py)api_debug.py: debugger control, unsafe / low priority for testsapi_python.py: execute Python in IDA contextapi_resources.py:ida://MCP resources
Core implementation rules
IDA thread safety
All IDA SDK calls must run on the main thread. Use:
from .rpc import tool
from .sync import idasync
@tool
@idasync
def my_tool(...):
...API conventions
- Prefer batch-first APIs.
- Many functions accept either a comma-separated string or a list.
- Use full type hints and
Annotated[...]descriptions. - The function docstring becomes the MCP tool description.
Example:
def my_api(addrs: Annotated[str, "Addresses (0x401000, main) or list"]) -> list[dict]:
...Common helpers
- Parse addresses with
parse_address() - Normalize batch input with
normalize_list_input()/normalize_dict_list() - Use shared pagination / filtering helpers from
utils.py
Unsafe operations
Debugger or destructive operations should be marked unsafe:
from .rpc import tool, unsafe
@unsafe
@tool
@idasync
def dangerous_op(...):
...Development commands
Run
uv run ida-pro-mcp
uv run ida-pro-mcp --transport http://127.0.0.1:8744/sse
uv run idalib-mcp --stdio path/to/binary
uv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/binary
uv run idalib-mcp --isolated-contexts --host 127.0.0.1 --port 8745 path/to/binary
uv run ida-pro-mcp --unsafeMCP inspector
uv run mcp dev src/ida_pro_mcp/server.pyInstall / uninstall
uv run ida-pro-mcp --install
uv run ida-pro-mcp --uninstallTesting and coverage
Run tests
Use the headless test runner:
uv run ida-mcp-test tests/crackme03.elf -q
uv run ida-mcp-test tests/typed_fixture.elf -q
uv run ida-mcp-test tests/crackme03.elf -c api_analysis
uv run ida-mcp-test tests/typed_fixture.elf -p "*stack*"Notes:
- Use
uv run ... - Non-interactive output should show failures only plus a summary
- Binary-specific tests should use
@test(binary="...")with the executable basename
Coverage
Measure coverage across both maintained fixtures:
uv run coverage erase
uv run coverage run -m ida_pro_mcp.test tests/crackme03.elf -q
uv run coverage run --append -m ida_pro_mcp.test tests/typed_fixture.elf -q
uv run coverage report --show-missingCurrent fixture intent:
tests/crackme03.elf: compact general regression fixturetests/typed_fixture.elf: typed globals / structs / locals / stack coverage fixture
Test expectations
- Prefer semantic assertions, not weak "field exists" checks
- Prefer round-trip tests for mutating APIs
- If tests expose clearly wrong API behavior, fix the API instead of weakening the test
- Focus on IDA-facing modules, not server/config plumbing
- Expect some IDA / Hex-Rays variance; guarded assertions or runtime skips are acceptable when justified
Generic-test sanity check
When adding generic tests, also try a non-fixture binary to avoid ELF-specific assumptions:
uv run ida-mcp-test "C:\CodeBlocks\x64dbg\bin\x64\x64dbg.dll" -qScope priorities
High priority:
api_analysis.pyapi_types.pyapi_modify.pyapi_stack.pyapi_memory.pyapi_core.pyapi_resources.pyutils.pyframework.py
Lower priority:
api_debug.py- MCP transport / hosting details
- install / config mutation logic
Practical notes
- Server/plugin Python: 3.11+
- IDA Pro 8.3+; 9.0 recommended
- IDA Free is not supported
- If IDA uses the wrong Python, use
idapyswitch
In this repository2 other files it gives its agents.
- idapythonSkill
- reverse-engineeringSkill
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

