人々がやり取りするアプリケーション
通常はエディター、デスクトップ アプリ、CLI、または ADK-Rust コーディネーターです。コーディング エージェントを開始し、プロジェクト セッションを開き、進行状況を表示し、権限の質問がユーザーに届く方法を決定します。
ACP は、コーディング インターフェイスとコーディング エージェントに、プロジェクトを開いたり、プロンプトを交換したり、進行状況をストリーミングしたり、承認を求めたり、作業をキャンセルしたり、同じセッションを継続したりするための共有方法を提供します。 ADK-Rust は、その関係の両側を実装します。
ADK-Rust ACP アーキテクチャ
インターフェイスを持つプログラムは ACP クライアントです。コーディング作業を行うプログラムは、ACP エージェントです。 ADK-Rust は、その関係のどちら側にも座ることができます。
01 · ADK-Rust は ACP クライアント/ホストです
リポジトリ タスクにコーディング スペシャリストが必要であると判断します。
プロセスを開始し、ワークスペースを選択し、コンテキストを保持して、アクセス許可ポリシーを適用します。
コードを検査し、編集を提案し、ツールを呼び出し、進行状況をストリーミングします。
The shared ACP v1 contract
Both directions use the same message vocabulary.
initializesession/newsession/promptsession/updaterequest_permissioncancelclose · list · resume · delete02 · ADK-Rust は ACP エージェント/サーバーです
会話 UI を所有し、ADK-Rust バイナリを開始します。
機能をネゴシエートし、セッションを検証し、更新をストリーミングし、キャンセルを処理します。
モデル、Rust ツール、ワークフロー、セッション、メモリ、アーティファクトを使用してターンを完了します。
1 つの ACP セッションは、1 つの永続的な ADK-Rust セッションにマップされます。
クライアントはエージェントが実際に提供したオプションを選択します。
テキスト、思考、ツールの開始、ツールの完了は session/update としてストリームされます。
安定した ACP v1 は、ローカル サブプロセスと stdio 経由の JSON-RPC を使用します。
関係から始める
コーディング エージェントはリポジトリについて推論し、ツールを使用できますが、ユーザーは依然として、ジョブを説明し、エージェントが何をしているかを確認し、質問に答え、機密性の高いアクションを承認し、ターンを停止できるインターフェイスを必要としています。標準がなければ、すべてのエディターとすべてのコーディング エージェントは、これらの基本をカスタム統合する必要があります。
ACP は、欠落している会話を定義します。クライアントは、提供することを選択したインターフェイスと作業環境を所有します。エージェントはコーディング インテリジェンスを所有します。彼らは、実装コードを共有することなく、セッション、プロンプト、コンテンツ、ライブ更新、ツール呼び出し、権限の選択、キャンセル、完了について同意します。
ADK-Rust は両方の実用的な方向をサポートします。 ADK エージェントは、ツールとして外部の ACP コーディング エージェントに作業を委任できます。サーバー機能を使用すると、編集者は ADK-Rust バイナリを開始し、同じ ACP v1 コントラクトを通じてその Runner、モデル、ツール、セッション、メモリ、およびワークフローを使用できます。
通常はエディター、デスクトップ アプリ、CLI、または ADK-Rust コーディネーターです。コーディング エージェントを開始し、プロジェクト セッションを開き、進行状況を表示し、権限の質問がユーザーに届く方法を決定します。
プロンプト、リポジトリに関する理由を受け取り、ツールのアクティビティを報告し、機密アクションの前に質問し、ターン終了時に停止理由を返します。
セッションには、ID、絶対作業ディレクトリ、オプションのワークスペース ルート、いくつかのプロンプト、ストリーミングされた更新、明確な終了または再開のライフサイクルがあります。
エージェントはツールの呼び出しを正確に説明し、選択肢を提供します。クライアントはそれらの選択肢の 1 つを返すため、アクションを続行するかどうかはエージェントではなくアプリケーションが制御します。
One ACP turn
Read from top to bottom. Initialization establishes the contract once. A session then carries several prompts, live updates, approval questions, cancellation, and a final stop reason.
Editor or ADK-Rust
Coding process or ADK-Rust
initializeprotocolVersion: 1
capabilitiesWhat this agent really supports
session/newAbsolute cwd + workspace roots
session/promptTyped content blocks
session/updateText · thought · tool call
session/request_permissionChoose from offered options
permission responseAllow once · always · reject
PromptResponseend_turn · cancelled
session/cancel into the Runner cancellation token and returns a typed cancelled stop reason.方向 1 · ADK-Rust はクライアントです
外部 ACP プロセスは、名前付きツールとして ADK-Rust 内に表示されます。コーディネーターは、それをいつ使用するかを決定し、プロジェクト ディレクトリを選択し、作業が数ターンにまたがる場合にコンテキストを保持し、進行状況をインターフェイスにストリーミングし、承認ポリシーをコーディング エージェントの外部に保持することができます。
AcpAgentToolADK エージェントが自己完結型リポジトリ タスクを時々委任する場合に最適です。各呼び出しで ACP プロセスが開始され、そのテキストが通常のツール出力として返されます。
AcpToolsetレビュー、テスト、移行、または文書化エージェントという名前のコーディネーターを指定します。これらのツールの説明は、モデルが各タスクを適切なプロセスにルーティングするのに役立ちます。
AcpSessionプロンプト間でプロセスと ACP セッションを維持します。エージェントはすでに検査した内容を記憶しており、キャンセル ハンドルを使用して飛行中のターンを停止できます。
stream_prompt結合された 1 つの文字列を待つのではなく、テキスト、思考、ツール呼び出し、許可、完了、およびエラーのチャンクを発生時に受信します。
use adk_acp::{AcpAgentTool, PermissionPolicy};
let coder = AcpAgentTool::new("my-coding-agent --acp")
.name("repository_coder")
.description("Inspect and improve this Rust project")
.working_dir("/absolute/path/to/project")
.permission_policy(PermissionPolicy::DenyAll);
let coordinator = LlmAgentBuilder::new("coordinator")
.model(model)
.tool(Arc::new(coder))
.build()?;let mut session = AcpSession::start(
AcpAgentConfig::new("my-coding-agent --acp")
.working_dir("/absolute/path/to/project"),
Arc::new(permission_policy),
).await?;
let cancel = session.cancellation_handle()?;
tokio::spawn(async move {
shutdown.cancelled().await;
cancel.cancel().await
});
let result = session
.prompt("Trace the failing test and propose a fix")
.await?;クライアントが作業環境を提供できる
ACP は、コーディング エージェントがディスクを読み取ったり、コマンドを直接実行したりできることを前提としていません。クライアントは、提供する準備ができているサービスを宣言し、各リクエストを処理し、セキュリティ ルールを製品とユーザーに近い状態に保ちます。
ADK-Rust は、型付きファイルと端末ホスト インターフェイスを公開し、クライアント提供の MCP サーバーをセッション作成に渡します。デフォルトでは何も有効になっていません。読み取り専用のドキュメント ツール、未保存のバッファーを含むデスクトップ エディター、および分離されたビルド ワーカーは、それぞれ異なる正確な機能セットを公開できます。
Your editor or application decides how reads and writes work. It can return an unsaved buffer, enforce approved roots, reject a symlink escape, or make the session read-only.
The coding agent can start a command, collect output, wait, stop it, and release it through the client. Terminal support stays disabled until the host implements the complete lifecycle.
Attach an MCP server when the ACP session opens. ADK-Rust starts it inside the selected project, exposes its tools only to that session, and cancels it when the session closes.
ACP セッション設定に MCP が表示される理由
たとえば、編集者はセッションを開くときに、問題トラッカーまたはリポジトリ検索 MCP サーバーを接続できます。コーディング エージェントは、資格情報や構成を所有せずに、これらのツールを受け取ります。 ADK-Rust は、安定版 ACP v1 で必要な stdio トランスポートをサポートし、各サーバーを制限付きハンドシェイクで起動し、セッションとともに削除します。オプションの HTTP および SSE トランスポートは、外部エージェントがそれらをアドバタイズする場合にのみクライアントによって受け入れられます。
承認は主催者に帰属します
コーディング エージェントは、ファイルの編集、コマンドの実行、依存関係のインストール、または生成された出力の削除が必要な場合があります。 ACP は、提案された操作を有効な選択肢のメニューとともにクライアントに送り返します。 ADK-Rust はセキュリティ関連の詳細を保持し、デフォルトでリクエストを拒否します。
信頼できるローカル ワークフローの場合、ルールで既知の操作を承認できます。インタラクティブな製品の場合、PermissionPolicy::async_custom はデスクトップ ダイアログ、Web 承認画面、または組織ポリシー サービスを待つことができます。 ADK-Rust は、エージェントによって提供された正確な不透明なオプション ID を返します。決して承認の価値を発明するものではありません。
リクエストには、セッション ID、ツール呼び出し ID、タイトル、ツールの種類、生の入力、およびエージェントがサポートするすべての応答オプションが含まれます。
デフォルトで拒否するか、同期ルールを使用するか、async_custom を介して人間のダイアログまたはリモート ポリシー サービスを待ちます。
許可および拒否の選択肢は ACP の意味で照合され、元の不透明なオプション ID が返されます。偽造IDはキャンセルとなります。
コーディング エージェントは同じセッションで決定を受け取り、ツールの呼び出しを続行するか、別のパスを選択するか、ターンを終了することができます。
let policy = PermissionPolicy::async_custom(|request| async move {
let choice = approval_ui.ask(ApprovalPrompt {
title: request.title,
kind: request.kind,
input: request.raw_input,
options: request.options,
}).await;
match choice {
Approval::Once => PermissionDecision::AllowOnce,
Approval::Always => PermissionDecision::AllowAlways,
Approval::Reject => PermissionDecision::Deny,
}
});ACP は、どのプロジェクトと追加のルートがセッションに属しているかを双方に伝えます。オペレーティング システムのセキュリティ境界は作成されません。コーディング プロセスをマシンの他の部分から分離する必要がある場合は、それを実行します。 adk-sandbox、コンテナー、または別のプロセス ポリシー。
Keep credentials in the process environment or the client's secret store. Protocol stdout must contain only ACP JSON-RPC messages.
方向 2 · ADK-Rust は ACP エージェントです
エディターは、Rust バイナリを ACP サブプロセスとして開始します。公式の SDK は、JSON-RPC フレーミング、リクエスト ID、型付きデコード、および stdio を所有しています。セッション ハンドラーは、1 つの ACP セッションを 1 つの ADK-Rust セッションにマップし、その後、Runner がモデルとツールのイベントをライブ session/update 通知としてストリーミングバックします。
この方向は、エージェントにドメイン固有の命令、Rust ツール、ワークフロー エージェント、メモリ、またはコーディング インターフェイスから利用できる必要がある内部サービスがある場合に便利です。編集者はこれらの内部構造を理解する必要はありません。バイナリが正直に公開する機能とライフサイクルを確認します。
use adk_acp::server::{
AcpServer, AcpServerConfigBuilder
};
let config = AcpServerConfigBuilder::new()
.agent(Arc::new(repository_agent))
.session_service(Arc::new(session_service))
.agent_name("repository-guide")
.agent_description("Explains and improves this workspace")
.max_sessions(16)
.build()?;
let server = AcpServer::run(config).await?;
server.wait().await?;{
"name": "repository-guide",
"command": "/absolute/path/to/repository-guide",
"args": [],
"env": {
"MODEL_API_KEY": "from-the-editor-secret-store"
}
}{
"jsonrpc": "2.0",
"id": 3,
"method": "session/prompt",
"params": {
"sessionId": "session-7f2a",
"prompt": [{
"type": "text",
"text": "Explain error handling in src/main.rs"
}]
}
}{"jsonrpc":"2.0","method":"session/update","params":{
"sessionId":"session-7f2a",
"update":{"sessionUpdate":"agent_message_chunk","content":{
"type":"text","text":"The entry point uses..."
}}
}}
{"jsonrpc":"2.0","id":3,"result":{
"stopReason":"end_turn"
}}検証範囲
ADK-Rust は両方のロールに公式 agent-client-protocol クレートを使用するようになりました。この表は、相互運用可能な v1 サーフェスとまだ実装が必要な機能を分離しているため、統合作業が開始された後にエディターや製品が不足している機能を検出することはありません。
ACP protocol v1 · official Rust SDK 1.2 · JSON-RPC over local stdio
ImplementedInitialize, new session, prompt, live updates, tool permissions, one-shot, persistent, streaming
ImplementedCloneable handle sends session/cancel while another task awaits the prompt
ImplementedInitialize, new, prompt, update, cancel, close, list, resume, delete
ImplementedText and resource links; unsupported media types are rejected and not advertised
Implemented scopeOpt-in host traits advertise only the file and terminal operations the application implements
Implemented APITyped session configuration, required stdio server support, per-session ADK toolsets, bounded startup and cleanup
Implemented · stdioThe runtime can await an exact-call decision; the server bridge is held back because the official SDK currently loses the outer prompt response in the nested-request test
SDK limitationHTTP or WebSocket ACP between machines
Protocol work is evolving; stdio only相互運用性ゲート
公式 SDK クライアントは、メモリ内トランスポートを介して ADK-Rust SDK エージェントに接続し、初期化→新規→プロンプト→更新→閉じる→リスト→再開→閉じる→削除を完了します。キャンセル テストは、ACP セッション/キャンセルと JSON-RPC リクエスト キャンセルの両方をカバーし、クリーンアップ後にセッションが別のプロンプトを受け入れることができることを証明します。許可テストでは、リジェクトファーストメニュー、不透明な ID、捏造された選択、および待機中の人間の決定が対象になります。別のライブ ゲートは実際の stdio MCP 子を開始し、ACP セッションで使用されるのと同じ McpToolset を通じてそのツール カタログを検出します。
境界を選択してください
まず、反対側に何があるかを尋ねてください。コーディング エージェントには、プロジェクト セッションと対話型ホストが必要です。リモート ビジネス エージェントにはネットワーク タスク契約が必要です。ツールまたはデータ サービスには、呼び出し可能な機能コントラクトが必要です。
コーディング インターフェイスとプロジェクト セッション内で動作するエージェントの間で ACP を使用します。
Explore ACP A2AA2A を使用して、リモート エージェントを検出し、作業を送信し、タスクの状態を追跡し、ネットワーク経由で成果物を受信します。
Explore A2A MCPMCP を使用すると、サーバーをエージェント自体にすることなく、エージェントに呼び出し可能なツール、プロンプト、リソースを提供できます。
Explore MCP必要な役割を備えた構築
Start with stdio, one absolute workspace, and DenyAll. Add a custom approval experience, persistent sessions, and stronger process isolation as the product's trust boundary becomes clear.