内蔵エージェントツール
これらは、組み込みエージェントランタイムが直接登録するサーバーにバインドされたツールです — 言語サーバー、構造検索、デバッガー、カーネル、質問、ワーカー制御 — ブリッジして取り込む MCP ツールや、ハーネスランタイムの汎用のファイル・検索・シェルツールとは対照的です。これらは MCP レジストリには載りません。外部の MCP クライアントには見えません。それぞれが、1 回の実行に属する生きたサーバー側のリソース — 言語サーバープロセス、デバッグアダプター、インタープリター — にバインドされているからです。
ここにあるすべてのツールは、その背後にあるリソースがその実行向けに配線されている場合にのみ登録されます — 言語サーバーまたはデバッグのスーパーバイザー、tree-sitter パーサー、カーネルファクトリー、質問ポート、vibe のロスターです。このチェックアウトに対する言語サーバーやデバッグアダプターの検出は、別の、より後に行われるチェック(status / adapters)です。それらのツールがサーフェスに残るのは、推測するのではなく、なぜ何も使えないのかをエージェントが尋ねられるようにするためです。
承認ティア
「承認ティア」というセクション各ツールはティアを宣言し、そのティアがどのサーフェスから見えるかを決めます — 単にプロンプトを出すかどうかではありません。プランモードと読み取り専用のサブエージェントは read が上限であるため、write または exec ティアのツールはそのスキーマにそもそも存在しません。
| ティア | 意味 | ここにあるツール |
|---|---|---|
read |
副作用なし | lsp、ast_grep、ask_user、5 つの vibe_* |
write |
ファイルを変更する | lsp_rename、ast_edit、resolve |
exec |
プロセスを起動または制御する | debug、eval |
lsp — 言語サーバークエリ
「lsp — 言語サーバークエリ」というセクション実行に言語サーバーのスーパーバイザーと作業ディレクトリがある場合に登録されます。サーバーが実際に応答できるかどうかは、呼び出し時に積集合として検出されます。ルートマーカーが存在し、かつサーバーバイナリが解決できなければなりません。どちらか片方だけではサーバーは起動しません — そう status が告げます — 黙って推測することはありません。
位置は line と symbol の部分文字列で指定し、列番号は決して使いません。列番号を求められたモデルは推測し、その推測が外れると同じ行の別のシンボルに解決されます — 正しく見えるのに、別のものについての答えです。ナビゲーションアクションで symbol を省略することはエラーであり、先頭列の推測ではありません。
| アクション | 引数 | 戻り値 |
|---|---|---|
diagnostics |
file(または "*") |
エラーと警告。"*" は代わりにプロジェクトチェッカーを実行します |
definition |
file、line、symbol |
シンボルが宣言されている場所 |
type_definition |
file、line、symbol |
その型が宣言されている場所 |
implementation |
file、line、symbol |
具体的な実装 |
references |
file、line、symbol |
すべての使用箇所。上限は 50 |
hover |
file、line、symbol |
シグネチャとドキュメントコメント |
symbols |
query または file |
query でワークスペース検索(上限 100)。file でドキュメントシンボル(上限 200) |
code_actions |
file、line、symbol |
サーバーが提示するクイックフィックス |
status |
— | どのサーバーが、どのルートに対して実行中か |
reload |
— | このルートのサーバーを再起動します |
書き込み時の診断
「書き込み時の診断」というセクション見返りはツールそのものではありません。write、edit、apply_patch がラップされています。書き込みの後、ファイルは言語サーバーを通して同期・保存され、新たに導入された診断だけがツールの結果に折り込まれます。エージェントは、ビルドを壊したまさにその瞬間に、壊したことを知ります。尋ねるのを覚えておく必要はありません。
すでに報告済みの診断は、重要度・コード・メッセージをキーとする実行ごとの台帳によって抑制されます — 位置は意図的に除外されているため、4 行下にずれただけの診断が新しいものとして再報告されることはありません。
lsp_rename — プロジェクト全体のリネーム
「lsp_rename — プロジェクト全体のリネーム」というセクション別個の write ティアのツールである理由は、ただ 1 つです。ティアが可視性を決めるからです。リネームを lsp に畳み込むと、読み取り専用の探索者にリポジトリを書き換える能力を与えるか、すべての hover を承認プロンプトの背後に置くかのどちらかになります。
| 引数 | 意味 |
|---|---|
file |
シンボルがある場所 |
line |
1 始まりの行番号 |
symbol |
その行でシンボルを特定する部分文字列 |
new_name |
新しい名前 |
ast_grep — 構造検索
「ast_grep — 構造検索」というセクションコードをテキストではなく形で見つけます。$NAME は任意のノードにマッチし、$$$NAME は連続する兄弟にマッチし、$_ は何も捕捉しないワイルドカードです。
これを「ひと手間多い正規表現」ではなくマッチャーにしている性質は、ひとつのパターンの中で繰り返されるメタ変数が同じテキストを捕捉しなければならないことです。
ast_grep(pattern: "if ($X != null) $X.dispose()", language: "dart")これは、検査したものを破棄するガードにマッチし、別のものを破棄するガードにはマッチしません。
| 引数 | 意味 |
|---|---|
pattern |
メタ変数を含むコードの断片 |
path |
検索するファイルまたはディレクトリ。デフォルトはワークスペース全体 |
language |
出荷されている文法 ID(dart、python、rust、c、…)。path がファイルを指すときは推論されます |
max_results |
デフォルトは 50 |
ast_edit — ステージングされる構造書き換え
「ast_edit — ステージングされる構造書き換え」というセクション同じマッチングに加えて、メタ変数を戻し入れる rewrite テンプレートを使います。何も書き込まれません。 変更はステージングされ、結果が edit_id を名指しします。
ast_edit(pattern: "dispose($X)", rewrite: "$X.dispose()", language: "dart")→ (proposed) 12 replacements in 4 files … call resolve with edit_id "edit_1"| 引数 | 意味 |
|---|---|
pattern |
マッチするもの |
rewrite |
そこに置くもの。$NAME が置換されます |
path |
スコープ。デフォルトはワークスペース全体 |
language |
言語 ID |
resolve — ステージングされた変更のコミットまたは破棄
「resolve — ステージングされた変更のコミットまたは破棄」というセクション| 引数 | 意味 |
|---|---|
edit_id |
(proposed) の結果から |
action |
accept または discard |
すべてのファイルは、ステージング時に捕捉した内容と照合され、少しでも食い違えば変更全体が拒否されます。部分的に適用された構造的書き換えは、古い形でも新しい形でもコンパイルできないツリーを残します。
debug — デバッガーを操作する
「debug — デバッガーを操作する」というセクション実行にデバッグセッションのスーパーバイザー、作業ディレクトリ、会話 ID がある場合に登録されます。アダプターが実際に起動できるかどうかは、言語サーバーと同じ積集合のルール(ルートマーカーかつバイナリ)で、呼び出し時に検出されます。exec ティアで、並列安全ではありません(セッションは呼び出しをまたぐ状態なので、continue が stack を追い越すと、すでに動いてしまったフレームを読むことになります)。
会話ごとにセッションは 1 つで、厳密な TTL(30 分)があります。2 回目の launch は、最初のものを黙って置き換えるのではなく拒否されます。
| 操作 | 引数 | 備考 |
|---|---|---|
adapters |
— | ここでどのアダプターが使えるか、使えないならなぜか |
status |
— | セッションが実行中かどうか、どこで停止したか |
breakpoints |
file、lines[] |
lines が空だとそのファイルのブレークポイントを消去します。起動の前に設定できます |
launch |
program、args[] |
ブレークポイントで停止した状態でプログラムを開始します |
attach |
port |
すでに実行中のデバッグ対象に接続します |
continue |
thread_id? |
次の停止まで実行します |
pause |
thread_id? |
その場で停止します |
step_over / step_in / step_out |
thread_id? |
1 ステップ動かします |
threads |
— | スレッド ID と名前 |
stack |
thread_id? |
フレーム。上限は 30 |
scopes |
frame_id |
フレーム上のスコープ。それぞれ reference を持ちます |
variables |
reference |
子。上限は 50、値は 400 文字まで |
evaluate |
expression、frame_id? |
フレーム自身のスコープで評価されます |
output |
— | デバッグ対象の stdout/stderr。上限あり |
terminate |
— | セッションを終了し、アダプターを停止します |
アダプター
「アダプター」というセクション| ID | コマンド | ルートマーカー |
|---|---|---|
dart |
dart debug_adapter |
pubspec.yaml |
debugpy |
python3 -m debugpy.adapter |
pyproject.toml、setup.py、requirements.txt |
lldb |
lldb-dap |
Cargo.toml、CMakeLists.txt |
delve |
dlv dap |
go.mod |
debugpy はプロジェクトローカルの .venv/bin または venv/bin を $PATH より優先します。$PATH 上の python は別の環境であり、誤ったほうからアタッチすると、壊れたコードのように見える形で失敗します。
eval — 永続インタープリター
「eval — 永続インタープリター」というセクション変数、インポート、読み込んだデータが呼び出しをまたいで残る Python または JavaScript のセルです。exec ティアで、並列安全ではありません。
| 引数 | 意味 |
|---|---|
code |
セル |
description |
必須。トランスクリプトのラベル用の 5〜10 語 |
language |
python(デフォルト)または javascript |
reset |
インタープリターを破棄し、先にまっさらな状態から始めます |
- 最後の式は、ノートブックと同じようにエコーされます。
display()は機能し、pandas のフレームは表としてレンダリングされ、matplotlib の図はトランスクリプトが表示する画像として返ります。- 人が反射的に入力する IPython のイディオム —
%pip、%cd、!cmd、%%bash、%%timeit— は素のコードに書き換えられます。%pipはsys.modulesからも追い出すため、次のimportはたった今インストールされたものを認識します。
セルの中から自分のツールを呼び出す
「セルの中から自分のツールを呼び出す」というセクションcontents = tool("read", {"path": "lib/auth.dart"})このブリッジはハーネスのツールレジストリに再入するため、ガードレール、承認、あらゆるラッパーが、モデルが発行した呼び出しとまったく同じように適用されます。ループバックソケットではなくカーネル自身のパイプを使います。ポートも、シークレットも、外向き通信のルールも不要です。
セルのタイムアウトは非アクティブの予算(デフォルト 5 分)であり、ブリッジされた呼び出しが未完了の間は一時停止されます。そのため、サブエージェントにファンアウトするセルがファンアウトの途中で停止させられることはありません。
ask_user — 人間に質問する
「ask_user — 人間に質問する」というセクションread ティアです。実行がオペレーターに何かを尋ねる唯一の方法です。会話内に番号付きのカードをレンダリングし、誰かが回答するか、スキップするか、質問がタイムアウトするまでブロックします。質問をチャットメッセージとして書かないでください — それはターンを終わらせてしまいます。
| 引数 | 意味 |
|---|---|
question |
尋ねる内容 |
context |
任意: なぜ尋ねているのか、回答次第で何が変わるのか |
options[] |
選択肢。それぞれ {label, description?} |
allow_free_text |
入力された回答を受け付けるかどうか |
multi_select |
複数の選択肢を選べるかどうか |
スキップは成功です。明示した前提の上で進め、二度尋ねないでください。タイムアウトは、同じ指示を伴うエラーです。許可プロンプト(「これをやってもいいですか」)は別のゲートであり、会話内に同じカードとして表示されます。
質問ポートと対象スペースの両方が存在する場合にのみ登録されます。人間が接続されていない場合、その呼び出しは永遠にブロックするのではなく失敗します — 承認者が接続されていないときにガードレールの prompt が取るのと同じフェイルクローズの姿勢です。
vibe_* — バックグラウンドワーカーの指示
「vibe_* — バックグラウンドワーカーの指示」というセクションvibe モードがオンの間だけ登録されます。5 つとも read ティアです。ゲートは、編集が実際に起こるワーカーのツール側にあるべきです。
| ツール | 引数 | 備考 |
|---|---|---|
vibe_spawn |
brief、label、tier? |
すぐに戻ります。ワーカーは動き続けます |
vibe_send |
worker_id、message |
ブリーフに追記して再実行します |
vibe_wait |
worker_id、timeout_seconds? |
決着するまでブロックします |
vibe_kill |
worker_id |
停止します |
vibe_list |
— | ティア、ステータス、経過時間、最後の結果 |
tier は fast(明確な仕様がある機械的な作業)または good(設計、判断、または fast ワーカーの出力のレビュー)です。