Skip to main content
Glama
Claude-Reverser

IDA-instances-MCP

IDA-instances-MCP

Eigener Build von ida-pro-mcp: ein MCP-Server, der es MCP-Clients ermöglicht, IDA Pro zu steuern – überarbeitet mit einem Durchgang zur Stabilitätshärtung, der darauf abzielt, mehrere Headless-idalib-Instanzen zu hosten (das Ida-Instances-Setup).

Dies ist ein Fork von mrexodias ida-pro-mcp (MIT). Das gesamte Verdienst am Upstream gebührt Duncan Ogilvie und allen Mitwirkenden; die unten beschriebenen, eigenen Änderungen werden in diesem Repository gepflegt.

Eigene Änderungen

Stabilitätshärtung gegenüber Upstream v2.0.0:

Bereich

Änderung

Datensicherheit

Die Bereinigung von Teildatenbanken ist eigentümerbewusst: .id0/.id1/.id2/.nam/.til-Dateien, die einer anderen laufenden Instanz gehören, werden niemals gelöscht; ist keine Eigentumsermittlung möglich, schlägt die Bereinigung sicher fehl

Speicherzuverlässigkeit

idb_save läuft mit einem Budget von 600 s (zuvor 60 s); idb_close weigert sich, nach einem fehlgeschlagenen Speichern einen Worker zu beenden, anstatt Änderungen stillschweigend zu verwerfen

Nebenläufigkeit

Die Supervisor-Sperre umfasst nicht mehr das Starten von Workern (~120 s), Health-Checks (~2,5 s/Sitzung) oder die Beendigung veralteter Worker – ein langsames Öffnen kann nicht mehr alle Sitzungen einfrieren

Robustheit

Fehlerhafter JSON-RPC über stdio liefert -32700/-32600 zurück, statt den Proxy abzustürzen

Timeouts

Proxy-Timeout von 30 s auf 900 s angehoben und konfigurierbar gemacht (IDA_MCP_PROXY_TIMEOUT), sodass lange Dekompilierungen clientseitig nicht mehr als „fehlgeschlagen“ gelten, während sie serverseitig noch laufen

Netzwerk

Worker-Port-TOCTOU verwendet nun Retries; SSE-Schreibvorgänge und das Herunterfahren sind sperrengeschützt; CORS-Richtlinienlesungen werden außerhalb des IDA-Hauptthreads gecacht

Ressourcengrenzen

IDB-Trace-Protokoll auf 64 MB begrenzen (IDA_MCP_TRACE_MAX_MB), überdimensionierte Argumente/Ergebnisse werden gekürzt; Warteschlange für fehlgeschlagene Flushes ist begrenzt

Authentifizierung

Jede HTTP-Anfrage erfordert einen Instanz-API-Schlüssel; dieser wird über GET /key genau einmal ausgestellt und dann verbraucht. Der Schlüssel wird auf der Festplatte gesichert, damit er Neustarts und Reboots überlebt

Hosting-Endpunkte

GET /health (unauthentifizierter Bereitschaftstest), GET /sessions (offene Datenbanken + letzter Zugriff), POST /upload (direkter Binär-Upload mit Größenlimit)

Bereinigung im Leerlauf

Sitzungen, die IDA_MCP_IDLE_TIMEOUT Minuten lang unangetastet bleiben, werden automatisch geschlossen (nach dem Speichern)

Elegantes Herunterfahren

Bei SIGTERM/SIGINT wird jede geöffnete Datenbank vor dem Beenden gespeichert – mit pct stop geht keine Arbeit mehr verloren

Selbst-Update

Der Start prüft GitHub-Releases; bei interaktiven Sitzungen wird ein Update per Tastendruck angeboten

Hosting-Standards

Der leitende Headless-Supervisor lauscht auf 0.0.0.0:9999; auch das GUI-Plugin bindet 0.0.0.0 und verlangt nun denselben API-Key

Related MCP server: idalib-mcp-headless

Voraussetzungen

  • Linux, macOS oder Windows

  • Python 3.11+ (idapyswitch innerhalb von IDA verwenden, um sie abzustimmen)

  • IDA Pro 8.3+ (9.x empfohlen). IDA Free wird nicht unterstützt

  • uv

  • Ein MCP-Client (Claude Code, Cursor, Codex, Opencode, VS Code, ...)

Einrichtung

idalib für die uv-Umgebung aktivieren:

# linux (server deployment)
uv run "/opt/idapro-9.x/idalib/python/py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.x.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
# windows
uv run "C:\Program Files\IDA Professional 9.x\idalib\python\py-activate-idalib.py"

Für Headless-Ausführungen müssen zusätzlich das IDA-Installationsverzeichnis in IDADIR angegeben.

Headless-Supervisor ausführen (Hosting-Modus)

uv run idalib-mcp                # serves http://0.0.0.0:9999/mcp (new default)

Beim Start wird ein API-Key generiert (oder von Festplatte geladen), und jede Anfrage ohne einen solchen erhält 401 Unauthorized — ohne Ausnahmen.

Den Key genau einmal von der Maschine/dem Netzwerk abrufen, das der Instanz gehört:

curl http://your-host:9999/key
# {"key": "3f2b..."}   <- save it; this endpoint is now burned until restart
  • Der Key bleibt unter ~/.idapro/mcp/api_key (Modus 0600) und überlebt Reboots; GET /key stellt ihn einmal pro Serverstart wieder aus

  • Überschreibbar mit IDA_MCP_API_KEY (oder Verlagerung über IDA_MCP_API_KEY_FILE)

  • Alle anderen Endpunkte verlangen ihn bei jedem Aufruf:

Authorization: Bearer <key>
# or equivalently
X-API-Key: <key>

Der Key wird niemals aufgezeichnet.

Hosting-Endpunkte

Endpunkt

Auth

Zweck

GET /health

keine

Bereitschaftstest: {"status":"ok","uptime":N,"sessions":N} — abfragen statt zu warten

GET /sessions

Key

Offene Datenbanken einschließlich letzter Zeitstempel

POST /upload?filename=NAME

Key

Binär-Upload mit Rohdaten, gestreamt nach IDA_MCP_UPLOAD_DIR; gibt den Pfad zur Übergabe an idb_open zurück

# provisioning flow
while ! curl -sf http://10.0.0.4:9999/health >/dev/null; do sleep 1; done
KEY=$(curl -s http://10.0.0.4:9999/key | jq -r .key)
curl -H "Authorization: Bearer $KEY" --data-binary @sample.elf \
     "http://10.0.0.4:9999/upload?filename=sample.elf"

Nützliche Flags:

uv run idalib-mcp --host 127.0.0.1 --port 9999   # override bind address
uv run idalib-mcp --max-workers 8                # concurrent databases (default 4, 0 = unlimited)
uv run idalib-mcp --unsafe                       # enable destructive/debugger tools (DANGEROUS)
uv run idalib-mcp --profile tools.txt            # restrict worker tools to a profile file
uv run idalib-mcp --stdio                        # stdio transport instead of HTTP
uv run idalib-mcp path/to/binary                 # open a binary at startup

Sitzungsbezogene Tools: idb_open, idb_list, idb_close — pro Sitzung wird eine Datenbank geöffnet; jede Sitzung erhält einen eigenen isolierten Worker-Prozess.

GUI-Proxy ausführen (interaktives IDA)

Das Plugin in IDA starten (Edit -> Plugins -> MCP oder Ctrl+Alt+M), dann:

uv run ida-pro-mcp                                   # stdio proxy, auto-discovers IDA
uv run ida-pro-mcp --transport http://127.0.0.1:9999 # serve HTTP instead

Einen MCP-Client verbinden

Generische JSON-Konfiguration (HTTP-Transport):

{
  "mcpServers": {
    "ida-instances": {
      "url": "http://your-host:9999/mcp",
      "headers": {
        "Authorization": "Bearer <key-from-/key>"
      }
    }
  }
}

Claude Code:

claude mcp add --transport http ida-instances http://your-host:9999/mcp \
  --header "Authorization: Bearer <key-from-/key>"

Für den GUI-Proxy über stdio: uv run ida-pro-mcp --config ausführen und das JSON in den Client einfügen.

Konfiguration (Umgebungsvariablen)

Variable

Standard

Bedeutung

IDA_MCP_OPEN_TIMEOUT

1800

Maximale Sekunden für Öffnen + Auto-Analyse vor dem Zuschlagen (0 = unbegrenzt)

IDA_MCP_WORKER_CALL_TIMEOUT

900

Auffangzeit pro weitergeleitetem Tool-Aufruf

IDA_MCP_PROXY_TIMEOUT

900

GUI-Proxy → IDA-Upstream-Timeout (0 = unbegrenzt)

IDA_MCP_TRACE_MAX_MB

64

Begrenzung des Trace-Protokolls innerhalb der IDB

IDA_MCP_MAX_WORKERS

4

Standardwert für --max-workers

IDA_MCP_HEALTH_TCP_TIMEOUT / IDA_MCP_HEALTH_RPC_TIMEOUT

2.0 / 10.0

Budgets für Integritätstests

IDA_MCP_IDLE_TIMEOUT

60

Minuten, bevor eine unbewegte Sitzung automatisch geschlossen wird (90 schaltet ab)

IDA_MCP_MAX_UPLOAD_MB

100

Obergrenze für POST /upload-Datensätze

IDA_MCP_UPLOAD_DIR

~/.idapro/mcp/uploads

Wo Uploads gespeichert werden

IDA_MCP_API_KEY / IDA_MCP_API_KEY_FILE

– / ~/.idapro/mcp/api_key

Instanz-Key injizieren oder Speicherort verändern

IDA_MCP_SHUTDOWN_SAVE_TIMEOUT / IDA_MCP_SHUTDOWN_SAVE_BUDGET

30 / 120

Speicherbudget pro Datenbank / gesamt bei SIGTERM

IDA_MCP_NO_UPDATE_CHECK

unset

Auf 1 setzen, um die GitHub-Release-Prüfung zu deaktivieren

Sicherheitshinweise: Der API-Key sperrt jeden HTTP-Endpunkt und gilt für Supervisor und GUI-Plugin gleichermaßen (das Plugin kann über py_eval beliebigen Code ausführen, daher ist es auch im Loopback mit Key gesichert). Es ist ein Bearer-Token: Wer ihn erhält, besitzt die Instanz. Ein TLS-Reverse-Proxy einbinden, sobald es Ihr sicheres Netzwerk verlässt. Browser können den Key als ?key=<key> übergeben (praktisch für /config.html).

Testen

IDADIR=/path/to/ida uv run ida-mcp-test tests/crackme03.elf -q
IDADIR=/path/to/ida uv run ida-mcp-test tests/typed_fixture.elf -q
IDADIR=/path/to/ida uv run ida-mcp-test tests/crackme03.elf -c api_analysis   # one category
IDADIR=/path/to/ida uv run coverage run -m ida_pro_mcp.test tests/crackme03.elf -q

Lizenz

MIT — übernommen aus ida-pro-mcp. Produktnamen des Upstreams (IDA Pro, Hex-Rays) sind Marken der Hex-Rays SA; dieses Projekt erfordert eine eigene gültige IDA-Pro-Lizenz.

Related MCP Connectors

Related MCP Servers