Skip to main content
Glama
Claude-Reverser

IDA-instances-MCP

IDA-instances-MCP

Compilación personalizada de ida-pro-mcp: un servidor MCP que permite a los clientes MCP manejar IDA Pro — rehecha con una revisión de estabilidad orientada a alojar múltiples instancias idalib sin interfaz gráfica (la configuración Ida-Instances).

Se trata de un fork del ida-pro-mcp de mrexodia (MIT). Todo el reconocimiento del upstream es para Duncan Ogilvie y sus colaboradores; los cambios propios que se describen a continuación se mantienen en este repositorio.

Qué hay de personalizado

Endurecimiento de la estabilidad sobre la v2.0.0 del upstream:

Ámbito

Cambio

Seguridad de datos

La limpieza parcial de la base de datos es consciente de la propiedad: nunca elimina archivos .id0/.id1/.id2/.nam/.til reclamados por otra instancia activa, y falla de forma segura si el descubrimiento no está disponible

Fiabilidad de guardado

idb_save se ejecuta con un presupuesto de 600 s (antes 60 s); idb_close se niega a matar a un proceso después de un guardado fallido, en lugar de descartar silenciosamente los cambios

Concurrencia

El bloqueo del supervisor ya no abarca la creación de los procesos (~120 s), las comprobaciones de salud (~2,5 s/session) ni la terminación de procesos obsoletos: una apertura lenta ya no congela todas las sesiones

Robustez

Un JSON-RPC malformado a través de stdio devuelve -32700/-32600 en lugar de hacer que el proxy se caenga

Tiempos de espera

El timeout del proxy se amplía de 30s a 900s y se hace configurable (IDA_MCP_PROXY_TIMEOUT) para que las descompilaciones largas no “fallen” en el cliente mientras todavía se están ejecutando en el servidor

Red

El problema TOCTOU del puerto del worker ahora reconecta; la salida SSE y el cierre están protegidos con bloqueos; las políticas CORS se leen de la caché fuera del hilo principal de IDA

Límites de recursos

El registro de trazas del IDB se limita a 64 MB (IDA_MCP_TRACE_MAX_MB), se recortan los argumentos/resultados demasiado grandes y la cola de fallos de volcado queda acotada

Autenticación

Cada petición HTTP requiere una clave de API de la instancia; se emite exactamente una vez mediante GET /key y luego se quema. La clave persiste en el disco para que sobreviva a reinicios y reboots

Endpoints de hosting

GET /health (sonda de disponibilidad sin autenticación), GET /sessions (bases de datos abiertas + último acceso), POST /upload (subida binaria directa con límite de tamaño)

Recolección de sesiones

Las sesiones que no se toque durante IDA_MCP_IDLE_TIMEOUT minutes se cierran automáticamente (se guardan antes)

Apierro controlado

Con SIGTERM/SIGINT se guarda cada base de datos abierta antes de salir — no más trabajo perdido en pct stop

Auto-actualización

En el inicio se consultan los lanzamientos de GitHub; las sesiones interactivas reciben la opción de actualizarse automáticamente con una tecla

Valores por defecto

El supervisor sin interfaz gráfica escucha en 0.0.0.0:9999; el plugin de la GUI también tiene binding en 0.0.0.0 y ahora exige la misma clave de API

Related MCP server: idalib-mcp-headless

Requisitos

  • Linux, macOS o Windows

  • Python 3.11+ (usa idapyswitch con el que IDA coincida)

  • IDA Pro 8.3+ (se recomienda la 9.x). IDa Free no es compatible

  • uv

  • Un cliente de MCP (Claude Code, Cursor, Codex, Opencode, VS Code, ...)

Instalación

Activa idalib para tu entorno de uv:

# 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"

Los ejecuciones sin interfaz gráfica necesitan además el directorio de instalación de IDA en IDADIR.

Cómo ejecutar el supervisor sin interfaz gráfica (modo hosting)

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

Al iniciar, se generará una clave de API (o se cargará desde el disco) y toda petición que no la incluya recibirá 401 Unauthorized — no hay excepciones.

Obtén la clave una vez desde la máquina/red propietaria de la instancia:

curl http://your-host:9999/key
# {"key": "3f2b..."}   <- save it; this endpoint is now burned until restart
  • La clave se persistí en ~/.idapro/mcp/api_key (modo 0600) y sobrevive a reinicios; GET /key la vuelve a emitir una única vez cada vez que arranca el servidor

  • Se puede anular con IDA_MCP_API_KEY (o se puede reubicar con IDA_MCP_API_KEY_FILE)

  • Todos los demás endpoints la exigen en cada llamada:

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

La clave no se registra nunca en los logs.

Endpoints de hosting

Endpoint

Autorización

Propósito

GET /health

No

Sonda de disponibilidad: {"status":"ok","uptime":N,"sessions":N} — consulta en lugar de esperar

GET /sessions

Clave

Bases de datos abiertas incl. última acceso

POST /upload?filename=NAME

Clave

Subida de binario con el cuerpo bruto, transmitido en streaming a IDA_MCP_UPLOAD_DIR; devuelve la ruta para idb_open

# 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"

Opciones útiles:

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

Herramientas del ciclo de vida de las sesiones: idb_open, idb_list, idb_close — se abre una base de datos por sesión; cada sesión tiene su propio proceso aislado.

Ejecutar el proxy de la GUI (IDA interactivos)

Inicia el plugin en el IDA (Editar -> Plugins -> MCP, o Ctrl+Alt+M), y después:

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

Conecta un cliente de MCPpedar

Configuración JSON genérica (transporte HTTP):

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

Claude:

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

Para el proxy de la GUI por stdio, ejecuta uv run ida-pro-mcp --config y pega el JSON en tu cliente.

Configuración (variables de entorno)

Variable

Valor por defecto

Significado

IDA_MCP_OPEN_TIMEOUT

1800

Número máximo de segundos para abrir + análisis automático antes de terminar el proceso (0 = sin límite)

IDA_MCP_WORKER_CALL_TIMEOUT

900

Tope de seguridad de la llamada tool por cada worker

IDA_MCP_PROXY_TIMEOUT

900

Timeout del proxy de la GUI → IDA (0 = sin límite)

IDA_MCP_TRACE_MAX_MB

64

Límite de size del log de trazas almacenado dentro del IDB

IDA_MCP_MAX_WORKERS

4

Valo de --max-workers por defecto

IDA_MCP_HEALTH_TCP_TIMEOUT / IDA_MCP_HEALTH_RPC_TIMEOUT

2.0 / 10.0

Presupuestos de las sondas de disponibilidad

IDA_MCP_IDLE_TIMEOUT

60

Minutos de inactividad; se cierra automáticamente (0 = desactivado)

IDA_MCP_MAX_UPLOAD_MB

100

Límite para el cuerpo de POST /upload

IDA_MCP_UPLOAD_DIR

~/.idapro/mcp/uploads

Dónde se guardan los archivos subidos

IDA_MCP_API_KEY / IDA_MCP_API_KEY_FILE

– / ~/.idapro/mcp/api_key

Inyecta o mueve la clave dela instancia

IDA_MCP_SHUTDOWN_SAVE_TIMEOUT / IDA_MCP_SHUTDOWN_SAVE_BUDGET

30 / 120

Presupuesto de guardado por base de datos / total en apagado por SIGTERM

IDA_MCP_NO_UPDATE_CHECK

desactivado

Configuar a 1 para desactivar la comprobación de versiones en GitHub

Notas de seguridad: la clave de API protege todos los endpoints HTTP del supervisor y del plugin de la interface gráfica (el plugin puede ejecutar código arbitrario con py_eval, por lo que requiere autenticación incluso en local). Con la llave se puede controlar por completo la instancia; agrega un proxy inverso TLS si la clave va a salir de la red de confianza. Los exploradores pueden pasar la claves como ?key=<clave> (útil para /config.html).

A prueba

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

Related MCP Connectors

Related MCP Servers