Skip to main content
タスク: シグナルの説明に基づき、配信先情報付きで発見する。 応答時間: 約 60 秒(バックエンド推論/RAG) Request Schema: https://adcontextprotocol.org/schemas/v2/signals/get-signals-request.json Response Schema: https://adcontextprotocol.org/schemas/v2/signals/get-signals-response.json get_signals はシグナルのメタデータと、プラットフォーム横断のリアルタイム配信状況を返し、利用可能性の把握と有効化のガイドに役立ちます。

リクエストパラメーター

ParameterTypeRequiredDescription
signal_specstringYes目的のシグナルを自然言語で記述
deliver_toDeliverToYesシグナルを有効化したい配信先(下記 Deliver To 参照)
filtersFiltersNo結果を絞り込むフィルター(下記 Filters 参照)
max_resultsnumberNo返却する最大件数

Deliver To オブジェクト

ParameterTypeRequiredDescription
deploymentsDestination[]Yes配信ターゲット(DSP、営業エージェントなど)の配列。Destination を参照
countriesstring[]Yesシグナルを使用する国 (ISO 3166-1 alpha-2、推奨は大文字)

Destination オブジェクト

配信ターゲットは type でプラットフォーム型とエージェント型を判別します。
ParameterTypeRequiredDescription
typestringYes判別子。DSP は “platform”、営業エージェントは “agent”
platformstringConditional*プラットフォーム ID(例: ‘the-trade-desk’, ‘amazon-dsp’)。type=“platform” の場合必須
agent_urlstring (URI)Conditional*営業エージェントを特定する URL。type=“agent” の場合必須
accountstringNoプラットフォーム/エージェント上のアカウント ID
*type="platform" のとき platform 必須、type="agent" のとき agent_url 必須。 Activation Keys: 認証済み呼び出し元がリクエスト内の配信先にアクセスできる場合、その配信先で is_live: true ならレスポンスに activation_key が含まれます。 権限モデル: シグナルエージェントは呼び出し元の認証/認可に基づいてキーを付与します。
  • 営業エージェントは自分の agent_url に一致する配信先のキーを受け取る
  • 複数 DSP 資格を持つバイヤーは、保有するプラットフォームすべてのキーを受け取る
  • アクセス判定はシグナルエージェント側の権限管理によります(リクエストのフラグでは決まらない)

Filters オブジェクト

ParameterTypeRequiredDescription
catalog_typesstring[]Noカタログ種別でフィルター (“marketplace”, “custom”, “owned”)
data_providersstring[]No特定のデータプロバイダーに限定
max_cpmnumberNo最大 CPM を指定
min_coverage_percentagenumberNo最小カバレッジを指定

レスポンス構造

すべての AdCP レスポンスは次を含みます:
  • message: 処理結果の要約
  • context_id: フォローアップ用のセッション識別子
  • data: タスク固有ペイロード(下記 Response Data)
構造はプロトコル間で共通で、ラッパーだけが異なります。
  • MCP: フラットな JSON を返す
  • A2A: テキスト部に message、データ部に data を格納したアーティファクトとして返す

Response Data

{
  "signals": [
    {
      "signal_agent_segment_id": "string",
      "name": "string",
      "description": "string",
      "signal_type": "string",
      "data_provider": "string",
      "coverage_percentage": "number",
      "deployments": [
        {
          "type": "agent",
          "agent_url": "string",
          "account": "string",
          "is_live": "boolean",
          "activation_key": {
            "type": "segment_id",
            "segment_id": "string"
          },
          "estimated_activation_duration_minutes": "number"
        }
      ],
      "pricing": {
        "cpm": "number",
        "currency": "string"
      }
    }
  ]
}

フィールド説明

  • signals: 該当するシグナルの配列
    • signal_agent_segment_id: シグナルの一意 ID
    • name: 人が読めるシグナル名
    • description: 詳細説明
    • signal_type: シグナル種別(marketplace, custom, owned)
    • data_provider: データプロバイダー名
    • coverage_percentage: オーディエンスカバレッジ(%)
    • deployments: 配信先の配列
      • agent_url: 配信先エージェント URL
      • account: 該当アカウント(あれば)
      • is_live: その配信先で現在有効か
      • activation_key: ターゲティング用キー(下記 Activation Key 参照)。is_live=true かつリクエストで requester=true の配信先に対してのみ含まれる
      • estimated_activation_duration_minutes: 未有効時の想定有効化時間
    • pricing: 価格情報
      • cpm: 1,000 インプレッション単価
      • currency: 通貨コード

Activation Key オブジェクト

配信先でシグナルを利用するための情報。セグメント ID 形式またはキーバリュー形式を取ります。 Segment ID 形式:
{
  "type": "segment_id",
  "segment_id": "ttd_segment_12345"
}
Key-Value 形式:
{
  "type": "key_value",
  "key": "audience_segment",
  "value": "luxury_auto_intenders"
}

プロトコル別の例

AdCP のペイロードはプロトコル間で共通で、リクエスト/レスポンスのラッパーのみ異なります。

MCP リクエスト - 営業エージェントがシグナルを問い合わせる

認証済み呼び出し元が wonderstruck.salesagents.com のため、レスポンスにアクティベーションキーが含まれます。
{
  "tool": "get_signals",
  "arguments": {
    "signal_spec": "High-income households interested in luxury goods",
    "deliver_to": {
      "deployments": [
        {
          "type": "agent",
          "agent_url": "https://wonderstruck.salesagents.com"
        }
      ],
      "countries": ["US"]
    },
    "filters": {
      "max_cpm": 5.0,
      "catalog_types": ["marketplace"]
    },
    "max_results": 5
  }
}

MCP レスポンス - Activation Key 付き

認証済み呼び出し元が配信先に一致するため、レスポンスにキーが含まれます。
{
  "message": "Found 1 luxury segment matching your criteria. Already activated for your sales agent.",
  "context_id": "ctx-signals-123",
  "signals": [
    {
      "signal_agent_segment_id": "luxury_auto_intenders",
      "name": "Luxury Automotive Intenders",
      "description": "High-income individuals researching luxury vehicles",
      "signal_type": "marketplace",
      "data_provider": "Experian",
      "coverage_percentage": 12,
      "deployments": [
        {
          "type": "agent",
          "agent_url": "https://wonderstruck.salesagents.com",
          "is_live": true,
          "activation_key": {
            "type": "key_value",
            "key": "audience_segment",
            "value": "luxury_auto_intenders_v2"
          }
        }
      ],
      "pricing": {
        "cpm": 3.50,
        "currency": "USD"
      }
    }
  ]
}

MCP リクエスト - バイヤーが複数 DSP を確認

複数 DSP での利用可否を確認するバイヤーの例:
{
  "tool": "get_signals",
  "arguments": {
    "signal_spec": "High-income households interested in luxury goods",
    "deliver_to": {
      "deployments": [
        {
          "type": "platform",
          "platform": "the-trade-desk",
          "account": "agency-123"
        },
        {
          "type": "platform",
          "platform": "amazon-dsp"
        }
      ],
      "countries": ["US"]
    },
    "filters": {
      "max_cpm": 5.0,
      "catalog_types": ["marketplace"]
    },
    "max_results": 5
  }
}

MCP レスポンス - マルチプラットフォームアクセスを持つバイヤー

The Trade Desk と Amazon DSP の資格を持つバイヤーは両方のキーを受け取ります。
{
  "message": "Found 1 luxury segment matching your criteria. Already activated on The Trade Desk, pending activation on Amazon DSP.",
  "context_id": "ctx-signals-123",
  "signals": [
    {
      "signal_agent_segment_id": "luxury_auto_intenders",
      "name": "Luxury Automotive Intenders",
      "description": "High-income individuals researching luxury vehicles",
      "signal_type": "marketplace",
      "data_provider": "Experian",
      "coverage_percentage": 12,
      "deployments": [
        {
          "type": "platform",
          "platform": "the-trade-desk",
          "account": "agency-123",
          "is_live": true,
          "activation_key": {
            "type": "segment_id",
            "segment_id": "ttd_agency123_exp_lux_auto"
          }
        },
        {
          "type": "platform",
          "platform": "amazon-dsp",
          "is_live": false,
          "estimated_activation_duration_minutes": 60
        }
      ],
      "pricing": {
        "cpm": 3.50,
        "currency": "USD"
      }
    }
  ]
}

A2A リクエスト

自然言語での呼び出し

await a2a.send({
  message: {
    parts: [{
      kind: "text",
      text: "Find me signals for high-income households interested in luxury goods that can be deployed on The Trade Desk and Amazon DSP in the US, with a maximum CPM of $5.00."
    }]
  }
});

明示的なスキル呼び出し

await a2a.send({
  message: {
    parts: [{
      kind: "data",
      data: {
        skill: "get_signals",
        parameters: {
          signal_spec: "High-income households interested in luxury goods",
          deliver_to: {
            deployments: [
              {
                type: "agent",
                agent_url: "https://thetradedesk.com",
                account: "agency-123"
              },
              {
                type: "agent",
                agent_url: "https://advertising.amazon.com/dsp"
              }
            ],
            countries: ["US"]
          },
          filters: {
            max_cpm: 5.0,
            catalog_types: ["marketplace"]
          },
          max_results: 5
        }
      }
    }]
  }
});

シナリオ

すべてのプラットフォームを探索

{
  "signal_spec": "Contextual segments for luxury automotive content",
  "deliver_to": {
    "platforms": "all",
    "countries": ["US"]
  },
  "filters": {
    "data_providers": ["Peer39"],
    "catalog_types": ["marketplace"]
  }
}

レスポンス

Message: “Found luxury automotive contextual segment from Peer39 with 15% coverage. Live on Index Exchange and OpenX, pending activation on Pubmatic.” Payload:
{
  "signals": [{
    "signal_agent_segment_id": "peer39_luxury_auto",
    "name": "Luxury Automotive Context",
    "description": "Pages with luxury automotive content and high viewability",
    "signal_type": "marketplace",
    "data_provider": "Peer39",
    "coverage_percentage": 15,
    "deployments": [
      {
        "type": "platform",
        "platform": "index-exchange",
        "account": "agency-123-ix",
        "is_live": true,
        "scope": "account-specific",
        "decisioning_platform_segment_id": "ix_agency123_peer39_lux_auto"
      },
      {
        "type": "platform",
        "platform": "index-exchange",
        "account": null,
        "is_live": true,
        "scope": "platform-wide",
        "decisioning_platform_segment_id": "ix_peer39_luxury_auto_gen"
      },
      {
        "type": "platform",
        "platform": "openx",
        "account": null,
        "is_live": true,
        "scope": "platform-wide",
        "decisioning_platform_segment_id": "ox_peer39_lux_auto_456"
      },
      {
        "type": "platform",
        "platform": "pubmatic",
        "account": "brand-456-pm",
        "is_live": false,
        "scope": "account-specific",
        "estimated_activation_duration_minutes": 60
      }
    ],
    "pricing": {
      "cpm": 2.50,
      "currency": "USD"
    }
  }]
}

レスポンスフィールド

  • context_id (string): セッション継続用の ID
  • signals (array): 一致したシグナルの配列
    • signal_agent_segment_id (string): シグナルの汎用 ID
    • name (string): シグナル名
    • description (string): 詳細説明
    • signal_type (string): 種別 (marketplace, custom, owned)
    • data_provider (string): データ提供者
    • coverage_percentage (number): 想定リーチ割合
    • deployments (array): プラットフォーム別の配信情報
      • platform (string): 対象プラットフォーム名
      • account (string, nullable): アカウント特化の場合の ID
      • is_live (boolean): 現在有効か
      • scope (string): “platform-wide” または “account-specific”
      • decisioning_platform_segment_id (string): 使用するプラットフォーム固有 ID
      • estimated_activation_duration_minutes (number, optional): 未有効時の有効化時間
    • pricing (object): 価格情報
      • cpm (number): CPM 単価
      • currency (string): 通貨コード

エラーコード

ディスカバリーエラー

  • SIGNAL_AGENT_SEGMENT_NOT_FOUND: 指定シグナル ID が存在しない
  • AGENT_NOT_FOUND: 非公開シグナルエージェントがプリンシパルから見えない
  • AGENT_ACCESS_DENIED: プリンシパルにシグナルエージェントの権限がない

ディスカバリー警告

  • PRICING_UNAVAILABLE: 一部プラットフォームで価格データが一時取得不可
  • PARTIAL_COVERAGE: 要求プラットフォームの一部がこのシグナル種別をサポートしない
  • STALE_DATA: プロバイダー更新遅延により一部メタデータが古い可能性

利用上の注意

  1. 認証ベースのキー付与: 認証済み呼び出し元が配信先に一致する場合のみアクティベーションキーを返す
  2. 権限の安全性: キー付与は呼び出し元の身元に基づき、リクエストのフラグでは決定しない
  3. 配信ステータス: is_live を確認して有効化が必要か判断する
  4. 複数配信先の確認: 複数配信先を問い合わせ、プラットフォーム横断の利用可否を確認する
  5. 有効化が必要な場合: is_live が false なら activate_signal タスクを使用
  6. message フィールド は最重要ポイントを要約して伝える

レスポンス例 - 複数シグナル

{
  "message": "I found 3 signals matching your luxury goods criteria. The best option is 'Affluent Shoppers' with 22% coverage, already live across all requested platforms. 'High Income Households' offers broader reach (35%) but requires activation on OpenX. All signals are priced between $2-4 CPM.",
  "context_id": "ctx-signals-abc123",
  "signals": [
    {
      "signal_agent_segment_id": "acme_affluent_shoppers",
      "name": "Affluent Shoppers",
      "description": "Users with demonstrated luxury purchase behavior",
      "signal_type": "marketplace",
      "data_provider": "Acme Data",
      "coverage_percentage": 22,
      "deployments": [
        {
          "type": "platform",
          "platform": "index-exchange",
          "account": "agency-123-ix",
          "is_live": true,
          "scope": "account-specific",
          "decisioning_platform_segment_id": "ix_agency123_acme_aff_shop"
        },
        {
          "type": "platform",
          "platform": "openx",
          "account": "agency-123-ox",
          "is_live": true,
          "scope": "account-specific",
          "decisioning_platform_segment_id": "ox_agency123_affluent_789"
        }
      ],
      "pricing": {
        "cpm": 3.50,
        "currency": "USD"
      }
    }
    // ... more signals
  ]
}

レスポンス例 - 警告付き部分成功

{
  "message": "Found 2 luxury signals, but encountered some platform limitations. The 'Premium Auto Shoppers' signal has limited reach due to data restrictions, and pricing data is unavailable for one platform. Review the warnings below for optimization suggestions.",
  "context_id": "ctx-signals-abc123",
  "signals": [
    {
      "signal_agent_segment_id": "premium_auto_shoppers",
      "name": "Premium Auto Shoppers",
      "description": "High-value automotive purchase intenders",
      "signal_type": "marketplace",
      "data_provider": "Experian",
      "coverage_percentage": 8,
      "deployments": [
        {
          "type": "platform",
          "platform": "the-trade-desk",
          "account": null,
          "is_live": true,
          "scope": "platform-wide",
          "decisioning_platform_segment_id": "ttd_exp_auto_premium"
        }
      ],
      "pricing": {
        "cpm": 4.50,
        "currency": "USD"
      }
    }
  ],
  "errors": [
    {
      "code": "PRICING_UNAVAILABLE",
      "message": "Pricing data temporarily unavailable for The Trade Desk platform",
      "field": "signals[0].pricing",
      "suggestion": "Retry in 15-30 minutes when platform pricing feed updates",
      "details": {
        "affected_platform": "the-trade-desk",
        "last_updated": "2025-01-15T12:00:00Z",
        "retry_after": 1800
      }
    },
    {
      "code": "PRICING_UNAVAILABLE", 
      "message": "Pricing data temporarily unavailable for Amazon DSP",
      "field": "filters.platforms",
      "suggestion": "Pricing will be available during activation, or try again later",
      "details": {
        "affected_platform": "amazon-dsp",
        "retry_after": 1800
      }
    }
  ]
}

レスポンス例 - 該当なし

{
  "message": "I couldn't find any signals matching 'underwater basket weavers' in the requested platforms. This appears to be a very niche audience. Consider broadening your criteria to 'craft enthusiasts' or 'hobby communities' for better results. Alternatively, we could create a custom signal for this specific audience.",
  "context_id": "ctx-signals-abc123",
  "signals": []
}

実装ガイド

シグナルメッセージ生成

message フィールドは実行可能な洞察を提供します。
def generate_signals_message(signals, request):
    if not signals:
        return generate_no_signals_message(request.signal_spec)
    
    # Analyze deployment readiness
    ready_count = sum(1 for s in signals if all_platforms_live(s, request.deliver_to))
    best_signal = find_best_signal(signals)
    
    if len(signals) == 1:
        signal = signals[0]
        deployment_status = get_deployment_summary(signal, request.deliver_to)
        price_commentary = f"The CPM is ${signal.pricing.cpm}, which {'is well within' if signal.pricing.cpm <= request.filters.max_cpm else 'exceeds'} your budget."
        return f"I found a perfect match: '{signal.name}' from {signal.data_provider} with {signal.coverage_percentage}% coverage. {deployment_status} {price_commentary}"
    else:
        return f"I found {len(signals)} signals matching your {extract_key_criteria(request.signal_spec)} criteria. {describe_best_option(best_signal)} {get_pricing_range(signals)}."


def get_deployment_summary(signal, deliver_to):
    live_platforms = [d.platform for d in signal.deployments if d.is_live]
    needs_activation = [d for d in signal.deployments if not d.is_live and d.platform in deliver_to.platforms]
    
    if len(live_platforms) == len(deliver_to.platforms):
        return "It's already live on all requested platforms, ready to use immediately."
    elif live_platforms:
        activation_time = max(d.estimated_activation_duration_minutes for d in needs_activation)
        return f"It's live on {', '.join(live_platforms)}. Activation on {needs_activation[0].platform} would take about {activation_time} minutes."
    else:
        return "It requires activation on all platforms, which typically takes 1-2 hours."