
Servidor MCP que conecta la ingeniería inversa de Ghidra con herramientas de IA: 256 herramientas para descompilación, emulación P-code, depuración en vivo, análisis de flujo de datos, operaciones por lotes y aplicación de convenciones en modos headless y GUI.
Si te resulta útil, por favor ⭐ da una estrella al repositorio — ¡ayuda a que otros lo descubran!
Si Ghidra MCP te ahorra tiempo, considera patrocinar el proyecto. Tanto el apoyo único como el recurrente ayudan a financiar actualizaciones de compatibilidad, endurecimiento para producción, documentación y nuevas herramientas.
Un servidor Model Context Protocol (MCP) listo para producción que une las potentes capacidades de ingeniería inversa de Ghidra con herramientas modernas de IA y marcos de automatización. 271 herramientas MCP, flujos de trabajo de IA probados en batalla, y la integración Ghidra-MCP más completa disponible — incluyendo emulación P-code, integración con depurador en vivo y análisis de flujo de datos con PCode-graph.
La mayoría de las implementaciones de Ghidra MCP ofrecen un puñado de herramientas de solo lectura y ya está. Este proyecto es diferente — fue construido por un ingeniero inverso que lo usa a diario en binarios reales, no como demostración.
Te ha pasado: seis meses en un proyecto encuentras ProcessItem, process_items, handleItem, y ItemProc en la misma base de código — cuatro funciones haciendo lo mismo, nombradas por cuatro sesiones o ingenieros diferentes sin un contrato compartido. Arreglarlo lleva más tiempo del necesario, y el problema volverá a ocurrir.
v5.0 traslada las convenciones de "cosas para recordar" a la capa de herramientas, donde pueden ser realmente aplicadas.
Para agentes de IA, esto significa resultados consistentes en cada sesión, cada modelo, cada ejecución — sin pegar una guía de estilo en cada indicación. La herramienta conoce las reglas; el modelo solo necesita tomar la decisión.
Para equipos, elimina toda la clase de comentarios de revisión que dicen "esa no es nuestra convención de nombres". El arbitraje de convenciones permanece en la herramienta, no en la revisión de código.
Para trabajo en solitario a escala, analyze_function_completeness te da una puntuación del 0–100% que mide honestamente: las deducciones estructurales (artefactos del compilador no solucionables) se perdonan en tu puntuación efectiva, el escalado logarítmico evita que una categoría mala entierre todo lo demás, y la calidad de los comentarios por niveles significa que sabes exactamente qué falta y por qué.
Nota de compatibilidad: Los nombres de las herramientas MCP están normalizados para la CLI de GitHub Copilot y la validación CAPI. Los nombres de herramientas expuestos usan solo letras minúsculas, dígitos, guiones bajos y guiones; las rutas HTTP anidadas como
/debugger/statusse anuncian como nombres comodebugger_status_2cuando es necesario para evitar colisiones con herramientas puente estáticas.
EmulatorHelper de Ghidra; resuelve hashes API por fuerza bruta en milisegundosUsuarios de Servidor Ghidra compartido: los clientes Ghidra 12.1.2 requieren un Servidor Ghidra en versión 12.1, 12.0.5, o una versión compatible más reciente. Actualiza el servidor antes de usar este plugin desde un cliente 12.1.
Ghidra 12.1.2 incluye Jython como extensión opcional. Los scripts Java funcionan por defecto, pero los scripts
.pyenghidra_scripts/requieren instalar la extensión Jython desde File > Install Extensions y reiniciar Ghidra.
Recomendado para todas las plataformas: usa
python -m tools.setupdirectamente.
ensure-prereqsinstala los requisitos de Python en tiempo de ejecución más los JARs de Ghidra necesarios en el repositorio Maven local.deploycopia la compilación de salida, instala la extensión de perfil de usuario y parchea la configuración de usuario de Ghidra.
deploy guarda/cierra una instancia de Ghidra coincidente que ya se está ejecutando cuando
sea necesario, instala la extensión, inicia Ghidra, espera la salud de MCP y ejecuta
comprobaciones rápidas de esquema.
Ruta de compilación compatible: python -m tools.setup build usa Maven internamente y es el flujo de trabajo canónico utilizado por las tareas del repositorio y la documentación. ```bash
mvn clean package assembly:single -DskipTests
## Ligero y Extensible
- Dependencias mínimas: Solo usa la biblioteca estándar de `Python` cuando es posible, bibliotecas de terceros opcionales.
- Arquitectura de plugins: Amplía la funcionalidad con plugins personalizados para tareas únicas. ```bash
# Secondary/manual Gradle build path only (not used by tools.setup or VS Code tasks)
GHIDRA_INSTALL_DIR=/path/to/ghidra gradle buildExtension
Nota para Debian/Kali/Ubuntu 23.04+ (PEP 668): estas distribuciones marcan el Python del sistema como gestionado externamente, por lo que un simple
pip installfalla conerror: externally-managed-environment. No lo evites con--break-system-packages— puede corromper herramientas gestionadas por apt. En su lugar usa uv (recomendado — crea y gestiona automáticamente un.venvlocal del proyecto, y es lo que usan los comandos de este repositorio):curl -LsSf https://astral.sh/uv/install.sh | sh uv run bridge-mcp-ghidra # resuelve dependencias en .venv e inicia el puenteo un entorno virtual clásico:
python3 -m venv .venv && source .venv/bin/activate pip install -e . bridge-mcp-ghidra
Esto hará:
~/.m2/repository localGhidraMCP-<version>.zip con Maven~/.config/ghidra/ghidra_<version>_PUBLIC/Extensions/preferences con LastExtensionImportDirectoryRutas de Linux: La extensión se instala en
$HOME/.config/ghidra/ghidra_<version>_PUBLIC/Extensions/GhidraMCP/. Los archivos de configuración de Ghidra están en$HOME/.config/ghidra/ghidra_<version>_PUBLIC/.
La extensión se instala en ~/Library/ghidra/ghidra_12.1.2_PUBLIC/Extensions/GhidraMCP/.
Nota:
--ghidra-versiones necesario al usar la ruta de Homebrew porque la ruta no contiene una cadena de versión.
En la ventana principal del proyecto: Tools > GhidraMCP > Start MCP Server
~/.cursor/mcp.json): ```json
{
"mcpServers": {
"ghidra": {
"command": "uv",
"args": ["run", "--directory", "/path/to/ghidra-mcp", "bridge-mcp-ghidra"]
}
}
}
@Pandoriaantje mantiene los paquetes comunitarios de AUR:
ghidra-mcp-git — sigue la rama mainghidra-mcp — sigue las versiones etiquetadasInstálelo con su ayudante de AUR preferido, por ejemplo:
yay -S ghidra-mcp-git
# or
paru -S ghidra-mcp
``````bash
yay -S ghidra-mcp # or ghidra-mcp-git
uv run bridge-mcp-ghidra # or: python -m bridge_mcp_ghidra
Para agregar el puente a [Autohand Code](https://github.com/autohandai/code-cli/) desde un checkout clonado:```bash
autohand mcp add ghidra uv run --directory /path/to/ghidra-mcp bridge-mcp-ghidra
Agrega --scope project antes de ghidra para guardar el servidor en la configuración .autohand del proyecto actual en lugar de la configuración de usuario.
uv run bridge-mcp-ghidra --transport streamable-http --mcp-host 127.0.0.1 --mcp-port 8081
Configuración del cliente MCP para el transporte HTTP (agregar al archivo de configuración MCP de su cliente):```json
{
"mcpServers": {
"ghidra-mcp-http": {
"url": "http://127.0.0.1:8081/mcp"
}
}
}
Clientes basados en navegador (ej. MCP Inspector) funcionan sin configuración adicional: los transportes HTTP responden a las solicitudes de preflight CORS (OPTIONS) y exponen los encabezados mcp-session-id / mcp-protocol-version a los scripts. Los orígenes permitidos siguen la política del encabezado Host — el loopback en cualquier puerto siempre está permitido, además del host de enlace y cualquier host listado en GHIDRA_MCP_ALLOWED_HOSTS.
uv run bridge-mcp-ghidra --transport sse --mcp-host 127.0.0.1 --mcp-port 8081
#### Banderas avanzadas del puente
| Indicador | Valor predeterminado | Descripción |
|-----------|---------------------|-------------|
| `--transport` | `stdio` | `stdio` (herramientas de IA), `streamable-http` (clientes web), `sse` (obsoleto) |
| `--mcp-host` | `127.0.0.1` | Host de enlace para transportes HTTP |
| `--mcp-port` | — | Puerto para transportes HTTP |
| `--lazy` | off | Carga solo los grupos de herramientas predeterminados al conectar. Inicio más rápido, pero los clientes MCP que no soportan `tools/list_changed` verán una lista de herramientas incompleta. No recomendado para Claude Code. |
| `--no-lazy` | (default) | Carga todos los grupos de herramientas inmediatamente al conectar. Requerido para la mayoría de los clientes de IA. |
| `--default-groups` | `listing,function,program` | Grupos separados por comas cargados al conectar cuando se establece `--lazy`. |
#### Enrutamiento estricto de programas (seguridad multiprograma)
Establece `GHIDRA_MCP_REQUIRE_PROGRAM_SELECTORS=1` para que el puente rechace cualquier llamada con ámbito de programa que omita un selector de programa, devolviendo un error claro en lugar de permitir que la llamada utilice el "programa actual" compartido del servidor (el que mueven `switch_program` y la pestaña activa de la GUI).```bash
export GHIDRA_MCP_REQUIRE_PROGRAM_SELECTORS=1
uv run bridge-mcp-ghidra
Sin esto, una llamada que omita program= se ejecuta contra el programa que esté activo, lo cual está bien para un flujo de trabajo con un solo programa, pero es un riesgo una vez que varios programas están abiertos: la llamada puede leer o editar el binario equivocado sin error. El riesgo es peor cuando más de un cliente comparte un servidor, ya que cada uno mueve la variable global del programa actual por debajo de los demás.
Con el modo estricto activado, cada llamada con ámbito de programa debe nombrar su objetivo. Esto cubre todo selector que elija un programa abierto: el simple program= y los source_program/target_program o program_a/program_b de las herramientas entre programas (declarados como obligatorios, pero el servidor aún recurre al programa actual cuando uno llega vacío). Un selector olvidado se manifiesta como un error ruidoso en la primera llamada incorrecta en lugar de una escritura silenciosa en el binario equivocado. Las herramientas sin selector de programa (open_program y close_program toman path/name) no se ven afectadas. Desactivado por defecto: con la variable sin establecer, el puente envía las llamadas sin cambios.
El puente expone un catálogo grande. Para mantener pequeña la superficie de herramientas del modelo, ejecuta con --lazy (carga solo listing,function,program al conectar) y deja que el modelo descubra el resto bajo demanda en lugar de registrar todo:
search_tools("rename function") — búsqueda por palabras clave en el catálogo completo, incluyendo herramientas cuyo grupo no está cargado. Cada resultado indica si se puede llamar ahora y, si no, la llamada exacta load_tool_group(...) para habilitarlo.list_tool_groups() — lista todas las categorías y su estado de carga.load_tool_group("datatype") / unload_tool_group("datatype") — cargar o eliminar una categoría en tiempo de ejecución.check_tools("rename_or_label,batch_set_comments") — confirma que herramientas específicas se pueden llamar en este momento.search_tools funciona tanto en modo eager como en modo --lazy, por lo que los agentes que respetan tools/list_changed obtienen descubrimiento completo sin el costo inicial de contexto.
uv sync --group debugger uv run python -m debugger
El servidor de depuración escucha en `http://127.0.0.1:8099/` por defecto y es necesario para las herramientas proxy `debugger_*` expuestas por el puente MCP.
Banderas del servidor de depuración:
| Bandera | Predeterminado | Descripción |
|------|---------|-------------|
| `--port` | `8099` | Puerto del servidor HTTP |
| `--host` | `127.0.0.1` | Dirección de enlace (`0.0.0.0` para exponer en LAN) |
| `--exports-dir` | — | Ruta a un directorio `dll_exports/` para resolución de ordinal a nombre |
| `--log-level` | `INFO` | `DEBUG`, `INFO`, `WARNING` o `ERROR` |
Establece `GHIDRA_DEBUGGER_URL` en `.env` si cambias el puerto o host predeterminado para que el puente pueda encontrarlo.
#### En Ghidra
1. Inicia Ghidra y abre una ventana de **CodeBrowser**
2. En **CodeBrowser**, habilita el plugin mediante **File > Configure > Configure All Plugins > GhidraMCP**
3. Opcional: configura el puerto personalizado mediante **CodeBrowser > Edit > Tool Options > GhidraMCP HTTP Server**
4. Inicia el servidor mediante **Tools > GhidraMCP > Start MCP Server**
5. El servidor se ejecuta en `http://127.0.0.1:8089/` por defecto
#### Verificar que funciona```bash
# Quick health check
curl http://127.0.0.1:8089/check_connection
# Expected: "Connected: GhidraMCP plugin running with program '<name>'"
# Get version info
curl http://127.0.0.1:8089/get_version
Si Ghidra MCP te ahorra tiempo de ingeniería o ingeniería inversa, considera patrocinar el proyecto.
GhidraMCP está diseñado para desarrollo solo en localhost. La configuración predeterminada — servidor HTTP vinculado a 127.0.0.1, sin autenticación — es segura en una estación de trabajo confiable de un solo usuario y coincide con el comportamiento anterior a v5.4.1.
Si expones el servidor más allá del loopback, configura primero estas tres variables de entorno. El servidor se niega a iniciarse en un enlace que no sea loopback sin un token.
La aplicación de la calidad de nombres es independiente de la seguridad. Por defecto,
rename_function_by_address y los endpoints de escritura global rechazan nombres que fallan
las puertas de calidad incorporadas, y las escrituras de campos de struct aplican la convención de prefijo de campo incorporada. Desactive la capa de convención incorporada con Edit > Tool
Options > GhidraMCP HTTP Server > Strict Naming Enforcement. La misma casilla de Tool Options cubre rename_data, rename_global_variable,
set_global, la guarda de prefijo/tipo de apply_data_type, y las autocorrecciones de prefijo húngaro de campos de struct en create_struct, add_struct_field, y
modify_struct_field. La configuración se lee cuando el servidor MCP se inicia o reinicia. Las advertencias de convención de funciones/globales aún se devuelven cuando la aplicación está deshabilitada.
export GHIDRA_MCP_AUTH_TOKEN=$(openssl rand -hex 32) export GHIDRA_MCP_ALLOW_SCRIPTS=1 # only if your workflow needs it export GHIDRA_MCP_FILE_ROOT=/srv/ghidra/inputs
java -jar GhidraMCPHeadless.jar --bind 0.0.0.0 --port 8089
### Autenticación del servidor Ghidra
Al conectarse a un servidor Ghidra compartido, GhidraMCP puede suprimir el diálogo de contraseña automáticamente. Resuelve las credenciales en este orden (el primer valor no vacío es el que se usa):
Nota de compatibilidad: Los clientes Ghidra 12.1.2 requieren Ghidra Server 12.1.2,
12.0.5 o un servidor compatible más reciente. Los servidores compartidos antiguos no son objetivos seguros para una actualización del cliente 12.1.
1. `GHIDRA_SERVER_PASSWORD` variable de entorno (o archivo `.env` en el directorio de instalación de Ghidra o `~`)
2. `~/.ghidra-cred` — archivo de contraseña de una sola línea en tu directorio personal
3. `<ghidra-install-dir>/.ghidra-cred`
El nombre de usuario se resuelve de manera similar: `GHIDRA_SERVER_USER` variable de entorno → propiedad del sistema `user.name`.
Si no se encuentra una contraseña, Ghidra muestra su diálogo GUI normal. Configúralos en `.env` (consulta `.env.template` para el bloque completo) para habilitar la autenticación silenciosa.
### Migración de v5.4.0 → v5.4.1
- **Los endpoints de scripts ahora están desactivados por defecto.** Si dependías de `/run_script_inline` o `/run_ghidra_script`, exporta `GHIDRA_MCP_ALLOW_SCRIPTS=1`. Este es un cambio deliberado que rompe la compatibilidad; el valor predeterminado anterior no era seguro.
- **Las implementaciones solo en localhost no necesitan cambios.** La autenticación, el rechazo de enlace y las comprobaciones de ruta raíz son opcionales.
## ❓ Solución de problemas
### El menú "GhidraMCP" no aparece en Herramientas
**Causa:** Plugin no habilitado o instalado incorrectamente.
**Solución:**
1. Verifica que la extensión esté instalada: **Archivo > Instalar extensiones** — GhidraMCP debería aparecer listado
2. Habilita el plugin: **Archivo > Configurar > Configurar todos los plugins > GhidraMCP** (marca la casilla)
3. **Reinicia Ghidra** después de la instalación/habilitación
### El servidor no responde / Conexión rechazada
**Causa:** Servidor no iniciado o puerto incorrecto.
**Solución:**
1. Asegúrate de haber iniciado el servidor: **Herramientas > GhidraMCP > Iniciar servidor MCP**
2. Verifica el puerto configurado: **Editar > Opciones de herramienta > Servidor HTTP GhidraMCP**
3. Verifica si el puerto está en uso: ```bash
# Linux/macOS
lsof -i :8089
# Windows
netstat -ano | findstr :8089
pip install falla con error: externally-managed-environmentCausa: PEP 668. Las distribuciones de la familia Debian (Debian 12+, Kali, Ubuntu 23.04+) marcan el Python del sistema como administrado externamente, por lo que el pip install global está bloqueado para proteger los paquetes administrados por apt.
Solución: Usa un entorno virtual — nunca --break-system-packages. La ruta recomendada es uv, que gestiona automáticamente un .venv local del proyecto:```bash
curl -LsSf https://astral.sh/uv/install.sh | sh
cd ghidra-mcp
uv run bridge-mcp-ghidra
O un venv clásico:```bash
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
bridge-mcp-ghidra
python -m debugger falla con ModuleNotFoundError para pybag o comtypesCausa: El servidor de depuración independiente utiliza dependencias opcionales de Python solo para Windows que no están instaladas por defecto.
Solución:```text uv sync --group debugger uv run python -m debugger
Si tienes tanto un Python global como un venv de proyecto, asegúrate de instalar
y ejecutar desde el mismo intérprete.
### Errores internos del servidor 500
**Causa:** Excepción del lado del servidor, a menudo debido a datos de programa faltantes.
**Solución:**
1. Asegúrate de que un binario esté cargado en CodeBrowser
2. Ejecuta primero el análisis automático: **Analysis > Auto Analyze**
3. Revisa la consola de Ghidra (**Window > Console**) en busca de excepciones de Java
4. Algunas operaciones requieren binarios completamente analizados
### Errores 404 No encontrado
**Causa:** El endpoint no existe o la URL es incorrecta.
**Solución:**
1. Verifica que el endpoint exista: `curl http://127.0.0.1:8089/get_version`
2. Revisa si hay errores tipográficos en el nombre del endpoint
3. Asegúrate de estar usando el método HTTP correcto (GET vs POST)
### Los scripts de Python en Ghidra fallan con "No script provider found"
**Causa:** En Ghidra 12.1.2, el soporte de Jython ya no está habilitado por
defecto. Los scripts `.py` necesitan la extensión Jython incluida; los scripts de Python 3
deben usar PyGhidra en lugar del Ghidra Script Manager.
**Solución:**
1. En la interfaz principal de Ghidra, abre **File > Install Extensions**.
2. Marca **Jython**, reinicia Ghidra, luego actualiza el Script Manager.
3. Para nueva automatización, prefiere scripts Java de Ghidra o PyGhidra.
### La extensión no aparece en Install Extensions
**Causa:** El archivo JAR está en una ubicación incorrecta.
**Solución:**
1. Ubicación de instalación manual: `~/.ghidra/ghidra_12.1.2_PUBLIC/Extensions/GhidraMCP/lib/GhidraMCP.jar`
2. O usa: **File > Install Extensions > Add** y selecciona el archivo ZIP
3. Asegúrate de que el JAR/ZIP fue compilado para tu versión de Ghidra
### La compilación falla con "Ghidra dependencies not found"
**Causa:** Los JARs de Ghidra no están instalados en el repositorio local de Maven.
**Solución:**```text
# Windows (recommended)
python -m tools.setup install-ghidra-deps --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
271 herramientas MCP respaldadas por puntos finales HTTP, agrupadas por categoría de catálogo. Generado desde tests/endpoints.json por python -m tools.gen_readme_api_reference --write; el esquema en vivo en /mcp/schema es autoritativo en tiempo de ejecución. Patrones de uso: docs/prompts/TOOL_USAGE_GUIDE.md.
analysis_status - Obtener el estado de auto-análisis para programas abiertosclose_program - Cerrar un programa abierto por ruta o nombre de proyectocreate_property_map - Crear un mapa de propiedades de usuario para almacenar valores tipados indexados por direccióndelete_property_map - Eliminar un mapa de propiedades de usuario y todos los valores que contieneexit_ghidra - Guardar y salir de Ghidraget_address_spaces - Listar todos los espacios de direcciones físicos y superpuestos en el programa (las superposiciones incluyen la bandera is_overlay y el nombre del espacio superpuesto)get_current_program_info - Obtener información del programa actualget_language_metadata - Volcar la descripción del lenguaje del programa: espacios de direcciones, registros, símbolos predeterminados, endianidad, tamaño de puntero (issue #192)get_program_options - Leer todas las opciones en un grupo de opciones de programa con tipos, valores actuales, valores predeterminados y descripcionesget_property - Leer el valor almacenado en una dirección en un mapa de propiedadescreate_folder - Crear una carpeta en el proyectodelete_file - Eliminar un archivo del proyectodelete_project - Eliminar un proyecto Ghidralist_projects - Listar proyectos Ghidra disponiblesmove_file - Mover un archivo a otra carpeta del proyectomove_folder - Mover una carpeta a otra ubicaciónproject_info - Obtener información detallada del proyecto incluyendo herramientas en ejecución y programas abiertosDisponible en el servidor headless independiente (GhidraMCPHeadlessServer).
archive_project - Archivar el proyecto actualmente abierto en un archivo .gar nativo de Ghidracheckin_program - Registrar un programa abierto de nuevo en el Servidor Ghidra compartido como una nueva versiónclose_project - Cerrar el proyecto actualmente abiertocreate_project - Crear un nuevo proyecto Ghidraexport_program - Exportar un programa abierto o residente en el proyecto a un Archivo Zip Ghidra (.gzf)get_project_info - Obtener información sobre el proyecto actualmente abiertoimport_program - Importar un Archivo Zip Ghidra (.gzf) en el proyecto actualmente abierto como un nuevo DomainFile dentro de target_folder (por defecto '/')load_program - Cargar un archivo binario en el servidor headless para análisisload_program_from_project - Cargar programa desde el proyecto Ghidra (headless)open_project - Abrir un proyecto Ghidra existente (archivo .gpr o directorio)restore_project - Restaurar un archivo .gar de Ghidra en un proyecto nuevo en disco en list_bookmarks - Listar marcadoreslist_calling_conventions - Listar convenciones de llamada disponibleslist_classes - Listar nombres de espacios de nombres/claseslist_data_items - Listar datos definidoslist_data_items_by_xrefs - Listar datos ordenados por cantidad de referencias cruzadaslist_exports - Listar símbolos exportadoslist_external_locations - Listar ubicaciones externaslist_functions - Listar funciones con direccioneslist_functions_enhanced - Listar funciones con metadatoslist_globals - Listar variables globaleslist_imports - Listar símbolos importadoslist_methods - Listar todos los nombres de funciones con paginaciónget_current_address - Obtener dirección del cursor (solo GUI)get_current_function - Obtener función en el cursor (solo GUI)get_current_selection - Obtener rangos de direcciones resaltados en el listado de CodeBrowser (solo GUI)get_entry_points - Obtener puntos de entrada del programaget_enum_values - Obtener valores de enumeraciónget_external_location - Obtener detalles de ubicación externaget_full_call_graph - Obtener grafo de llamadas completoget_function_by_address - Obtener función en direcciónget_function_call_graph - Obtener grafo de llamadasget_function_callees - Obtener funciones llamadasget_function_callers - Obtener funciones llamantesfind_similar_functions - Encontrar funciones similaressearch_byte_patterns - Buscar patrones de bytessearch_data_types - Buscar tipos de datossearch_functions - Buscar funciones por nombresearch_functions_enhanced - Búsqueda avanzada de funcionessearch_strings - Buscar cadenas definidas por un patrón regex/subcadenadecompile_function - Descompilar funcióndisassemble_bytes - Desensamblar rango de bytesdisassemble_function - Desensamblar funciónforce_decompile - Forzar descompilación nuevaadd_function_tag - Adjuntar una o más etiquetas a una funciónbatch_add_function_tags - Adjuntar etiquetas a muchas funciones en una sola transacciónbatch_remove_function_tags - Desvincular etiquetas de muchas funciones en una sola transacciónclear_flow_and_repair - Ejecutar la acción de GUI 'Clear Flow and Repair' de Ghidra en un rango semilla: limpia el flujo de instrucciones alcanzable desde la semilla, luego repara cuerpos de función y re-desensambla el flujo retenido (ClearFlowAndRepairCmd con clear_data=false, clear_labels=false, repair=true)create_function_tag - Crear una definición de etiqueta de función a nivel de programa con un comentario opcionaldelete_function_tag - Eliminar una definición de etiqueta de función a nivel de programaget_function_tags - Listar todas las etiquetas asignadas a una función específicalist_class_members - Listar las funciones miembro de una clase C++list_function_tags - Listar todas las definiciones de etiquetas de función a nivel de programa con sus conteos de usoremove_function_tag - Desvincular una o más etiquetas de una funciónadd_memory_reference - Crear una referencia cruzada definida por el usuario entre dos direcciones de memoria que el auto-analizador no puede inferir (tablas de punteros pobladas en tiempo de ejecución, vtables, punteros a funciones de enlace tardío, tablas de salto/switch omitidas)get_bulk_xrefs - Obtener referencias cruzadas para múltiples direccionesget_function_xrefs - Obtener referencias cruzadas de funcionesget_xrefs_from - Obtener referencias desde una direcciónget_xrefs_to - Obtener referencias hacia una direcciónremove_reference - Eliminar referencia(s) cruzada(s) de memoria de una dirección a otra — la inversa de add_memory_referenceadd_struct_field - Agregar campo de estructuraanalyze_global_completeness - Puntuar la completitud de documentación de una variable global en una escala presupuestada de 0 a 100 — el análogo de dirección de datos de analyze_function_completenessapply_data_type - Aplicar tipo de datoaudit_global - Auditar el estado de documentación de una variable globalaudit_globals_in_function - Auditar cada variable global referenciada desde dentro de una función en una sola llamadabatch_set_variable_types - Establecer múltiples tipos de variablesclone_data_type - Clonar tipo de datocreate_array_type - Crear tipo de arreglocreate_data_type_category - Crear categoría de tipo de datocreate_enum - Crear enumeracióncreate_function_signature - Crear tipo de firma de funciónbatch_create_labels - Crear múltiples etiquetasbatch_delete_labels - Eliminar múltiples etiquetasbatch_rename_function_components - Renombrar por lotes componentes de funcióncreate_label - Crear etiquetadelete_label - Eliminar etiqueta en direcciónrename_data - Renombrar símbolo de datorename_external_location - Renombrar ubicación externarename_function - Renombrar función por nombrerename_function_by_address - Renombrar función por direcciónrename_global_variable - Renombrar variable globalrename_label - Renombrar etiquetarename_or_label - Renombrar o crear etiquetabatch_set_comments - Establecer múltiples comentariosclear_function_comments - Limpiar todos los comentarios de una funcióndelete_bookmark - Eliminar marcadorget_comment - Obtener comentarios de listado (plate/pre/eol/post/repeatable) en CUALQUIER dirección, incluyendo direcciones de datos (a diferencia de get_plate_comment que requiere una función)get_plate_comment - Obtener comentario de placaset_bookmark - Establecer marcadorset_comment - Establecer un comentario de listado de un tipo dado (plate/pre/eol/post/repeatable) en CUALQUIER dirección, incluyendo direcciones de datosset_decompiler_comment - Establecer PRE_COMMENTset_disassembly_comment - Establecer EOL_COMMENTset_plate_comment - Establecer comentario de placaanalyze_api_call_chains - Analizar cadenas de llamadas APIanalyze_call_graph - Analizar patrones de grafo de llamadas de funcionesanalyze_control_flow - Analizar flujo de controlanalyze_data_region - Analizar región de datosanalyze_dataflow - Rastrear propagación de valores a través de una función (grafo PCode, hacia adelante/atrás)analyze_for_documentation - Análisis compuesto de documentación RE (descompilar + clasificar + variables + completitud)analyze_function_complete - Análisis completo de función en una sola llamadaanalyze_function_completeness - Analizar completitud de documentaciónanalyze_struct_field_usage - Analizar uso de campos de estructuraapply_data_classification - Aplicar clasificación de datosbatch_analyze_completeness - Analizar completitud por lotes para múltiples funcionesarchive_ingest_function - Ingerir la documentación de una única función en el archivo entre versiones (re_kb.functions en bsim Postgres)archive_ingest_program - Ingerir masivamente cada función de un programa en el archivo de documentación entre versionesbatch_string_anchor_report - Informe de cadenas de archivo fuente y sus funciones FUN_*bulk_fuzzy_match - Coincidencia masiva de funciones entre binariosfind_similar_functions_fuzzy - Coincidencia difusa de funciones entre binariosmerge_program_documentation - Fusión masiva: copiar toda la documentación RE (nombres de función, firmas, comentarios de placa, comentarios de instrucción en EOL/PRE/POST, etiquetas no predeterminadas y símbolos globales) de un programa a otro en direcciones coincidentesapply_function_documentation - Aplicar documentación de funcióncheck_connection - Punto final de verificación de estadocompare_programs_documentation - Comparar documentación entre programasconvert_number - Convertir número entre basesdiff_functions - Diferenciar dos funcionesfind_undocumented_by_string - Encontrar funciones sin documentar que referencian una cadenaget_bulk_function_hashes - Obtener hashes masivos de funcionesget_function_documentation - Exportar documentación de funciónget_function_hash - Obtener hash de funciónget_function_signature - Obtener firma característica de funciónget_metadata - Obtener metadatos del programaemulate_function - Emular una sola función con entradas controladas de registros/memoriaemulate_hash_batch - Resolución por fuerza bruta de hash APIrun_ghidra_script - Ejecutar script con captura de salidarun_script_inline - Ejecutar código de script en líneaserver_admin_set_permissions - Establecer permisos de usuario en un repositorioserver_admin_terminate_all_checkouts - Terminar todas las reservas en una carpeta de forma recursivaserver_admin_terminate_checkout - Terminar todas las reservas en un solo archivoserver_admin_users - Listar todos los usuarios en el servidorserver_authenticate - Registrar credenciales del servidor para autenticación programáticaserver_checkouts - Listar todos los archivos reservados en una carpeta, incluyendo reservas del lado del servidorserver_connect - Conectar a un servidor Ghidraserver_disconnect - Desconectar del servidor Ghidraserver_repositories - Listar repositorios en el servidor conectadoserver_repository_create - Crear un nuevo repositorio en el servidorserver_repository_file - Obtener información de archivo de un repositorio del servidorEn hosts Windows donde el proxy del depurador WinDbg del puente está activo (GHIDRA_DEBUGGER_URL), los nombres que colisionan reciben un sufijo _2 (por ejemplo, debugger_status_2).
debugger_dynamic_to_static - Traducir una dirección dinámica en tiempo de ejecución del rastreo actual de vuelta a una dirección estática del programa Ghidradebugger_interrupt - Interrumpir (irrumpir en) el objetivo en ejecucióndebugger_launch - Lanzar un ejecutable a través del lanzador de depurador Trace RMI de Ghidradebugger_launch_offers - Listar opciones disponibles de lanzamiento/adjuntar del depurador para el programa actualdebugger_list_breakpoints - Listar todos los puntos de interrupción en el rastreo actualdebugger_modules - Listar módulos (DLLs/EXEs) cargados en el proceso depuradodebugger_read_memory - Leer memoria del proceso depuradodebugger_registers - Leer registros de la CPU de la instantánea de rastreo de depuración actualdebugger_remove_breakpoint - Eliminar un punto de interrupción en una direccióndebugger_resume - Reanudar la ejecución del proceso depuradoprompt_policy - Habilitar, deshabilitar o consultar temporalmente el manejo de indicaciones de automatización con ámbitodebugger_* de WinDbg cuando GHIDRA_DEBUGGER_URL apunta al servidor de depuración independiente.check_tools - Informar qué herramientas están actualmente registradas y se pueden invocarconnect_instance - Conectar el puente a una instancia específica de Ghidraimport_file - Importar un binario desde el disco al proyecto actual y abrirlolist_instances - Descubrir instancias de Ghidra MCP en ejecución (UDS + escaneo de puertos TCP)list_tool_groups - Listar grupos de herramientas y su estado de cargaload_tool_group - Registrar las herramientas dinámicas de un grupo de herramientas con el cliente MCPsearch_tools - Buscar en el catálogo completo de herramientas por palabra claveunload_tool_group - Desregistrar las herramientas dinámicas de un grupo de herramientasVer CHANGELOG.md para el historial de versiones.
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ AI/Automation │◄──►│ MCP Bridge │◄──►│ Ghidra Plugin │ │ Tools │ │ (bridge_mcp_ │ │ (GhidraMCP.jar) │ │ (Claude, etc.) │ │ ghidra/) │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ │ │ MCP Protocol HTTP REST Ghidra API (stdio/streamable-http) (localhost:8089) (Program, Listing)
### Componentes
- **python/bridge_mcp_ghidra/** — Paquete del servidor MCP en Python (se distribuye como el wheel `ghidra-mcp-bridge`; script de consola `bridge-mcp-ghidra`) que traduce el protocolo MCP a llamadas HTTP (225 entradas del catálogo)
- **GhidraMCP.jar** — Plugin de Ghidra que expone capacidades de análisis a través de HTTP (175 puntos finales de GUI)
- **GhidraMCPHeadlessServer** — Servidor headless independiente — 183 puntos finales, no requiere GUI
- **ghidra_scripts/** — Colección de scripts de automatización para tareas comunes
## 🔧 Desarrollo
### Construcción desde el código fuente```bash
# Recommended: direct Python-first workflow
python -m tools.setup ensure-prereqs --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
python -m tools.setup build
python -m tools.setup deploy --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
# Version bump (updates all maintained version references atomically)
python -m tools.setup bump-version --new X.Y.Z
El sistema de compilación autoritativo hoy en día es Maven. tools.setup, las tareas de VS Code y el flujo de despliegue documentado compilan a través de pom.xml y escriben artefactos en target/. build.gradle permanece en el repositorio como respaldo manual para los usuarios directos de Ghidra/Gradle, pero no es la ruta principal.
Banderas comunes aceptadas por la mayoría de los comandos:
Los niveles de prueba de despliegue son optativos porque los niveles de referencia pueden importar/restablecer Benchmark.dll y BenchmarkDebug.exe en el proyecto Ghidra activo. Use --test release antes de lanzar versiones, o establezca GHIDRA_MCP_DEPLOY_TESTS=release en un .env local cuando desee que cada despliegue en su máquina ejecute la regresión de referencia en vivo. Consulte Testing and Release Regression.```text
python -m tools.setup ensure-prereqs --ghidra-path "C:\ghidra_12.1.2_PUBLIC" python -m tools.setup build python -m tools.setup deploy --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
python -m tools.setup preflight --strict --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
python -m tools.setup bump-version --new X.Y.Z --tag
python -m tools.setup run-tests
python -m tools.setup --help
### Estructura del proyecto```
ghidra-mcp/
├── pyproject.toml # uv project (ghidra-mcp-bridge wheel + dependency groups)
├── python/bridge_mcp_ghidra/ # MCP server package (Python, 225 catalog entries)
├── src/main/java/ # Ghidra plugin + headless server (Java)
│ └── com/xebyte/
│ ├── GhidraMCPPlugin.java # GUI plugin (196 endpoints)
│ ├── headless/ # Headless server (183 endpoints)
│ └── core/ # Shared service layer (12 services)
├── debugger/ # Optional standalone debugger server (port 8099)
├── ghidra_scripts/ # Automation scripts for batch workflows
├── tests/ # Python unit tests + endpoint catalog
│ ├── unit/ # Catalog consistency, schema, tool function tests
│ └── endpoints.json # Endpoint specification (225 entries)
├── docs/ # Documentation
│ ├── prompts/ # AI workflow prompts (V5 documentation workflows)
│ ├── releases/ # Version release notes
│ └── project-management/ # Contributor planning docs (Gradle migration, etc.)
├── tools/setup/ # Build and deployment CLI (python -m tools.setup)
├── fun-doc/ # Internal RE curation tool — not part of the MCP plugin
│ # Priority-queue worker, LLM scoring, web dashboard.
│ # See fun-doc/README.md for details.
└── .github/workflows/ # CI/CD pipelines
Los JARs de Ghidra deben instalarse en su repositorio local de Maven (~/.m2/repository) antes de la compilación.
Esta es una configuración única por máquina, y de nuevo cuando su versión de Ghidra cambie.
-Deploy ahora instala estos automáticamente por defecto.
La herramienta impone consistencia de versiones entre:
pom.xml (ghidra.version)--ghidra-path (por ejemplo, ghidra_12.1.2_PUBLIC)Si estos no coinciden, el despliegue falla rápidamente con un error claro.
Si ve un error de desajuste de versión, alinee ambos valores:
pom.xml → ghidra.version--ghidra-path (ghidra_X.Y.Z_PUBLIC)Luego vuelva a ejecutar:
mvn clean install -Deploy
``````text
python -m tools.setup preflight --ghidra-path "C:\ghidra_12.1.2_PUBLIC"
I notice that the input content after "INPUT:" is empty — there is no Markdown text provided to translate. Since there is nothing to translate, I will output nothing. If you have the actual content, please provide it and I will translate it according to the rules.```text
python -m tools.setup install-ghidra-deps --ghidra-path "C:\path\to\ghidra_12.1.2_PUBLIC"
**Bibliotecas requeridas (14 JARs, ~37MB):**
| Biblioteca | Ruta de origen | Propósito |
|---------|------------|---------|
| **Base.jar** | `Features/Base/lib/` | Funcionalidad principal de Ghidra |
| **Decompiler.jar** | `Features/Decompiler/lib/` | Motor de descompilación |
| **PDB.jar** | `Features/PDB/lib/` | Soporte de símbolos PDB de Microsoft |
| **FunctionID.jar** | `Features/FunctionID/lib/` | Identificación de funciones |
| **SoftwareModeling.jar** | `Framework/SoftwareModeling/lib/` | API del modelo de programa |
| **Project.jar** | `Framework/Project/lib/` | Gestión de proyectos |
| **Docking.jar** | `Framework/Docking/lib/` | Marco de acoplamiento de IU |
| **Generic.jar** | `Framework/Generic/lib/` | Utilidades genéricas |
| **Utility.jar** | `Framework/Utility/lib/` | Utilidades principales |
| **Gui.jar** | `Framework/Gui/lib/` | Componentes de interfaz gráfica |
| **FileSystem.jar** | `Framework/FileSystem/lib/` | Soporte de sistema de archivos |
| **Graph.jar** | `Framework/Graph/lib/` | Análisis de grafos/grafos de llamadas |
| **DB.jar** | `Framework/DB/lib/` | Operaciones de base de datos |
| **Emulation.jar** | `Framework/Emulation/lib/` | Emulación de P-código |
> **Nota**: Las bibliotecas NO están incluidas en el repositorio (ver `.gitignore`). Debe instalarlas desde su instalación de Ghidra antes de compilar.
> **Punto de entrada de automatización**:
> - `python -m tools.setup` es la interfaz compatible de configuración/compilación/despliegue/versión
> - use `ensure-prereqs`, `build`, `deploy`, `preflight`, `clean-all` y `bump-version` directamente
> - estos comandos actualmente usan Maven como el backend de compilación Java canónico
### Funcionalidades de desarrollo
- **Despliegue automatizado**: Script de despliegue consciente de versiones
- **Operaciones por lotes**: Reduce las llamadas a la API en un 93%
- **Transacciones atómicas**: Semántica de todo o nada
- **Registro completo**: Capacidades de depuración y rastreo
## 📚 Documentación
### Documentación principal
- [Índice de documentación](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/README.md) - Navegación completa por la documentación
- [Estructura del proyecto](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/PROJECT_STRUCTURE.md) - Guía de organización del proyecto
- [Pruebas y Regresión de versión](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/TESTING.md) - Pruebas locales, CI, regresión en vivo de Ghidra y puertas de versión
- [Convenciones de nomenclatura](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/NAMING_CONVENTIONS.md) - Estándares de nomenclatura de código
- [Notación húngara](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/HUNGARIAN_NOTATION.md) - Guía de nomenclatura de variables
### Indicaciones de flujo de trabajo de IA
- [Documentación de funciones V5](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/FUNCTION_DOC_WORKFLOW_V5.md) — Flujo de trabajo principal: proceso de 7 pasos con notación húngara, auditoría de tipos y puntuación de verificación
- [Documentación por lotes V5](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/FUNCTION_DOC_WORKFLOW_V5_BATCH.md) — Despacho paralelo de subagentes para procesamiento multifunción
- [Descubrimiento de código huérfano](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/ORPHANED_CODE_DISCOVERY_WORKFLOW.md) — Escáner automatizado para funciones no descubiertas
- [Investigación de tipos de datos](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/DATA_TYPE_INVESTIGATION_WORKFLOW.md) — Descubrimiento sistemático de estructuras
- [Coincidencia entre versiones](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/CROSS_VERSION_MATCHING_COMPREHENSIVE.md) — Coincidencia de funciones basada en hash
- [Indicación de inicio rápido](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/QUICK_START_PROMPT.md) — Flujo de trabajo simplificado para principiantes
- [Todas las indicaciones](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/prompts/README.md) — Índice completo de indicaciones
### Historial de versiones
- [Registro de cambios completo](https://github.com/bethington/ghidra-mcp/blob/HEAD/CHANGELOG.md) - Notas de todas las versiones
- [Notas de versión](https://github.com/bethington/ghidra-mcp/blob/HEAD/docs/releases/) - Documentación detallada de versiones
## 🐳 Servidor sin interfaz gráfica (Docker)
GhidraMCP incluye un modo de servidor sin interfaz gráfica para análisis automatizado sin la GUI de Ghidra.
### Inicio rápido con Docker```bash
# Build and run
docker-compose up -d ghidra-mcp
# Test connection
curl http://localhost:8089/check_connection
# Connection OK - GhidraMCP Headless Server v5.17.0
curl -X POST -d "file=/data/program.exe" http://localhost:8089/load_program
curl -X POST http://localhost:8089/run_analysis
curl "http://localhost:8089/list_functions?limit=20"
curl "http://localhost:8089/decompile_function?address=0x401000"
curl http://localhost:8089/get_metadata
### Endpoints Headless Clave
| Endpoint | Método | Descripción |
|----------|--------|-------------|
| `/load_program` | POST | Cargar archivo binario para análisis |
| `/run_analysis` | POST | Ejecutar análisis automático de Ghidra |
| `/list_functions` | GET | Listar todas las funciones descubiertas |
| `/list_exports` | GET | Listar símbolos exportados |
| `/list_imports` | GET | Listar símbolos importados |
| `/decompile_function` | GET | Descompilar función a código C |
| `/create_function` | POST | Crear función en dirección |
| `/get_metadata` | GET | Obtener metadatos del programa |
| `/create_project` | POST | Crear un proyecto Ghidra |
| `/list_analyzers` | GET | Listar analizadores disponibles |
| `/server/status` | GET | Verificar conexión al servidor Ghidra |
### Configuración
Variables de entorno para Docker:
- `GHIDRA_MCP_PORT` - Puerto del servidor (por defecto: 8089)
- `GHIDRA_MCP_BIND_ADDRESS` - Dirección de enlace (por defecto: 0.0.0.0 en Docker)
- `JAVA_OPTS` - Opciones de JVM (por defecto: -Xmx4g -XX:+UseG1GC)
## 🤝 Contribuciones
Consulte [CONTRIBUTING.md](https://github.com/bethington/ghidra-mcp/blob/HEAD/CONTRIBUTING.md) para obtener pautas detalladas de contribución.
### Inicio Rápido
1. Haga un fork del repositorio
2. Cree una rama de funcionalidad (`git checkout -b feature/amazing-feature`)
3. Compile y pruebe sus cambios (`mvn clean package assembly:single -DskipTests` o `GHIDRA_INSTALL_DIR=/ruta/a/ghidra gradle buildExtension`)
4. Actualice la documentación según sea necesario
5. Confirme sus cambios (`git commit -m 'Agregar funcionalidad increíble'`)
6. Suba a la rama (`git push origin feature/amazing-feature`)
7. Abra un Pull Request
## 📄 Licencia
Este proyecto está licenciado bajo la Licencia Apache 2.0; consulte el archivo [LICENSE](https://github.com/bethington/ghidra-mcp/blob/HEAD/LICENSE) para obtener más detalles.
## 🏆 Estado de Producción
| Métrica | Valor |
|---------|-------|
| **Versión** | 5.17.0 |
| **Herramientas MCP** | 249 totalmente implementadas |
| **Endpoints GUI** | 196 (GhidraMCPPlugin) |
| **Endpoints Headless** | 195 (GhidraMCPHeadlessServer) |
| **Compilación** | ✅ 100% éxito |
| **Eficiencia de Procesamiento por Lotes** | 93% de reducción de llamadas API |
| **Flujos de Trabajo de IA** | 7 flujos de trabajo de documentación probados |
| **Scripts de Ghidra** | Scripts de automatización incluidos |
| **Documentación** | Completa con indicaciones de IA |
Consulte [CHANGELOG.md](https://github.com/bethington/ghidra-mcp/blob/HEAD/CHANGELOG.md) para el historial de versiones y notas de la versión.
## 🙏 Agradecimientos
Este proyecto se derivó originalmente de [LaurieWired/GhidraMCP](https://github.com/LaurieWired/GhidraMCP) en agosto de 2025 y desde entonces ha sido reescrito y ampliado sustancialmente. Reconocemos el trabajo original de LaurieWired como punto de partida. Consulte [NOTICE](https://github.com/bethington/ghidra-mcp/blob/HEAD/NOTICE) para la atribución de la licencia.
## 👥 Contribuyentes
Este proyecto se ha beneficiado del trabajo de contribuyentes dedicados:
### Contribuyentes Principales
**[@heeen](https://github.com/heeen)** — Contribuciones significativas que incluyen:
- Coincidencia difusa de funciones y diff estructurado para comparación entre binarios (#13)
- Mejoras en la ejecución de scripts y corrección de errores (#12)
- Nuevos endpoints de API: `save_program`, `exit_ghidra`, `delete_function`, `create_memory_block`, `run_script_inline` (#11)
- Visión arquitectónica: diseño basado en anotaciones, transporte UDS, propuestas de optimización del puente Python
**[@huehuehuehueing](https://github.com/huehuehuehueing)** — Contribuciones significativas que incluyen:
- Soporte de prefijo de espacio de direcciones: se agregó la sintaxis `<space>:<hex>` (ej., `mem:1000`, `code:ff00`) al análisis de direcciones en toda la superficie de endpoints, desbloqueando objetivos multi-espacio como firmware embebido (#84, cierra #65)
- Parámetro `program` opcional + correcciones de esquema de parámetros requeridos: se hizo `program` opcional en cada endpoint con un fallback sensato de currentProgram, y se corrigieron varios errores de esquema requerido vs opcional que el catálogo había heredado (#92)
- Sembró #44 (herramientas de tipo de dato / enum) — el problema que motivó la capa de aplicación de enum + struct de v5.0
- **Equipo de Ghidra** - Por la increíble plataforma de ingeniería inversa
- **Protocolo de Contexto de Modelo** - Por el marco estandarizado de integración de IA
- **Contribuyentes** - Por las pruebas, comentarios y mejoras
---
## 🔗 Proyectos Relacionados
- [re-universe](https://github.com/bethington/re-universe) — Plataforma Ghidra BSim PostgreSQL para análisis de similitud binaria a gran escala. Se combina perfectamente con GhidraMCP para flujos de trabajo de ingeniería inversa impulsados por IA.
- [cheat-engine-server-python](https://github.com/bethington/cheat-engine-server-python) — Servidor MCP para análisis dinámico de memoria y depuración.
---
**Listo para implementación en producción con confiabilidad de nivel empresarial y capacidades integrales de análisis binario.**
| Nivel | Comportamiento | Ejemplo |
|---|
| Auto-arreglo | Aplicado silenciosamente | Campo count en un uint32 → se auto-prefija dwCount al guardar |
| Advertencia | El cambio se aplica, se devuelve una advertencia | processData → "el nombre debe ser PascalCase con un verbo: ProcessData" |
| Rechazo | Cambio bloqueado con explicación | Cambio de tipo undefined → undefined → "no-op rechazado, tipo sin cambios" |
| Variable de entorno | Efecto |
|---|
GHIDRA_MCP_AUTH_TOKEN | Cuando se configura, cada solicitud HTTP debe llevar Authorization: Bearer <token>. Comparación segura en tiempo. /mcp/health, /health, /check_connection están exentos. |
GHIDRA_MCP_ALLOW_SCRIPTS | Establézcalo en 1, true o yes para habilitar /run_script_inline y /run_ghidra_script. Desactivado por defecto a partir de v5.4.1 — estos endpoints ejecutan Java arbitrario contra el proceso de Ghidra. En modo sin cabeza también activa la inicialización de BundleHost de OSGi al inicio del servidor (framework Felix, ~cientos de ms); desactívelo si no necesita ejecución de scripts. |
GHIDRA_MCP_FILE_ROOT | Cuando se establece en una ruta de directorio, los endpoints de rutas del sistema de archivos (/load_program, /import_file, /open_project, /delete_file, etc.) canonican la entrada y requieren que esté bajo esta raíz. Previene path-traversal. |
import_file - Importar un archivo binario desde el disco al proyecto Ghidra actual y abrirlolist_open_programs - Listar programas abiertoslist_option_groups - Listar grupos de opciones de programa (por ejemplolist_project_files - Listar archivos del proyectolist_properties - Listar entradas (dirección, valor) almacenadas en un mapa de propiedades, con paginaciónlist_property_maps - Listar mapas de propiedades definidos por el usuario — almacenes tipados por dirección clave→valoropen_program - Abrir programa desde el proyectoreanalyze - Activar auto-análisis completo en un programaremove_program_option - Eliminar una opción de un grupo de opciones de programaremove_property - Eliminar el valor almacenado en una única dirección en un mapa de propiedadessave_all_programs - Guardar todos los programas abiertossave_program - Guardar el programa actualset_image_base - Establecer la dirección base del programa (reubica todas las direcciones)set_program_option - Establecer una opción de programa tipadaset_property - Establecer un valor en una dirección en un mapa de propiedadesswitch_program - Cambiar de programa actualparent_dir/project_nameserver_status - Verificar el estado de conexión del servidor headlesslist_namespaces - Listar todos los espacios de nombreslist_scripts - Listar scripts Ghidra disponibleslist_segments - Listar segmentos de memorialist_strings - Listar cadenas definidasget_function_countget_function_jump_targets - Obtener objetivos de saltoget_function_labels - Obtener etiquetas en la funciónget_function_variables - Listar todas las variables en una funciónget_struct_layout - Obtener diseño de estructuraget_valid_data_types - Obtener nombres de tipos de datos válidossearch_functions_by_tag - Listar todas las funciones que tienen una etiqueta especificada adjuntaset_decompiler_variable_type - Establecer el tipo de una variable o parámetro de descompilador (alto nivel) por nombreset_function_no_return - Establecer el atributo de no retornoset_function_tag_comment - Actualizar el comentario/descripción en una etiqueta de función existente a nivel de programaset_function_this_type - Establecer el tipo de descompilador/base de datos del puntero 'this' implícito (ECX en x86 __thiscall/__fastcall)set_variables - Establecer tipos y nombres para múltiples variables atómicamentecreate_pointer_type - Crear tipo de punterocreate_struct - Crear estructuracreate_typedef - Crear typedefcreate_union - Crear unióndelete_data_type - Eliminar tipo de datoembed_struct_field - Reemplazar un campo de estructura con un tipo de estructura incrustado por valor (por ejemploget_data_type_size - Obtener tamaño de tipo de dato en bytesget_type_size - Obtener tamaño e información del tipo de datoimport_data_types - Importar tipos de datos desde GDTlist_data_type_categories - Listar categorías de tipos de datoslist_data_types - Listar tipos de datosmodify_struct_field - Modificar campo de estructuramodify_struct_field_type - Establecer el tipo de un campo de estructura por nombre o desplazamiento (offset:N)move_data_type_to_category - Mover tipo de dato a categoríarecreate_struct - Reemplazar una estructura en un paso: opcionalmente eliminar un tipo existente con el mismo nombre, luego crear con campos JSON (misma forma que create_struct)remove_struct_field - Eliminar campo de estructuraresize_struct - Agrandar o reducir una estructura existente por tamaño total en bytesresolve_duplicate_type - Encontrar tipos de datos duplicados por nombre simple; eliminar stubs no utilizados /Demangler de tamaño 1 cuando existe un tipo canónico más grandeset_function_prototype - Establecer prototipo de función (tipo de retorno, tipos de parámetros, convención de llamada)set_global - Aplicar atómicamente nombre + tipo + comentario de placa + longitud de arreglo a una variable globalset_local_variable_type - Establecer tipo de variableset_parameter_type - Establecer tipo de parámetroset_variable_storage - Establecer almacenamiento de variablevalidate_data_type - Validar sintaxis de tipo de datovalidate_data_type_exists - Verificar si existe un tipo de datovalidate_function_prototype - Validar prototipo de funciónrename_variable - Renombrar una variable en una funciónrename_variables - Renombrar por lotes variablesbatch_apply_documentation - Aplicar toda la documentación a una función en una sola llamadabatch_decompile - Descompilar múltiples funciones a la vezcan_rename_at_address - Verificar si se puede renombrar en una direcciónclear_instruction_flow_override - Limpiar anulación de flujoconfigure_analyzer - Configurar un plugin de análisiscreate_function - Crear función en direccióncreate_memory_block - Crear bloque de memoriadelete_function - Eliminar función en direccióndetect_array_bounds - Detectar límites de arreglodetect_crypto_constants - Detectar constantes criptográficasdetect_malware_behaviors - Detectar comportamientos de malwareextract_iocs_with_context - Extraer IOCs con contextofind_anti_analysis_techniques - Encontrar técnicas anti-análisisfind_code_gaps - Encontrar huecos de bytes indefinidos entre funciones en memoria ejecutablefind_dead_code - Encontrar código muertofind_next_undefined_function - Encontrar la siguiente función sin definirget_assembly_context - Obtener contexto de ensambladorget_field_access_context - Obtener contexto de acceso a campoget_function_pcode - Volcar P-code sin procesar para una función (issue #192)inspect_memory_content - Inspeccionar bytes de memorialist_analyzers - Listar plugins de análisis disponiblesread_memory - Leer memoria sin procesarrun_analysis - Ejecutar auto-análisis en el programa actualsearch_instructions - Buscar instrucciones por mnemónico y/o subcadena de operandosuggest_field_names - Sugerir nombres de camposget_versionhealth - Punto final de verificación de estado para servidor headlessmcp_health - Estado del servidor HTTP: estadísticas del pool, tiempo de actividad, memoria, conteo de solicitudes activasmcp_schema - Esquema de API legible por máquina con metadatos de puntos finalestool_goto_address - Navegar el listado de CodeBrowser y el descompilador a una dirección específicatool_launch_codebrowser - Abrir un archivo en CodeBrowser, lanzando uno nuevo si es necesariotool_running_tools - Listar todas las ventanas de herramientas Ghidra en ejecuciónserver_repository_files - Listar archivos en una carpeta de repositorio del servidorserver_version_control_add - Agregar un archivo al control de versionesserver_version_control_checkin - Registrar un archivo bajo control de versionesserver_version_control_checkout - Reservar un archivo bajo control de versionesserver_version_control_undo_checkout - Deshacer la reserva de un archivoserver_version_history - Obtener historial de versiones de un archivodebugger_set_breakpoint - Establecer un punto de interrupción de ejecución de software en una dirección del rastreodebugger_stack_trace - Obtener el backtrace de la pila de llamadas para el hilo actualdebugger_static_to_dynamic - Traducir una dirección estática del programa Ghidra a una dirección dinámica en tiempo de ejecución en el rastreo actualdebugger_status - Obtener estado del depurador: rastreo activo, hilo, estado de ejecución, conteo de módulosdebugger_step_into - Ejecutar paso a paso dentro de la siguiente instrucción (sigue llamadas)debugger_step_out - Salir de la función actual (ejecutar hasta el retorno)debugger_step_over - Ejecutar paso a paso sobre la siguiente instrucción (no sigue llamadas)debugger_traces - Listar todos los rastreos de depuración abiertos| Command | What it does |
|---|
ensure-prereqs | Instalar dependencias de Python y JAR de Maven de Ghidra de una sola vez. Comience aquí en una máquina nueva. |
preflight | Validar Python, herramienta de compilación, ruta de Ghidra y disponibilidad de JAR sin realizar cambios. Agregue --strict para verificar también la accesibilidad de red. |
build | Compilar el JAR del plugin y el ZIP de extensión mediante Maven (o Gradle cuando TOOLS_SETUP_BACKEND=gradle). |
deploy | Copiar la extensión compilada al perfil de Ghidra y parchear FrontEndTool.xml para activación automática. |
start-ghidra | Lanzar la instalación configurada de Ghidra. |
clean | Eliminar las salidas de compilación de Maven/Gradle (target/, build/). |
clean-all | Eliminar las salidas de compilación más los artefactos de caché local (JAR de Ghidra en .m2, etc.). |
install-ghidra-deps | Instalar solo los JAR de Ghidra en ~/.m2. Útil cuando el entorno de compilación cambia. |
install-python-deps | Instalar los grupos de dependencias de Python mediante uv sync. |
run-tests | Ejecutar la suite de pruebas Java sin conexión (no se necesita Ghidra en ejecución). |
verify-version | Verificar que las cadenas de versión sean consistentes en pom.xml, CHANGELOG.md y README.md. |
bump-version --new X.Y.Z | Actualizar atómicamente todas las referencias de versión. Pase --tag para crear una etiqueta git. |
| Flag | Description |
|---|
--ghidra-path PATH | Directorio de instalación de Ghidra. Por defecto GHIDRA_PATH de .env. |
--dry-run | Imprimir acciones sin ejecutarlas. |
--force | Reinstalar JAR de Ghidra incluso si ya están presentes (install-ghidra-deps, ensure-prereqs). |
--with-debugger | Forzar instalación de requisitos de Python del depurador (solo Windows). |
--use-debugger-toggle | Leer INSTALL_DEBUGGER_DEPS de .env para decidir si instalar dependencias del depurador. |
--test TIER | (deploy solamente) Optar por niveles de regresión de despliegue en vivo como release o debugger-live. |
--strict | (preflight solamente) También verificar accesibilidad de red para Maven Central y PyPI. |