Ghidra MCPでClaude Codeにバイナリ解析を任せる設定ガイド
Ghidra MCPサーバーをClaude Codeに繋ぎ、逆コンパイルや関数解析をClaudeに任せる手順と、209個のツールを絞り込むLazy Loading設定をまとめました。
Ghidra MCPは、逆コンパイラGhidraの解析機能をMCP経由でClaudeに渡すオープンソースのブリッジです。Claude CodeにMCPサーバーとして登録すると、実行ファイルの逆コンパイルや関数の命名、文字列抽出をチャットの指示だけで進められます。Claude Codeから使うには、Ghidra側のプラグインとPython製のbridge(bridge-mcp-ghidra)の2つを用意し、claude mcp addでbridgeを登録します。本記事は接続手順と、209個あるツールを絞り込む設定、出力サイズの調整までをまとめます。
Ghidra MCPとは何か
Ghidraは実行ファイルを逆コンパイルして解析するリバースエンジニアリングツールです。Ghidra MCPはこのGhidraをMCPサーバーとして公開し、AIツールから関数解析やリネームを操作できるようにするブリッジで、GitHubのbethington/ghidra-mcpが配布しています。209個のMCPツールを持ち、読み取り専用の解析だけでなく、関数名・型のリネーム、構造体の作成、スクリプト実行、P-codeエミュレーション、ライブデバッガ連携まで書き込み系の操作も揃っています。209個は全カタログの数で、GUIプラグイン経由なら205個、ヘッドレスサーバー経由なら190個が提供されます。
解析だけでなく編集もできる点が特徴です。SHA-256による関数ハッシュの一致を使い、バージョンの違うバイナリ間で解析結果(関数名やコメント)を引き継ぐ機能もあります。一度ドキュメント化した関数の情報を、別バージョンの同じバイナリに自動で適用できるということです。
セットアップの前提条件
Ghidra MCPを動かすには次の4つが必要です。
| 項目 | 要件 |
|---|---|
| Java | 要件Java 21 LTS(OpenJDK推奨) |
| ビルドツール | 要件Apache Maven 3.9以上 |
| Ghidra | 要件12.1.4、または互換バージョン |
| Python | 要件3.10以上(uv推奨。pip + venvでも可) |
Pythonパッケージマネージャーのuvを推奨しているのには理由があります。Debian系ディストリ(Debian 12以降、Kali、Ubuntu 23.04以降)はシステムのPythonを外部管理化しているため、素のpip installがexternally-managed-environmentエラーで失敗します。uvはプロジェクト専用の.venvを自動で作るため、この制約に引っかかりません。
既存の共有Ghidraサーバーに繋ぐ場合は、クライアントとサーバーのバージョンを揃える必要があります。READMEは、Ghidra 12.1.4のクライアントにサーバー12.1.2か12.0.5以降を求めています。古い共有サーバーは12.1系クライアントの接続先に向かないため、サーバー側を先に上げます。
Claude Codeに接続する
まずリポジトリをクローンし、セットアップスクリプトでビルドとデプロイを行います。
git clone https://github.com/bethington/ghidra-mcp.git
cd ghidra-mcp
python -m tools.setup ensure-prereqs --ghidra-path /path/to/ghidra
python -m tools.setup build
python -m tools.setup deploy --ghidra-path /path/to/ghidramacOSでHomebrewを使う場合は、Ghidra自体もHomebrewから入れられます。
brew install openjdk@21 maven python ghidradeployは実行中のGhidraがあれば保存して閉じ、拡張機能をインストールしてから起動確認まで一気に行います。
接続が通るまでの3段階
- 1
プラグインを有効にしてサーバーの起動を確認する
File > Configure > Utility > Configure > GhidraMCPPluginでプラグインを有効にします。サーバーはプラグインと一緒に起動し、Tools > GhidraMCP > Server Statusで状態を確認できます。既定の待ち受け先はhttp://127.0.0.1:8089/です。git cloneで取れる既定ブランチはdevで、上のメニューはdevの表記です。mainブランチと安定版v6.0.0のzip(Ghidra 12.1.2が前提)は旧メニューのままです。有効化は
File > Configure > Configure All Plugins > GhidraMCP、起動はTools > GhidraMCP > Start MCP Serverです。 - 2
Claude Codeにbridgeを登録する
下のコマンドで登録します。
- 3
疎通を確かめる
下の
curlとclaude mcp getで確かめます。
Claude Code側は、ローカルのstdioサーバーとしてclaude mcp addで登録します。公式ドキュメントが示す基本形は次のとおりです。
claude mcp add [options] <name> -- <command> [args...]Ghidra MCPに当てはめると、bridgeの起動コマンドを--の後ろに渡す形になります。
claude mcp add --transport stdio ghidra -- \
/home/you/.local/bin/uv run --directory /path/to/ghidra-mcp bridge-mcp-ghidra環境変数を渡すときは-eの位置に注意が要ります。Claude Code v2.1.287で、別のポートで待ち受けるGhidraに向けるためGHIDRA_MCP_URLを渡す場面を試しました。-eをサーバー名の前に置くと、-eが複数の値を受け取る指定なのでサーバー名まで環境変数として読まれ、登録に失敗します。
claude mcp add --transport stdio --scope project -e GHIDRA_MCP_URL=http://127.0.0.1:8089 ghidra -- /home/you/.local/bin/uv run --directory /path/to/ghidra-mcp bridge-mcp-ghidraInvalid environment variable format: ghidra, environment variables should be added as: -e KEY1=value1 -e KEY2=value2サーバー名を先に置き、-eをその後ろ、--の前に並べると通ります。--scope projectを付けたので、作業ディレクトリに.mcp.jsonが書かれます。
claude mcp add --transport stdio --scope project ghidra -e GHIDRA_MCP_URL=http://127.0.0.1:8089 -- /home/you/.local/bin/uv run --directory /path/to/ghidra-mcp bridge-mcp-ghidra{
"mcpServers": {
"ghidra": {
"type": "stdio",
"command": "/home/you/.local/bin/uv",
"args": ["run", "--directory", "/path/to/ghidra-mcp", "bridge-mcp-ghidra"],
"env": { "GHIDRA_MCP_URL": "http://127.0.0.1:8089" }
}
}
}登録先のスコープは3種類あり、claude mcp addは既定でlocalスコープ(自分だけ・現在のプロジェクトのみ)に書き込みます。チームで共有するなら--scope projectを付けて.mcp.jsonに書き、全プロジェクトで使うなら--scope userにします。
接続の確認は2段階でできます。Claude Code側はclaude mcp get ghidraで、登録済みのサーバーへ実際に接続して状態を返します。Ghidra側は次のヘルスチェックです。
curl http://127.0.0.1:8089/check_connectionConnected: GhidraMCP plugin running with program '<name>'が返れば、Ghidraとの接続まで通っています。ただしトークンを入れても通るので、保護の確認には使えません。
ここまでのclaude mcp addの流れはGhidra MCPに限りません。ローカルコマンドを繋ぐ別の例はNext.js MCPサーバーをClaude Codeで使う設定ガイドにもあります。
Claudeにバイナリ解析を任せる基本操作
接続できたら、Claudeに「このバイナリのエントリポイントから主要な処理を要約して」のように頼むだけで、Claudeが必要なツールを自分で選んで呼び出します。ただしMCPクライアントによっては、許可するツールを絞りたい場面があります。用途別の目安は次のとおりです。
| 用途 | 向くツール構成 | 注意点 |
|---|---|---|
| 未知バイナリの初期調査(読み取り専用) | 向くツール構成get_metadata / list_methods / get_entry_points / decompile_functionの4つ | 注意点書き込み系を許可しなくても完結する |
| 関数のリネーム・型付け・コメント作業 | 向くツール構成既定のlisting,function,programグループ | 注意点リネームは命名規則チェックに引っかかることがある |
| スクリプト実行 | 向くツール構成GHIDRA_MCP_ALLOW_SCRIPTS=1 | 注意点v5.4.1以降は既定で無効。必要なときだけ有効化する |
| ライブデバッグ | 向くツール構成debugger_*ツール群 | 注意点外部のデバッガサーバーを用意しGHIDRA_DEBUGGER_URL(ループバック)を設定したときだけ登録される |
最小構成の4つが閉じた組み合わせになっているのがポイントです。get_entry_pointsとlist_methodsがアドレスと名前を渡し、decompile_functionがその関数本体を返します。返ってきた本体には呼び出し先の関数名が含まれるので、そこから次のdecompile_function呼び出しにつながります。エントリポイントから追える範囲であれば、この4つだけで調査が完結します。
Claude Code側では、権限ルールでこの構成を固められます。mcp__<サーバー名>__<ツール名>の形で書き、allowは確認なしで呼べるツール、denyは呼べなくするツールです。allowは絞り込みではないため、書き込み系を止めたいときはdenyで名指しします。
{
"permissions": {
"allow": [
"mcp__ghidra__get_metadata",
"mcp__ghidra__list_methods",
"mcp__ghidra__get_entry_points",
"mcp__ghidra__decompile_function"
],
"deny": ["mcp__ghidra__rename_symbol"]
}
}サーバー名ghidraは登録時の名前と揃えます。mcp__ghidra__*のようなワイルドカードは、allowでもmcp__<サーバー名>__の後ろに限って使えます。丸括弧で引数を条件にしたmcp__ルールは、読み込み時に無視されます。
209個のツールは、Claude Codeではどこで絞られるか
ツールの絞り込みは、bridgeとClaude Codeの両方で働きます。Claude Codeを使う限り、209個の多さが問題になる場面は限られます。
遅延ロードは2か所にある
bridge側(Lazy Tool Loading)
既定ではlisting・function・programの3グループ(68エンドポイント+8個の静的ツール)だけを接続時に登録します。残りはsearch_toolsやload_tool_groupで、実行中に追加します。
Claude Code側(tool search)
MCPツールの定義は既定で後回しにされ、セッション開始時に載るのはツール名とサーバーの説明だけです。必要になった時点でClaudeが検索して読み込みます。
bridgeが遅延ロードを既定にした理由は、Geminiです。GeminiのAPIは関数定義を状態機械にコンパイルする方式で、全ツールを一度に渡すと呼び出し前にリクエストごと拒否します。
400 INVALID_ARGUMENT
The specified schema produces a constraint that has too many states for servingClaude Codeにこの制約はありません。Claude Code側のtool searchが外れる条件もあります。
ANTHROPIC_BASE_URLが公式以外のホストを指すとき、ENABLE_TOOL_SEARCH=falseのとき、
CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETASを設定したときです。Google CloudのAgent PlatformでClaude 4.5世代より前のモデルを使うときと、Microsoft FoundryのAzureホストでも、ツールを先読みします。外れた構成では、bridgeの遅延ロードだけが絞り込みを担います。
遅延ロードで後から増えたツールは、list_changed通知でClaude Codeに伝わります。対話セッションでは一覧が自動で更新され、-pの非対話モードやAgent SDKでも、ツール一覧は通知で更新されます。通知を受けるストリームが閉じたときは、再接続までは最後に取得した一覧のままです。/mcpから接続し直すと、すぐ最新になります。
通知を無視するクライアントでは、遅延登録されたツールに気づけません。その場合は起動時に--no-lazyを付けるか、環境変数GHIDRA_MCP_LAZY=0を設定して全ツールを最初から読み込みます。
逆に、特定のツール群を毎回見える状態にしたいなら、.mcp.jsonの該当サーバーに"alwaysLoad": trueを足す手があります。ただしtool searchの後回しが外れ、そのサーバーのツールが全部セッション開始時に載ります。bridgeが遅延ロードのままなら、載るのは接続時に登録された分です。
Windowsで設定するときの違い
手順はmacOS・Linuxと同じで、違うのはパスの書き方です。ensure-prereqsとdeployの--ghidra-pathには、"C:\ghidra_12.1.4_PUBLIC"のようにGhidraのインストール先を渡します。
bridgeの登録では、commandをuv.exeの絶対パスにします。C:\\Users\\<you>\\.local\\bin\\uv.exeの形で、JSONではバックスラッシュを2つ重ねます。自分のパスはwhere.exe uvで調べられます。python -m tools.setup preflightを実行すると、解決済みの絶対パスと貼り付け用の設定例も表示されます。
出力サイズとタイムアウトの調整
decompile結果は関数によっては長大になり、Claude Code側の出力上限に触れやすい機能です。ここはGhidra MCPの設定ではなく、Claude Code側の設定で調整します。
Claude Codeは、単一のMCPツール出力が1万トークンを超えると警告を出します。既定の上限は2.5万トークンで、MAX_MCP_OUTPUT_TOKENS環境変数で変更できます。
export MAX_MCP_OUTPUT_TOKENS=50000
claude上限を超えた結果は、会話にそのまま貼られるのではなくファイルへ保存されます。保存先はセッションのtool-resultsディレクトリで、~/.claude/projects/の下にあります。Claudeはファイルパスだけを受け取り、必要になった時点でそのファイルを読みに行きます。画像を含む結果は、この保存の対象外です。
呼び出しごとのタイムアウトは.mcp.json側のtimeoutフィールド(ミリ秒)で個別に設定できます。未設定の場合はMCP_TOOL_TIMEOUT環境変数、それも未設定なら既定で約28時間という長いタイムアウトになります。
{
"mcpServers": {
"ghidra": {
"command": "/home/you/.local/bin/uv",
"args": ["run", "--directory", "/path/to/ghidra-mcp", "bridge-mcp-ghidra"],
"timeout": 600000
}
}
}タイムアウトやMCPサーバーの呼び出しがエラーになる不具合は、Ghidra MCP固有の話ではありません。Agent SDK側では並列呼び出しでタイムアウトの扱いが変わる別のパターンもあり、MCP_TOOL_TIMEOUTを設定しても5分で切れるAgent SDKのMCPツール呼び出しで扱っています。
セキュリティ上の注意
Ghidra MCPはローカル開発を前提に設計されています。既定の構成(127.0.0.1へのバインド、認証なし)は、信頼できる単一ユーザーのワークステーションでは安全です。
ループバックの外に公開する場合は、次の3つの環境変数を先に設定します。サーバーは、トークンなしで非ループバックにバインドしようとすると起動を拒否します。
公開前に設定する3つの環境変数
GHIDRA_MCP_AUTH_TOKEN
設定すると、すべてのHTTPリクエストに
Authorization: Bearer <token>が必須になります。/mcp/health・/health・/check_connectionは対象外です。GHIDRA_MCP_ALLOW_SCRIPTS
1・true・yesで、/run_script_inlineと/run_ghidra_scriptが有効になります。Ghidraのプロセス上で任意のJavaを実行する強力なエンドポイントのため、v5.4.1から既定で無効です。v5.4.0からの移行で使っていた場合は、明示的に有効化します。GHIDRA_MCP_FILE_ROOT
ファイルパスを扱うエンドポイント(
/load_program・/import_file・/open_project・/delete_fileなど)を、指定ディレクトリの配下に制限します。パストラバーサルの対策です。
複数のバイナリを同時に開いて作業する場合は、GHIDRA_MCP_REQUIRE_PROGRAM_SELECTORS=1を設定すると安全です。これを設定すると、対象バイナリを指定しない呼び出しをエラーとして拒否します。設定しない場合、対象を省略した呼び出しは「現在アクティブなプログラム」を暗黙に対象にするため、複数クライアントが同じサーバーを共有していると、意図しないバイナリを書き換えてしまう事故に繋がります。
よくあるつまずき
spawn uv ENOENT / spawn python ENOENT
MCPクライアントがcommandに指定したコマンドを、自分のPATH上で見つけられないときに出ます。systemdのユーザーサービスや.desktopエントリ、Finderから起動したmacOSアプリは、いずれもシェルとは別のPATHで動くため、ターミナルでuvが使えても解決に失敗します。プロセスが立ち上がる前の失敗なので、ログにも何も残りません。which uv(Windowsはwhere.exe uv)で調べた絶対パスに書き換えるのが対処です。登録例の/home/you/.local/bin/uvも、この形です。
"GhidraMCP"メニューがToolsに出てこない
拡張機能が有効化されていないか、インストールが正しく完了していません。File > Install ExtensionsにGhidraMCPが表示されているか確認します。次にFile > Configure > Utility > Configure > GhidraMCPPluginでチェックを入れ、Ghidraを再起動します。mainブランチやv6.0.0のzipでは、File > Configure > Configure All Plugins > GhidraMCPです。
接続がrefusedになる・応答がない
サーバーが起動していないか、ポートが想定と違います。Tools > GhidraMCP > Server Statusで起動状態を見て、止まっていればRestart Serverを選びます。mainブランチやv6.0.0のzipでは、Tools > GhidraMCP > Start MCP Serverで起動します。設定ポートはEdit > Tool Options > GhidraMCP HTTP Serverで確認します。ポートが使用中かどうかは、macOS/Linuxならlsof -i :8089、Windowsならnetstat -ano | findstr :8089で調べられます。
遅延ロードが有効か無効かわからない
READMEの中で、--lazyを既定とする表・解説と、--no-lazyを既定と書く一文が混在しています。後者は許可リストの節にあります。実際のモードはbridgeの起動ログに出るので、そこで確かめます。コマンドライン引数の--lazyと--no-lazyは、環境変数GHIDRA_MCP_LAZYより優先されます。
MCPサーバー導入時のエラーはツールごとに形が違います。似た文脈で起きるHTTP側のエラーはGitHub MCPプラグインがHTTP 400で失敗する原因と対処法でも扱っています。
まとめ
Claude Codeから使うなら、つまずきやすいのはuvの絶対パスと-eの置き場所の2点です。ローカルの単一ユーザー環境なら追加のセキュリティ設定は要らず、LANやサーバー越しにするときだけ認証トークンから先に決めます。
参照した一次ソース
この記事の記述は、次の一次ソースと照合しています。更新時に参照先が変わった場合は一覧も更新します。