Skip to main content

ida-codemode

⚠️ Experimental prerelease ⚠️

IDA Code Mode gives agents a compact Python execution surface over the ida-domain API. It will discover and share databases already open in the IDA GUI, and starts managed idalib workers only when no suitable instance exists.

The MCP adapter explicitly runs execute_python as a lease-scoped REPL: imports, variables, and function definitions persist between its calls through the same database handle. The low-level API remains stateless by default and opts in with persist_globals=True; a stateless call discards any namespace previously retained by that handle. Separate handles receive isolated namespaces, and closing a handle releases its namespace and retained IDA objects.

Installation

Requirements

  • Installed in your PATH
  • IDA 9.4 or higher with idalib and Python 3.11+
  • Other IDA MCP servers must be disabled to reduce agent confusion

Claude Code

claude plugin marketplace add HexRaysSA/claude-marketplace
claude plugin install ida-mcp@HexRaysSA

Codex CLI

codex plugin marketplace add HexRaysSA/codex-marketplace
codex plugin add ida-mcp@HexRaysSA

Pi

pi install git:github.com/HexRaysSA/ida-codemode

oh-my-pi

omp plugin install github:HexRaysSA/ida-codemode

IDA GUI Support

To support IDA GUI instances when using ida-codemode, install the plugin:

uvx ida-hcli plugin install ida-codemode
# or if you have hcli installed:
hcli plugin install ida-codemode

Other agents

Configure a regular stdio MCP server in your MCP JSON configuration:

{
  "mcpServers": {
    "ida": {
      "command": "uvx",
      "args": [
        "--with=ida-hcli",
        "ida-codemode",
        "mcp",
        "--agent=my-agent"
      ]
    }
  }
}

uvx resolves the latest stable ida-codemode release from PyPI, so this configuration does not need to be updated for each release. Pre-release dependency resolution is currently required because ida-domain is published as a development release.

--agent=my-agent is a human-chosen label (like claude-code, cursor, my-custom-agent, etc.) used to differentiate sessions in a metrics dashboard.

We tested the following clients, but any MCP client should work similarly:

Usage

Start your agent harness and ask it something like:

Reverse /path/to/sample.elf for me

To test the GUI integration, open something in IDA and ask your harness:

What do I have open in the IDA GUI?

Command line

The package installs one ida-codemode command with subcommands:

ida-codemode mcp --agent=my-agent
ida-codemode dashboard --open
ida-codemode exec /path/to/sample.elf -c 'db.functions.get_all()'
ida-codemode logs
ida-codemode benchmark /path/to/sample.elf

Run ida-codemode COMMAND --help for command-specific options. The internal worker subcommand is used automatically when a managed idalib database is needed.

Python Package (Developers)

You can build on ida-codemode as a library and reuse the database management functionality. Doing so will transparently allow other ida-codemode users to use IDBs concurrently and work together.

Example scenarios

Below are a few scenarios enabled by the ida-codemode library:

  • You have an executable open in the IDA GUI and would like to use the MCP without closing IDA.
  • Your main agent spawns 5 subagents to work on different parts of the IDB concurrently.
  • A headless database is created by the MCP, you want to access it with a CLI tool.
  • You develop a web application to look at all the open IDA databases at once.

API

DatabaseHandle is the primary API. One handle owns one lease on an exact GUI or idalib database; closing it releases only that lease.

from ida_codemode import DatabaseHandle, DatabaseOpenOptions

options = DatabaseOpenOptions(
    startup_timeout=300,
    processor="arm",
    image_base=0x08000000,
)
with DatabaseHandle.open("firmware.bin", options=options) as handle:
    handle.wait_autoanalysis()
    execution = handle.execute_python(
        "len(list(db.functions.get_all()))",
        timeout=60,
    )
    print(execution["result"])

IDA import settings in DatabaseOpenOptions apply only when Code Mode imports a new source file. They do not reconfigure a reused GUI, worker, or existing IDB. execute_python() is stateless by default; pass persist_globals=True to keep a lease-scoped Python namespace between calls.

Discovery returns public instance descriptors that support exact attachment:

from ida_codemode import DatabaseHandle, InstanceState, discover_databases

ready = [
    item.instance for item in discover_databases() if item.state is InstanceState.READY
]
with DatabaseHandle.attach(ready[0]) as handle:
    print(handle.instance.record_id, handle.instance.idb_path)

find_database_owner() and wait_database_released() support clients that must safely replace an executable or IDB. DatabaseManager is the secondary API for MCP-style adapters that manage several handles and a current target. All supported Python names are exported directly from ida_codemode; underscore modules and non-exported implementation modules are private. See ARCHITECTURE.md for more details.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ida_codemode-0.6.0.tar.gz (187.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ida_codemode-0.6.0-py3-none-any.whl (104.2 kB view details)

Uploaded Python 3

File details

Details for the file ida_codemode-0.6.0.tar.gz.

File metadata

  • Download URL: ida_codemode-0.6.0.tar.gz
  • Upload date:
  • Size: 187.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ida_codemode-0.6.0.tar.gz
Algorithm Hash digest
SHA256 95586cf2e9099aa31db1aa48d28aaf71b680917a74dd13855b0e0807d1ea74d0
MD5 c99e3a1a3b9d2f87305c1631628f99b3
BLAKE2b-256 87f72fe60ca1a0d54c91bbffafdc11f5955cda3f78c407d317132aa1e2529836

See more details on using hashes here.

File details

Details for the file ida_codemode-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: ida_codemode-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 104.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for ida_codemode-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c6cbb759261c10507119f29f1abc6148d848c4357ca0e6643e0f06ada1d7bb6d
MD5 b94105ad4da18b8fe03448d0e5c2a5c2
BLAKE2b-256 73d44f954ff52b860d18062cb1baa80bd1577baa6f5458d9f8f7336c6b8f950f

See more details on using hashes here.

Release history Release notifications | RSS feed

0.6.1

2 files

This release

0.6.0 This release

2 files

0.5.3

2 files

0.5.2

2 files

0.5.1

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page