What's Changed
v1.0.0 is a full architecture release: IDA-MCP now runs on headless idalib workers only — no GUI plugin, no IDA executable path, no plugin installation. Everything runs through uvx idamcp-hub stdio.
Breaking Changes
- BREAKING: GUI support removed entirely — the IDA plugin entry (
ida_mcp.py),ida-plugin.json,install.py, and the in-GUI bridge runtime are gone. GUI instances can no longer be attached to or launched. - BREAKING:
select_databaseremoved together with the mutable default selection. Routing is per call: an explicitinstance_idalways wins; with exactly one live instance it is the implicit target; with several live instances an omitted id is a loudinstance_ambiguouserror. Concurrent agents can never re-route each other's calls. - Config key
ida_pathremoved; the only remaining launch setting isida_python(any interpreter that canimport idapro— normally IDA's bundledida-pythonruntime).
Features
- Operation interruption (design borrowed from Hex-Rays' ida-nexus): tool calls that carry a timeout get an operation id; on client-side timeout the still-running code is interrupted on the instance — IDA's native cancel switch for stuck SDK calls, plus a
PyThreadState_SetAsyncExcinjection for pure-Python loops. A hungpy_eval("while True: pass")now unwinds in milliseconds instead of pinning the worker forever. Verified end to end: after interruption the worker keeps answering. - Debugger works headless:
dbg_startloads the platform's local debugger itself (debuggerparameter for remote names likegdb) and places an entry-point breakpoint for a deterministic suspend. - Call stack rebuilt on IDA 9: IDA 9 removed
get_call_stack/walk_stackwithout replacements;dbg_callstacknow reconstructs the stack from the frame-pointer chain (RBP/EBP/X29), including the entry-instruction case where the prologue has not run. - Safe memory access under IDA 9:
dbg_read_memuses theida_idd.dbg_read_memorywrapper (the legacy 2-arg form raisesTypeErroron 9.4). - Test suite now compiles its own ELF sample with a known call chain (
main → level1 → level2 → level3) and runs a real debugger session headlessly — previously always skipped.
Bug Fixes
- fix(lifecycle): actually interrupt timed-out
py_evalin idalib workers — the async exception was injected into the executor thread that merely waits on the future, while user code runs on the worker's main thread; the queued closure now re-registers the executing thread at run time. Client-side timeouts are also classified correctly so the auto-cancel hooks fire, and the CLI tool-call path gained the same cancellation as the MCP server.
Installation
hcli ida install --download-id ida-pro:latest --set-default --accept-eula --yes
uvx idamcp-hub stdioFull Changelog: v0.9.8...v1.0.0