Skip to main content

AdCP エージェントの呼び出し

このページは正準なバイヤー側のワイヤーコントラクトです: どの単一タスクスキーマにもきれいに収まらないが、あなたが行うすべての変更呼び出しに適用されるルール。バイヤー(DSP、プランニングツール、エージェンティッククライアント)を構築し、AdCP のセールス、クリエイティブ、シグナル、ガバナンス、SI、ブランドエージェントを呼び出すなら、これを一度読んでください。 このコンテンツのエージェント向けバージョンは skills/call-adcp-agent/SKILL.md にあります — SDK がコーディングエージェントに出荷できるよう プロトコル tarball にバンドルされています。

Discovery chain

任意の新しいエージェントとの最初の接触では、これらを順にたどります:
  1. Agent card(A2A)または tools/list(MCP): ツールを返す。AdCP MCP サーバーは tools/list でツールごとのパラメータースキーマをもはや公開しません — すべてのツールは {type: 'object', properties: {}} を示す。そこから形状を推論しようとしないでください。
  2. get_adcp_capabilities: サポートするプロトコル、AdCP メジャーバージョン、機能フラグを返す。このエージェントがどのツールをサポートするかを教えますが、それらをどう呼ぶかは教えません。get_adcp_capabilities を参照。
  3. get_schema(tool_name) (エージェントがそれを公開するとき — 標準化保留中、#3057 を参照): 特定のツールのリクエスト/レスポンスの JSON Schema を返す。
  4. バンドルされたスキーマ(オフライン、権威的): すべての公開された AdCP バージョンは、すべてのツールの JSON Schema を Sigstore 経由で署名して出荷します。パスは SDK によって異なります — 仕様リポジトリソースは dist/schemas/<version>/bundled/ を使い、@adcp/sdknpm 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_FLIGHTsecurity.mdx#冪等性 のルール 9)。セラーはブロックする代わりに error.details.retry_after 付きでこのコードを返してもよい(MAY)。同じキーで待って再試行する — このコードで新しいキーを鋳造すると、安全なリトライが二重実行レースになります。
非同期フローでは、リプレイされたレスポンスは同じ task_id を運ぶため、フォークするのではなく同じタスクに対してポーリングが続きます。 idempotency_key は次で必須です: create_media_buyupdate_media_buysync_creativessync_audiencessync_accountssync_catalogssync_event_sourcessync_planssync_governanceactivate_signalacquire_rightslog_eventreport_usageprovide_performance_feedbackreport_plan_outcomecreate_property_listupdate_property_listdelete_property_listcreate_collection_listupdate_collection_listdelete_collection_listcreate_content_standardsupdate_content_standardscalibrate_contentsi_initiate_sessionsi_send_message キーの欠落 → issues/idempotency_key を伴う adcp_error.code: 'VALIDATION_ERROR'

account is oneOf — pick exactly one variant

account は判別共用体です。create_media_buyupdate_media_buy では 2 つのバリアント:
バリアントをまたいで必須フィールドをマージしないでください。 各バリアントの additionalProperties: false は、{account_id, brand}両方で失敗することを意味します。 タスクスキーマが account を必須とするとき、SDK が認証済み認証情報で利用可能な唯一のアカウントを自動選択していても、明示的な AccountRef を送ってください。隠れた認証情報由来のデフォルト化はプロトコルモデルではありません。タスクが account を任意とマークするとき、省略はそのタスクが文書化したセマンティクスのみを持ちます。 他のツール(例: sync_creatives)はスーパーセットを受け入れることがあります — 常に特定のツールのスキーマを確認してください。

Async responses: status: 'submitted' means queued

変更ツールは 3 つの形状の 1 つを返せます:
AdCP タスク状態はアプリケーション層のコントラクトです。MCP と A2A は AdCP レスポンスをラップ、ストリーム、またはトランスポートできますが、それらのネイティブなタスクメカニズムは AdCP の 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 Pointer
  • issues[].keyword — Ajv キーワード(requiredtypeoneOfanyOfadditionalPropertiesformatenum
  • issues[].variantskeywordoneOf または 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 にある。
両トランスポートは冪等性、エラー形状、スキーマ強制、ハンドラーセマンティクスを共有します。ある呼び出しが一方で機能するなら、同等の呼び出しは他方でも機能します。 よくある罠: A2A の Task.state: 'completed' は AdCP の完了と同じではありません。 A2A タスク状態はトランスポート呼び出しのライフサイクルを記述します。AdCP レベルの完了はアーティファクトのペイロード(structuredContent.status または data.status)にあります。completed の A2A タスクでも submitted の AdCP レスポンスを運べます。
  • タスクごとのリクエスト/レスポンス形状: プロトコル固有のリファレンス(/docs/media-buy//docs/creative//docs/signals/ など)を参照。
  • プロトコルアーキテクチャ — プロトコルドメインがどう組み合わさるか。
  • 必須タスク — 専門分野を主張するためにエージェントが実装しなければならないタスク。
  • get_adcp_capabilities — 任意の新しいエージェントに対する最初の呼び出し。
  • Schemas — SDK がプロトコル tarball(現在 skills/ をバンドル)をどう消費するか。
  • Build a caller — 呼び出し元側のビルド形式ガイド: インストール、呼び出し、レスポンス処理、レポート取り込み。