AdCP エージェントの呼び出し
このページは正準なバイヤー側のワイヤーコントラクトです: どの単一タスクスキーマにもきれいに収まらないが、あなたが行うすべての変更呼び出しに適用されるルール。バイヤー(DSP、プランニングツール、エージェンティッククライアント)を構築し、AdCP のセールス、クリエイティブ、シグナル、ガバナンス、SI、ブランドエージェントを呼び出すなら、これを一度読んでください。 このコンテンツのエージェント向けバージョンはskills/call-adcp-agent/SKILL.md にあります — SDK がコーディングエージェントに出荷できるよう プロトコル tarball にバンドルされています。
Discovery chain
任意の新しいエージェントとの最初の接触では、これらを順にたどります:- Agent card(A2A)または
tools/list(MCP): ツール名を返す。AdCP MCP サーバーはtools/listでツールごとのパラメータースキーマをもはや公開しません — すべてのツールは{type: 'object', properties: {}}を示す。そこから形状を推論しようとしないでください。 get_adcp_capabilities: サポートするプロトコル、AdCP メジャーバージョン、機能フラグを返す。このエージェントがどのツールをサポートするかを教えますが、それらをどう呼ぶかは教えません。get_adcp_capabilitiesを参照。get_schema(tool_name)(エージェントがそれを公開するとき — 標準化保留中、#3057 を参照): 特定のツールのリクエスト/レスポンスの JSON Schema を返す。- バンドルされたスキーマ(オフライン、権威的): すべての公開された AdCP バージョンは、すべてのツールの JSON Schema を Sigstore 経由で署名して出荷します。パスは SDK によって異なります — 仕様リポジトリソースは
dist/schemas/<version>/bundled/を使い、@adcp/sdkはnpm run sync-schemasの後にそれらをschemas/cache/<version>/bundled/に置き、Python と Go の SDK は独自の慣例を使います。パスをハードコードせず、SDK のローダーに見つけさせてください。いったん見つかれば、各スキーマは<protocol>/<tool>-{request,response}.jsonにあります。
Idempotency: replay vs. new operation
すべての変更ツールはidempotency_key(UUID)を必要とします。
- リトライで同じキー → サーバーは同じレスポンスをバイト単位でリプレイする。トランスポートレベルのリトライ(タイムアウト、5xx、切断された接続)にこれを使う。
- 新しいキー → ボディにかかわらず新しい操作。前回の試行が失敗したという理由で新しい UUID を生成することは、素朴な呼び出し元が重複したメディアバイを作る最も一般的な方法です。
- 同じキー、異なる正準ボディ →
IDEMPOTENCY_CONFLICT。セラーは拒否しなければならない(MUST)(security.mdx#冪等性 のルール 5) — 2 番目のボディを黙って適用せず、最初のレスポンスを黙ってリプレイしないでください。 - 最初のリクエストがまだ実行中に同じキー →
IDEMPOTENCY_IN_FLIGHT(security.mdx#冪等性 のルール 9)。セラーはブロックする代わりにerror.details.retry_after付きでこのコードを返してもよい(MAY)。同じキーで待って再試行する — このコードで新しいキーを鋳造すると、安全なリトライが二重実行レースになります。
task_id を運ぶため、フォークするのではなく同じタスクに対してポーリングが続きます。
idempotency_key は次で必須です: create_media_buy、update_media_buy、sync_creatives、sync_audiences、sync_accounts、sync_catalogs、sync_event_sources、sync_plans、sync_governance、activate_signal、acquire_rights、log_event、report_usage、provide_performance_feedback、report_plan_outcome、create_property_list、update_property_list、delete_property_list、create_collection_list、update_collection_list、delete_collection_list、create_content_standards、update_content_standards、calibrate_content、si_initiate_session、si_send_message。
キーの欠落 → issues に /idempotency_key を伴う adcp_error.code: 'VALIDATION_ERROR'。
account is oneOf — pick exactly one variant
account は判別共用体です。create_media_buy と update_media_buy では 2 つのバリアント:
additionalProperties: false は、{account_id, brand} が両方で失敗することを意味します。
タスクスキーマが account を必須とするとき、SDK が認証済み認証情報で利用可能な唯一のアカウントを自動選択していても、明示的な AccountRef を送ってください。隠れた認証情報由来のデフォルト化はプロトコルモデルではありません。タスクが account を任意とマークするとき、省略はそのタスクが文書化したセマンティクスのみを持ちます。
他のツール(例: sync_creatives)はスーパーセットを受け入れることがあります — 常に特定のツールのスキーマを確認してください。
Async responses: status: 'submitted' means queued
変更ツールは 3 つの形状の 1 つを返せます:
task_id、ステータス値、webhook ペイロード、ポーリング/再照合サーフェスを置き換えません。トランスポートタスクは、ペイロードがまだ status: 'submitted' と言う AdCP レスポンスを配信した後に完了できます。
status: 'submitted' を見たとき、作業は完了していません。3.x では、返された task_id を使ってレガシー AdCP tasks/get サーフェス経由でポーリングします。セラーは衝突しない get_task_status エイリアスもアドバタイズしてもよく(MAY)、呼び出し元はそれがディスカバリーに現れたときそのエイリアスを使ってもよい(MAY)。両方の AdCP ポーリング名は、マルチアカウント認証情報用の任意の account スコープを含め、同じ snake_case ペイロード形状を使います。どちらの AdCP ポーリング形状も、トランスポート独自のタスクワイヤー形状を使うトランスポートネイティブの MCP/A2A tasks/get と混同しないでください。
ポーリング時に include_result: true を渡すと、ステータスが completed に遷移したときにセラーが完了ペイロードを含めます:
result フィールドは、完了タスクのプッシュ通知 webhook の result フィールドと同じペイロード構造を使います — ポーリングと webhook の両方を設定するバイヤーは、どちらの経路でも同じデータ形状を受け取ります。
Error recovery — read issues[]
すべての検証失敗は、次のような形状のエンベロープを生成します:
issues[].pointer— 問題のあるフィールドへの RFC 6901 JSON Pointerissues[].keyword— Ajv キーワード(required、type、oneOf、anyOf、additionalProperties、format、enum)issues[].variants—keywordがoneOfまたはanyOfのとき、各エントリが 1 つのバリアントのrequired+ 宣言されたpropertiesをリストする
oneOf 失敗については、variants[] から 1 つのバリアントを選び、その required フィールドのみを送ってください。 これは、フィールドが共用体だと知らなかったときの最速のリカバリーパスです。
recovery 値:
correctable— バイヤー側の修正。issues[]を読み、ポインターをパッチし、再送するtransient— 同じidempotency_keyでリトライするterminal— 人間の対応が必要(アカウント停止、支払い必要)。リトライしない
Common shape pitfalls
Transport notes
- MCP:
{ name: 'tool_name', arguments: {...} }を伴うtools/call。型付きレスポンスはstructuredContentを読む。 - A2A:
{ skill: 'tool_name', input: {...} }の形状のDataPartを伴うmessage/send。型付きレスポンスはtask.artifacts[0].parts[0].dataにある。
Task.state: 'completed' は AdCP の完了と同じではありません。 A2A タスク状態はトランスポート呼び出しのライフサイクルを記述します。AdCP レベルの完了はアーティファクトのペイロード(structuredContent.status または data.status)にあります。completed の A2A タスクでも submitted の AdCP レスポンスを運べます。
Related
- タスクごとのリクエスト/レスポンス形状: プロトコル固有のリファレンス(
/docs/media-buy/、/docs/creative/、/docs/signals/など)を参照。 - プロトコルアーキテクチャ — プロトコルドメインがどう組み合わさるか。
- 必須タスク — 専門分野を主張するためにエージェントが実装しなければならないタスク。
get_adcp_capabilities— 任意の新しいエージェントに対する最初の呼び出し。- Schemas — SDK がプロトコル tarball(現在
skills/をバンドル)をどう消費するか。 - Build a caller — 呼び出し元側のビルド形式ガイド: インストール、呼び出し、レスポンス処理、レポート取り込み。