pi-delegate-mcp
██████╗ ██╗ ██████╗ ███████╗██╗ ███████╗ ██████╗ █████╗ ████████╗███████╗
██╔══██╗██║ ██╔══██╗██╔════╝██║ ██╔════╝██╔════╝ ██╔══██╗╚══██╔══╝██╔════╝
██████╔╝██║ ██║ ██║█████╗ ██║ █████╗ ██║ ███╗███████║ ██║ █████╗
██╔═══╝ ██║ ██║ ██║██╔══╝ ██║ ██╔══╝ ██║ ██║██╔══██║ ██║ ██╔══╝
██║ ██║ ██████╔╝███████╗███████╗███████╗╚██████╔╝██║ ██║ ██║ ███████╗
╚═╝ ╚═╝ ╚═════╝ ╚══════╝╚══════╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝
███╗ ███╗ ██████╗██████╗
████╗ ████║██╔════╝██╔══██╗
██╔████╔██║██║ ██████╔╝
██║╚██╔╝██║██║ ██╔═══╝
██║ ╚═╝ ██║╚██████╗██║
╚═╝ ╚═╝ ╚═════╝╚═╝
pi コーディングエージェントを委任可能で、誘導可能なワーカーとして公開する MCP サーバーです。
Claude Code(または任意の MCP ホスト)からこのサーバーを指し示し、pi の約 38 のプロバイダー(DeepSeek、Grok、GLM、Kimi、Qwen、Codex、OpenRouter、ローカルの llama.cpp)のいずれかに作業を委任できます。サブエージェントのコンテキストはメインの会話には入りません。
これは何のためのものか
メインのハーネスは高価なモデルで動作し、コンテキストウィンドウを気にしています。そのモデルが行う作業の多くは、そのモデルを必要とせず、むしろコンテキストを積極的に損なうものです。リポジトリ内のすべての呼び出し箇所を grep する、1 つの質問に答えるために 2000 行のファイルを読む、リファクタリングが残したものを監査する、などです。
代わりに、その作業をデリゲートに任せましょう。
コスト。 単純作業は DeepSeek、GLM、Kimi、Qwen、またはローカルの llama.cpp で実行されます。フロンティア価格を支払うのは、実際にそれらを必要とする推論だけです。
コンテキスト。 デリゲートは独自の予算でファイルを読み、結果を返します。読み取った 200 KB が会話に入ることはありません。
影響範囲。 デリゲートはデフォルトで読み取り専用(
read, grep, find, ls)であり、セッション構築時に強制されます。安価なモデルが探索的な作業を行う場合、オプトインしない限りツリーに触れることはできません。
デリゲートは常に pi エージェントです。Codex、Grok、DeepSeek などはその背後にあるモデルを供給します。これはそれらの CLI のラッパーではありません。
Related MCP server: cursor-agents-mcp
なぜ pi なのか、opencode や CLI ラッパーではないのか?
デリゲートが誘導可能であるためには、2 つのチャネルが開いている必要があります。タスクの途中でリダイレクトできなければならず、また、何かを尋ねて、回答があるまでブロックできなければなりません。別のプログラムからコーディングエージェントを駆動するほとんどの方法では、両方が閉じられています。
| opencode SDK | このサーバー | |
プロセス内で実行 | いいえ(サブプロセス) | いいえ( | はい( |
実行中のターンをリダイレクト | いいえ |
|
|
エージェントが何かを尋ねられる | いいえ( | セッション API にはない |
|
呼び出しごとのモデル | いいえ | はい |
|
pi -p と --mode json は ctx.hasUI = false を設定します。そのように開始されたデリゲートは、構造上、発火して忘れるだけです。質問を提起できず、リダイレクトもできません。
opencode の SDK は別のサーバープロセス用の型付きクライアントです。createOpencode() は opencode serve を起動し、HTTP で通信します。クリーンな設計ですが、監視すべき 2 番目のプロセスがあり、公開されるセッションサーフェス(prompt、abort、revert、messages)には、ターン途中のステアリングも、エージェントが呼び出し元に何かを尋ねる経路もありません。
pi は createAgentSession を埋め込み可能なライブラリとして提供しています。このサーバーはセッションオブジェクトをプロセス内に保持するため、session.steer() は現在のツール呼び出しの後、次のモデル呼び出しの前にメッセージを配置でき、合成の uiContext はエージェントの質問を捕捉して answer のために保留します。シェルアウトされるものはなく、監視する必要もありません。
* 質問は pi 拡張機能から来るため、そのチャネルは extensions: true で生成されたデリゲートにのみ開かれています。Web 検索とその他の拡張ツール を参照してください。
(この表は委任チャネルを比較しており、サンドボックス化ではありません。opencode には独自の権限設定があります。このサーバーが何を強制し、何を強制しないかについては、デフォルトで読み取り専用 を参照してください。)
ツール
ツール | 目的 |
| 最初に呼び出します。 到達可能なモデル、許可されたツール、デリゲートの駆動方法を報告します。他のすべてのツールは、これが一度実行されるまで拒否します。 |
| バックグラウンドでデリゲートします。 |
| 1 回の呼び出しで最大 10 個のデリゲートをファンアウトします。バッチとして検証されるため、1 つのタスクが不良でも何も開始されません。 |
| デリゲートして完了までブロックします。簡単な質問専用です。 |
| 状態、ターン、使用されたツール、最新のテキスト、保留中の質問。 |
| 実行中のエージェントをリダイレクトします。現在のツール呼び出しの後に配置されます。 |
| 完了したデリゲートにもう 1 ターン与えます。読み取ったものはすべて保持されるため、タスクを再説明する必要はありません。 |
|
|
| セッションを停止します。部分的な出力は読み取り可能なままです。 |
| このデリゲートが使用できるモデルを一覧表示します。 |
| 実行中および完了したセッションを一覧表示します。 |
| 完了したセッションを履歴から削除し、その ID を解放します。 |
インストール
Node.js 22.19+ と、一度ログインしたことのある動作する pi インストール(pi、次に /login)が必要です。
Claude Code
claude mcp add pi -e PI_DELEGATE_MODEL=openrouter/stealth/ox-alpha -- npx -y pi-delegate-mcp任意の MCP ホスト、.mcp.json 経由
{
"mcpServers": {
"pi": {
"command": "npx",
"args": ["-y", "pi-delegate-mcp"],
"env": { "PI_DELEGATE_MODEL": "openrouter/stealth/ox-alpha" },
"timeout": 1800000
}
}
}npx は起動のたびにパッケージを解決します。固定するには、グローバルにインストールしてバイナリを直接呼び出します。
npm install -g pi-delegate-mcp{ "mcpServers": { "pi": { "command": "pi-delegate-mcp", "timeout": 1800000 } } }サーバーキーは短くしてください。すべてのツール名のプレフィックスになるためです(mcp__pi__spawn)。
ソースから
git clone https://github.com/howznguyen/pi-delegate-mcp && cd pi-delegate-mcp
npm install && npm run build && npm link最初の実行
エージェントに何かを委任するよう依頼してください。エージェントは init を一度呼び出してこのサーバーが到達できるものを学習し、次に spawn を呼び出します。
{ "id": "audit-01", "label": "who still imports onnxruntime",
"prompt": "Search this repo for anything still importing onnxruntime and list the files.",
"cwd": "/path/to/repo" }{ "sessionId": "audit-01", "state": "running", "model": "opencode-go/deepseek-v4-flash",
"activeTools": ["read", "grep", "find", "ls"] }spawn はすぐに返ります。status で順序付けられたツールトレースと回答をポーリングするか、複数が進行中の場合は sessions を使用します。init が失敗した場合、何が欠けているかを正確に示します。pi がインストールされていない、プロバイダーがログインしていない、一致するモデルスコープがない、などです。
以下の例のモデル名は例示です。models を実行して、自分の pi インストールが実際に到達できるものを確認してください。
トレーサビリティ
spawn と run はどちらも独自の id と自由形式の label を受け入れます。
{
"id": "search-audit-01",
"label": "what ONNX removal left behind",
"prompt": "...",
"model": "opencode-go/deepseek-v4-flash"
}ID は [A-Za-z0-9._:-]、1〜64 文字、英数字で始まる必要があり、ライブセッション間で一意である必要があります。省略すると UUID になります。
完了したセッションは消えずに status と sessions で読み取り可能なままなので、デリゲートが実際に何をしたかを後で確認できます。最新の PI_DELEGATE_HISTORY(デフォルト 50)が保持されます。forget で早期に削除できます。
status は順序付けられた toolCalls トレースを返します。デリゲートが実行したすべてのツールと、引数とタイミングです。verbose: true を追加すると、呼び出し ID と結果が含まれます。
{
"seq": 1,
"id": "call_467b4bb4…",
"name": "bash",
"state": "ok",
"ms": 10,
"args": "{\"command\":\"echo hello-trace\"}",
"result": "hello-trace\n"
}引数と結果は(PI_DELEGATE_TRACE_ARGS、PI_DELEGATE_TRACE_RESULT)でクリップされ、削除された長さが記録されるため、大きなファイルの 1 回の read がコンテキストをあふれさせることはありません。
デリゲートにもう 1 ターン与える
完了したデリゲートは使い捨てではありません。pi はセッションをメモリに保持するため、follow_up は、すでに読み取ったすべてをコンテキストに保持したまま、同じエージェントに再プロンプトします。
{ "sessionId": "search-audit-01", "prompt": "Now check whether the build files reference it too" }{ "sessionId": "search-audit-01", "state": "running", "turnsSoFar": 1 }デリゲートは中断したところから再開します。最初のターンで読み取ったファイルをまだ保持しているため、2 番目の質問は、リポジトリを再読込する新しいセッションではなく、1 回のモデル呼び出しで済みます。
これはデリゲートと会話するための安価な方法です。新しいものを生成すると、タスクを再説明し、同じファイルを再読込するためのコストがかかり、その回答にはそこに至るまでの推論が一切含まれません。
follow_up はまだ作業中のデリゲートを拒否します。タスク途中のリダイレクトは steer の役割だからです。この 2 つは交換可能ではありません。steer は実行中のエージェントのツール呼び出しの間に配置され、follow_up は完了したエージェントで新しいターンを開始します。
ファンアウト
spawn_batch は 1 回の呼び出しでバッチ全体を開始します。タスクはバッチレベルの model、cwd、tools、extensions を継承し、必要に応じて個別にオーバーライドします。
{
"idPrefix": "audit",
"model": "opencode-go/deepseek-v4-flash",
"cwd": "/repo",
"tools": ["ls"],
"tasks": [
{ "prompt": "What still imports onnxruntime?", "label": "imports" },
{ "prompt": "Which build files still reference ONNX?", "label": "build" },
{
"prompt": "Any ONNX model files left on disk?",
"label": "artifacts",
"model": "opencode-go/ox-alpha-free"
}
]
}これにより、audit-01、audit-02、audit-03 という名前が付けられ、数ミリ秒で返ります。デリゲートの起動は、考えるのを待たないためです。
バッチは何かが開始される前に検証されます。ID 形式、バッチ内の ID の重複、すでにライブの ID、ブロックされたツール、すべてのモデル名。1 つのタスクが不良だと、呼び出しは失敗し、何も起動されません。ファンアウトの半分は最悪の結果です。開始されたデリゲートのコストを支払い、どれが開始されなかったかを特定する必要があるからです。
バッチ全体をポーリングするには、デリゲートごとに 1 つの status ではなく、1 つの sessions 呼び出しを使用します。実際に読みたいデリゲートにのみ status にドロップダウンします。steer と abort はセッションごとに残ります。
呼び出しごとのモデル選択
任意の呼び出しの model は PI_DELEGATE_MODEL をオーバーライドします。解決できない名前はハードエラーであり、デフォルトモデルへのサイレントフォールバックは決してありません。サイレントフォールバックは、要求していないモデルに課金される方法だからです。
どの名前が解決されるかは、pi 自身の enabledModels スコープによって決定されます。このサーバーはそれを単に表示するだけでなく強制します。
opencode-go/deepseek-v4-flash -> ok (listed in enabledModels)
opencode-go/glm-5.3 -> refused (out of scope)
knowns-hub/claude-opus -> ok (custom provider, see below)カスタムプロバイダーはスコープをバイパスします。 ~/.pi/agent/models.json で宣言されたプロバイダーが提供するモデルは、enabledModels がその名前を挙げていない場合でも提供されます。プロバイダーを手動で宣言することは、それを使用する意図があると見なされるためです。これが、リストが enabledModels よりもはるかに長くなり得る理由です。スコープ内の 3 つのエントリと 2 つのカスタムプロバイダーで、15 の提供モデルになることは簡単です。init は、該当する場合、models.scopeNote でこれを明示的に示します。
2 つのスイッチでそれを変更できます。
効果 | |
|
|
| スコープを完全に削除します。認証されたすべてのモデルが使用可能です。 |
models を呼び出して、現在有効な設定で実際に到達可能なものを確認してください。
ステータスライン
Claude Code は statusLine コマンドを 1 つだけ許可するため、pi-delegate-statusline は既存のものをラップし、このワークスペースのデリゲートを示すセグメントを追加します。
{
"statusLine": {
"type": "command",
"command": "PI_DELEGATE_STATUSLINE_WRAP=ccstatusline pi-delegate-statusline",
"refreshInterval": 10
}
}PI_DELEGATE_STATUSLINE_WRAP を削除すると、pi セグメントのみが表示されます。
π ▸ audit engine·t1·12s audit index·t2·8s running, with turn counts and elapsed time
π ▸ migrate·t7·3m04s ?1 waiting one delegate is blocked on a question
π ✓2 finished, nothing runningどのデリゲートがどのセッションに属するか
ディレクトリによるフィルタリングだけでは不十分です。同じリポジトリで開かれた 2 つの Claude Code セッションは、互いのデリゲートを表示してしまいます。属性は代わりにプロセス系統を使用します。
MCP ホストはセッションごとに 1 つのサーバーを生成するため、サーバーは process.ppid(ホストの pid)を記録します。同じホストによって生成されたステータスラインは、自身の祖先をたどり、hostPid がそこにある状態ファイルのみを保持します。同じリポジトリ、2 つのセッション、クロストークなし。ディレクトリフィルタは、これが存在する前に書き込まれた状態ファイルのフォールバックとして残ります。
状態は $XDG_STATE_HOME/pi-delegate-mcp/<pid>.json に保存されます(PI_DELEGATE_STATE_DIR で場所を変更可能)。ファイルはプロセスが消えたときに削除されますが、ESRCH の場合のみです。EPERM はプロセスが別のユーザーとして生存していることを意味するためです。サーバーは stdin が閉じるかホストの pid が消えると自動的に終了するため、トランスポートを閉じずにホストが死んでも何も残りません。
デフォルトでは読み取り専用
ツールはセッション構築時に read, grep, find, ls にロックされます。それ以外はセッションが作成される前に拒否されます。
これを広げるには、サーバー上で追加のツールを指定します:
"env": { "PI_DELEGATE_ALLOW_TOOLS": "bash" }または PI_DELEGATE_ALLOW_WRITE=1 ですべてを許可します。
bash は中間手段ではありません。 pi には権限システムが搭載されていないため、bash を保持するデリゲートは、write と edit がリストに含まれていなくても、ファイルの書き込み、削除、ネットワークへの到達が可能です。これら2つを拒否しつつ bash を許可することは意図を記録するだけで、何も強制しません。Claude Code の権限プロンプトやフックは pi の動作を一切認識しません。本当の境界が必要な場合は、このサーバーをコンテナ内で実行してください。
Web 検索とその他の拡張ツール
pi 自身のツールは read, grep, find, ls, bash, powershell, write, edit です。その中に検索やフェッチはありません。これらは pi 拡張機能から提供され、拡張機能が独自のツールを登録し、デリゲートがそれらを使用できます。
呼び出しで extensions: true を設定し、サーバー上でツール名を許可します:
"env": { "PI_DELEGATE_ALLOW_TOOLS": "web_search,fetch_content" }{ "prompt": "Find the current Node LTS version and tell me just the number",
"extensions": true, "tools": ["read", "grep", "find", "ls", "web_search"] }{ "seq": 1, "name": "web_search", "state": "ok", "ms": 2568,
"args": "{\"query\":\"latest stable Node.js LTS version\",\"numResults\":5}" }これが、bash を渡さずにデリゲートにネットワーク到達を許可する方法です。web_search は検索のみが可能で、他のツールと同じ許可リストを通過するため、それを要求しない呼び出しでは読み取り専用のデフォルトは変わりません。
どのツールが存在するかは、サーバーを実行しているユーザーがインストールしているものに依存します。pi-web-access は web_search, fetch_content, source_check, get_search_content を提供します。pi-mcp-adapter は ~/.pi/agent/mcp.json 内の MCP サーバーをブリッジし、mcp として公開します。pi には独自の MCP クライアントがないため、その拡張機能が唯一の経路です。
extensions: true は、意図した拡張機能だけでなく、インストールされているすべての拡張機能を信頼します。 それらはセットとして読み込まれ、このサーバーのプロセスの全権限で実行され、セッションを超えて存続するソケットやタイマーを開くものもあります。デフォルトで有効にするのではなく、必要なデリゲートのために呼び出しごとにオンにしてください。また、実際の起動時間がかかるため、要求されない限りオフになっています。
設定
環境変数 | デフォルト | 意味 |
| pi 自身のデフォルト | 呼び出しが |
| 未設定 | 許可する追加ツールのカンマ区切りリスト(例: |
| 未設定 |
|
|
| レビュー用に保持される完了セッション数 |
|
| トレースに保持されるツール引数の最大文字数 |
|
| トレースに保持されるツール結果の最大文字数 |
|
|
|
|
| これを超えると、 |
| XDG 状態ディレクトリ | ステータスラインの状態が公開される場所 |
| 未設定 | ラップして追加するステータスラインコマンド |
| 未設定 | デバッグ用にステータスライン描画のたびにタイムスタンプを追記するファイル |
|
|
|
| 未設定 |
|
| 未設定 |
|
|
| pi の |
長時間実行の作業
MCP TypeScript SDK はデフォルトで 60 秒 のリクエストタイムアウトを持ち、実際のタスクはそれを超えてしまいます。優先順位の高い順に3つの防御策があります:
spawn+statusを使用する。ブロックするものがないため、タイムアウトは適用されません。runは定期的な進行通知を発行し、ホストのタイムアウトをリセットします。.mcp.jsonの"timeout"または環境変数MCP_TOOL_TIMEOUTで上限を引き上げます。
CLAUDE_AUTO_BACKGROUND_TASKS=1 を設定すると、Claude Code は約2分後に長時間の MCP 呼び出しをバックグラウンドにします。バックグラウンド化されると進行通知は破棄されるため、(1) または (3) のどちらかを選択し、両方は選択しないでください。
認証
サーバーは資格情報を処理しません。pi は ~/.pi/agent/auth.json から認証し、次に環境変数を使用します。MCP ホストは多くの場合、環境変数が削除された状態でサーバーを起動するため、シェルプロファイルでキーをエクスポートするよりも auth.json(pi を一度実行して /login)を優先してください。
開発
npm install
npm run build # tsc, src/*.ts -> dist/
npm run typecheck # tsc --noEmit, strict
npm run test:ci # offline: boots the server over stdio and lists its tools
npm test # full suite: needs a logged-in pi, makes real model callstest:ci は CI が実行するものであり、prepublishOnly がゲートするものです。資格情報やネットワークが不要だからです。npm test は実際のデリゲートを実際のプロバイダーに対して駆動するため、コストがかかり、pi がログインしている環境でのみ動作します。
パス | そこにあるもの |
| すべての環境変数が一箇所で読み込まれる |
| ツール許可リストとそれを強制するゲート |
| セッションマップ、ID 要求、履歴の退避 |
| MCP ツールのグループごとのモジュール |
| pi SDK に触れるすべて |
| 状態ファイルの公開とステータスラインバイナリ |
リリースはタグ駆動です。npm version patch && git push --follow-tags はビルドとテストを実行し、OIDC トラステッドパブリッシングで公開するため、リポジトリ内に npm トークンは保存されません。
Issue とプルリクエストは歓迎します。動作がおかしいデリゲートを報告する場合は、verbose: true を指定した status の toolCalls トレースが役立つ情報です。
先行実装
abatilo/pi-mcp-bridge はよりシンプルな方法を取っています:pi --mode json -p --session-id <uuid> を起動し、pi にセッションをディスク上に永続化させるため、ブリッジは状態を一切保持しません。エレガントで、読む価値があります。その代わりに、ステアリング、質問、ツール制御を犠牲にしています。
ライセンス
MIT
Available Tools
12 toolsabortA
Stop a running pi session. Partial output stays readable via status.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that partial output remains readable after abort, which is a useful behavioral detail beyond the simple action. It does not detail other side effects, but for a simple abort tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is one clear sentence with an additional clause. It is front-loaded with the main action and adds a relevant detail. No wasted words, though it could be slightly more structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simplicity of the tool (one param, no output schema), the description covers the core action and a key consequence. However, it lacks details on error conditions, idempotency, or what 'running' means precisely. Acceptable but not comprehensive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the sessionId parameter at all. The agent must infer that sessionId refers to the ID of the session to abort. With low coverage, the description should compensate, but it does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action 'Stop a running pi session' with a clear resource (pi session). It distinguishes from siblings like run, status, and spawn by focusing on termination. The verb 'abort' is reinforced by the description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies when to use (to stop a running session) but does not explicitly contrast with alternatives. However, it does mention that 'Partial output stays readable via status', which hints at using status afterwards. No explicit when-not to use, but the mention of status provides some context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
answerA
Answer a question raised by a pi agent. Get requestId from status. Only pi extensions can ask, so questions appear only for delegates spawned with extensions: true; the MCP adapter's tool-approval and elicitation prompts are the usual source. A delegate waiting on one is blocked until you answer it.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Chosen option, text, or boolean for a confirm | |
| requestId | Yes | ||
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a critical behavioral trait: 'A delegate waiting on one is blocked until you answer it,' i.e. this call has a real unblocking side effect. It also explains the origin of requests (MCP adapter tool-approval and elicitation prompts), which helps an agent recognize legitimate questions. It omits permission/auth requirements for the caller and what a successful answer returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose and immediately followed by the operational detail (where to get requestId). No filler or restatement of the tool name. Slightly dense mid-sentence clause, but nothing wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-required-param, no-output-schema tool with no annotations, the description covers purpose, prerequisite lookup, source of requests, and the blocking consequence. The main remaining gap is that `sessionId` is never explained and there is no statement of what a valid answer looks like beyond the schema's `value` types.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33% (only `value` is described), so the description must compensate. It does add genuine meaning for `requestId` by pointing to `status` as its source. However, `sessionId` is left entirely unexplained in both schema and description, so the compensation is partial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ('Answer a question raised by a pi agent') that is clearly distinct from siblings like status, spawn, or steer. It scopes the tool to a narrow case (questions from pi extensions), so an agent can tell it apart from generic session tools. It stops just short of 5 because it never characterizes what an 'answer' does downstream beyond unblocking the caller.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear prerequisite chain: get `requestId` from `status`, and questions only exist for delegates spawned with `extensions: true`. That effectively tells the agent the condition under which this tool is callable. It doesn't state a when-not-to-use or name a fallback tool if no question is pending, so it falls short of explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
follow_upA
Send another prompt to a delegate that has already finished, keeping everything it read and said. Use this instead of spawning a fresh delegate and re-explaining the task: the session still holds its own context, which yours never had to absorb. Returns immediately; poll with status as usual. For a delegate that is still working, use steer instead.
| Name | Required | Description | Default |
|---|---|---|---|
| prompt | Yes | The next turn for this delegate | |
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Given no annotations, the description carries the full burden. It discloses context preservation, immediate return (non-blocking), and the need to poll with `status`. It also states the pre‑condition (delegate finished). It doesn't cover error cases or side effects explicitly, but for this tool the key behaviors are well communicated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences pack purpose, usage, alternatives, and behavior with zero filler. The primary instruction (use for finished delegates) is front-loaded, and each clause serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter tool without an output schema, the description covers the essential workflow: when to use, what it does, and how to obtain results (poll via `status`). Minor gaps like error handling or repeated follow‑ups are not critical for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema documents the `prompt` parameter, but `sessionId` is left undocumented. The description does not add explicit meaning for `sessionId` beyond the name and context. With 50% schema coverage, this is borderline; the description could have compensated by explaining that `sessionId` identifies the finished delegate session.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear action (send another prompt) targeted at a specific resource (a finished delegate) while preserving context. Explicitly distinguishes from spawn and steer, making the tool's purpose unambiguous even among many siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides direct guidance to use this instead of spawning a fresh delegate, and explicitly directs to `steer` for a working delegate. The when-to-use and when-not-to-use conditions are spelled out, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
forgetA
Drop a finished session from the review history, freeing its id for reuse.
| Name | Required | Description | Default |
|---|---|---|---|
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It clearly discloses the destructive effect ('Drop'), the target ('review history'), and the side effect ('freeing its id for reuse'). It does not mention irreversibility or error behavior, but the core behavior is transparent and specific.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. Every word contributes meaning, and the most important action ('Drop') comes first.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter tool with no output schema, the description states the operation, the constraint (finished session), and the outcome (id reuse). It could have pointed to sessions for finding sessionId or to abort for running sessions, but nothing critical is missing for selecting and invoking the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema gives no description for sessionId, so the description adds meaning by tying it to a finished session's id and explaining the reuse consequence. It does not explicitly name the parameter or explain where to find sessionId, but the parameter name plus the description make the intent clear.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Drop') and resource ('finished session from the review history'), and clarifies the consequence ('freeing its id for reuse'). It also distinguishes itself from abort by specifying the session must be finished.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is for finished sessions only, which separates it from running-session tools like abort. However, it never explicitly names an alternative or states when not to use this tool, leaving some routing inferred rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
initA
READ THIS FIRST. Reports what this server can reach and how to drive it: permitted tools, the default model, models available per provider, and the recipes for delegating. Every other tool refuses until this has been called once.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Repository you intend to delegate in; picks up its project-local pi model scope | |
| models | No | Substring to filter the model list, e.g. "deepseek" |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses the most important behavior: all other tools refuse until init runs. It also makes clear this is a reporting/discovery call, implying read-only use, though it does not explicitly address repeated-call safety or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences front-load the critical directive and include the refusal behavior without any filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a discovery tool with two optional parameters and no output schema, the description sufficiently lists what the agent will learn (reachable tools, default model, provider models, delegation recipes) and the prerequisite behavior, making it complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description does not add meaning beyond the schema's existing explanations for cwd and models, though its mention of model listing aligns with the models parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Reports') and names concrete resources: permitted tools, default model, provider models, and delegation recipes. It clearly positions init as the mandatory discovery/entry-point tool, distinguishing it from siblings like models, which only list models.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit ordering guidance: 'READ THIS FIRST' and 'Every other tool refuses until this has been called once.' This tells an agent exactly when to call init and that no sibling can substitute for it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
modelsA
List models this delegate may use: pi's own scoped set plus any custom provider. Use to pick a model value.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Picks up a project-local pi model scope | |
| filter | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses the list scope (pi's scoped set plus custom providers) but does not mention side effects (none expected), output format, or ordering. For a read-only listing tool this is adequate but not rich; it does not contradict any structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences. The main purpose and usage are front-loaded, with no filler or redundant wording. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple listing tool with two parameters and no output schema, this description covers the core purpose and usage. However, the `filter` parameter is left undocumented, and the description does not mention the return format or any caveats, leaving some operational details unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 50%: `cwd` has a description but `filter` does not. The tool description adds no meaning for `filter` or `cwd` beyond the schema, so the undocumented parameter remains unexplained. It fails to compensate for the schema gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List models this delegate may use' with a specific verb and resource. It also specifies the scope ('pi's own scoped set plus any custom provider'), which distinguishes it from the sibling command-like tools (init, run, etc.) that perform actions rather than listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use to pick a `model` value', giving clear context for when to invoke it. It does not mention when not to use it or name alternatives, but given the sibling set are mostly action-oriented commands, the guidance is sufficient for selecting it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
runA
Delegate a task to a pi agent and wait for the final answer. Blocks until done. Prefer spawn for long work; this is for quick questions.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Your own session id for traceability, e.g. "search-audit-01". 1-64 chars of [A-Za-z0-9._:-], must start alphanumeric, must not already be in use. Defaults to a UUID. | |
| cwd | No | Working directory for the agent | |
| label | No | Free-text note shown in `sessions`, e.g. what this delegate is for | |
| model | No | Model as "provider/modelId", e.g. "openrouter/stealth/ox-alpha" | |
| tools | No | Tool allowlist for this delegate. [] disables all tools. Omit for defaults: read, grep, find, ls. Permitted on this server: read, grep, find, ls. | |
| prompt | Yes | The task for the pi agent | |
| extensions | No | Load pi extensions for this delegate. Off by default; they add startup cost and can misbehave. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it discloses the most consequential trait: the call blocks until the delegate finishes, and it returns the final answer. It does not cover failure/timeout behavior, cost, or isolation of the delegate, which leaves some gaps for an unattended blocking call.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero waste, and the blocking constraint plus the routing guidance are front-loaded. Every sentence conveys a decision-relevant fact.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter delegation tool with full schema coverage and no output schema, the description supplies the missing return semantics ('final answer') and the blocking contract, which the schema cannot express. Minor gap: no mention of what happens on delegate failure or timeout.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters (including id, tools allowlist, extensions, model) are already documented in the schema. The description adds no syntax or format meaning beyond that, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Delegate a task to a pi agent') and clarifies the interaction model ('wait for the final answer'), then explicitly differentiates itself from the `spawn` sibling. An agent can distinguish this from spawn, spawn_batch, and follow_up without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (`spawn`) and the exact condition that selects it ('long work') versus the condition for this tool ('quick questions'). This is an explicit when/when-not/alternative statement, which is the top of the scale.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sessionsA
List pi sessions held by this server, running and finished. Finished ones stay readable for review until evicted (keeps the newest 50).
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Filter by state: starting, running, done, aborted, error | |
| verbose | No | Include full text and tool calls |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does disclose that finished sessions remain readable until evicted and keeps the newest 50, which is useful behavioral context. However, it does not mention any authentication requirements, rate limits, or the exact return format (e.g., whether it returns summaries or raw session objects). For a non-destructive list operation, this is partial transparency but not exhaustive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two tight sentences. The first states the core purpose, and the second adds a relevant retention policy. No fluff or redundancy; every word earns its place. It is front-loaded with the primary action and scope, making it easy for an agent to quickly grasp the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (2 optional params, no output schema, no annotations), the description covers the essential aspects: what it lists, the state scope, and retention behavior. It does not explicitly describe the output format, but for a list tool this is often inferable. The lack of an output schema is partially offset by the clear description of the tool's behavior, making it adequately complete for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both 'state' and 'verbose' already documented. The description adds no new parameter-specific detail beyond what the schema provides—it references 'running and finished' which maps to a subset of state values, but this is already inferred from the schema's enum-like description. Since the schema carries the parameter semantics, the description's contribution is minimal, aligning with the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with a specific verb and resource: 'List pi sessions held by this server, running and finished.' It clearly identifies the tool as a listing operation for sessions, and the mention of 'running and finished' distinguishes it from siblings like 'status' which likely targets a single session. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing sessions but does not explicitly contrast it with alternatives such as 'status' or 'forget'. No when-to-use/when-not-to-use guidance is provided, relying on the agent to infer when this tool is appropriate based on the action of listing. The retention note hints at review use cases, but no explicit routing to siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawnA
Delegate a task to a pi agent running in the background. Returns a sessionId immediately, so nothing blocks. Poll with status, redirect with steer, answer its questions with answer. Use this for anything that might take more than a minute.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Your own session id for traceability, e.g. "search-audit-01". 1-64 chars of [A-Za-z0-9._:-], must start alphanumeric, must not already be in use. Defaults to a UUID. | |
| cwd | No | Working directory for the agent | |
| label | No | Free-text note shown in `sessions`, e.g. what this delegate is for | |
| model | No | Model as "provider/modelId", e.g. "openrouter/stealth/ox-alpha" | |
| tools | No | Tool allowlist for this delegate. [] disables all tools. Omit for defaults: read, grep, find, ls. Permitted on this server: read, grep, find, ls. | |
| prompt | Yes | The task for the pi agent | |
| extensions | No | Load pi extensions for this delegate. Off by default; they add startup cost and can misbehave. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the burden and delivers the single most important trait: it returns a sessionId immediately and nothing blocks, so the agent knows not to expect an inline result. It omits other behavioral context such as permissions, session lifetime/cleanup (handled by `forget`/`abort`), and failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and followed by the async contract and lifecycle routing. No filler; every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, no-output-schema tool this covers what an agent most needs: the async contract and the follow-up tools for polling, steering and answering. Residual gaps are minor – return payload shape beyond sessionId and failure/timeout behavior are unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already explains id, cwd, label, model, tools and extensions in detail. The description adds no parameter-level meaning beyond that (e.g. it never mentions the tools allowlist or model override), so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: "Delegate a task to a pi agent running in the background," which is unambiguous. It implicitly separates itself from `run` via the timing heuristic ("more than a minute"), but never names `run` or `spawn_batch` explicitly, so sibling differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use rule ("anything that might take more than a minute") and then routes the agent through the full lifecycle: poll with `status`, redirect with `steer`, answer questions with `answer`. This is exactly the alternative-naming guidance an agent needs to pick and follow this tool correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
spawn_batchA
Fan out several delegates in one call. Each task inherits the batch-level model, cwd, tools and extensions unless it overrides them. The whole batch is validated before any delegate starts, so a bad model name or a duplicate id fails everything instead of leaving half a fan-out running. Poll the result with sessions, which reports all of them at once, rather than one status per delegate.
| Name | Required | Description | Default |
|---|---|---|---|
| cwd | No | Default working directory for every task in this batch | |
| model | No | Default model for every task in this batch | |
| tasks | Yes | 1 to 10 delegates to start | |
| tools | No | Default tool allowlist for every task in this batch | |
| idPrefix | No | Names the tasks `<prefix>-01`, `<prefix>-02`, ... e.g. "audit" gives "audit-01" | |
| extensions | No | Default extensions setting for every task in this batch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully covers behavioral traits: whole-batch validation before any start, failure semantics for bad model or duplicate id, and inheritance/override rules. It discloses key outcomes and edge-case behavior, though it does not mention async execution or session cleanup.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The core purpose and key behavior are front-loaded; the polling guidance is a natural close. Every clause serves a purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema and no annotations, the description covers purpose, validation, inheritance, and polling—enough for correct invocation. Minor gaps like precise return format are covered by the `sessions` reference, so it is nearly complete for the complexity level.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with descriptions for all 6 parameters, so baseline is 3. The description adds meaningful semantics beyond the schema: it explains how batch-level defaults are overridden per task, clarifies the idPrefix format, and states the validation impact on parameters. This elevates it above the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Fan out several delegates in one call.' It specifies the resource (delegates) and the batch nature, distinguishing it from the single-delegate spawn. The inheritance and validation details further clarify its exact role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly advises polling with `sessions` instead of per-delegate `status`, giving concrete guidance on expected follow-up. It implies batch use case but does not explicitly contrast with `spawn` for single-delegate scenarios, leaving some room for inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
statusA
Check a background pi session. Returns state, turn count, tools used, latest text, and any pending questions the agent is waiting on. A non-empty questions array means it is blocked until you call answer. toolCalls traces every tool the delegate ran, in order.
| Name | Required | Description | Default |
|---|---|---|---|
| verbose | No | Include tool results and call ids in the trace | |
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the return contents (state, turn count, tools, latest text, pending questions) and explains the blocking semantics of the 'questions' array. It also notes that 'toolCalls' traces every tool run in order, adding behavioral depth beyond the tool name. It doesn't mention side effects, but 'check' implies read-only behavior, and the description sufficiently covers operational behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: two sentences plus a note. It front-loads the purpose, then details the return fields and the blocking condition. Every sentence carries useful information with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the absence of an output schema, the description adequately explains what the call returns and how to interpret the 'questions' array. It also clarifies the nature of 'toolCalls'. Minor omissions like error behavior for invalid sessions are not critical for a status-checking tool, so it feels complete enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: only 'verbose' has a description; 'sessionId' is undocumented. The tool description does not mention either parameter, failing to compensate for the uncovered 'sessionId'. It doesn't explain what constitutes a valid sessionId or how 'verbose' changes the output beyond the schema's minimal hint. With low coverage and no description support, this is a significant gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb ('Check') and a specific resource ('background pi session'), and enumerates exactly what it returns (state, turn count, tools used, latest text, pending questions). This distinguishes it from siblings like 'sessions' (which likely lists sessions) and 'answer' (which handles questions). The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable guidance on how to interpret the result: a non-empty 'questions' array means the agent is blocked and must call 'answer'. However, it does not explicitly state when to use this tool versus alternatives (e.g., 'sessions' for listing all sessions, or 'steer' for modifying a session). The when-to-use context is implied but not contrasted with siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
steerA
Redirect a running pi agent mid-task. The message lands after its current tool call finishes, before the next model call. Use this instead of aborting when the agent is going the wrong way.
| Name | Required | Description | Default |
|---|---|---|---|
| message | Yes | ||
| sessionId | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden of behavioral disclosure. It transparently explains the timing of when the message lands, which is a key behavioral trait. It does not mention error cases or lack of side effects, but for a simple steering action this is reasonably transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, concise, and front-loaded with the core action and timing. Every word adds value without unnecessary detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with no annotations and no output schema, the description covers the primary use case and timing behavior. It lacks details on error handling or edge cases, but given the low complexity, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and the description does not explain the parameters at all. While 'sessionId' and 'message' are somewhat self-explanatory by name, the description fails to indicate which parameter identifies the agent or what the message content should be. The description should have compensated for the lack of schema documentation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('redirect') on a specific resource ('running pi agent') and adds timing context (after current tool call, before next model call). It explicitly contrasts with the sibling 'abort', making the purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit guidance: use this instead of aborting when the agent is going the wrong way. This clearly tells the agent when to choose this tool over a direct alternative, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
3 tool updates
v0.1.1- Changed
answer2 fields changed- removed
Input schema / properties / value / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "boolean" - } -] - added
Input schema / properties / value / typeAdded value: +[ + "string", + "boolean" +]
- Changed
run1 field changed- changed
Input schema / properties / tools / descriptionPrevious value: -"Tool allowlist for this delegate. Default: read, grep, find, ls. Permitted on this server: read, grep, find, ls."New value: +"Tool allowlist for this delegate. [] disables all tools. Omit for defaults: read, grep, find, ls. Permitted on this server: read, grep, find, ls."
- Changed
spawn1 field changed- changed
Input schema / properties / tools / descriptionPrevious value: -"Tool allowlist for this delegate. Default: read, grep, find, ls. Permitted on this server: read, grep, find, ls."New value: +"Tool allowlist for this delegate. [] disables all tools. Omit for defaults: read, grep, find, ls. Permitted on this server: read, grep, find, ls."
12 tool updates
v0.1.0- First observed
abort - First observed
answer - First observed
follow_up - First observed
forget - First observed
init - First observed
models - First observed
run - First observed
sessions - First observed
spawn - First observed
spawn_batch - First observed
status - First observed
steer
TDQS
Scored across 12 tools
Each tool targets a distinct state or action, and the three delegation entry points (spawn/run/spawn_batch) are explicitly differentiated by blocking behavior and fan-out. The message-sending trio (answer/steer/follow_up) is clearly disambiguated by delegate state, and descriptions even cross-reference each other (spawn vs steer vs follow_up).
Most names are concise lowercase verbs (spawn, run, steer, abort, forget, init) with a consistent compound pattern for spawn_batch/spawn variants. The deviation is noun-style list tools (sessions, models) and the short 'init', which break a strict verb convention but remain readable and predictable.
12 tools map cleanly onto the delegation lifecycle: launch (spawn/run/spawn_batch), monitor (status/sessions), interact (steer/follow_up/answer), stop (abort), and housekeeping (forget/models/init). Each earns its place with no redundant or filler tools.
The surface covers the full delegate lifecycle including batch fan-out, mid-task redirection, post-completion follow-up, Q&A unblocking, and cleanup. Minor gaps exist (e.g. no dedicated blocking wait-for-completion on a spawned session, no explicit per-provider model-filtering view), but agents can work around these via status/run.
Maintenance
Related MCP Connectors
Agent-native task management: your AI agent is the interface. Delegate to anyone by email.
Hand tasks, bugs and finished work to AI coding agents, and get back a write-up with evidence.
Coordination hub for AI coding agents: message teammates, ask humans, audit every event.
Build agents to automate any background task. Works with your ChatGPT/Claude subscription.
Related MCP Servers
- AlicenseCqualityBmaintenanceEnables a primary agent in Antigravity IDE to delegate coding tasks to background subagents across multiple model backends, with crash recovery, process cleanup, and human-in-the-loop approval for destructive actions.20MIT
- AlicenseAqualityCmaintenanceEnables an orchestrator like Claude Code to hand coding work off to Cursor SDK agents, run as detached background jobs that survive the session and can be listed, inspected, steered, resumed, or stopped. Agents are asynchronous and reusable across follow-up turns, letting expensive frontier models delegate cheaply without blocking or paying to read the results.7MIT
- AlicenseNot gradedqualityAmaintenanceEnables a coding agent such as Codex or Claude Code to delegate work to a local Pi coding-agent session, including second-opinion reviews, bulk reading kept out of the main context, and follow-up turns that retain context. Operators control what is possible by defining workspace and execution-profile aliases in a local config file, so clients cannot choose directories, models, providers, or permission levels themselves.2,808 npm1MIT
- AlicenseNot gradedqualityCmaintenanceEnables an assistant to run pi coding-agent tasks in the background: dispatching a task, polling its status and tool trace, reading the final result, and cancelling it when no longer needed, all without pulling the delegate's context into its own conversation.MIT