{"repo":"mrexodia/ida-pro-mcp","free":true,"listed":false,"github":"https://github.com/mrexodia/ida-pro-mcp","clone":"git clone https://github.com/mrexodia/ida-pro-mcp.git","description":"AI-powered reverse engineering assistant that bridges IDA Pro with language models through MCP.","language":"Python","stars":11376,"topics":["ai","aiagent","binary-analysis","ida-plugin","ida-pro","mcp","mcp-server","modelcontextprotocol","reverse-engineering"],"license":"MIT","category":"binary_analysis","readme_excerpt":"# IDA Pro MCP\n\nSimple [MCP Server](https://modelcontextprotocol.io/introduction) to allow vibe reversing in IDA Pro.\n\nhttps://github.com/user-attachments/assets/6ebeaa92-a9db-43fa-b756-eececce2aca0\n\nThe binaries and prompt for the video are available in the [mcp-reversing-dataset](https://github.com/mrexodia/mcp-reversing-dataset) repository.\n\n## Prerequisites\n\n- [Python](https://www.python.org/downloads/) (**3.11 or higher**)\n  - Use `idapyswitch` to switch to the newest Python version\n- [IDA Pro](https://hex-rays.com/ida-pro) (8.3 or higher, 9 recommended), **IDA Free is not supported**\n- Supported MCP Client (pick one you like)\n  - [Amazon Q Developer CLI](https://aws.amazon.com/q/developer/)\n  - [Augment Code](https://www.augmentcode.com/)\n  - [Claude](https://claude.ai/download)\n  - [Claude Code](https://www.anthropic.com/code)\n  - [Cline](https://cline.bot)\n  - [Codex](https://github.com/openai/codex)\n  - [Copilot CLI](https://docs.github.com/en/copilot)\n  - [Crush](https://github.com/charmbracelet/crush)\n  - [Cursor](https://cursor.com)\n  - [Gemini CLI](https://google-gemini.github.io/gemini-cli/)\n  - [Kilo Code](https://kilo.ai/)\n  - [Kiro](https://kiro.dev/)\n  - [LM Studio](https://lmstudio.ai/)\n  - [Opencode](https://opencode.ai/)\n  - [Qodo Gen](https://www.qodo.ai/)\n  - [Qwen Coder](https://qwenlm.github.io/qwen-code-docs/)\n  - [Roo Code](https://roocode.com)\n  - [Trae](https://trae.ai/)\n  - [VS Code](https://code.visualstudio.com/)\n  - [VS Code Insiders](https://code.visualstudio.com/insiders)\n  - [Warp](https://www.warp.dev/)\n  - [Windsurf](https://windsurf.com)\n  - [Zed](https://zed.dev/)\n  - [Kimi Code](https://moonshotai.github.io/kimi-code/en/)\n  - [Other MCP Clients](https://modelcontextprotocol.io/clients#example-clients): Run `ida-pro-mcp --config` to get the JSON config for your client.\n\n**Note**: This requires having idalib activated globally and [uv](https://astral.sh/uv) installed:\n\n```bash\n# windows\nuv run \"C:\\Program Files\\IDA Professional 9.3\\idalib\\python\\py-activate-idalib.py\"\n# macos\nuv run \"/Applications/IDA Professional 9.3.app/Contents/MacOS/idalib/python/py-activate-idalib.py\"\n# linux\nuv run \"/path/to/idapro-9.3/idalib/python/py-activate-idalib.py\"\n```\n\n## Installation (Claude Code)\n\nTo install the latest IDA Pro MCP in Claude Code:\n\n```bash\nclaude plugin marketplace add mrexodia/claude-marketplace\nclaude plugin uninstall ida-pro-mcp@mrexodia\nclaude plugin install ida-pro-mcp@mrexodia\n```\n\n## Installation (Codex)\n\nTo install the latest IDA Pro MCP in Codex:\n\n```bash\ncodex plugin marketplace add mrexodia/codex-marketplace\ncodex plugin remove ida-pro-mcp@mrexodia\ncodex plugin add ida-pro-mcp@mrexodia\n```\n\n## Installation (Kimi Code)\n\nTo install the latest IDA Pro MCP in Kimi Code, run this slash command in the chat:\n\n```\n/plugins install https://github.com/mrexodia/ida-pro-mcp/tree/main\n/reload\n```\n\nThis installs the `idalib` MCP server and the `idapython` skill. Plugins are copied to\n`$KIMI_CODE_HOME/plugins/managed/`, so `uv` must be on your `PATH`. The first session after\ninstalling is slower, because `uv` resolves the dependencies before the server responds.\n\n## Installation (GUI)\n\n**Note**: the MCP plugin is no longer recommended and will eventually be deprecated. Use `idalib-mcp` instead.\n\nIf you want to configure the MCP server manually from the IDA GUI:\n\n```sh\npip uninstall ida-pro-mcp\npip install https://github.com/mrexodia/ida-pro-mcp/archive/refs/heads/main.zip\n```\n\nConfigure the MCP servers and install the IDA Plugin:\n\n```\nida-pro-mcp --install\n```\n\n**Important**: Make sure you completely restart IDA and your MCP client for the installation to take effect. Some clients (like Claude) run in the background and need to be quit from the tray icon.\n\n## Prompt Engineering\n\nLLMs are prone to hallucinations and you need to be specific with your prompting. For reverse engineering the conversion between integers and bytes are especially problematic. Below is a minimal example prompt, feel free to start a discussion or open an issue if you have good results with a different prompt:\n\n```md\nYour task is to analyze a crackme in IDA Pro. You can use the MCP tools to retrieve information. In general use the following strategy:\n\n- Inspect the decompilation and add comments with your findings\n- Rename variables to more sensible names\n- Change the variable and argument types if necessary (especially pointer and array types)\n- Change function names to be more descriptive\n- If more details are necessary, disassemble the function and add comments with your findings\n- NEVER convert number bases yourself. Use the `int_convert` MCP tool if needed!\n- Do not attempt brute forcing, derive any solutions purely from the disassembly and simple python scripts\n- Create a report.md with your findings and steps taken at the end\n- When you find a solution, prompt to user for feedback with the password you found\n```\n\nThis prompt was just the first experiment, please share if you found ways to improve the output!\n\nAnother prompt by [@can1357](https://github.com/can1357):\n\n```md\nYour task is to create a complete and comprehensive reverse engineering analysis. Reference AGENTS.md to understand the project goals and ensure the analysis serves our purposes.\n\nUse the following systematic methodology:\n\n1. **Decompilation Analysis**\n   - Thoroughly inspect the decompiler output\n   - Add detailed comments documenting your findings\n   - Focus on understanding the actual functionality and purpose of each component (do not rely on old, incorrect comments)\n\n2. **Improve Readability in the Database**\n   - Rename variables to sensible, descriptive names\n   - Correct variable and argument types where necessary (especially pointers and array types)\n   - Update function names to be descriptive of their actual purpose\n\n3. **Deep Dive When Needed**\n   - If more details are necessary, examine the disassembly and add comments with findings\n   - Document any low-level behaviors that aren't clear from the decompilation alone\n   - Use sub-agents to perform detailed analysis\n\n4. **Important Constraints**\n   - NEVER convert number bases yourself - use the int_convert MCP tool if needed\n   - Use MCP tools to retrieve information as necessary\n   - Derive all conclusions from actual analysis, not assumptions\n\n5. **Documentation**\n   - Produce comprehensive RE/*.md files with your findings\n   - Document the steps taken and methodology used\n   - When asked by the user, ensure accuracy over previous analysis file\n   - Organize findings in a way that serves the project goals outlined in AGENTS.md or CLAUDE.md\n```\n\nLive stream discussing prompting and showing some real-world malware analysis:\n\n[![](https://img.youtube.com/vi/iFxNuk3kxhk/0.jpg)](https://www.youtube.com/watch?v=iFxNuk3kxhk)\n\n## Tips for Enhancing LLM Accuracy\n\nLarge Language Models (LLMs) are powerful tools, but they can sometimes struggle with complex mathematical calculations or exhibit \"hallucinations\" (making up facts). Make sure to tell the LLM to use the `int_convert` MCP tool and you might also need [math-mcp](https://github.com/EthanHenrickson/math-mcp) for certain operations.\n\nAnother thing to keep in mind is that LLMs will not perform well on obfuscated code. Before trying to use an LLM to solve the problem, take a look around the binary and spend some time (automatically) removing the following things:\n\n- String encryption\n- Import hashing\n- Control flow flattening\n- Code encryption\n- Anti-decompilation tricks\n\nYou should also use a tool like Lumina or FLIRT to try and resolve all the open source library code and the C++ STL, this will further improve the accuracy.\n\n## Transports & Headless MCP\n\nYou can run an SSE server to connect to the user interface like this:\n\n```sh\nuv run ida-pro-mcp --transport http://127.0.0.1:8744/sse\n```\n\nAfter installing [`idalib`](https://docs.hex-rays.com/core/idalib/getting-started) you can also run a headless MCP server. You can start with an initial binary:\n\n```sh\nuv run idalib-mcp --host 127.0.0.1 --port 8745 path/to/executable\n```\n\nOr start without a binary and open arbitrary files later with `idb_open(...)`:\n\n```sh\nuv run idalib-mcp --host 127.0.0.1 --port 8745\n```\n\nFor stdio-based clients, use:\n\n```sh\nuv run idalib-mcp --stdio\n```\n\nDatabase workers are persistent: each one runs as a detached process that\noutlives the supervisor that spawned it. When a new supervisor (over stdio\nor HTTP) calls `idb_open` for a binary that is already open under a worker\non this host, the supervisor adopts that worker transparently — there is\nno separate \"shared\" mode to enable. Workers self-exit when no request has\nhit them for an idle interval.\n\n_Note_: The `idalib` feature was contributed by [Willi Ballenthin](https://github.com/williballenthin).\n\n## Headless idalib Session Model\n\n`idalib-mcp` is a supervisor that keeps each open database in its own idalib worker process. Workers register themselves in a host-local discovery directory and outlive the supervisor that spawned them; any subsequent supervisor that wants the same path adopts the running worker. A worker self-exits when no request has hit it for its idle TTL (default 1 hour). Call `idb_close` to release a worker eagerly (freeing a slot toward `--max-workers`), adopted GUI/worker instances are detached rather than killed.\n\n`idb_open` picks the backend via its `mode` parameter:\n\n- `prefer_headless` (default): spawn an idalib worker (or adopt one that already has the file open).\n- `force_headless`: same, but never adopt a running GUI even if one has the file.\n- `prefer_gui`: adopt a running GUI for the file; otherwise spawn an idalib worker.\n- `force_gui`: adopt a running GUI for the file; otherwise launch a new IDA GUI process.\n\nEvery tool call must carry an explicit `database` argument. There is no implicit \"current database\" — callers name the session they want to operate on.\n\n```sh\nuv run idalib-mcp --stdio --max-workers 4\n```\n\nTypical flow:\n\n```python\nidb_open(\"/path/to/binary_a","default_branch":"main","files":211,"tree":[".claude-plugin/plugin.json",".codex-plugin/mcp.json",".codex-plugin/plugin.json",".editorconfig",".github/FUNDING.yml",".github/logo.png",".github/workflows/idalib-tests.yml",".gitignore",".kimi-plugin/plugin.json",".python-version","CLAUDE.md","LICENSE","README.md","devdocs/test-framework.md","ida-plugin.json","profiles/readonly.txt","profiles/triage.txt","pyproject.toml","scripts/stress_search_cancellation.py","skills/idapython/SKILL.md","skills/idapython/docs/ida_auto.md","skills/idapython/docs/ida_auto.rst","skills/idapython/docs/ida_bitrange.md","skills/idapython/docs/ida_bitrange.rst","skills/idapython/docs/ida_bytes.md","skills/idapython/docs/ida_bytes.rst","skills/idapython/docs/ida_dbg.md","skills/idapython/docs/ida_dbg.rst","skills/idapython/docs/ida_dirtree.md","skills/idapython/docs/ida_dirtree.rst","skills/idapython/docs/ida_diskio.md","skills/idapython/docs/ida_diskio.rst","skills/idapython/docs/ida_entry.md","skills/idapython/docs/ida_entry.rst","skills/idapython/docs/ida_expr.md","skills/idapython/docs/ida_expr.rst","skills/idapython/docs/ida_fixup.md","skills/idapython/docs/ida_fixup.rst","skills/idapython/docs/ida_fpro.md","skills/idapython/docs/ida_fpro.rst","skills/idapython/docs/ida_frame.md","skills/idapython/docs/ida_frame.rst","skills/idapython/docs/ida_funcs.md","skills/idapython/docs/ida_funcs.rst","skills/idapython/docs/ida_gdl.md","skills/idapython/docs/ida_gdl.rst","skills/idapython/docs/ida_graph.md","skills/idapython/docs/ida_graph.rst","skills/idapython/docs/ida_hexrays.md","skills/idapython/docs/ida_hexrays.rst","skills/idapython/docs/ida_ida.md","skills/idapython/docs/ida_ida.rst","skills/idapython/docs/ida_idaapi.md","skills/idapython/docs/ida_idaapi.rst","skills/idapython/docs/ida_idc.md","skills/idapython/docs/ida_idc.rst","skills/idapython/docs/ida_idd.md","skills/idapython/docs/ida_idd.rst","skills/idapython/docs/ida_idp.md","skills/idapython/docs/ida_idp.rst","skills/idapython/docs/ida_ieee.md","skills/idapython/docs/ida_ieee.rst","skills/idapython/docs/ida_kernwin.md","skills/idapython/docs/ida_kernwin.rst","skills/idapython/docs/ida_libfuncs.md","skills/idapython/docs/ida_libfuncs.rst","skills/idapython/docs/ida_lines.md","skills/idapython/docs/ida_lines.rst","skills/idapython/docs/ida_loader.md","skills/idapython/docs/ida_loader.rst","skills/idapython/docs/ida_merge.md","skills/idapython/docs/ida_merge.rst","skills/idapython/docs/ida_mergemod.md","skills/idapython/docs/ida_mergemod.rst","skills/idapython/docs/ida_moves.md","skills/idapython/docs/ida_moves.rst","skills/idapython/docs/ida_nalt.md","skills/idapython/docs/ida_nalt.rst","skills/idapython/docs/ida_name.md","skills/idapython/docs/ida_name.rst","skills/idapython/docs/ida_netnode.md","skills/idapython/docs/ida_netnode.rst","skills/idapython/docs/ida_offset.md","skills/idapython/docs/ida_offset.rst","skills/idapython/docs/ida_pro.md","skills/idapython/docs/ida_pro.rst","skills/idapython/docs/ida_problems.md","skills/idapython/docs/ida_problems.rst","skills/idapython/docs/ida_range.md","skills/idapython/docs/ida_range.rst","skills/idapython/docs/ida_regfinder.md","skills/idapython/docs/ida_regfinder.rst","skills/idapython/docs/ida_registry.md","skills/idapython/docs/ida_registry.rst","skills/idapython/docs/ida_search.md","skills/idapython/docs/ida_search.rst","skills/idapython/docs/ida_segment.md","skills/idapython/docs/ida_segment.rst","skills/idapython/docs/ida_segregs.md","skills/idapython/docs/ida_segregs.rst","skills/idapython/docs/ida_srclang.md","skills/idapython/docs/ida_srclang.rst","skills/idapython/docs/ida_strlist.md","skills/idapython/docs/ida_strlist.rst","skills/idapython/docs/ida_tryblks.md","skills/idapython/docs/ida_tryblks.rst","skills/idapython/docs/ida_typeinf.md","skills/idapython/docs/ida_typeinf.rst","skills/idapython/docs/ida_ua.md","skills/idapython/docs/ida_ua.rst","skills/idapython/docs/ida_undo.md","skills/idapython/docs/ida_undo.rst","skills/idapython/docs/ida_xref.md","skills/idapython/docs/ida_xref.rst","skills/idapython/docs/idaapi.md","skills/idapython/docs/idaapi.rst","skills/idapython/docs/idadex.md","skills/idapython/docs/idadex.rst","skills/idapython/docs/idautils.md","skills/idapython/docs/idautils.rst","skills/idapython/docs/idc.md","skills/idapython/docs/idc.rst","skills/idapython/docs/init.md","skills/idapython/docs/init.rst","src/ida_pro_mcp/__init__.py","src/ida_pro_mcp/__main__.py","src/ida_pro_mcp/ida_mcp.py","src/ida_pro_mcp/ida_mcp/__init__.py","src/ida_pro_mcp/ida_mcp/_sigmaker.py","src/ida_pro_mcp/ida_mcp/api_analysis.py","src/ida_pro_mcp/ida_mcp/api_composite.py","src/ida_pro_mcp/ida_mcp/api_core.py","src/ida_pro_mcp/ida_mcp/api_debug.py","src/ida_pro_mcp/ida_mcp/api_memory.py","src/ida_pro_mcp/ida_mcp/api_modify.py","src/ida_pro_mcp/ida_mcp/api_python.py","src/ida_pro_mcp/ida_mcp/api_resources.py","src/ida_pro_mcp/ida_mcp/api_sigmaker.py","src/ida_pro_mcp/ida_mcp/api_stack.py","src/ida_pro_mcp/ida_mcp/api_survey.py","src/ida_pro_mcp/ida_mcp/api_types.py","src/ida_pro_mcp/ida_mcp/compat.py","src/ida_pro_mcp/ida_mcp/discovery.py","src/ida_pro_mcp/ida_mcp/framework.py","src/ida_pro_mcp/ida_mcp/http.py","src/ida_pro_mcp/ida_mcp/mainthread.py","src/ida_pro_mcp/ida_mcp/profile.py","src/ida_pro_mcp/ida_mcp/rpc.py","src/ida_pro_mcp/ida_mcp/sync.py","src/ida_pro_mcp/ida_mcp/tests/__init__.py","src/ida_pro_mcp/ida_mcp/tests/mcp_mode.py","src/ida_pro_mcp/ida_mcp/tests/test_api_analysis.py","src/ida_pro_mcp/ida_mcp/tests/test_api_analysis_internals.py","src/ida_pro_mcp/ida_mcp/tests/test_api_composite.py","src/ida_pro_mcp/ida_mcp/tests/test_api_core.py","src/ida_pro_mcp/ida_mcp/tests/test_api_debug.py","src/ida_pro_mcp/ida_mcp/tests/test_api_memory.py","src/ida_pro_mcp/ida_mcp/tests/test_api_modify.py","src/ida_pro_mcp/ida_mcp/tests/test_api_python.py","src/ida_pro_mcp/ida_mcp/tests/test_api_resources.py","src/ida_pro_mcp/ida_mcp/tests/test_api_sigmaker.py","src/ida_pro_mcp/ida_mcp/tests/test_api_stack.py","src/ida_pro_mcp/ida_mcp/tests/test_api_survey.py","src/ida_pro_mcp/ida_mcp/tests/test_api_types.py","src/ida_pro_mcp/ida_mcp/tests/test_discovery.py","src/ida_pro_mcp/ida_mcp/tests/test_framework_helpers.py","src/ida_pro_mcp/ida_mcp/tests/test_http.py","src/ida_pro_mcp/ida_mcp/tests/test_installer.py","src/ida_pro_mcp/ida_mcp/tests/test_profile.py","src/ida_pro_mcp/ida_mcp/tests/test_server.py","src/ida_pro_mcp/ida_mcp/tests/test_tool_metadata.py","src/ida_pro_mcp/ida_mcp/tests/test_trace.py","src/ida_pro_mcp/ida_mcp/tests/test_typed_fixture.py","src/ida_pro_mcp/ida_mcp/tests/test_utils.py","src/ida_pro_mcp/ida_mcp/trace.py","src/ida_pro_mcp/ida_mcp/utils.py","src/ida_pro_mcp/ida_mcp/zeromcp/__init__.py","src/ida_pro_mcp/ida_mcp/zeromcp/jsonrpc.py","src/ida_pro_mcp/ida_mcp/zeromcp/mcp.py","src/ida_pro_mcp/idalib_server.py","src/ida_pro_mcp/idalib_session_manager.py","src/ida_pro_mcp/idalib_supervisor.py","src/ida_pro_mcp/installer.py","src/ida_pro_mcp/installer_data.py","src/ida_pro_mcp/installer_tui.py","src/ida_pro_mcp/server.py","src/ida_pro_mcp/test.py","src/ida_pro_mcp/trace_dump.py","src/ida_pro_mcp/worker_lifecycle.py","tests/_mcp_spec_support.py","tests/binary_info.py","tests/crackme03.elf","tests/test_browser_transport_guards.py","tests/test_idalib_session_manager.py","tests/test_idalib_supervisor.py","tests/test_installer_scope_messages.py","tests/test_mainthread_pump.py","tests/test_mcp_spec_endpoints.py","tests/test_mcp_spec_envelope.py","tests/test_mcp_spec_http_e2e.py","tests/test_mcp_spec_schema_generation.py","tests/test_mcp_spec_tools_list.py","tests/test_mcp_spec_truncation.py","tests/test_no_protocol_stdout_prints.py","tests/test_output_schema.py","tests/test_server_transport.py","tests/test_worker_lifecycle.py","tests/typed_fixture.c","tests/typed_fixture.elf","uv-package.sh","uv.lock"],"storefront":"/r/mrexodia","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/mrexodia/ida-pro-mcp/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}