claude-code-acpを作った話 — サブスク課金でClaude CodeをOpenClawから使う

きっかけ — APIキーの従量課金がつらい

OpenClawというAIエージェントフレームワークからClaude Codeを呼び出すとき、サブスクリプション(Pro/Max)の認証ではなくAPIキーの指定が必要でした。APIキーだと従量課金になるので、使えば使うほどお金がかかってしまいます。

できればサブスクリプションの範囲内で使いたいなと思い、それを実現するブリッジを作ってみることにしました。

ACPとは

ACP(Agent Client Protocol)は、コードエディタとAIコーディングエージェント間の通信を標準化するプロトコルです。JSON-RPCベースの共通インターフェースを定義することで、エージェント側がACPを実装していればどのエディタからでも利用できるようになります。

LSP(Language Server Protocol)がエディタと言語サーバーの関係を標準化したように、ACPはエディタとAIエージェントの関係を標準化するものです。現在、JetBrains IDEやZed、Neovimなどがサポートしており、Claude CodeやGitHub Copilot CLI、Gemini CLIなどのエージェントが対応しています。

OpenClawもACPをサポートしており、ACP対応のエージェントをサブプロセスとして管理・実行できます。

claude-code-acpとは

claude-code-acpは、Claude Code CLIをACP(Agent Client Protocol)互換のエージェントとして動作させるTypeScript製のブリッジです。

仕組みとしては以下のような3層構造になっています。

OpenClaw(ACPクライアント)
  ↕ stdio(JSON-RPC 2.0)
claude-code-acp(ブリッジ)
  ↕ subprocess(NDJSON streaming)
Claude Code CLI(Pro/Maxサブスクリプション認証)

ポイントは、OpenClawがあくまでClaude Code CLIのクライアントとして動作する形にしていることです。Claude Codeの認証自体でOpenClawを動かすのは規約上NGですが、OpenClawがCLIツールとしてClaude Codeを利用する形であれば問題ないと考えています。

主な機能

  • サブスクリプション認証のまま利用可能 — 環境変数からAPIキーを自動で除去し、必ずサブスク課金で動作する
  • ストリーミング対応 — Claude Code CLIのstream-json出力をリアルタイムでACPプロトコルに変換
  • セッション管理 — ACPのセッションIDとClaude CodeのセッションUUIDをマッピングし、--resumeで会話を継続可能
  • MCPサーバーのパススルー — OpenClaw側で設定したMCPサーバーをClaude Codeにそのまま渡せる
  • パーミッション制御 — Claude CLIのパーミッションリクエストをACPプロトコル経由でクライアントに中継

開発について

ACPというプロトコルの仕様がしっかり定まっていたので、Claude Codeへ「こういう仕様のブリッジを作って」と指示すれば、実装やテストをすべてやってくれました。仕様が固まっている開発であれば、Claude Codeに任せるとかなり楽だなと実感しています。

今後の課題

セッション管理まわりにまだバグがあり、うまく動かないケースがあるのでそこは改善していきたいところです。

ACPプロトコル自体はまだ発展途上ですが、今後エコシステムが整っていけば、こういったブリッジの需要は増えていくのかなと思っています。引き続き開発を進めていきます。