この記事はClaude Codeと一緒に書いています。内容は2026年11月8日時点で確認したものです。
e2eは、エージェントに画面を操作させたり確認させたりできるE2Eテストのツールです。agent.act が自然言語で書いた操作を実行し、agent.assert が画面の状態を確認します。(以降、この2つをエージェントステップと呼びます)
e2e 0.23(2026年11月5日公開)で、エージェントステップを、自分のClaudeのログインで動くClaude Codeに実行させられるようになりました。e2eとClaude Codeの間の通信にはACPを使います。この機能を試してみました。
この記事は、e2eのサイトに書かれている手順に沿って試した結果です。AnthropicのLegal and complianceには、第三者の開発者が自分のアプリにclaude.aiのログインを組み込むことや、ユーザーの代わりにサブスクリプションの認証情報でリクエストを送ることを認めない、と書かれています。一方で、ユーザー本人が改変されていないClaude Codeに自分のサブスクリプションでサインインすることは、妨げないとも書かれています。利用にあたっては、ご自身で規約を確認し、規約を守って行ってください。
試用に使ったリポジトリは、こちらに公開しています。
ACPとは
ACPはAgent Client Protocolの略で、エディタなどのクライアントとコーディングエージェントが通信するための共通規格です。仕様はagentclientprotocol.comで公開されています。e2eがACPのクライアントになり、Claude Code用のアダプタを通してClaude Codeを動かします。
このアダプタ @agentclientprotocol/claude-agent-acp は、Zed Industriesが公開しているものです。中身はAnthropic公式のClaude Agent SDKで動いていて、e2eのドキュメントでもZedのアダプタとして紹介されています。
e2eは、Claude Codeのほかに、Codexを codex() で、そのほかのACPエージェントを acp({ command, args }) で動かせると、リリース記事に書かれています。この記事ではClaude Codeを試します。
環境
- Windows 11
- WSL2 (Ubuntu 24.04 LTS)
- Node.js 24.22.2
- e2e 0.23.0
- @e2e-dev/acp 0.1.1
- @agentclientprotocol/claude-agent-acp 0.101.0
アダプタが動かすClaude Codeは、アダプタが使うAgent SDKに同梱された2.1.318でした。
設定
パッケージを2つ追加します。1つ目がe2e側でACPを扱うパッケージで、2つ目がClaude Code用のアダプタです。
npm install -D @e2e-dev/acp @agentclientprotocol/claude-agent-acp
e2e.config.ts には、claudeCode の読み込みと、agents の1行を足します。
import type { E2EConfig } from 'e2e';
import { claudeCode } from '@e2e-dev/acp';
export default {
// targets は省略
agents: { default: { executor: claudeCode({ model: 'sonnet' }) } },
} satisfies E2EConfig;
テスト対象は、リポジトリの app/ にあるToDoアプリです。targets に、e2eが node app/server.js で起動するよう設定しています。
認証は、claude でサインインするか、環境変数 ANTHROPIC_API_KEY を設定します。e2eのドキュメントにそう書かれています。今回は claude でサインインしただけで、ANTHROPIC_API_KEY は設定していません。サインインしていないと、e2eは「the agent is not signed in」と表示して止まります。
Claude Codeに使わせるツール
e2eは、Claude Code自身のツールを使わせません。Bashやファイルの読み書きといったツールは無効になり、手元のユーザー設定やプロジェクト設定、ほかのMCPサーバーも読み込まれません。使えるのは、e2eが渡すステップ用のツールだけです。画面を調べたり操作したりするツールと、ステップの結果を返す complete_step が含まれます。
これは、Claude Codeが自分のツールで操作すると、e2eはその操作を記録できず、あとから再生もできないためです。ドキュメントではWhat the agent can useに説明があります。Claude Codeが自分のツールを許可なく動かしたときは、そのステップは POLICY_DENIED で失敗します。
動作の確認
npx e2e doctor --check-model は、e2eの環境を診断するコマンドです。Node.js、設定ファイル、ブラウザの3つは確認されましたが、モデルの行は ? でした。
? model: [default] executor "claude-code" brings its own agent, which doctor does not check
Claude Codeは自分のログインでモデルを呼びます。e2eのモデル設定を使わないので、doctor はこの行を確認の対象にしていません。ログインが使えるかどうかは、エージェントのステップを1つ動かして確かめました。agent.assert だけのテストです。
import { test } from '@e2e-dev/web';
test('agent sees the todo form', async ({ app, agent }) => {
await app.open('/');
await agent.assert('a todo form with a "New todo" input and an Add button is shown');
});
実行結果の抜粋です。
✓ agent sees the todo form > agent.assert "a todo form with a "New todo" input and an Add button is shown" 5.35s · 1 model call
AI 24.7k tokens · 84% cached · $0.0200 · 1 model calls · @agentclientprotocol/claude-agent-acp/sonnet
最後の行に、アダプタとモデルが出ています。モデルの呼び出しは1回で、このステップが通りました。
actの再生
e2eは、agent.act の操作を記録して、次の実行では記録から再生します。ACPでも同じように動くかを確かめました。agent.act のあとに agent.assert を置くテストです。agent.assert が通ると、act の記録が保存されます。
test('adds a todo', async ({ app, agent }) => {
await app.open('/');
await agent.act('add a todo named {title}', { params: { title: 'Buy milk' } });
await agent.assert('"Buy milk" is listed and the count shows "1 todo"');
});
npm run test:e2e を2回続けて実行した結果です。時間は各1回の計測で、実行のたびに変わります。
| 実行 | act |
assert |
|---|---|---|
| 1回目 | 7.81秒、モデル1回 | 8.23秒、モデル1回 |
| 2回目 | 0.252秒、モデルなし | 5.04秒、モデル1回 |
2回目の act は、モデルを呼ばずに記録から再生されました。assert は、毎回モデルが実行します。なお、ACPはモデルへのリクエストを報告しないので、e2eはエージェントとの1往復を、モデル1回として数えています。ドキュメントのLimitsにそう書かれています。
所感
設定ファイルの2行だけで、エージェントステップをClaude Codeに実行させる形を確認できました。