ジェネラティブエージェンツの大嶋です。
「AIエージェントキャッチアップ #66 - Agent Client Protocol」という勉強会を開催しました。
generative-agents.connpass.com
アーカイブ動画はこちらです。
Agent Client Protocol
今回は、エディターとコーディングエージェントの通信を標準化する「Agent Client Protocol(ACP)」をキャッチアップしました。
Agent Client ProtocolのGitHubリポジトリはこちらです。
公式ドキュメントはこちらです。
今回のポイント
Agent Client Protocol(ACP)とは
Agent Client Protocol(ACP)は、エディターとコーディングエージェント間の通信を標準化するプロトコルです。
Language Server Protocol(LSP)が言語サーバーの統合を標準化したのと同様に、ACPはエージェントとエディター間の通信を標準化します。
ACPを実装したエージェントは互換性のあるあらゆるエディターで動作し、ACPをサポートするエディターはACPに対応したエージェントすべてを使用できるようになります。
ACP登場の背景
ACPは、AIネイティブなコードエディターであるZedが、外部のコーディングエージェントを統合するために定義したプロトコルです。
初期のリファレンス実装として、ZedとGemini CLIの統合がブログで紹介されています。
ACPの基本仕様
ACPはローカルとリモートの両方のエージェントに対応しています。
- ローカルエージェント:エディターのサブプロセスとして実行され、標準入出力を介してJSON-RPCで通信
- リモートエージェント:クラウドまたは別のインフラストラクチャで動作し、HTTPまたはWebSocketを介して通信(現在開発中)
プロトコルはJSON-RPC 2.0 Specificationを使用しており、できるだけMCPのデータ型を再利用しています。
エディターとエージェントのやりとりの流れ
エディター(クライアント)とエージェント間の基本的な通信フローは以下のとおりです。
- initialize:クライアントがエージェントを初期化し、プロトコルバージョンや機能をネゴシエート
- session/new:新しいセッション(チャットスレッド)を作成
- session/prompt:クライアントからエージェントにユーザーのメッセージを送信
- session/update:エージェントからクライアントにレスポンスを返す
エージェントがツールを使用する場合は、権限のリクエスト(session/request_permission)やファイルの読み書き(fs/read_text_file、fs/write_text_file)などのメソッドも使用されます。
対応状況
ACPに対応しているエージェントやエディター(クライアント)の一部を紹介します。
エージェント(ネイティブ対応)
- Claude Code (Zedアダプター経由)
- Cline
- Codex (Zedアダプター経由)
- Gemini CLI(
--experimental-acpオプション) - OpenCode
- OpenHands
クライアント(エディター)
- JetBrains
- Neovim
- Obsidian
- Zed
なお、VS Code拡張は現時点では提供されていないようです。
実際に動かしてみた
ACPのPython SDKを使って、サンプルのエージェントとクライアントを動かしてみました。
Python SDKのリポジトリはこちらです。
以下のページがQuick Startです。
エージェント側は、ACPのPython SDKからAgentクラスをimportして継承して、on_connect・initialize・new_session・promptなどのメソッドを実装します。
: from acp import ( Agent, : class EchoAgent(Agent): _conn: Client def on_connect(self, conn: Client) -> None: : async def initialize( self, protocol_version: int, client_capabilities: ClientCapabilities | None = None, client_info: Implementation | None = None, **kwargs: Any, ) -> InitializeResponse: : async def new_session( self, cwd: str, mcp_servers: list[HttpMcpServer | SseMcpServer | McpServerStdio], **kwargs: Any ) -> NewSessionResponse: : async def prompt( self, prompt: list[ TextContentBlock | ImageContentBlock | AudioContentBlock | ResourceContentBlock | EmbeddedResourceContentBlock ], session_id: str, **kwargs: Any, ) -> PromptResponse: :
コード引用元:https://github.com/agentclientprotocol/python-sdk/blob/main/examples/echo_agent.py
クライアント(エディター)側は、ACPのPython SDKからClientクラスをimportして継承して、request_permission・session_updateなどのメソッドを実装します。 これらはエージェントから呼び出されたときのハンドラーのようなメソッドです。
: from acp.interfaces import Client class SimpleClient(Client): async def request_permission( self, options, session_id, tool_call, **kwargs: Any ): return {"outcome": {"outcome": "cancelled"}} async def session_update(self, session_id, update, **kwargs): print("update:", session_id, update)
また、クライアント側は、ユーザーの操作に応じてエージェントの起動・initialize・new_session・promptを呼び出します。
async def main() -> None: script = Path("examples/echo_agent.py") async with spawn_agent_process(SimpleClient(), sys.executable, str(script)) as (conn, _proc): await conn.initialize(protocol_version=1) session = await conn.new_session(cwd=str(script.parent), mcp_servers=[]) await conn.prompt( session_id=session.session_id, prompt=[text_block("Hello from spawn!")], )
コード引用元:https://agentclientprotocol.github.io/python-sdk/quickstart/
実際に動かしてみると、クライアントとエージェントがしっかり疎通する様子を確認できました。

次回のご案内
以上、今回は「Agent Client Protocol」をキャッチアップしました。
次回は「AIエージェントキャッチアップ #67 - Harbor」ということで、サンドボックス環境でエージェントを評価するためのフレームワーク「Harbor」がテーマです!
generative-agents.connpass.com
ご興味・お時間ある方はぜひご参加ください!
また、その次の回以降のテーマも募集しているので、気になるエージェントのOSSなどあれば教えてください!