コーディングエージェント基盤をつなぐVercel AI SDKのACPアダプター

Vercelの@ai-sdk/harness-acpは、ACP対応のコーディングエージェント用ハーネスをHarnessAgentへ接続します。共通ブリッジの仕組み、導入手順、専用アダプターとの使い分け、ACP version 1の制約、権限・認証・Sandbox設計で見落とせないポイントを、実装例とともに解説します。

Thursday, September 3, 2026Omid Saffari
Tools
コーディングエージェント基盤をつなぐVercel AI SDKのACPアダプター

2026年8月13日、Vercelは@ai-sdk/harness-acpを追加しました。これは、Agent Client Protocolパッケージを提供するコーディングハーネスをAI SDKのHarnessAgentから動かすための、プロトコルレベルの単一アダプターです。コーディングエージェントそのものが賢くなるわけではありません。実利は、より多くのランタイムを1つの統合ポイントで扱えることにあります。

Vercelがコーディングエージェント向けに提供したもの

まず、混同されやすいレイヤーを整理しましょう。

モデルは次の応答を生成します。ハーネスはセッション、ツール、承認、Sandbox、指示、コンテキスト圧縮、作業ループを管理し、そのモデルを実際に働く仕組みに変えます。Agent Client Protocolの略であるACPは、クライアントとハーネスが共通の方法で通信するためのプロトコルです。

VercelのHarnessAgentには、複数のハーネスを1つのAPIで扱う仕組みがすでにありました。足りなかったのは、それぞれをつなぐコネクターです。今回のリリース以前は、Claude Code、Codex、Pi、Deep Agents、OpenCodeを含め、ランタイムごとに別々のアダプターをVercelが用意する必要がありました。

新しいACPハーネスアダプターがラップするのは、特定のランタイムではなくプロトコルです。createACPには、対象ハーネスのACP実装を含むNPMパッケージ、実行ファイル、認証ルール、指示のマッピング、権限のマッピングを渡します。共通アダプターは、ブリッジ、ACPクライアント、ツールの中継、イベント、承認、セッションのライフサイクルを処理します。

設計の要点は、この役割分担にあります。共通ブリッジはVercelが担い、ハーネスごとの差分はランタイムプロファイルが担います。

アプリケーションがHarnessAgentとACPブリッジを介してSandbox内のACPランタイムへ接続され、ホストツールがMCP経由で中継される構成図
アプリケーションとハーネスランタイムの間でACPアダプターが担う位置

現在のアダプターが対応するのはACP version 1のみです。保証されるのはプロトコル境界での互換性であり、接続後にすべてのハーネスが同じように振る舞うわけではありません。

ハーネス専用アダプターACPハーネスアダプター
接続方式1つのランタイム専用ACPプロトコル向け
最適な用途Claude CodeやCodexなど、専用対応済みのハーネスAI SDK専用アダプターがないACPハーネス
ランタイムの再現性ランタイム固有の挙動を細かく公開できるACPとランタイム実装が公開する範囲に限られる
移植性ランタイムごとに新しいアダプターが必要ブリッジを再利用し、小さなランタイムプロファイルだけを書く

Vercelは使い分けを明確にしています。Claude CodeとCodexには@ai-sdk/harness-claude-codeまたは@ai-sdk/harness-codexを使います。互換パッケージはあるものの専用アダプターがないハーネスには、@ai-sdk/harness-acpを選びます。

コーディングエージェント統合で重要な理由

変わるのは、統合にかかる作業量です。

devtoolsチームは、別のACPランタイムをHarnessAgentの背後に置くたびに、セッション管理、イベント変換、承認処理、ホストツールの中継、ライフサイクル制御を一から作り直す必要がなくなります。実装するのはランタイムプロファイルで、アプリケーションの残りの部分では同じハーネスAPIを使い続けられます。

プロダクト層もランタイムの差分から守られます。HarnessAgent.generate()HarnessAgent.stream()は、どちらもAI SDK互換の結果を返します。すでにuseChatを使っているチームなら、背後のワーカーを変更してもインターフェースのフローを維持できます。

ただし、このリリースによってハーネスが高速、安価、高性能になるわけではありません。ACP実装の挙動が統一されるわけでも、Sandboxが不要になるわけでもありません。どのACPハーネスにも、少なくとも1つのポートを公開したネットワークSandboxが必要です。

Claude Code、Codex、その他のコーディングエージェントを直接使うだけなら、ほとんど影響はありません。この機能が対象にしているのは、それらのエージェントを組み込んだプロダクトを開発する側です。

すぐに活用できるのは誰か

AI SDK対応を追加したい開発者ツール企業の創業者

自社でコーディングハーネスを提供し、すでにACP互換のNPMパッケージを公開しているとします。createACPプロファイルを1つ定義すれば、AI SDKユーザーがそのランタイムを利用するための正式な経路を用意できます。

利点は配布のしやすさです。パッケージ固有のインストール、認証、指示、権限は自社チームが保守し、その周囲にある共通処理はVercelのアダプターに任せられます。

複数のランタイムを支えるプラットフォームエンジニア

中規模のエンジニアリングプラットフォームでは、リポジトリ修復には1つのエージェント、移行作業には別のエージェント、社内固有の自動化には内製ハーネスを使いたい場合があります。プラットフォームエンジニアはセッションと結果の契約を1つに保ち、ジョブごとに異なるハーネスプロファイルを選べます。

ランタイム間の挙動の違いが消えるわけではありません。その違いを名前付きプロファイルへ移すことで、別々のオーケストレーション基盤を管理するよりレビューしやすくなります。

既存のAI SDKインターフェースを持つSaaSチーム

既存のAI SDKアプリケーションなら、チャット画面を作り直さずに、ACP経由のコーディングワーカーを追加できます。具体的な変更はサーバー側で行います。ハーネスプロファイルを作成し、Sandboxを接続してセッションを開始し、UIがすでに扱っているものと同じ形式のストリーミング結果または生成結果を返します。

プロダクトへの組み込みではなく、どのエージェントを選ぶかを検討している段階なら、まずコーディングエージェントの比較をご覧ください。このアダプターが意味を持つのは、その選定を終えた後です。

境界を設計するセキュリティエンジニア

セキュリティエンジニアにとっては、明確な制御点が得られます。認証情報をブローカー経由にすれば、Sandbox内のACPプロセスにはプレースホルダーだけを見せ、外向きのリクエストへ実値を追加できます。権限モードはランタイムが実際に対応するモードへマッピングでき、未対応の選択肢にはnullを設定できます。これにより、アクセス範囲が暗黙に広がるのではなく、処理を失敗させられます。

それだけで安全が自動的に保証されるわけではありません。安全ルールを記述し、テストする場所が明確になるということです。

導入までの流れ

  1. ランタイムが本当にACPを実装しているか確認する

    ACP互換の実装を提供するNPMパッケージと、起動する実行ファイルが明確になっている必要があります。ハーネスがACPに対応すると説明していても、その実装をパッケージとして提供していなければ不十分です。

  2. ランタイムプロファイルを書く

    安定したharnessId、パッケージのソース、実行ファイル、認証情報以外の環境値、認証情報のブローカー処理、指示のマッピング、ランタイムが対応するすべての権限モードをcreateACPへ渡します。

  3. ネットワークSandboxを接続する

    少なくとも1つのポートを公開します。Vercel Sandboxのドキュメント例ではNode 24とポート4000を使っており、明示的に変更しない限り、アダプターは最初に公開されたポートを選びます。

  4. ライフサイクルと拒否動作をテストする

    セッションを作成してタスクを1つ実行し、finallyでセッションを破棄します。統合完了と判断する前に、各権限モード、ポート不足、認証情報不足、ホストツール一覧の変更もテストします。

ドキュメントに沿った完全な実装例

ハーネス、ACPアダプター、Vercel Sandboxの各パッケージをインストールします。

Bash
pnpm add @ai-sdk/harness @ai-sdk/harness-acp @ai-sdk/sandbox-vercel

簡潔でありながら必要事項を省かないデモには、Vercelが公開している完全なCodex ACPプロファイルが適しています。パッケージのインストール、直接認証、AI Gatewayの設定、指示、権限を1か所で確認できるからです。ただし、これは配線を示す例であり、CodexでACPを選ぶことを推奨するものではありません。実際にCodexを統合する場合、Vercelは専用のCodexアダプターを推奨しています。

以下のコードは、現在ドキュメントに掲載されているプロファイルと呼び出しフローです。直接認証にはCODEX_API_KEYまたはOPENAI_API_KEYのいずれかを用意します。AI_GATEWAY_API_KEYまたはVERCEL_OIDC_TOKENがあれば、デフォルトのauth: 'auto'経路でAI Gatewayが選ばれます。

TypeScript
import { createACP, type ACPPermissionModeMapping } from '@ai-sdk/harness-acp';
import { createCredentialRequestTransformation } from '@ai-sdk/harness/utils';
import { secureJsonParse } from '@ai-sdk/provider-utils';

export const codexACPHarness = createACP({
  harnessId: 'acp-codex',
  // Define the runtime's built-in tool names and input schemas to expose
  // provider-executed calls as typed HarnessAgent tools.
  // builtinTools: { ... },
  source: {
    type: 'npm-simple',
    packageName: '@agentclientprotocol/codex-acp',
    packageVersion: '1.1.4',
  },
  executable: 'codex-acp',
  forwardEnv: ['CODEX_CONFIG'],
  credentialEnv: ['CODEX_API_KEY', 'OPENAI_API_KEY'],
  credentialBrokering: ({ env }) => {
    const credential = env.CODEX_API_KEY ?? env.OPENAI_API_KEY;
    if (!credential) return [];
    const config =
      env.CODEX_CONFIG == null
        ? undefined
        : (secureJsonParse(env.CODEX_CONFIG) as {
            model_provider?: string;
            model_providers?: Record<string, { base_url?: string }>;
          });
    const baseUrl =
      config?.model_providers?.[config.model_provider ?? '']?.base_url ??
      'https://api.openai.com/v1';
    return [
      createCredentialRequestTransformation({
        baseUrl,
        headers: { Authorization: `Bearer ${credential}` },
      }),
    ];
  },
  instructionMapping: {
    type: 'launch-env-json',
    variable: 'CODEX_CONFIG',
    path: ['developer_instructions'],
  },
  permissionModeMapping: {
    'allow-reads': null,
    'allow-edits': null,
    'allow-all': { type: 'session-mode', modeId: 'agent-full-access' },
  } as const satisfies ACPPermissionModeMapping,
  authentication: {
    methodId: 'api-key',
  },
  providerAuthentication: {
    gateway: {
      env: {
        CODEX_API_KEY: { $source: 'gateway-api-key' },
        CODEX_CONFIG: {
          model: 'openai/gpt-5.6-sol',
          model_provider: 'ai_gateway',
          model_providers: {
            ai_gateway: {
              name: 'AI Gateway',
              base_url: {
                $source: 'gateway-base-url',
                ensureSuffix: '/v1',
              },
              env_key: 'CODEX_API_KEY',
              wire_api: 'responses',
              supports_websockets: false,
              http_headers: {
                'User-Agent': { $source: 'client-app' },
                'x-client-app': { $source: 'client-app' },
              },
            },
          },
          model_supports_reasoning_summaries: true,
          preferred_auth_method: 'apikey',
        },
      },
    },
  },
});

よくある誤解は、ランタイムプロファイルを「パッケージ名とAPIキーだけ」と考えることです。権限のマッピング、指示のマッピング、Sandboxのポート、認証情報の境界、セッションのクリーンアップまで含めて統合となります。

制約も直視する

ハーネス関連のパッケージは実験的な段階にあります。リリース間で破壊的変更が起こると想定されているため、本番環境で静かに追従させてよい依存関係ではありません。

パッケージのバージョン固定は明示的に判断する必要があります。simple sourceでは、例の@agentclientprotocol/codex-acp1.1.4にしているように、正確なバージョンを固定できます。バージョンを省略すると、Sandboxはパッケージのlatestタグをインストールし、そのバージョンはハーネスの識別情報に含まれません。再現可能なビルドが必要なら、package.jsonpnpm-lock.yamlを含むlocked sourceを使います。Vercelはpnpm install --frozen-lockfileでインストールします。

ACP version 1には、次のような実質的な制約もあります。

  • モデルのステップ境界やステップごとの使用量は公開されません。アダプターが境界を推定し、ステップごとの使用量は不明のままです。
  • 移植可能な手動コンテキスト圧縮APIや、ターン途中のステアリングAPIはありません。
  • ハーネス内蔵ツールを移植可能な形で絞り込めません。ホストツールのフィルタリングは機能しますが、ACP内蔵ツールを絞り込もうとするとエラーになります。
  • ホストツール一覧が変わった場合、ACP実装側でMCPツールリストを更新する必要があります。古い一覧を保持した実装は明示的に失敗します。

今回のリリースに関して確認したVercelのページには、@ai-sdk/harness-acp単体の価格は記載されていません。だからといって「無料のエージェント」と捉えるべきではありません。この構成にはモデル認証の経路と必須のネットワークSandboxが含まれるため、既存のランタイムコストと管理ルールは引き続き適用されます。

さらに根本的な制約は、ランタイム固有の挙動をどこまで保てるかです。ACPは共通の接続手段を提供しますが、専用アダプターのほうがハーネス本来の挙動をより忠実に公開できます。標準化によって統合作業は減りますが、その下で動くランタイムの違いまでは消えません。

いま取るべき選択

判断基準はシンプルです。

専用のAI SDKアダプターがないACP互換ハーネスを提供している場合、または複数の該当ランタイムを1つのアプリケーション契約の背後で動かしたいプラットフォームチームなら、今週着手する価値があります。薄いプロファイルを作り、パッケージのバージョンを固定し、すべての権限と失敗経路をテストしてください。

実験的なパッケージを本番ポリシーで許容できない場合、正確なステップごとの使用量が必要な場合、または手動コンテキスト圧縮とターン途中のステアリングが中核的な制御要件なら、導入を待つべきです。

Claude CodeまたはCodexを使う場合は、専用アダプターを使い続けてください。Vercelが推奨する経路がすでにあり、プロトコル境界によって失われる挙動も少なくて済みます。

モデルを直接呼び出すだけ、コーディングエージェントをエンドユーザーとして使うだけ、あるいは自社アプリケーション内でハーネスを動かす必要がない場合、この変更の影響はありません。

チームのプロダクト開発を変えるツールについて、平易な解説を今後も読みたい方は、ニュースレターにご登録ください

最終更新
2026年9月3日
カテゴリー
Explained

Googleでこのサイトを優先する

omidsaffari.comをGoogle検索の優先ソースに追加

omidsaffari.comを優先ソースに設定すると、GoogleがTop Stories・AI Overviews・AI Modeであなたのために優先表示します。

AI 文字起こしの料金は据え置き:Grok Voice Transcribe 2.0移行ガイド

AI 文字起こしの料金は据え置き:Grok Voice Transcribe 2.0移行ガイド

Grok Voice Transcribe 2.0のAI 文字起こし料金は、バッチが音声1時間あたり$0.10、ストリーミングが$0.20のままです。デフォルトモデル変更で起こり得る出力差、移行前に確認すべき総コスト、1.0と2.0を同条件で検証して本番モデルを固定する手順を、運用担当者向けに整理します。2026年9月20日Explained
HAR ファイルで原因を追う:Cloudflare Browser Runの失敗調査

HAR ファイルで原因を追う:Cloudflare Browser Runの失敗調査

Cloudflare Browser RunのSession RecordingにInspectパネルが加わり、完了後のログ、通信、最終DOMを確認できるようになりました。HAR ファイルで失敗原因を絞り込み、不要な再実行を減らす手順、料金への影響、録画では見えない領域まで、実務向けに分かりやすく解説します。2026年9月19日Explained
v0でnpm プライベートパッケージを活用する:社内コンポーネント再利用の実践ガイド

v0でnpm プライベートパッケージを活用する:社内コンポーネント再利用の実践ガイド

v0が共有環境変数経由でnpm プライベートパッケージに対応。NPM_TOKENとNPM_RCの選び方、認証情報をモデルやSandboxに渡さない仕組み、社内コンポーネントを試作から本番へ引き継ぐ設定手順、料金と実務上の注意点を整理し、差し替え工数を減らせるか判断する方法を解説します。2026年9月19日Explained
Claude Code 料金を見直す:auto modeの分類器課金が消える条件

Claude Code 料金を見直す:auto modeの分類器課金が消える条件

Claude Code 2.1.278では、auto modeの安全判定をサーバー側で処理できるセッションの分類器リクエスト課金がなくなります。API、Enterprise、クラウド、ゲートウェイ環境で適用条件を見極め、/statusで実際の課金経路を確認し、予算へ正しく反映する方法を解説します。2026年9月19日Explained
Vercel ビルド高速化:Turboを1回だけ使う方法と料金

Vercel ビルド高速化:Turboを1回だけ使う方法と料金

VercelのPro/Enterpriseで、プロジェクト設定を変えずに1回のデプロイだけTurboを指定する方法を解説します。GitHubのコミットマーカー、Vercel CLI、デプロイAPIという3つの経路と、1分あたり$0.105からの料金、権限不足時のフォールバック、通常ビルドとの比較手順まで整理しました。2026年9月18日Explained
ChatGPT Word連携の実力:できること・料金・導入手順

ChatGPT Word連携の実力:できること・料金・導入手順

ChatGPT Word連携を使えば、Wordのサイドバーで下書き、要約、選択範囲の修正、見出し調整まで完結します。利用条件、共有される使用量、料金の考え方、データ境界、導入手順を、提案書やSOPの具体例とともに解説。コピペ往復を減らしつつ、事実や約束を守るレビュー方法も紹介します。2026年9月18日Explained
Google Antigravity移行ガイド:10月5日までのローカルジョブ対応

Google Antigravity移行ガイド:10月5日までのローカルジョブ対応

Google Antigravityの5月版エージェントは2026年10月5日に停止予定です。出力のみのジョブはID変更で済みますが、ローカルツールやfunction_callを扱う環境には、新しいツール名、PascalCase引数、行範囲編集に対応するアダプター改修が必要です。安全な移行手順を解説します。2026年9月18日Explained
Cloudflare WorkersのRPCトレースで遅延箇所を特定する

Cloudflare WorkersのRPCトレースで遅延箇所を特定する

Cloudflare WorkersのRPCトレースで、遅い顧客リクエストを別のWorkerやDurable Objectまで追跡。担当サービスとメソッドを見つける手順、サンプリング率、保持期間、2026年10月1日以降のスパン単位の料金まで、チェックアウトの例で実践的に解説します。2026年9月17日Explained
ニュースレター

毎週日曜、一通の手紙。動くシステムの話。感想戦ではなく。

週刊。スパムなし。いつでも解除できます。