
Python Ghidra MCP de línea de comandos
pyghidra-mcp es un servidor de línea de comandos del Protocolo de Contexto del Modelo (MCP) que trae todo el poder analítico de Ghidra, un robusto conjunto de herramientas de ingeniería inversa de software (SRE), al mundo de los agentes inteligentes y las herramientas basadas en LLM.
Conecta la ProgramAPI y la FlatProgramAPI de Ghidra con Python usando pyghidra y jpype, y luego expone esa funcionalidad a través del Protocolo de Contexto del Modelo.
MCP es una interfaz unificada que permite a los modelos de lenguaje, herramientas de desarrollo (como VS Code) y agentes autónomos acceder a contexto estructurado, invocar herramientas y colaborar inteligentemente. Piensa en MCP como el puente entre potentes herramientas de análisis y el ecosistema LLM.
Con pyghidra-mcp, Ghidra se convierte en un backend inteligente—listo para responder a consultas ricas en contexto, automatizar tareas profundas de ingeniería inversa e integrarse en flujos de trabajo asistidos por IA.
pyghidra-mcp ahora soporta dos modos de operación:
headless para análisis y automatización desde la línea de comandos--gui, que inicia Ghidra a través de pyghidra-mcp y comparte el estado del programa en vivo con la GUI en ejecución[!NOTE] Este proyecto beta está en desarrollo activo. Nos encantaría recibir tus comentarios, informes de errores, solicitudes de funciones y código.
Sí, el ghidra-mcp original es fantástico. Pero pyghidra-mcp adopta un enfoque diferente:
--gui cuando quieras navegación y edición en vivo en la GUI.Este proyecto ofrece una experiencia centrada en Python optimizada para el desarrollo local, entornos sin interfaz gráfica y flujos de trabajo comprobables.
flowchart LR subgraph Clients["Clients"] Agent["MCP host / agent"] Cli["pyghidra-mcp-cli"] User["Ghidra user"] end
subgraph Process["pyghidra-mcp process"]
Transport["stdio or streamable-http"]
Tools["MCP tools"]
Context["PyGhidra context"]
end
Project["Ghidra project<br/>.gpr / .rep"]
Artifacts["MCP artifacts<br/>ChromaDB + GZF cache"]
Gui["Ghidra GUI / CodeBrowser<br/>only with --gui"]
Agent -->|"stdio or HTTP"| Transport
Cli -->|"HTTP only"| Transport
Transport --> Tools
Tools --> Context
Context --> Project
Context --> Artifacts
Context -.-> Gui
User -.-> Gui
Gui -.-> Project
### Eligiendo un Modo```mermaid
flowchart TD
Start["What do you need?"]
Start --> Headless["Agent or automation only"]
Start --> GuiNeed["Live Ghidra GUI control"]
Start --> Terminal["Interactive terminal client"]
Headless --> Stdio["pyghidra-mcp -t stdio<br/>or -t streamable-http"]
GuiNeed --> GuiMode["pyghidra-mcp --gui<br/>--transport streamable-http<br/>--project-path project.gpr"]
Terminal --> HttpServer["Start pyghidra-mcp<br/>--transport streamable-http"]
HttpServer --> CliMode["Run pyghidra-mcp-cli commands"]
stdio para hosts MCP locales, o streamable-http cuando varios clientes necesitan el mismo proyecto Ghidra de larga duración.pyghidra-mcp lanza Ghidra, abre el proyecto y expone herramientas adicionales que dirigen el CodeBrowser en la misma JVM.pyghidra-mcp-cli es un cliente HTTP. Primero inicia un servidor streamable-http, luego ejecuta comandos de terminal contra ese servidor en ejecución.subgraph Transports
Stdio["stdio"]
Http["streamable-http"]
Sse["sse legacy"]
end
subgraph Server["pyghidra-mcp server"]
FastMcp["FastMCP tool server"]
Context["PyGhidra context"]
Indexing["background analysis and Chroma indexing"]
subgraph Tools["MCP tools"]
Analysis["decompile, xrefs, bytes, callgraph"]
Search["symbols, strings, code"]
ProjectOps["import, delete, metadata, list binaries"]
Edits["rename function, rename variable, set type, set prototype, set comment"]
GuiOnly["GUI only: open program, goto, list open programs, set current program"]
end
end
subgraph GhidraRuntime["Ghidra runtime"]
PyGhidra["pyghidra"]
Jpype["JPype shared JVM"]
Project["Ghidra project"]
Programs["program databases"]
CodeBrowser["Ghidra GUI / CodeBrowser"]
end
Agent --> Stdio
Agent --> Http
Automation --> Stdio
Automation --> Http
Automation --> Sse
Cli --> Http
Stdio --> FastMcp
Http --> FastMcp
Sse --> FastMcp
FastMcp --> Context
Context --> PyGhidra
PyGhidra --> Jpype
Jpype --> Project
Project --> Programs
Context --> Indexing
Indexing --> Search
FastMcp --> Tools
Tools --> Context
GuiOnly -.-> CodeBrowser
Context -.-> CodeBrowser
</details>
## Contenido
- [PyGhidra-MCP - Servidor de Protocolo de Contexto de Modelo Ghidra](#pyghidra-mcp---ghidra-model-context-protocol-server)
- [Descripción general](#overview)
- [¿Otro Ghidra MCP?](#yet-another-ghidra-mcp)
- [Diagramas de configuración](#setup-diagrams)
- [Cómo se conectan las piezas](#how-the-pieces-connect)
- [Elegir un modo](#choosing-a-mode)
- [Contenido](#contents)
- [Primeros pasos](#getting-started)
- [Optimizado para agentes](#optimized-for-agents)
- [Cliente CLI](#cli-client)
- [Instalación](#installation)
- [Inicio rápido con CLI](#quick-start-with-cli)
- [Creación, gestión y apertura de proyectos existentes](#project-creation-management-and-opening-existing-projects)
- [Crear nuevos proyectos](#creating-new-projects)
- [Estructura de proyecto autocontenida](#self-contained-project-structure)
- [Creación básica de proyectos](#basic-project-creation)
- [Creación personalizada de proyectos](#custom-project-creation)
- [Creación de múltiples proyectos relacionados](#creating-multiple-related-projects)
- [Apertura de proyectos Ghidra existentes](#opening-existing-ghidra-projects)
- [Apertura mediante archivo .gpr](#opening-by-gpr-file)
- [Modo GUI](#gui-mode)
- [Valores predeterminados de inicio y proyectos grandes](#startup-defaults-and-large-projects)
- [Desarrollo](#development)
- [Configuración](#setup)
- [Pruebas y calidad](#testing-and-quality)
- [API](#api)
- [Herramientas](#tools)
- [Operaciones por lotes](#batch-operations)
- [Herramientas de lectura/análisis](#read--analysis-tools)
- [Operaciones de proyecto](#project-operations)
- [Herramientas de edición/mutación](#edit--mutation-tools)
- [Herramientas de control GUI (solo `--gui`)](#gui-control-tools---gui-only)
- [Uso](#usage)
- [Mapeo de binarios con Docker](#mapping-binaries-with-docker)
- [Uso con OpenWeb-UI y MCPO](#using-with-openweb-ui-and-mcpo)
- [Con `uvx`](#with-uvx)
- [Con Docker](#with-docker)
- [Entrada/Salida estándar (stdio)](#standard-inputoutput-stdio)
- [Python](#python)
- [Docker](#docker)
- [HTTP transmisible](#streamable-http)
- [Python](#python-1)
- [Docker](#docker-1)
- [Eventos enviados por el servidor (SSE)](#server-sent-events-sse)
- [Python](#python-2)
- [Docker](#docker-2)
- [Integraciones](#integrations)
- [Claude Desktop](#claude-desktop)
- [Inspiración](#inspiration)
- [Contribución, comunidad y ejecución desde el código fuente](#contributing-community-and-running-from-source)
- [Flujo de trabajo del contribuyente](#contributor-workflow)
## Primeros pasos
Ejecuta el [paquete de Python](https://pypi.org/p/pyghidra-mcp) como un comando CLI usando [`uv`](https://docs.astral.sh/uv/guides/tools/):```bash
uvx pyghidra-mcp # Creates pyghidra_mcp_projects directory by default
Para lanzar y controlar una interfaz gráfica de Ghidra en vivo desde MCP, usa --gui con streamable-http:```bash
uvx pyghidra-mcp
--gui
--transport streamable-http
--host 127.0.0.1
--port 8000
--project-path /absolute/path/to/ghidra-projects
--project-name my_project
> [!IMPORTANT]
> `--gui` inicia Ghidra a través de `pyghidra-mcp`. No se adjunta a una instancia externa de Ghidra ya en ejecución.
O, ejecútelo como un [contenedor Docker](https://ghcr.io/clearbluejar/pyghidra-mcp):```bash
docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp -t stdio
pyghidra-mcp mantiene la superficie MCP intencionadamente estrecha para que los clientes agente gasten menos tokens en descubrimiento de herramientas y selección de argumentos.
open_program_in_gui, list_open_programs, set_current_program y goto solo se exponen cuando el servidor se inicia con --gui.pyghidra-mcp-cli proporciona un cliente de línea de comandos directo sobre HTTP con comandos agrupados para flujos de trabajo comunes de edición y análisis.Esto mantiene el servidor predeterminado utilizable para agentes LLM, integraciones IDE y automatización, sin exponer superficie innecesaria de herramientas ni controles solo GUI en sesiones sin cabeza.
Para una experiencia de línea de comandos más interactiva, puede usar el paquete separado pyghidra-mcp-cli, que proporciona una interfaz amigable para interactuar con un servidor pyghidra-mcp en ejecución.
Instale el cliente CLI usando uv (recomendado):```bash
uvx pyghidra-mcp-cli
O instalar con pip:```bash
pip install pyghidra-mcp-cli
2. **Usa la CLI** (en otra terminal):```bash
# List available binaries
pyghidra-mcp-cli list binaries
# Decompile a function
pyghidra-mcp-cli decompile --binary ls main
# Decompile with callees, referenced strings, and cross-references
pyghidra-mcp-cli decompile --binary ls main --callees --strings --xrefs
# Search for symbols (supports regex patterns)
pyghidra-mcp-cli search symbols --binary ls printf -l 10
[!NOTE] El CLI se conecta a pyghidra-mcp a través de HTTP para evitar la sobrecarga de inicio de 10 a 60 segundos al crear un nuevo proceso de Ghidra para cada comando. Consulta el README del CLI para obtener documentación completa.
Puedes crear nuevos proyectos de varias maneras, según tu flujo de trabajo:
pyghidra-mcp crea una estructura de proyecto autocontenida donde cada proyecto tiene su propio proyecto de Ghidra y artefactos de pyghidra-mcp. Esto garantiza un aislamiento completo y una gestión sencilla del proyecto.
pyghidra-mcp
$ tree pyghidra_mcp_projects/ pyghidra_mcp_projects/ ├── my_project.gpr ├── my_project-pyghidra-mcp │ ├── chromadb │ └── gzfs └── my_project.rep
#### Creación de Proyecto Personalizado```bash
# Create project with custom name and location
pyghidra-mcp --project-path ~/analysis/malware_study --project-name malware_analysis
$ tree ~/analysis/
/home/vscode/analysis/
└── malware_study
├── malware_analysis.gpr
├── malware_analysis-pyghidra-mcp
│ ├── chromadb
│ └── gzfs
└── malware_analysis.rep
mkdir ~/reverse_engineering_workspace
pyghidra-mcp --project-path ~/reverse_engineering_workspace/suspicious_binaries --project-name suspicious_analysis
pyghidra-mcp --project-path ~/reverse_engineering_workspace/packed_malware --project-name packed_analysis
### Abriendo proyectos existentes de Ghidra
Si tienes proyectos existentes de Ghidra (archivos `.gpr`), puedes abrirlos directamente con `pyghidra-mcp`:
#### Abriendo por archivo .gpr```bash
# Open existing Ghidra project (project name derived from filename)
pyghidra-mcp --project-path ~/existing/ghidra/my_research.gpr
# Result: ~/existing/ghidra/my_research-pyghidra-mcp/
# └── chromadb/, gzfs/ (pyghidra-mcp additions)
Use el modo GUI cuando desee que las acciones de MCP operen sobre los mismos objetos de programa en vivo que Ghidra está mostrando.
--gui requiere --transport streamable-http (o --transport http como alias)--project-path puede ser un directorio de proyecto más --project-name, o un archivo .gpr existente. Los proyectos faltantes se crean automáticamente.pyghidra-mcp, lo que mantiene las transacciones de GUI y MCP en la misma JVM--guiEjemplo:```bash
pyghidra-mcp
--gui
--transport streamable-http
--project-path /absolute/path/to/my_research.gpr
El modo GUI es la opción correcta cuando deseas:
- abrir o cambiar programas en CodeBrowser
- navegar en el listado hacia una función o dirección
- renombrar funciones o agregar comentarios y ver inmediatamente esos cambios en Ghidra
### Valores Predeterminados de Inicio y Proyectos Grandes
`pyghidra-mcp` no requiere `--wait-for-analysis` por defecto. El servidor puede iniciar mientras el análisis y la indexación del lado de MCP continúan en segundo plano.
Esto es importante para proyectos grandes:
- iniciar un proyecto con muchos binarios no necesita bloquear el inicio del servidor
- `--wait-for-analysis` está disponible cuando deseas un proyecto completamente analizado antes de atender solicitudes
- para proyectos grandes existentes, espera que la preparación del análisis y la indexación varíe según el binario
Limitación actual:
- El estado de análisis de Ghidra y el estado de indexación de MCP están separados
- un binario puede estar completamente analizado en Ghidra mientras `search_strings` o `search_code` semántico aún esperan la indexación del lado de MCP
- esto es más notable al abrir proyectos existentes más grandes
En la práctica:
- la descompilación, navegación, renombrado y comentarios aún pueden funcionar para un binario mientras las funciones de búsqueda intensiva en indexación se ponen al día
- si la latencia de inicio importa más que la preparación inmediata de búsqueda, mantén el valor predeterminado `--no-wait-for-analysis`
- si la preparación inmediata importa más que el tiempo de inicio, usa `--wait-for-analysis`
## Desarrollo
Este proyecto utiliza un `Makefile` para agilizar el desarrollo y las pruebas. `ruff` se utiliza para linting y formateo, y los hooks de `pre-commit` se utilizan para garantizar la calidad del código.
### Configuración
1. **Instalar `uv`**: Si no tienes `uv` instalado, puedes instalarlo usando pip:
```bash
pip install uv
```
O sigue la guía oficial de instalación de `uv`: [https://docs.astral.sh/uv/install/](https://docs.astral.sh/uv/install/)
2. **Crear un entorno virtual e instalar dependencias**:
```bash
make dev-setup
source ./.venv/bin/activate
```
3. **Establecer la variable de entorno de Ghidra**: Descarga e instala Ghidra, luego establece la variable de entorno `GHIDRA_INSTALL_DIR` en tu directorio de instalación de Ghidra.
```bash
# For Linux / Mac
export GHIDRA_INSTALL_DIR="/path/to/ghidra/"
# For Windows PowerShell
[System.Environment]:https://raw.githubusercontent.com/clearbluejar/pyghidra-mcp/HEAD/:SetEnvironmentVariable(%27GHIDRA_INSTALL_DIR%27,%27C:%5Cpath%5Cto%5Cghidra%27)
```
### Pruebas y Calidad
El `Makefile` proporciona varios objetivos para pruebas y calidad del código:
- `make run`: Ejecutar el servidor MCP.
- `make test`: Ejecutar la suite completa de pruebas (unitarias y de integración).
- `make test-unit`: Ejecutar pruebas unitarias.
- `make test-integration`: Ejecutar pruebas de integración.
- `make test-integration-fast`: Ejecutar la prueba de humo de integración ligera utilizada por pre-commit.
- `make test-integration-gui`: Ejecutar pruebas de integración de GUI. Requiere una instalación funcional de Ghidra y soporte de GUI.
- `make lint`: Verificar el estilo del código con `ruff`.
- `make format`: Formatear código con `ruff`.
- `make typecheck`: Ejecutar comprobaciones estáticas ligeras con `ruff`.
- `make check`: Ejecutar todas las comprobaciones de calidad.
- `make dev`: Ejecutar el flujo de trabajo de desarrollo (formatear y verificar).
- `make build`: Construir paquetes de distribución.
- `make clean`: Limpiar artefactos de compilación y caché.
División recomendada:
- pre-commit: `ruff`, `pyright`, pruebas unitarias y una prueba de humo de integración ligera
- GitHub Actions: cobertura completa de integración en Linux sin cabeza, GUI de Linux bajo `Xvfb`, cobertura de CLI y pruebas de humo actuales de macOS
- CI programada: cobertura de compatibilidad con macOS/Ghidra más antiguos
- local/manual: depuración de GUI específica del entorno más pesada y comprobaciones de cordura de lanzamiento
## API
### Herramientas
Permite que los LLMs realicen acciones, hagan cálculos deterministas e interactúen con servicios externos.
#### Operaciones por Lotes
`decompile_function` y `list_xrefs` aceptan un solo objetivo o una lista de objetivos, reduciendo los viajes de ida y vuelta al analizar cadenas de llamadas o múltiples símbolos a la vez.```jsonc
// Decompile three functions in one call, with callees and xrefs attached
{
"binary_name": "firmware.bin",
"name_or_address": ["main", "init_hardware", "0x08001234"],
"include_callees": true,
"include_xrefs": true
}
// Get cross-references for multiple symbols at once
{
"binary_name": "firmware.bin",
"name_or_address": ["malloc", "free", "realloc"]
}
Los errores por elemento se devuelven en línea (otros objetivos aún tienen éxito):```jsonc [ {"name": "main", "code": "void main() { ... }", "callees": ["init_hardware"], "xrefs": [...]}, {"name": "0xdeadbeef", "code": "", "error": "Function or symbol '0xdeadbeef' not found."} ]
#### Herramientas de Lectura / Análisis
- `search_code(binary_name: str, query: str, limit: int = 5, offset: int = 0, search_mode: str = "semantic", include_full_code: bool = True, preview_length: int = 500, similarity_threshold: float = 0.0)`: Busca pseudo-C descompilado mediante búsqueda vectorial semántica o coincidencia literal.
- `list_xrefs(binary_name: str, name_or_address: str | list[str])`: Lista referencias cruzadas a función(es), símbolo(s) o dirección(es). Acepta un solo objetivo o una lista para búsqueda por lotes.
- `gen_callgraph(binary_name: str, function_name: str, direction: str = "calling", display_type: str = "flow", condense_threshold: int = 50, top_layers: int = 3, bottom_layers: int = 3, max_run_time: int = 120)`: Genera un gráfico de llamadas MermaidJS para una función específica. Admite ambas direcciones "llamadas" (funciones llamadas por el objetivo) y "llamantes" (funciones que llaman al objetivo) con múltiples tipos de visualización.
- `decompile_function(binary_name: str, name_or_address: str | list[str], include_callees: bool = False, include_strings: bool = False, include_xrefs: bool = False, timeout_sec: int = 30)`: Descompila función(es) por nombre o dirección. Acepta un solo objetivo o una lista para descompilación por lotes. Los indicadores de respuesta enriquecida adjuntan callees, cadenas y/o referencias cruzadas a cada resultado. `timeout_sec` se aplica por objetivo y acota cada intento de descompilación de forma independiente.
- `list_exports(binary_name: str, query: str = ".*", offset: int = 0, limit: int = 25)`: Lista todas las funciones y símbolos exportados de un binario específico (regex compatible para la consulta).
- `list_imports(binary_name: str, query: str = ".*", offset: int = 0, limit: int = 25)`: Lista todas las funciones y símbolos importados de un binario específico (regex compatible para la consulta).
- `read_bytes(binary_name: str, address: str, size: int = 32)`: Lee bytes sin procesar de la memoria en una dirección específica. Las direcciones hexadecimales pueden incluir u omitir el prefijo `0x`.
- `search_strings(binary_name: str, query: str, limit: int = 100)`: Busca cadenas dentro de un binario.
- `search_symbols_by_name(binary_name: str, query: str, functions_only: bool = False, offset: int = 0, limit: int = 25)`: Busca símbolos dentro de un binario por nombre. Admite patrones regex (p.ej., `^main$`, `func.*one`) con coincidencia sin distinción de mayúsculas, o consultas de subcadenas simples. Establece `functions_only=True` para excluir etiquetas, variables y otros símbolos que no sean funciones.
#### Operaciones de Proyecto
- `import_binary(binary_path: str)`: Importa un binario desde una ruta designada al proyecto actual de Ghidra. Si la ruta es un directorio, escaneará recursivamente e importará todos los archivos binarios compatibles, preservando la estructura de directorios dentro del proyecto de Ghidra.
- `list_project_binaries()`: Lista los binarios en el proyecto actual de Ghidra. En modo GUI, esto incluye los binarios del proyecto que existen en disco incluso si no están abiertos actualmente en CodeBrowser.
- `list_project_binary_metadata(binary_name: str)`: Recupera metadatos detallados de un binario específico, incluyendo arquitectura, compilador, formato ejecutable, métricas de análisis y hashes de archivos.
- `delete_project_binary(binary_name: str)`: Elimina un binario (programa) del proyecto de Ghidra.
#### Herramientas de Edición / Mutación
- `rename_function(binary_name: str, name_or_address: str, new_name: str)`: Renombra una función por nombre o dirección. En modo GUI, esto se ejecuta como una transacción en vivo de Ghidra y actualiza el programa abierto.
- `rename_variable(binary_name: str, function_name_or_address: str, variable_name: str, new_name: str)`: Renombra un parámetro de función o variable local por nombre exacto dentro de una función específica. Si el nombre falta o es ambiguo dentro de esa función, la herramienta devuelve un error en lugar de adivinar. En modo GUI, esto se ejecuta como una transacción en vivo de Ghidra y actualiza el programa abierto.
- `set_variable_type(binary_name: str, function_name_or_address: str, variable_name: str, type_name: str)`: Establece el tipo de dato de un parámetro de función o variable local por nombre exacto dentro de una función específica. Si el nombre falta o es ambiguo dentro de esa función, la herramienta devuelve un error en lugar de adivinar. `type_name` se analiza usando el analizador de tipos de datos de Ghidra contra el gestor de tipos de datos del programa.
- `set_function_prototype(binary_name: str, function_name_or_address: str, prototype: str)`: Establece un prototipo de función a partir de una cadena de firma completa. La herramienta siempre ejecuta el prototipo a través del analizador de firmas nativo de Ghidra y devuelve el error del analizador subyacente o de aplicación si el prototipo no es válido.
- `set_comment(binary_name: str, target: str, comment: str, comment_type: str)`: Establece un comentario de función/descompilador o comentario de lista. Los objetivos de comentarios de lista pueden ser direcciones, símbolos o funciones. Los valores admitidos de `comment_type` son `decompiler`, `plate`, `pre`, `eol`, `post` y `repeatable`.
#### Herramientas de Control de GUI (`--gui` solo)
Estas herramientas solo están disponibles cuando `pyghidra-mcp` se inicia con `--gui` y controlan lo que muestra la GUI en lugar de mutar los datos del proyecto directamente:
- `list_open_programs()`: Lista los programas actualmente abiertos en la GUI de Ghidra.
- `open_program_in_gui(binary_name: str, new_window: bool = True)`: Abre un binario del proyecto en CodeBrowser. Por defecto abre una nueva ventana de CodeBrowser. Establece `new_window=false` para reutilizar un CodeBrowser visible cuando sea posible.
- `set_current_program(binary_name: str)`: Hace que un programa abierto sea el programa activo/actual en el contexto de la herramienta GUI principal.
- `goto(binary_name: str, target: str, target_type: str)`: Navega la GUI de Ghidra a una dirección o función. `target_type` debe ser `address` o `function`.
## Uso
Este paquete de Python se publica en PyPI como [pyghidra-mcp](https://pypi.org/p/pyghidra-mcp) y se puede instalar y ejecutar con [pip](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/#install-a-package), [pipx](https://pipx.pypa.io/), [uv](https://docs.astral.sh/uv/), [poetry](https://python-poetry.org/), o cualquier gestor de paquetes de Python.```text
$ uvx pyghidra-mcp --help
Usage: pyghidra-mcp [OPTIONS] [INPUT_PATHS]...
PyGhidra Command-Line MCP server
Options:
-v, --version Show version and exit.
-t, --transport [stdio|streamable-http|sse|http]
Transport protocol. SSE is deprecated;
use streamable-http instead. [default: stdio]
-p, --port INTEGER Port for HTTP-based transports. [default: 8000]
-o, --host TEXT Host for HTTP-based transports. [default: 127.0.0.1]
--project-path PATH Directory for a pyghidra-mcp project or an
existing Ghidra .gpr file. [default: pyghidra_mcp_projects]
--project-name TEXT Ghidra project name. Ignored for .gpr paths.
[default: my_project]
--threaded / --no-threaded Allow threaded analysis. [default: threaded]
--max-workers INTEGER Number of analysis workers; 0 means CPU count.
[default: 0]
--wait-for-analysis / --no-wait-for-analysis
Wait for initial analysis before starting.
[default: no-wait-for-analysis]
--gui / --no-gui Launch Ghidra GUI in-process and serve MCP
against GUI-open programs. Cannot attach to
an already-running external Ghidra process.
[default: no-gui]
--list-project-binaries List ingested project binaries and exit.
--delete-project-binary TEXT Delete a project binary by name and exit.
--force-analysis / --no-force-analysis
Force a new binary analysis each run.
[default: no-force-analysis]
--verbose-analysis / --no-verbose-analysis
Verbose logging for analysis. [default: no-verbose-analysis]
--no-symbols / --with-symbols Turn off symbols for analysis. [default: with-symbols]
--sym-file-path PATH Single PDB symbol file for one binary.
-s, --symbols-path PATH Local symbols directory.
--gdt PATH Path to GDT files. May be specified multiple times.
--program-options PATH JSON file with Ghidra program options.
--gzfs-path PATH Location to store GZFs of analyzed binaries.
-h, --help Show this message and exit.
Al usar el contenedor Docker, puedes mapear un directorio local que contenga tus binarios al espacio de trabajo del contenedor. Esto permite que pyghidra-mcp analice tus archivos.```bash
mkdir -p ./binaries cp /path/to/your/binaries/* ./binaries/
docker run -i --rm
-v "$(pwd)/binaries:/binaries"
ghcr.io/clearbluejar/pyghidra-mcp
/binaries/*
### Usando con OpenWeb-UI y MCPO
Puedes integrar `pyghidra-mcp` con [OpenWeb-UI](https://github.com/open-webui/open-webui) usando [MCPO](https://github.com/open-webui/mcpo), un proxy de MCP a OpenAPI. Esto te permite exponer las herramientas de `pyghidra-mcp` a través de una API RESTful estándar, haciéndolas accesibles para interfaces web y otras herramientas.
https://github.com/user-attachments/assets/3d56ea08-ed2d-471d-9ed2-556fb8ee4c95
#### Con `uvx`
Puedes ejecutar `pyghidra-mcp` y `mcpo` juntos usando `uvx`:```bash
uvx mcpo -- \
pyghidra-mcp /bin/ls
Puedes combinar mcpo con Docker:```bash uvx mcpo -- docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp /bin/ls
### Entrada/Salida Estándar (stdio)
El transporte stdio permite la comunicación a través de flujos de entrada y salida estándar. Esto es particularmente útil para integraciones locales y herramientas de línea de comandos. Consulte la [especificación](https://modelcontextprotocol.io/docs/concepts/transports#built-in-transport-types) para más detalles.
#### Python```bash
pyghidra-mcp
Por defecto, el paquete de Python se ejecutará en modo stdio. Debido a que utiliza los flujos de entrada y salida estándar, parecerá que la herramienta está colgada sin ninguna salida, pero esto es esperado.
Este servidor está publicado en el Registro de Contenedores de GitHub (ghcr.io/clearbluejar/pyghidra-mcp)``` docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp -t stdio
Por defecto, el contenedor Docker inicia el servidor `streamable-http`, así que incluya `-t stdio` después del nombre de la imagen y ejecute con `-i` para el modo stdio [interactivo](https://docs.docker.com/reference/cli/docker/container/run/#interactive).
### Streamable HTTP
Streamable HTTP permite respuestas en streaming sobre JSON RPC a través de solicitudes HTTP POST. Consulte la [especificación](https://modelcontextprotocol.io/specification/draft/basic/transports#streamable-http) para más detalles.
Por defecto, el servidor escucha en [http://127.0.0.1:8000/mcp](http://127.0.0.1:8000/mcp) para conexiones de clientes. Use `--host` / `--port` o las variables de entorno `MCP_HOST` / `MCP_PORT` para cambiar la dirección de enlace. _El servidor debe estar en ejecución para que los clientes se conecten a él._
#### Python```bash
pyghidra-mcp -t streamable-http
Por defecto, el paquete de Python se ejecutará en modo stdio, por lo que deberá incluir -t streamable-http.
El modo GUI utiliza este transporte:```bash
pyghidra-mcp
--gui
--transport streamable-http
--project-path /absolute/path/to/my_project.gpr
#### Docker```
docker run -p 8000:8000 ghcr.io/clearbluejar/pyghidra-mcp
[!WARNING] La comunidad MCP considera este un protocolo de transporte heredado destinado a la retrocompatibilidad. Se recomienda Streamable HTTP como reemplazo.
El transporte SSE permite la transmisión de servidor a cliente con Server-Sent Events para la comunicación de cliente a servidor y de servidor a cliente. Consulte la especificación para más detalles.
Por defecto, el servidor escucha en http://127.0.0.1:8000/sse para conexiones de clientes. Utilice --host / --port o las variables de entorno MCP_HOST / MCP_PORT para cambiar la dirección de enlace. El servidor debe estar ejecutándose para que los clientes se conecten a él.
pyghidra-mcp -t sse
Por defecto, el paquete de Python se ejecutará en modo `stdio`, por lo que tendrás que incluir `-t sse`.
#### Docker```
docker run -p 8000:8000 ghcr.io/clearbluejar/pyghidra-mcp -t sse
[!NOTE] Esta sección está en proceso. Pronto añadiremos ejemplos para integraciones específicas.
Añade el siguiente bloque JSON a tu archivo claude_desktop_config.json:```json
{
"mcpServers": {
"pyghidra-mcp": {
"command": "uvx",
"args": [
"--from",
"git+https://github.com/clearbluejar/pyghidra-mcp",
"pyghidra-mcp",
"--project-path",
"/tmp/pyghidra", // or path to writeable directory
"/bin/ls" //
],
"env": {
"GHIDRA_INSTALL_DIR": "/path/to/ghidra/ghidra_12.0_PUBLIC"
}
}
}
}
## Inspiración
La implementación y diseño de este proyecto se inspiraron en estos proyectos increíbles:
* [GhidraMCP](https://github.com/lauriewired/GhidraMCP)
* [semgrep-mcp](https://github.com/semgrep/mcp)
* [ghidrecomp](https://github.com/clearbluejar/ghidrecomp)
* [BinAssistMCP](https://github.com/jtang613/BinAssistMCP)
---
## Contribuir, comunidad y ejecución desde el código fuente
Creemos que el futuro de la ingeniería inversa es agentivo, contextual y escalable.
`pyghidra-mcp` es un paso hacia ese futuro—hacer que los proyectos completos de Ghidra sean accesibles para agentes de IA y pipelines de automatización.
Estamos desarrollando activamente el proyecto y agradecemos comentarios, problemas y contribuciones.
> [!NOTE]
> Nos encantan sus comentarios, informes de errores, solicitudes de funciones y código.
### Flujo de trabajo del colaborador
Si estás añadiendo una nueva herramienta o integración, este es el flujo de trabajo recomendado:
- Etiqueta tu rama con el prefijo `feature/` para indicar una nueva capacidad.
- Añade tu herramienta usando el mismo estilo y estructura que las herramientas existentes en `pyghidra/tools/`.
- Escribe una prueba de integración que ejercite tu herramienta usando una instancia de `StdioClient`. Colócala en `tests/integration/`.
- Amplía las pruebas concurrentes añadiendo una llamada a tu herramienta en `tests/integration/test_concurrent_streamable_client.py`.
- Ejecuta `make test` y `make format` para asegurarte de que tus cambios pasan todas las pruebas y cumplen con las reglas de linting.
Esto asegura consistencia en todo el código base y nos ayuda a mantener herramientas robustas y escalables para flujos de trabajo de ingeniería inversa.
______________________________________________________________________
Hecho con ❤️ por el [PyGhidra-MCP Team](https://github.com/clearbluejar/pyghidra-mcp)