Skip to main content
Glama
Claude-Reverser

IDA-instances-MCP

IDA-instances-MCP

ida-pro-mcpのカスタムビルド: MCPクライアントがIDA Proを操作できるようにするMCPサーバーで、複数のヘッドレスidalibインスタンスをホストすることを目的とした安定性向上対応(Ida-Instancesセットアップ)を加えた再構成版です。

これはmrexodia氏のida-pro-mcp(MIT)のフォークです。アップストリームの功績はすべてDuncan Ogilvie氏とコントリビューターに帰属し、以下のカスタム変更はこのリポジトリで維持されています。

変更内容の概要

アップストリームv2.0.0に追加された安定性強化:

領域

変更内容

データの安全性

部分データベースのクリーンアップは所有権を考慮: 他の稼働中インスタンスが所有する.id0/.id1/.id2/.nam/.tilファイルを削除することは一切なく、探索が不可能な場合は安全側に失敗します

保存の信頼性

idb_saveは600秒の予算(旧60秒)で実行。idb_closeは保存失敗後にワーカーを強制終了せず、変更を黙って破棄することもありません

同時実行性

スーパーバイザーロックは、ワーカーの起動(約120秒)、ヘルスプローブ(セッションあたり約2.5秒)、または古いワーカーの終了にまたがりません。1つの遅いオープンがすべてのセッションをフリーズさせることはありません

堅牢性

不正なJSON-RPCがstdioで受信されると、プロキシをクラッシュさせる代わりに-32700/-32600を返します

タイムアウト

プロキシのタイムアウトを30秒→900秒に引き上げ、IDA_MCP_PROXY_TIMEOUTで設定可能に。長時間の逆コンパイルがサーバー側で実行中でも、クライアント側で「失敗」しません

ネットワーク

ワーカーポートのTOCTOUは改訂され、再試行されます。SSEの書き込みと終了処理はロックで保護されます。CORSポリシーの読み取りはIDAメインスレッドの外でキャッシュされます

リソース制限

IDBトレースログはIDA_MCP_TRACE_MAX_MBで64MBに制限され、過大な引数/結果はクリップされます。フラッシュ失敗キューは上限付きです

認証

すべてのHTTPリクエストにはインスタンスAPIキーが必要です。GET /keyで厳密に1回だけ発行され、その後は破棄されます。キーはディスク上に永続化されるため、再起動やリブート後も存続します

ホスティングエンドポイント

GET /health(認証不要の動作確認プローブ)、GET /sessions(開いているデータベースと最終アクセス時刻)、POST /upload(サイズ上限付きのバイナリ直接アップロード)

アイドル回収

IDA_MCP_IDLE_TIMEOUT分間アクセスがないセッションは自動的にクローズされます(先に保存されます)

グレースフルシャットダウン

SIGTERM/SIGINT時には、開いているすべてのデータベースを保存してから終了 — pct stopで作業が失われることはありません

自己更新

起動時にGitHubリリースをチェックします。対話セッションでは、1キー入力で自動更新が提案されます

ホスティングの既定値

ヘッドレススーパーバイザーは0.0.0.0:9999で待ち受けます。GUIプラグインも0.0.0.0にバインドされ、同じAPIキーが必要になります

Related MCP server: idalib-mcp-headless

要件

  • Linux、macOS、Windows

  • Python 3.11以上(IDA内ではidapyswitchを使用して一致させてください)

  • IDA Pro 8.3以上(9.x推奨)。IDA Freeはサポートされていません

  • uv

  • MCPクライアント(Supabase Code、Cursor、Codex、OpenCode、VS Codeなど)

セットアップ

uv環境でidalibを有効化します:

# linux (server deployment)
uv run "/opt/idapro-9.x/idalib/python/py-activate-idalib.py"
# macos
uv run "/Applications/IDA Professional 9.x.app/Contents/MacOS/idalib/python/py-activate-idalib.py"
# windows
uv run "C:\Program Files\IDA Professional 9.x\idalib\python\py-activate-idalib.py"

ヘッドランモードでは、IDAのインストールディレクトリがIDADIRに設定されていることも必要です。

ヘッドレススーパーバイザーの実行(ホスティングモード)

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

起動時にAPIキーが生成され(またはディスクから読み込まれ)、それを持たないすべてのリクエストは例外的な場合を除き401 Unauthorizedになります。

インスタンスを所有するマシン/ネットワークから、キーを一度だけ取得します:

curl http://your-host:9999/key
# {"key": "3f2b..."}   <- save it; this endpoint is now burned until restart
  • キーは~/.idapro/mcp/api_key(モード0600)に保存され、再起動後も維持されます。GET /keyはサーバー起動ごとに一度だけ再発行します

  • IDA_MCP_API_KEYで上書きできます(またはIDA_MCP_API_KEY_FILEで移設)

  • 他のすべてのエンドポイントでは毎回キーが必要です:

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

キーがログに記録されることはありません。

ホスティングエンドポイント

エンドポイント

認証

目的

GET /health

なし

動作確認プローブ: {"status":"ok","uptime":N,"sessions":N} — スケジュールではなくポーリング

GET /sessions

キー

開いているデータベースと最終アクセス時刻

POST /upload?filename=NAME

キー

生ボディのバイナリアップロード。IDA_MCP_UPLOAD_DIRにストリーミングされ、idb_openに渡すパスを返します

# provisioning flow
while ! curl -sf http://10.0.0.4:9999/health >/dev/null; do sleep 1; done
KEY=$(curl -s http://10.0.0.4:9999/key | jq -r .key)
curl -H "Authorization: Bearer $KEY" --data-binary @sample.elf \
     "http://10.0.0.4:9999/upload?filename=sample.elf"

便利なフラグ:

uv run idalib-mcp --host 127.0.0.1 --port 9999   # override bind address
uv run idalib-mcp --max-workers 8                # concurrent databases (default 4, 0 = unlimited)
uv run idalib-mcp --unsafe                       # enable destructive/debugger tools (DANGEROUS)
uv run idalib-mcp --profile tools.txt            # restrict worker tools to a profile file
uv run idalib-mcp --stdio                        # stdio transport instead of HTTP
uv run idalib-mcp path/to/binary                 # open a binary at startup

セッションのライフサイクルツール: idb_open、idb_list、idb_close — セッションごとに1つのデータベースを開きます。各セッションには独立したワーカープロセスがあります。

GUIプロキシの実行(対話型IDA)

IDA内でプラグインを起動して(Edit -> Plugins -> MCP、またはCtrl+Alt+M)、その後:

uv run ida-pro-mcp                                   # stdio proxy, auto-discovers IDA
uv run ida-pro-mcp --transport http://127.0.0.1:9999 # serve HTTP instead

MCPクライアントを接続する

一般的なJSON構成(HTTPトランスポート):

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

Claude Code:

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

stdioを使用するGUIプロキシの場合は、uv run ida-pro-mcp --configを実行して、そのJSONをクライアントに貼り付けます。

設定(環境変数)

変数

デフォルト

説明

IDA_MCP_OPEN_TIMEOUT

1800

リードプローブ前のオープン+自動解析の最大秒数(0 = 無制限)

IDA_MCP_WORKER_CALL_TIMEOUT

900

転送された個々のツールコールのバックストップ

IDA_MCP_PROXY_TIMEOUT

900

GUIプロキシからIDAへのタイムアウト(0 = 無制限)

IDA_MCP_TRACE_MAX_MB

64

IDB内に保存されるトレースログの上限

IDA_MCP_MAX_WORKERS

4

デフォルトの--max_workers

IDA_MCP_HEALTH_TCP_TIMEOUT / IDA_MCP_HEALTH_RPC_TIMEOUT

2.0 / 10.0

ヘルスプローブの予算 (秒)

IDA_MCP_IDLE_TIMEOUT

60

未使用のセッションが自動的にクローズされるまでの分(0 = 無効)

IDA_MCP_MAX_UPLOAD_MB

100

POST /upload の本体の上限

IDA_MCP_UPLOAD_DIR

~/.idapro/mcp/uploads

アップロードの保存先

IDA_MCP_API_KEY / IDA_MCP_API_KEY_FILE

– / ~/.idapro/mcp/api_key

インスタンスキーの注入、または場所の変更

IDA_MCP_SHUTDOWN_SAVE_TIMEOUT / IDA_MCP_SHUTDOWN_SAVE_BUDGET

30 / 120

SIGTERM時のデータベースごと/合計保存予算

IDA_MCP_NO_UPDATE_CHECK

未設定

GitHubリリースチェックを無効化するには1を設定します

セキュリティメモ: APIキーは、スーパーバイザーとGUIプラグインの両方で、すべてのHTTPエンドポイントを保護します(プラグインはpy_evalを介して任意のコードを実行できるため、ループバックでもキーが必要です)。これはBearerトークンであり、入手した相手なら誰でもインスタンスを作成できることを意味します。信頼されたネットワークの外部に公開する場合はTLS対応リバースプロキシを配置してください。ブラウザでは?key=<key>でキーを渡せます(/config.htmlで便利です)。

テスト

IDADIR=/path/to/ida uv run ida-mcp-test tests/crackme03.elf -q
IDADIR=/path/to/ida uv run ida-mcp-test tests/typed_fixture.elf -q
IDADIR=/path/to/ida uv run ida-mcp-test tests/crackme03.elf -c api_analysis   # one category
IDADIR=/path/to/ida uv run coverage run -m ida_pro_mcp.test tests/crackme03.elf -q

ライセンス

MIT — アップストリームのida-pro-capから継承しています。アップストリームの製品名(IDA Pro、Hex-Rays)はHex-Rays SAの商標であり、このプロジェクトはユーザー自身による有効なIDA Proライセンスが必要になります。

Related MCP Connectors

Related MCP Servers