mcpField
U
ui-context

ui-context

github.com/allthingsida開発4947 回インストール3 週間前に更新
リポジトリ

ui-context について

ui-contextは、IDAの現在の画面状態を取得して解釈するidasqlスキルです。ビュー、選択範囲、コード位置を報告し、取得できない情報を推測しないようエージェントを導きます。

主な機能

  1. 01現在の画面状態を取得
  2. 02ビューの種類とタイトルを特定
  3. 03選択範囲とプレビューを報告
  4. 04コードのアドレス位置を抽出
  5. 05UIを利用できない実行環境に対応

活用シーン

  1. 01IDAの表示内容を説明
  2. 02現在の選択範囲を説明
  3. 03表示中のビューから関数を特定して解説

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/allthingsida/idasql-skills --skill ui-context

インストール後、Claude Code で/ui-contextを入力して読み込まれたか確認します。

同梱ファイルagents/openai.yaml

詳細


主なクエリ

アクティブな UI の状態を取得するには、この関数を使用します。

SELECT get_ui_context_json();

ユーザーの質問ごとに一度取得し、回答中はそのスナップショットを再利用します。 ユーザーが更新や再確認を求めた場合、または UI に関する新しい質問が始まった場合にのみ、再取得します。


トリガーパターン

次のようなプロンプトで、このスキルを使用します。

  • 「今何を見ていますか?」
  • 「画面に何が表示されていますか?」
  • 「何が選択されていますか?」
  • 「今していることを見て」
  • 「これ」「ここ」「現在」「選択中」「あれ」「前のもの」などの参照

取得ポリシー

  1. UI に関するプロンプトに回答する前に、get_ui_context_json() を呼び出します。
  2. ビュー情報(ウィジェットの種類/タイトルとカスタムビューの状態)を抽出します。
  3. 選択情報がある場合は、開始位置/終了位置とプレビューのテキスト行を抽出します。
  4. コードアンカー情報がある場合は、アドレス、関数、セグメントを抽出します。
  5. has_address: false の場合は制限を説明し、コードコンテキストを捏造しないでください。

ウィジェットフィールド(focused_widget / main_viewer)

  • type_id(int):生の IDA twidget_type_t 数値 ID です。
  • type_name(string):ビルドに使用された SDK のウィジェットの SDK マクロ名です(例:"BWN_PSEUDOCODE"、"BWN_TILIST")。SDK スロット 10 の名前は IDA のバージョンによって異なります(BWN_TILVIEW / BWN_TICSR / BWN_TITREE)。
  • canonical_name(string):バージョンをまたいで安定した名前です。「Local Types」ウィジェット(スロット 10)の場合は常に "BWN_LOCAL_TYPES" となり、その他のウィジェットでは type_name と同じです。バージョンをまたいだ推論には、こちらを優先してください。
  • category(string):大まかな分類です。disassembly、decompiler、hex_view、type_view、chooser、debugger、navigation、output、script、auxiliary、unknown のいずれかです。
  • is_address(bool):ウィジェットが意味のあるアドレスアンカーを公開するかどうかを示します(DISASM、HEXVIEW、PSEUDOCODE、MICROCODE では true)。
  • is_custom_view(bool):カスタムの行コンテンツを持つビューア形式のウィジェットかどうかを示します。
  • is_chooser_like(bool):行ベースのリスト/選択ウィジェットで、行の選択に意味があるかどうかを示します。
  • title(string):IDA が報告するウィジェットのタイトルです。

main_viewer には同じウィジェットフィールドが含まれますが、is_chooser_like は含まれません(メインビューアは常にビューアであり、選択ウィジェットではありません)。


時間的参照のルール

  • this / here / current / selected:この質問のために新しいスナップショットを取得します。
  • that / previous / earlier:同じ作業フロー内の直近のスナップショットを再利用します。
  • ユーザーが「更新」と言った場合は、直ちに新しいスナップショットを取得します。

実行環境での利用可否とフォールバック

  • get_ui_context_json() はすべての実行環境に登録されていますが、ライブ UI の状態を返すのは IDA GUI プラグインのみです。
  • ライブ GUI のエンベロープには available:true が含まれます。idalib/CLI のスタブには available:false と capture.source:"cli" が含まれます(エラーではなく、UI がないだけです)。そのため、available は GUI と CLI を双方向で確実に判別できる値です。これを基準にしてください。
  • CLI のスタブを受け取った場合は、そのことを明確に伝え、UI を必要としないクエリ(明示的なアドレス/シンボル、またはデータベースの状況確認クエリ)に進みます。

binary はデータベースのメタデータにすぎず、UI コンテキストの代わりにはなりません。


回答テンプレート

UI コンテキストを読み取った後は、次の固定形式を使用します。

  • What You Are Viewing:ウィジェット/ビューの概要。
  • What Is Selected:選択範囲とプレビュー(または「アクティブな選択なし」)。
  • Code Context:利用可能な場合はアドレス/関数/セグメント。そうでない場合は、アドレスを持たないビューであることを記載します。
  • Limits:確度に影響する実行環境の制約や不足フィールド。
  • Suggested Next Query:具体的な次のコマンド/クエリを1つ提示します。

例

1) 「今何を見ていますか?」
SELECT get_ui_context_json();

上記のテンプレート項目を使って回答します。フォーカスされたウィジェットのタイトル/種類と、存在する場合は現在のアンカーアドレスを含めます。

2) 「今していることを見て」
SELECT get_ui_context_json();

まずアクティブなビューと選択内容を要約し、そのコンテキストに沿った次のアクション(例:現在の関数をデコンパイルする)を提案します。

3) 「今何が選択されていますか?」
SELECT get_ui_context_json();

選択範囲の開始位置/終了位置とプレビューテキストを優先します。アクティブな選択がない場合は、その旨を明示します。

4) 「この関数について説明して」
  1. UI コンテキストを取得します。
  2. 関数/アドレスのコンテキストがある場合は、逆コンパイラーに切り替えます。
SELECT get_ui_context_json();
SELECT decompile(0x401000);

0x401000 を、取得した関数/アドレスのアンカーに置き換えます。

5) 続けて質問:「あの関数はどうですか?」

同じフローの最新のスナップショットを再利用し(求められない限り自動更新は行わず)、保存済みのアンカーから分析を続けます。

6) アドレス以外のビュー(Local Types の選択画面など)
SELECT get_ui_context_json();

has_address: false の場合は、選択画面の詳細を報告し、このビューにはコードアドレスのアンカーがないことを伝えます。

7) プラグイン API を利用できない場合(CLI/idalib)

get_ui_context_json() を実行できない場合は、次のようにします。

  • このランタイムでは UI コンテキストを利用できないことを伝えます
  • シンボル/アドレスを明示するよう依頼するか、UI を使わない方法で続行します(例:DB の概要を確認するための SELECT * FROM binary)

ガードレール

  • binary の出力を UI コンテキストとして扱わないでください。
  • 存在しない選択/アドレスのフィールドを捏造しないでください。
  • ユーザーから更新を求められない限り、1 回の回答でコンテキストを繰り返し取得しないでください。

コメント