Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
pyghidra-mcp — Python Ghidra MCP da riga di comando | Kitploit
Strumenti/GitHubGitHub/clearbluejar/pyghidra-mcp
Sicurezza Sistemi EmbeddedAnalisi StaticaAnalisi del CodiceReverse EngineeringDebuggerAnalisi MalwareAnalisi di BinariApprendimento e FormazioneReverse Engineering Assistito dall'IAAnalisi del Firmware
GitHubclearbluejar/pyghidra-mcp
4045513 giorni faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

pyghidra-mcp

Python Ghidra MCP da riga di comando

Vedi Repository

GitHub Workflow Status (with event) PyPI - Downloads

PyGhidra-MCP - Server Ghidra Model Context Protocol

Panoramica

pyghidra-mcp è un server Model Context Protocol (MCP) da riga di comando che porta tutta la potenza analitica di Ghidra, una suite robusta per il reverse engineering del software (SRE), nel mondo degli agenti intelligenti e degli strumenti basati su LLM. Collega la ProgramAPI e la FlatProgramAPI di Ghidra a Python usando pyghidra e jpype, quindi espone queste funzionalità tramite il Model Context Protocol.

MCP è un'interfaccia unificata che consente a modelli linguistici, strumenti di sviluppo (come VS Code) e agenti autonomi di accedere a contesti strutturati, invocare strumenti e collaborare in modo intelligente. Pensa a MCP come al ponte tra potenti strumenti di analisi e l'ecosistema degli LLM.

Con pyghidra-mcp, Ghidra diventa un backend intelligente—pronto a rispondere a query ricche di contesto, automatizzare attività complesse di reverse engineering e integrarsi in flussi di lavoro assistiti dall'IA.

pyghidra-mcp ora supporta due modalità operative:

  • modalità headless per analisi e automazione guidate da CLI
  • modalità --gui, che avvia Ghidra tramite pyghidra-mcp e condivide lo stato live del programma con la GUI in esecuzione

[!NOTE] Questo progetto beta è in fase di sviluppo attivo. Apprezziamo feedback, segnalazioni di bug, richieste di funzionalità e codice.

Ancora un altro Ghidra MCP?

Sì, l'originale ghidra-mcp è fantastico. Ma pyghidra-mcp adotta un approccio diverso:

  • 🐍 Headless-first, con capacità GUI – Esegui interamente tramite CLI per un'automazione semplificata, oppure avvia Ghidra con --gui quando vuoi navigazione e modifiche live nella GUI.
  • 🔁 Progettato per l'automazione – Ideale per l'integrazione con LLM, pipeline CI e strumenti che richiedono comportamenti ripetibili.
  • ✅ Adatto a CI/CD – Costruito con test unitari e di integrazione robusti sia per sessioni client che server.
  • 🚀 Avvio rapido – L'avvio asincrono consente al server di iniziare a gestire le richieste mentre i binari vengono ancora analizzati in background. Supporta l'avvio rapido da riga di comando con configurazione minima.
  • 📦 Analisi a livello di progetto – Consente il reverse engineering concorrente di tutti i binari in un progetto Ghidra.
  • 🤖 Pronto per gli agenti – Progettato per flussi di lavoro guidati da agenti intelligenti e automazione del reverse engineering su larga scala.
  • 🔍 Ricerca semantica del codice – Usa embedding vettoriali (tramite ChromaDB) per consentire una ricerca fuzzy veloce tra funzioni decompilate, commenti e simboli—perfetta per l'esplorazione di pseudo-C e il triage guidato da agenti.

Questo progetto offre un'esperienza Python-first ottimizzata per lo sviluppo locale, ambienti headless e flussi di lavoro testabili.

Schemi di Setup

Come si Collegano i Componenti```mermaid

flowchart LR subgraph Clients["Clients"] Agent["MCP host / agent"] Cli["pyghidra-mcp-cli"] User["Ghidra user"] end

root@kitploit:~
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
root@kitploit:~
### Scegliere una modalità```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"]
  • MCP headless: usa stdio per host MCP locali, oppure streamable-http quando più client necessitano dello stesso progetto Ghidra a lunga esecuzione.
  • Modalità GUI: pyghidra-mcp avvia Ghidra, apre il progetto ed espone strumenti aggiuntivi che guidano il CodeBrowser nella stessa JVM.
  • Client CLI: pyghidra-mcp-cli è un client HTTP. Avvia prima un server streamable-http, poi invia comandi da terminale verso quel server in esecuzione.
Architettura dettagliata e superficie degli strumenti```mermaid flowchart TD subgraph Clients Agent["LLM / MCP host"] Cli["pyghidra-mcp-cli"] Automation["scripts and CI"] end
root@kitploit:~
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
root@kitploit:~
</details>

## Contenuti

- [PyGhidra-MCP - Ghidra Model Context Protocol Server](#pyghidra-mcp---ghidra-model-context-protocol-server)
    - [Panoramica](#overview)
  - [Ancora un altro MCP per Ghidra?](#yet-another-ghidra-mcp)
  - [Diagrammi di configurazione](#setup-diagrams)
    - [Come si collegano i componenti](#how-the-pieces-connect)
    - [Scelta della modalità](#choosing-a-mode)
  - [Contenuti](#contents)
  - [Per iniziare](#getting-started)
  - [Ottimizzato per agenti](#optimized-for-agents)
  - [Client CLI](#cli-client)
    - [Installazione](#installation)
    - [Avvio rapido con CLI](#quick-start-with-cli)
  - [Creazione, gestione e apertura di progetti esistenti](#project-creation-management-and-opening-existing-projects)
    - [Creazione di nuovi progetti](#creating-new-projects)
      - [Struttura di progetto autocontenuta](#self-contained-project-structure)
      - [Creazione di base del progetto](#basic-project-creation)
      - [Creazione personalizzata del progetto](#custom-project-creation)
      - [Creazione di più progetti correlati](#creating-multiple-related-projects)
    - [Apertura di progetti Ghidra esistenti](#opening-existing-ghidra-projects)
      - [Apertura tramite file .gpr](#opening-by-gpr-file)
    - [Modalità GUI](#gui-mode)
    - [Impostazioni predefinite di avvio e progetti di grandi dimensioni](#startup-defaults-and-large-projects)
  - [Sviluppo](#development)
    - [Configurazione](#setup)
    - [Test e qualità](#testing-and-quality)
  - [API](#api)
    - [Strumenti](#tools)
      - [Operazioni batch](#batch-operations)
      - [Strumenti di lettura / analisi](#read--analysis-tools)
      - [Operazioni sul progetto](#project-operations)
      - [Strumenti di modifica / mutazione](#edit--mutation-tools)
      - [Strumenti di controllo GUI (solo `--gui`)](#gui-control-tools---gui-only)
  - [Utilizzo](#usage)
    - [Mappatura dei binari con Docker](#mapping-binaries-with-docker)
    - [Utilizzo con OpenWeb-UI e MCPO](#using-with-openweb-ui-and-mcpo)
      - [Con `uvx`](#with-uvx)
      - [Con Docker](#with-docker)
    - [Standard Input/Output (stdio)](#standard-inputoutput-stdio)
      - [Python](#python)
      - [Docker](#docker)
    - [Streamable HTTP](#streamable-http)
      - [Python](#python-1)
      - [Docker](#docker-1)
    - [Server-sent events (SSE)](#server-sent-events-sse)
      - [Python](#python-2)
      - [Docker](#docker-2)
  - [Integrazioni](#integrations)
    - [Claude Desktop](#claude-desktop)
  - [Ispirazione](#inspiration)
  - [Contributi, community ed esecuzione dal sorgente](#contributing-community-and-running-from-source)
    - [Flusso di lavoro per i contributori](#contributor-workflow)

## Per iniziare

Esegui il [pacchetto Python](https://pypi.org/p/pyghidra-mcp) come comando CLI usando [`uv`](https://docs.astral.sh/uv/guides/tools/):```bash
uvx pyghidra-mcp # Creates pyghidra_mcp_projects directory by default
Scarica lo strumento

Per avviare e controllare una GUI di Ghidra live da 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

root@kitploit:~
> [!IMPORTANT]
> `--gui` avvia Ghidra tramite `pyghidra-mcp`. Non si collega a un'istanza Ghidra esterna già in esecuzione.

Oppure, esegui come [contenitore Docker](https://ghcr.io/clearbluejar/pyghidra-mcp):```bash
docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp -t stdio

Ottimizzato per gli agenti

pyghidra-mcp mantiene intenzionalmente ridotta la superficie MCP, così i client agente spendono meno token per la scoperta degli strumenti e la selezione degli argomenti.

  • Descrizioni brevi degli strumenti: le docstring degli strumenti MCP sono mantenute compatte, così gli schemi degli strumenti FastMCP restano piccoli ed economici da inviare ai modelli.
  • Disciplina del contesto: gli strumenti restituiscono dati strutturati mirati invece di scaricare per impostazione predefinita l'intero contesto del programma. I risultati di decompilazione, ricerca di simboli e riferimenti incrociati sono modellati per supportare un'analisi iterativa piuttosto che un'unica grande risposta.
  • Solo strumenti GUI quando pertinenti: i controlli esclusivi della GUI come open_program_in_gui, list_open_programs, set_current_program e goto sono esposti solo quando il server viene avviato con --gui.
  • CLI opzionale: se MCP non è la tua interfaccia preferita, pyghidra-mcp-cli fornisce un client a riga di comando diretto su HTTP con comandi raggruppati per i flussi di lavoro comuni di modifica e analisi.

Questo mantiene il server predefinito utilizzabile per agenti LLM, integrazioni IDE e automazione, senza esporre una superficie di strumenti superflua o controlli solo GUI nelle sessioni headless.

Client CLI

Per un'esperienza a riga di comando più interattiva, puoi usare il pacchetto separato pyghidra-mcp-cli, che fornisce un'interfaccia intuitiva per interagire con un server pyghidra-mcp in esecuzione.

Installazione

Installa il client CLI usando uv (consigliato):```bash uvx pyghidra-mcp-cli

root@kitploit:~
Oppure installa con pip:```bash
pip install pyghidra-mcp-cli

Avvio rapido con CLI

  1. Avvia il server (in un terminale):```bash pyghidra-mcp --transport streamable-http /bin/ls
root@kitploit:~
2. **Usa la CLI** (in un altro terminale):```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] La CLI si connette a pyghidra-mcp tramite HTTP per evitare l'overhead di avvio di 10-60 secondi necessario per generare un nuovo processo Ghidra per ogni comando. Consulta il CLI README per la documentazione completa.

Creazione, Gestione e Apertura di Progetti Esistenti

Creazione di Nuovi Progetti

Puoi creare nuovi progetti in diversi modi, a seconda del tuo flusso di lavoro:

Struttura di Progetto Autonoma

pyghidra-mcp crea una struttura di progetto autonoma in cui ogni progetto ha il proprio progetto Ghidra e i propri artefatti pyghidra-mcp. Ciò garantisce un completo isolamento e una facile gestione dei progetti.

Creazione di Progetto di Base```bash

Create a new project with default settings

pyghidra-mcp

Creates:

$ tree pyghidra_mcp_projects/ pyghidra_mcp_projects/ ├── my_project.gpr ├── my_project-pyghidra-mcp │ ├── chromadb │ └── gzfs └── my_project.rep

root@kitploit:~
#### Creazione di progetti personalizzati```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

Creare più progetti correlati```bash

Create separate projects for different analysis focuses

mkdir ~/reverse_engineering_workspace

Project for suspicious binaries

pyghidra-mcp --project-path ~/reverse_engineering_workspace/suspicious_binaries --project-name suspicious_analysis

Project for packed malware

pyghidra-mcp --project-path ~/reverse_engineering_workspace/packed_malware --project-name packed_analysis

root@kitploit:~
### Aprire progetti Ghidra esistenti

Se hai progetti Ghidra esistenti (file `.gpr`), puoi aprirli direttamente con `pyghidra-mcp`:

#### Apertura tramite file .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)

Modalità GUI

Usa la modalità GUI quando vuoi che le azioni MCP operino sugli stessi oggetti di programma live che Ghidra sta visualizzando.

  • --gui richiede --transport streamable-http (o --transport http come alias)
  • --project-path può essere una directory di progetto più --project-name, oppure un file .gpr esistente. I progetti mancanti vengono creati automaticamente.
  • Ghidra viene avviato da pyghidra-mcp, che mantiene le transazioni GUI e MCP nella stessa JVM
  • Gli strumenti solo GUI sono esposti solo quando si esegue con --gui

Esempio:```bash pyghidra-mcp
--gui
--transport streamable-http
--project-path /absolute/path/to/my_research.gpr

root@kitploit:~
La modalità GUI è la scelta giusta quando vuoi:

- aprire o cambiare programmi in CodeBrowser
- navigare nel listing fino a una funzione o un indirizzo
- rinominare funzioni o aggiungere commenti e vedere subito queste modifiche in Ghidra

### Default di avvio e progetti di grandi dimensioni

`pyghidra-mcp` non richiede `--wait-for-analysis` di default. Il server può avviarsi mentre l'analisi e l'indicizzazione lato MCP continuano in background.

Questo è importante per progetti di grandi dimensioni:

- l'avvio di un progetto con molti binari non deve bloccare l'avvio del server
- `--wait-for-analysis` è disponibile quando vuoi un progetto completamente analizzato prima di servire le richieste
- per progetti esistenti di grandi dimensioni, aspettati che la prontezza di analisi e indicizzazione vari da binario a binario

Limitazione attuale:

- lo stato di analisi di Ghidra e lo stato di indicizzazione di MCP sono separati
- un binario può essere completamente analizzato in Ghidra mentre `search_strings` o la ricerca semantica `search_code` attendono ancora l'indicizzazione lato MCP
- questo è più evidente quando si aprono progetti esistenti di grandi dimensioni

In pratica:

- decompilazione, navigazione, rinomina e commenti possono comunque funzionare per un binario mentre le funzionalità di ricerca che dipendono dall'indicizzazione recuperano il ritardo
- se la latenza di avvio conta più della prontezza immediata della ricerca, mantieni il default `--no-wait-for-analysis`
- se la prontezza immediata conta più del tempo di avvio, usa `--wait-for-analysis`

## Sviluppo

Questo progetto usa un `Makefile` per semplificare sviluppo e testing. `ruff` è usato per linting e formattazione, e gli hook `pre-commit` sono usati per garantire la qualità del codice.

### Configurazione

1.  **Installa `uv`**: Se non hai `uv` installato, puoi installarlo usando pip:
    ```bash
    pip install uv
    ```
    Oppure, segui la guida ufficiale all'installazione di `uv`: [https://docs.astral.sh/uv/install/](https://docs.astral.sh/uv/install/)

2.  **Crea un ambiente virtuale e installa le dipendenze**:
    ```bash
    make dev-setup
    source ./.venv/bin/activate
    ```

3.  **Imposta la variabile d'ambiente di Ghidra**: Scarica e installa Ghidra, poi imposta la variabile d'ambiente `GHIDRA_INSTALL_DIR` sulla directory di installazione di 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)
    ```

### Test e qualità

Il `Makefile` fornisce diversi target per il testing e la qualità del codice:

- `make run`: Esegue il server MCP.
- `make test`: Esegue la suite di test completa (unit e integrazione).
- `make test-unit`: Esegue i test unitari.
- `make test-integration`: Esegue i test di integrazione.
- `make test-integration-fast`: Esegue lo smoke test di integrazione leggero usato da pre-commit.
- `make test-integration-gui`: Esegue i test di integrazione GUI. Richiede un'installazione di Ghidra funzionante e il supporto GUI.
- `make lint`: Controlla lo stile del codice con `ruff`.
- `make format`: Formatta il codice con `ruff`.
- `make typecheck`: Esegue controlli statici leggeri con `ruff`.
- `make check`: Esegue tutti i controlli di qualità.
- `make dev`: Esegue il flusso di lavoro di sviluppo (formattazione e controllo).
- `make build`: Compila i pacchetti di distribuzione.
- `make clean`: Pulisce gli artefatti di build e la cache.

Suddivisione consigliata:

- pre-commit: `ruff`, `pyright`, test unitari e uno smoke test di integrazione leggero
- GitHub Actions: copertura completa dell'integrazione headless su Linux, GUI Linux sotto `Xvfb`, copertura CLI e smoke test correnti su macOS
- CI pianificata: copertura della compatibilità con versioni precedenti di macOS / Ghidra
- locale/manuale: debug GUI più pesante specifico per ambiente e controlli di sanity pre-rilascio

## API

### Strumenti

Consentono agli LLM di eseguire azioni, fare calcoli deterministici e interagire con servizi esterni.

#### Operazioni batch

`decompile_function` e `list_xrefs` accettano un singolo target o una lista di target, riducendo i round-trip quando si analizzano catene di chiamate o più simboli contemporaneamente.```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"]
}

Gli errori per singolo elemento vengono restituiti inline (gli altri target hanno comunque successo):```jsonc [ {"name": "main", "code": "void main() { ... }", "callees": ["init_hardware"], "xrefs": [...]}, {"name": "0xdeadbeef", "code": "", "error": "Function or symbol '0xdeadbeef' not found."} ]

root@kitploit:~
#### Strumenti di lettura / analisi

- `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)`: Cerca pseudo-C decompilato usando ricerca vettoriale semantica o corrispondenza letterale.

- `list_xrefs(binary_name: str, name_or_address: str | list[str])`: Elenca i riferimenti incrociati a funzioni, simboli o indirizzi. Accetta un singolo target o una lista per la ricerca batch.

- `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 grafo delle chiamate MermaidJS per una funzione specificata. Supporta entrambe le direzioni "calling" (funzioni chiamate dal target) e "called" (funzioni che chiamano il target) con più tipi di visualizzazione.

- `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)`: Decompila funzioni per nome o indirizzo. Accetta un singolo target o una lista per la decompilazione batch. I flag di risposta estesa collegano callees, stringhe e/o xref a ciascun risultato. `timeout_sec` si applica per target e limita autonomamente ogni tentativo di decompilazione.

- `list_exports(binary_name: str, query: str = ".*", offset: int = 0, limit: int = 25)`: Elenca tutte le funzioni e i simboli esportati da un binario specificato (regex supportata per la query).

- `list_imports(binary_name: str, query: str = ".*", offset: int = 0, limit: int = 25)`: Elenca tutte le funzioni e i simboli importati per un binario specificato (regex supportata per la query).

- `read_bytes(binary_name: str, address: str, size: int = 32)`: Legge byte grezzi dalla memoria a un indirizzo specificato. Gli indirizzi esadecimali possono includere o omettere il prefisso `0x`.

- `search_strings(binary_name: str, query: str, limit: int = 100)`: Cerca stringhe all'interno di un binario.

- `search_symbols_by_name(binary_name: str, query: str, functions_only: bool = False, offset: int = 0, limit: int = 25)`: Cerca simboli in un binario per nome. Supporta pattern regex (es. `^main$`, `func.*one`) con corrispondenza senza distinzione tra maiuscole e minuscole, o semplici query per sottostringa. Imposta `functions_only=True` per escludere etichette, variabili e altri simboli non funzione.

#### Operazioni di progetto

- `import_binary(binary_path: str)`: Importa un binario da un percorso designato nel progetto Ghidra corrente. Se il percorso è una directory, esegue una scansione ricorsiva e importa tutti i file binari supportati, preservando la struttura delle directory all'interno del progetto Ghidra.

- `list_project_binaries()`: Elenca i binari nel progetto Ghidra corrente. In modalità GUI questo include i binari del progetto presenti su disco anche se non sono attualmente aperti in CodeBrowser.

- `list_project_binary_metadata(binary_name: str)`: Recupera metadati dettagliati per un binario specifico, inclusi architettura, compilatore, formato eseguibile, metriche di analisi e hash dei file.

- `delete_project_binary(binary_name: str)`: Elimina un binario (programma) dal progetto Ghidra.

#### Strumenti di modifica / mutazione

- `rename_function(binary_name: str, name_or_address: str, new_name: str)`: Rinomina una funzione per nome o indirizzo. In modalità GUI questa operazione viene eseguita come transazione Ghidra live e aggiorna il programma aperto.

- `rename_variable(binary_name: str, function_name_or_address: str, variable_name: str, new_name: str)`: Rinomina un parametro di funzione o una variabile locale tramite nome esatto all'interno di una funzione specifica. Se il nome è assente o ambiguo all'interno di quella funzione, lo strumento restituisce un errore anziché fare ipotesi. In modalità GUI questa operazione viene eseguita come transazione Ghidra live e aggiorna il programma aperto.

- `set_variable_type(binary_name: str, function_name_or_address: str, variable_name: str, type_name: str)`: Imposta il tipo di dati per un parametro di funzione o una variabile locale tramite nome esatto all'interno di una funzione specifica. Se il nome è assente o ambiguo all'interno di quella funzione, lo strumento restituisce un errore anziché fare ipotesi. `type_name` viene analizzato tramite il parser dei tipi di dati di Ghidra utilizzando il gestore dei tipi di dati del programma.

- `set_function_prototype(binary_name: str, function_name_or_address: str, prototype: str)`: Imposta un prototipo di funzione da una stringa di firma completa. Lo strumento esegue sempre il prototipo tramite il parser di firme nativo di Ghidra e restituisce l'eventuale errore del parser o dell'applicazione se il prototipo non è valido.

- `set_comment(binary_name: str, target: str, comment: str, comment_type: str)`: Imposta un commento di funzione/decompilatore o un commento al listing. I target dei commenti al listing possono essere indirizzi, simboli o funzioni. I valori supportati per `comment_type` sono `decompiler`, `plate`, `pre`, `eol`, `post` e `repeatable`.

#### Strumenti di controllo GUI (solo `--gui`)

Questi strumenti sono disponibili solo quando `pyghidra-mcp` viene avviato con `--gui` e controllano ciò che la GUI mostra anziché modificare direttamente i dati del progetto:

- `list_open_programs()`: Elenca i programmi attualmente aperti nella GUI di Ghidra.
- `open_program_in_gui(binary_name: str, new_window: bool = True)`: Apre un binario del progetto in CodeBrowser. Di default apre una nuova finestra di CodeBrowser. Imposta `new_window=false` per riutilizzare un CodeBrowser visibile quando possibile.
- `set_current_program(binary_name: str)`: Rende un programma aperto il programma attivo/corrente nel contesto principale degli strumenti GUI.
- `goto(binary_name: str, target: str, target_type: str)`: Naviga nella GUI di Ghidra fino a un indirizzo o una funzione. `target_type` deve essere `address` o `function`.

## Utilizzo

Questo pacchetto Python è pubblicato su PyPI come [pyghidra-mcp](https://pypi.org/p/pyghidra-mcp) e può essere installato ed eseguito 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 qualsiasi gestore di pacchetti 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.

Mappatura dei binari con Docker

Quando si utilizza il container Docker, è possibile mappare una directory locale contenente i propri binari nello spazio di lavoro del container. Ciò consente a pyghidra-mcp di analizzare i tuoi file.```bash

Create and populate the new directory

mkdir -p ./binaries cp /path/to/your/binaries/* ./binaries/

Run the Docker container with volume mapping

docker run -i --rm
-v "$(pwd)/binaries:/binaries"
ghcr.io/clearbluejar/pyghidra-mcp
/binaries/*

root@kitploit:~
### Utilizzo con OpenWeb-UI e MCPO

Puoi integrare `pyghidra-mcp` con [OpenWeb-UI](https://github.com/open-webui/open-webui) utilizzando [MCPO](https://github.com/open-webui/mcpo), un proxy MCP-to-OpenAPI. Questo ti consente di esporre gli strumenti di `pyghidra-mcp` tramite un'API RESTful standard, rendendoli accessibili alle interfacce web e ad altri strumenti.


https://github.com/user-attachments/assets/3d56ea08-ed2d-471d-9ed2-556fb8ee4c95


#### Con `uvx`

Puoi eseguire `pyghidra-mcp` e `mcpo` insieme usando `uvx`:```bash
uvx mcpo -- \
  pyghidra-mcp /bin/ls

Con Docker

Puoi combinare mcpo con Docker:```bash uvx mcpo -- docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp /bin/ls

root@kitploit:~
### Input/Output standard (stdio)

Il trasporto stdio consente la comunicazione tramite flussi di input e output standard. Ciò è particolarmente utile per integrazioni locali e strumenti da riga di comando. Vedi la [specifica](https://modelcontextprotocol.io/docs/concepts/transports#built-in-transport-types) per maggiori dettagli.

#### Python```bash
pyghidra-mcp

Per impostazione predefinita, il pacchetto Python verrà eseguito in modalità stdio. Poiché utilizza i flussi di input e output standard, sembrerà che lo strumento si sia bloccato senza alcun output, ma questo è previsto.

Docker

Questo server è pubblicato nel Container Registry di GitHub (ghcr.io/clearbluejar/pyghidra-mcp)``` docker run -i --rm ghcr.io/clearbluejar/pyghidra-mcp -t stdio

root@kitploit:~
Per impostazione predefinita, il container Docker avvia il server `streamable-http`, quindi includi `-t stdio` dopo il nome dell'immagine ed esegui con `-i` per la modalità stdio [interattiva](https://docs.docker.com/reference/cli/docker/container/run/#interactive).

### Streamable HTTP

Streamable HTTP consente risposte in streaming su JSON RPC tramite richieste HTTP POST. Consulta la [specifica](https://modelcontextprotocol.io/specification/draft/basic/transports#streamable-http) per maggiori dettagli.

Per impostazione predefinita, il server è in ascolto su [http://127.0.0.1:8000/mcp](http://127.0.0.1:8000/mcp) per le connessioni dei client. Usa `--host` / `--port` o le variabili d'ambiente `MCP_HOST` / `MCP_PORT` per modificare l'indirizzo di bind. _Il server deve essere in esecuzione affinché i client possano connettersi ad esso._

#### Python```bash
pyghidra-mcp -t streamable-http

Per impostazione predefinita, il pacchetto Python verrà eseguito in modalità stdio, quindi dovrai includere -t streamable-http.

La modalità GUI utilizza questo trasporto:```bash pyghidra-mcp
--gui
--transport streamable-http
--project-path /absolute/path/to/my_project.gpr

root@kitploit:~
#### Docker```
docker run -p 8000:8000 ghcr.io/clearbluejar/pyghidra-mcp

Eventi inviati dal server (SSE)

[!WARNING] La community MCP considera questo un protocollo di trasporto legacy, pensato per la compatibilità con le versioni precedenti. Streamable HTTP è il sostituto consigliato.

Il trasporto SSE consente lo streaming da server a client con Server-Send Events per la comunicazione da client a server e da server a client. Consulta la specifica per maggiori dettagli.

Per impostazione predefinita, il server è in ascolto su http://127.0.0.1:8000/sse per le connessioni dei client. Usa --host / --port o le variabili d'ambiente MCP_HOST / MCP_PORT per modificare l'indirizzo di bind. Il server deve essere in esecuzione affinché i client possano connettersi.

Python```bash

pyghidra-mcp -t sse

root@kitploit:~
Di default, il pacchetto Python verrà eseguito in modalità `stdio`, quindi dovrai includere `-t sse`.

#### Docker```
docker run -p 8000:8000 ghcr.io/clearbluejar/pyghidra-mcp -t sse

Integrations

[!NOTE] Questa sezione è in lavorazione. Presto aggiungeremo esempi per integrazioni specifiche.

Claude Desktop

Aggiungi il seguente blocco JSON al tuo file 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" } } } }

root@kitploit:~
## Ispirazione

L'implementazione e il design di questo progetto sono stati ispirati da questi fantastici progetti:

* [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)

---

## Contributi, community ed esecuzione dal sorgente

Crediamo che il futuro del reverse engineering sia agentico, contestuale e scalabile.  
`pyghidra-mcp` è un passo verso quel futuro—rendere i progetti Ghidra completi accessibili ad agenti AI e pipeline di automazione.

Stiamo sviluppando attivamente il progetto e accogliamo volentieri feedback, segnalazioni di problemi e contributi.

> [!NOTE]
> Adoriamo il tuo feedback, le segnalazioni di bug, le richieste di funzionalità e il codice.

### Flusso di lavoro per i contributori

Se stai aggiungendo un nuovo strumento o una nuova integrazione, ecco il flusso di lavoro consigliato:

- Assegna al tuo branch il prefisso `feature/` per indicare una nuova funzionalità.
- Aggiungi il tuo strumento usando lo stesso stile e la stessa struttura degli strumenti esistenti in `pyghidra/tools/`.
- Scrivi un test di integrazione che eserciti il tuo strumento usando un'istanza di `StdioClient`. Posizionalo in `tests/integration/`.
- Estendi i test concorrenti aggiungendo una chiamata al tuo strumento in `tests/integration/test_concurrent_streamable_client.py`.
- Esegui make test e make format per assicurarti che le tue modifiche superino tutti i test e siano conformi alle regole di linting.

Questo garantisce coerenza in tutto il codebase e ci aiuta a mantenere strumenti robusti e scalabili per i flussi di lavoro di reverse engineering.

______________________________________________________________________

Fatto con ❤️ dal [PyGhidra-MCP Team](https://github.com/clearbluejar/pyghidra-mcp)