mcpField
C
consult

consult

github.com/agent-shエージェントワークフロー1.0k99 回インストール2 日前に更新
リポジトリ

consult について

consultは、別のAIコマンドラインツールに問い合わせて回答を返すスキルです。判断の確認や回答の比較に使え、ツール、モデル、思考レベル、コンテキストを選択し、対応するセッションを再開できます。

主な機能

  1. 01Gemini、Codex、Claude、OpenCode、Copilotへの相談
  2. 02思考レベルとモデルの選択
  3. 03diffまたはファイルのコンテキスト追加
  4. 04対応ツールのセッション再開
  5. 05引数とファイルパスの検証

活用シーン

  1. 01判断について別のAIの意見を得る
  2. 02異なるAIツールの回答を比較する
  3. 03外部AIで方針を検証する

インストール

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

$npx skills add https://github.com/agent-sh/agentsys --skill consult

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

詳細

consult

別の AI CLI ツールに問い合わせ、回答を返すクロスツール AI 相談です。

使用するタイミング

次の場合にこのスキルを呼び出します:

  • ユーザーが別の AI ツールにセカンドオピニオンを求めている
  • ユーザーが gemini/codex/claude/opencode/copilot に相談、質問、またはクロスチェックを依頼している
  • ユーザーが複数の AI ツールの回答を比較する必要がある
  • ユーザーが外部 AI を使って判断を検証したい

引数

$ARGUMENTS から解析します:

フラグ値デフォルト説明
--toolgemini, codex, claude, opencode, copilot(選択)対象ツール
--effortlow, medium, high, maxmedium思考の強度
--model任意のモデル名(effort に基づく)モデル選択を上書き
--contextdiff, file=PATH, nonenoneコンテキストを自動的に含める
--continue(フラグ) または SESSION_IDfalse前のセッションを再開

質問文は、上記のフラグを除いた $ARGUMENTS のすべてです。

プロバイダー設定

Claude
Command: env -u CLAUDECODE claude -p "QUESTION" --output-format json --model "MODEL" --max-turns TURNS --allowedTools "Read,Glob,Grep"
Session resume: --resume "SESSION_ID"

モデル:claude-haiku-4-5, claude-sonnet-4-6, claude-opus-4-6

努力度モデル最大ターン数
lowclaude-haiku-4-51
mediumclaude-sonnet-4-63
highclaude-opus-4-65
maxclaude-opus-4-610

出力の解析:JSON.parse(stdout).result セッション ID:JSON.parse(stdout).session_id 継続可能:はい ACP アダプター:npx -y @anthropic-ai/claude-code-acp(ACP Transport セクションを参照)

Gemini
Command: gemini -p "QUESTION" --output-format json -m "MODEL"
Session resume: --resume "SESSION_ID"

モデル:gemini-2.5-flash, gemini-2.5-pro, gemini-3-flash-preview, gemini-3-pro-preview, gemini-3.1-pro-preview

努力度モデル
lowgemini-3-flash-preview
mediumgemini-3-flash-preview
highgemini-3.1-pro-preview
maxgemini-3.1-pro-preview

出力の解析:JSON.parse(stdout).response セッション ID:JSON.parse(stdout).session_id 継続可能:はい(--resume を使用) ACP アダプター:gemini(ネイティブ ACP。Gemini CLI は ACP 互換です)

Codex
Command: codex exec "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
Session resume: codex exec resume "SESSION_ID" "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
Session resume (latest): codex exec resume --last "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"

注:codex exec は非対話型/ヘッドレスモードです。-q フラグはありません。TUI モードは codex です(サブコマンドなし)。 {SKIP_GIT_FLAG} は、Command Building Step 1b の信頼ゲートによって解決されます:

  • 信頼済みの git リポジトリ内:空文字列
  • 信頼済みの非リポジトリでの実行:--skip-git-repo-check

モデル:gpt-5.3-codex

努力度モデル推論
lowgpt-5.3-codexlow
mediumgpt-5.3-codexmedium
highgpt-5.3-codexhigh
maxgpt-5.3-codexhigh

出力の解析:JSON.parse(stdout).message または生テキスト セッション ID:Codex はセッション終了時に再開用のヒントを出力します(例:codex resume SESSION_ID)。stdout、または利用可能な場合は JSON.parse(stdout).session_id からセッション ID を抽出します。 継続可能:はい。セッションは ~/.codex/sessions/ に JSONL ロールアウトファイルとして保存されます。非対話型で再開するには、codex exec resume "SESSION_ID" "follow-up prompt" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL" を使用します。直近のセッションを再開するには、セッション ID の代わりに --last を使用します。 ACP アダプター:npx -y @zed-industries/codex-acp(ACP Transport セクションを参照)

OpenCode
Command: opencode run "QUESTION" --format json --model "MODEL" --variant "VARIANT"
Session resume: opencode run "QUESTION" --format json --model "MODEL" --variant "VARIANT" --continue (most recent) or --session "SESSION_ID"
With thinking: add --thinking flag

モデル:プロバイダー経由で75種類以上(形式:provider/model)。主なプロバイダー:opencode/(無料)、github-copilot/、amazon-bedrock/、google/。例:github-copilot/gemini-3.1-pro-preview、opencode/big-pickle、amazon-bedrock/anthropic.claude-opus-4-6-v1。すべてを一覧表示するには opencode models を実行します。

無料モデル:opencode/big-pickle、opencode/gpt-5-nano、opencode/minimax-m2.5-free、opencode/trinity-large-preview-free

労力モデルバリアント
low(ユーザーが選択したもの、またはデフォルト)low
medium(ユーザーが選択したもの、またはデフォルト)medium
high(ユーザーが選択したもの、またはデフォルト)high
max(ユーザーが選択したもの、またはデフォルト)high + --thinking

出力の解析:OpenCode は改行区切りの JSON イベントを出力します。各行は type フィールドを含む JSON オブジェクトです。type === "text" のイベントから応答テキストを抽出します。テキストは part.text にあります(part.content ではありません)。type: "text" のイベントからすべての part.text の値を連結します。イベントタイプ:step_start、tool_use、text、step_finish。sessionID はすべてのイベントのトップレベルの sessionID フィールドにあります。

セッション ID:すべてのイベントで event.sessionID として利用できます(例:ses_xxxxx)。再開するには --session SESSION_ID を使用します。 継続可能:はい(--continue または --session を使用)。セッションは OpenCode のデータディレクトリ内の SQLite データベースに保存されます。特定のセッションには --session SESSION_ID、直近のセッションには --continue を使用します。 ACP アダプター:opencode acp(ACP Transport セクションを参照)

Copilot
Command: copilot -p "QUESTION"

モデル:claude-sonnet-4-6(デフォルト)、claude-opus-4-6、claude-haiku-4-5、gpt-5

労力備考
すべて労力の制御は利用できません。モデルは --model フラグで選択できます。

出力の解析:標準出力からの生テキスト 継続可能:いいえ ACP アダプター:copilot --acp --stdio(ACP Transport セクションを参照)

Kiro
ACP-only provider. No CLI mode for external consultation.
Command: node acp/run.js --provider="kiro" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000

Kiro は ACP トランスポート経由でのみ利用できます。PATH 上に kiro-cli が必要です。

出力の解析:ACP ランナー経由(JSON.parse(stdout)) 継続可能:いいえ ACP アダプター:kiro-cli acp(ネイティブ ACP)

入力の検証

コマンドを組み立てる前に、ユーザーが指定したすべての引数を検証します。

  • --tool:次のいずれかでなければなりません:gemini、codex、claude、opencode、copilot、kiro。それ以外の値はすべて拒否します。
  • --effort:次のいずれかでなければなりません:low、medium、high、max。デフォルトは medium です。
  • --model:任意の文字列を許可しますが、コマンド内では引用符で囲みます。
  • --continue=SESSION_ID:指定された場合、SESSION_ID は ^(?!-)[A-Za-z0-9._:-]+$ に一致しなければなりません。空白、先頭のダッシュ、シェルのメタ文字を含む値は拒否します。
  • --context=file=PATH:プロジェクトディレクトリ内に解決されなければなりません。cwd 外の絶対パスは拒否します。追加の確認事項:
    1. UNC パスをブロック(Windows):\\ または // で始まるパス(ネットワーク共有)を拒否します
    2. 正規パスを解決:Read ツールを使ってファイルを読み込みます(シェルコマンドは使用しないでください)。読み込む前にパスを解決します:cwd + PATH を結合してから正規化します(.、.. を折りたたみ、シンボリックリンクを解決)
    3. 包含を検証:解決された正規パスは現在の作業ディレクトリで始まらなければなりません(..、シンボリックリンク、ジャンクションポイントによって)外部に出る場合は、[ERROR] Path escapes project directory: {PATH} で拒否します
    4. シェルアクセス禁止:Read ツールのみを使ってファイルの内容を読み込みます。ユーザーが指定したパスをシェルコマンドに渡すことは絶対にしないでください(パス値を介したインジェクションを防ぎます)

コマンドの組み立て

解析された引数に基づいて、完全な CLI コマンドを組み立てます。インジェクションを防ぐため、ユーザーが指定した値はすべてシェルコマンド内で引用符で囲まなければなりません。

ステップ 1:モデルの解決

--model が指定されている場合は、それをそのまま使用します。指定されていない場合は、上記のプロバイダーテーブルから労力に基づいたモデルを使用します。

ステップ 1b:Codex の --skip-git-repo-check に対する信頼ゲート

Codex テンプレートを使用する前に、このゲートで {SKIP_GIT_FLAG} を解決してください。

  1. コンサルテーションが任意の外部パスではなく、現在のプロジェクトの作業ディレクトリ(/consult が呼び出されたものと同じワークスペース)から実行されていることを確認します。
  2. 解決されたアクティブなツールが Codex(フラグ、NLP、ピッカー、または復元された --continue セッション)であることを確認します。
  3. 現在の作業ディレクトリで git rev-parse --is-inside-work-tree を実行します。
    • true の場合:{SKIP_GIT_FLAG} を空文字列に設定します。
    • false で、チェック 1〜2 に合格している場合:{SKIP_GIT_FLAG} を --skip-git-repo-check に設定します。
  4. チェック 1〜2 に失敗した場合は、[ERROR] Refusing Codex --skip-git-repo-check outside trusted working directory で実行を拒否します。

このスキルの Codex テンプレートは、この信頼ゲートをすでに通過していることを前提としています。

ステップ 2:コマンド文字列の作成

プロバイダーの設定セクションにあるコマンドテンプレートを使用します。QUESTION、MODEL、TURNS、LEVEL、VARIANT、SKIP_GIT_FLAG を、解決済みのリテラル値に置き換えます。 {SKIP_GIT_FLAG} はステップ 1b でのみ設定してください。継承されたシェル環境から SKIP_GIT_FLAG を読み取ってはいけません。

セッションを続行する場合:

  • Claude または Gemini:コマンドに --resume "SESSION_ID" を追加します。
  • Codex:標準コマンドの代わりに codex exec resume "SESSION_ID" "QUESTION" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL" を使用します。直近のセッションには、セッション ID の代わりに --last を使用します。
  • OpenCode:コマンドに --session SESSION_ID を追加します。session_id が保存されていない場合は、代わりに --continue を使用します(直近のセッションを再開します)。 OpenCode で最大の推論レベルを使用する場合:--thinking を追加します。
ステップ 3:コンテキストのパッケージ化

--context=diff の場合:git diff 2>/dev/null を実行し、その出力を質問の先頭に追加します。 --context=file=PATH の場合:Read ツールを使用してファイルを読み取り、その内容を質問の先頭に追加します。

ステップ 4:安全な質問の受け渡し

ユーザーが入力した質問文をシェルコマンド文字列に埋め込んではいけません。シェルエスケープだけでは不十分です。$()、バッククォート、その他の展開シーケンスは、二重引用符の中でも任意のコマンドを実行する可能性があります。

必須の方法――標準入力または一時ファイルで質問を渡す:

  1. 質問を書き込む Write ツールを使って一時ファイルに書き込みます(例:{AI_STATE_DIR}/consult/question.tmp)

    プラットフォームの状態ディレクトリ:

    • Claude Code:.claude/
    • OpenCode:.opencode/
    • Codex CLI:.codex/
  2. コマンドを組み立てる インラインテキストの代わりに、一時ファイルを入力として使います:

プロバイダー安全なコマンドパターン
Claudeenv -u CLAUDECODE claude -p - --output-format json --model "MODEL" --max-turns TURNS --allowedTools "Read,Glob,Grep" < "{AI_STATE_DIR}/consult/question.tmp"
Claude(再開)env -u CLAUDECODE claude -p - --output-format json --model "MODEL" --max-turns TURNS --allowedTools "Read,Glob,Grep" --resume "SESSION_ID" < "{AI_STATE_DIR}/consult/question.tmp"
Geminigemini -p - --output-format json -m "MODEL" < "{AI_STATE_DIR}/consult/question.tmp"
Gemini(再開)gemini -p - --output-format json -m "MODEL" --resume "SESSION_ID" < "{AI_STATE_DIR}/consult/question.tmp"
Codexcodex exec "$(cat "{AI_STATE_DIR}/consult/question.tmp")" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"(Codex exec には標準入力モードがありません。cat はユーザー入力ではなく、プラットフォームが管理するパスから読み込みます)
Codex(再開)codex exec resume "SESSION_ID" "$(cat "{AI_STATE_DIR}/consult/question.tmp")" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
Codex(最新のセッションを再開)codex exec resume --last "$(cat "{AI_STATE_DIR}/consult/question.tmp")" --json -m "MODEL" {SKIP_GIT_FLAG} -c model_reasoning_effort="LEVEL"
OpenCodeopencode run - --format json --model "MODEL" --variant "VARIANT" < "{AI_STATE_DIR}/consult/question.tmp"
OpenCode(ID を指定して再開)opencode run - --format json --model "MODEL" --variant "VARIANT" --session "SESSION_ID" < "{AI_STATE_DIR}/consult/question.tmp"
OpenCode(最新のセッションを再開)opencode run - --format json --model "MODEL" --variant "VARIANT" --continue < "{AI_STATE_DIR}/consult/question.tmp"
Copilotcopilot -p - < "{AI_STATE_DIR}/consult/question.tmp"
  1. コマンドの完了後に一時ファイルを削除する(成功時も失敗時も)。ファイルが蓄積しないよう、必ずクリーンアップしてください。

モデルとセッション ID の値は、ピッカーまたは保存済みの状態から取得する管理された文字列であり、コマンド内で直接引用符で囲んでも安全です。任意のユーザーテキストを含むのは質問だけなので、一時ファイルを使う必要があります。一時ファイルのパス({AI_STATE_DIR}/consult/question.tmp)には、プラットフォームが管理するディレクトリと固定のファイル名を使用しており、パスにユーザー入力は含まれません。

プロバイダーの検出

クロスプラットフォームでのツール検出:

  • Windows:where.exe TOOL 2>nul――ツールが見つかった場合は 0 を返します
  • Unix:which TOOL 2>/dev/null――ツールが見つかった場合は 0 を返します

各ツール(claude、gemini、codex、opencode、copilot、kiro)を確認し、利用可能なものだけを返します。

ACP トランスポート

ACP(Agent Client Protocol)は、CLI サブプロセス呼び出しに代わるトランスポートです。ACP が利用可能な場合、すべての主要な AI コーディングツールがサポートする共通プロトコルを介して、構造化された JSON-RPC 2.0 通信、セッションの永続化、ストリーミング応答を提供します。

ACP プロバイダーアダプター
プロバイダーACP コマンド種類検出方法
Claudenpx -y @anthropic-ai/claude-code-acpアダプターnpx が利用可能
Geminigemini(ネイティブ ACP)ネイティブgemini が利用可能
Codexnpx -y @zed-industries/codex-acpアダプターnpx が利用可能
Copilotcopilot --acp --stdioネイティブcopilot が利用可能
Kirokiro-cli acpネイティブkiro-cli が利用可能
OpenCodeopencode acpネイティブopencode が利用可能
トランスポートの選択
  1. 対象プロバイダーで ACP が利用可能か確認します(下記の ACP の検出を参照)
  2. ACP が利用可能な場合:ACP トランスポートを使用します(推奨。標準化されたプロトコルで、セッションを保持できます)
  3. ACP が利用できない場合:CLI トランスポートにフォールバックします(上記の既存の動作)

出力エンベロープは、トランスポートにかかわらず同一です。下流のコンシューマー(セッション管理、ディベートオーケストレーター、出力解析)はトランスポートに依存しません。

ACP コマンドテンプレート

すべての ACP プロバイダーは、ACP ランナースクリプトを介して同じコマンドパターンを使用します。

node acp/run.js --provider="PROVIDER" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=TIMEOUT_MS [--model="MODEL"] [--session-id="SESSION_ID"]
プロバイダーACP の安全なコマンドパターン
Claudenode acp/run.js --provider="claude" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
Gemininode acp/run.js --provider="gemini" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
Codexnode acp/run.js --provider="codex" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
OpenCodenode acp/run.js --provider="opencode" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000 --model="MODEL"
Copilotnode acp/run.js --provider="copilot" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000
Kironode acp/run.js --provider="kiro" --question-file="{AI_STATE_DIR}/consult/question.tmp" --timeout=120000

出力の解析:CLI トランスポートと同じく、JSON.parse(stdout) を使用します。ACP ランナーは同じエンベロープ形式を出力します。 セッション ID:JSON.parse(stdout).session_id(ACP セッション ID)から取得します。 再開:ACP コマンドに --session-id="SESSION_ID" フラグを渡します。 継続可能:Claude、Gemini、Codex、OpenCode(はい)。Copilot、Kiro(いいえ)。

ACP の検出

CLI の検出と並行して ACP の検出を実行します。各プロバイダーについて:

node acp/run.js --detect --provider="PROVIDER"

成功時(終了コード 0)の戻り値:

{"provider": "claude", "acp_available": true, "name": "Claude"}

失敗時(終了コード 1)の戻り値:

{"provider": "claude", "acp_available": false, "name": "Claude", "reason": "npx not found on PATH"}

Kiro に関する注意:Kiro は ACP 専用です。外部からの相談に使用できる CLI モードはありません。kiro-cli が PATH 上にあり、ACP の検出が成功した場合にのみ、利用可能として表示されます。

セッション管理

セッションの保存

相談が成功した後、{AI_STATE_DIR}/consult/last-session.json に保存します。

{
  "tool": "claude",
  "model": "opus",
  "effort": "high",
  "session_id": "abc-123-def-456",
  "timestamp": "2026-02-10T12:00:00Z",
  "question": "original question text",
  "continuable": true,
  "transport": "acp"
}

transport フィールドは "acp" または "cli" です。--continue でセッションを再開するときは、セッションの作成時と同じトランスポートを使用します。このフィールドがない場合は、"cli" とみなします(後方互換性)。

AI_STATE_DIR には、プラットフォームの状態ディレクトリを使用します。

  • Claude Code:.claude/
  • OpenCode:.opencode/
  • Codex CLI:.codex/
セッションの読み込み

--continue の場合、セッションファイルを読み込み、次の情報を復元します。

  • ツール(保存された状態から)
  • session_id(--resume フラグ用)
  • モデル(同じモデルを再利用)

復元した値を使用する前に、再検証します。

  • ツールが許可リストに含まれていること:gemini、codex、claude、opencode、copilot、kiro
  • session_id が ^(?!-)[A-Za-z0-9._:-]+$ に一致すること
  • model が ^[A-Za-z0-9._:/-]+$ に一致すること(スペースとシェルのメタ文字は拒否)
  • いずれかのチェックに失敗した場合、[ERROR] Invalid restored session data を返して拒否し、コマンドを構築しません

セッションファイルが見つからない場合は、警告を表示して新規の相談として続行します。

出力のサニタイズ

参照したツールの応答を出力に含める前に、応答テキストをスキャンし、次のパターンに一致する内容をすべて秘匿してください。

パターン説明置換後
sk-[a-zA-Z0-9_-]{20,}Anthropic API キー[REDACTED_API_KEY]
sk-proj-[a-zA-Z0-9_-]{20,}OpenAI プロジェクトキー[REDACTED_API_KEY]
sk-ant-[a-zA-Z0-9_-]{20,}Anthropic API キー(ant プレフィックス)[REDACTED_API_KEY]
AIza[a-zA-Z0-9_-]{30,}Google API キー[REDACTED_API_KEY]
ghp_[a-zA-Z0-9]{36,}GitHub 個人用アクセストークン[REDACTED_TOKEN]
gho_[a-zA-Z0-9]{36,}GitHub OAuth トークン[REDACTED_TOKEN]
github_pat_[a-zA-Z0-9_]{20,}GitHub のきめ細かい PAT[REDACTED_TOKEN]
ANTHROPIC_API_KEY=[^\s]+環境変数の出力に含まれるキーの割り当てANTHROPIC_API_KEY=[REDACTED]
OPENAI_API_KEY=[^\s]+環境変数の出力に含まれるキーの割り当てOPENAI_API_KEY=[REDACTED]
GOOGLE_API_KEY=[^\s]+環境変数の出力に含まれるキーの割り当てGOOGLE_API_KEY=[REDACTED]
GEMINI_API_KEY=[^\s]+環境変数の出力に含まれるキーの割り当てGEMINI_API_KEY=[REDACTED]
AKIA[A-Z0-9]{16}AWS アクセスキー[REDACTED_AWS_KEY]
ASIA[A-Z0-9]{16}AWS セッショントークン[REDACTED_AWS_KEY]
Bearer [a-zA-Z0-9_-]{20,}認証ヘッダーBearer [REDACTED]

結果の JSON に挿入する前に、応答テキスト全体に秘匿処理を適用してください。秘匿処理を行った場合は、次の注記を追加してください:[WARN] Sensitive tokens were redacted from the response.

出力形式

標準出力にプレーンな JSON オブジェクトを返してください(マーカーやラッパーは付けません)。

{
  "tool": "gemini",
  "model": "gemini-3.1-pro-preview",
  "effort": "high",
  "duration_ms": 12300,
  "response": "The AI's response text here...",
  "session_id": "abc-123",
  "continuable": true
}

インストール手順

ツールが見つからない場合は、次のインストールコマンドを返してください。

ツールインストール
Claudenpm install -g @anthropic-ai/claude-code
Geminiインストール手順については https://gemini.google.com/cli を参照してください
Codexnpm install -g @openai/codex
OpenCodenpm install -g opencode-ai または brew install anomalyco/tap/opencode
Copilotgh extension install github/copilot-cli

エラー処理

エラー応答
ツールがインストールされていない上記の表にあるインストール手順を返します
ツールの実行がタイムアウトした"response": "Timeout after 120s" を返します
JSON の解析エラー生テキストを応答として返します
出力が空"response": "No output received" を返します
セッションファイルが見つからないセッションの再開を行わずに続行します
API キーがないツール固有の環境変数に関する手順を返します

統合

このスキルは次の方法で呼び出されます。

  • /consult コマンドの consult-agent
  • 直接呼び出し:Skill('consult', '"question" --tool=gemini --effort=high')

例:Skill('consult', '"Is this approach correct?" --tool=gemini --effort=high --model=gemini-3.1-pro-preview')

コメント