Skip to main content
MCP と A2A は、統一ステータスシステムを用いて同じ AdCP 機能を提供します。異なるのはトランスポート形式と非同期処理だけです。

クイック比較

AspectMCPA2A
Request StyleTool callsTask messages
Response StyleDirect JSONArtifacts
Status SystemUnified status fieldUnified status field
Async HandlingPolling with tasks/getSSE streaming
WebhooksProtocol wrapper extensionNative PushNotificationConfig
Task Managementtasks/list, tasks/get toolsNative tasks/list, tasks/get
ContextManual (pass context_id)Automatic (protocol-managed)
Best ForClaude, AI assistantsAgent workflows

統一ステータスシステム

両プロトコルは同じステータスフィールドを同じ値で使用します。

ステータス処理(両プロトコル)

すべてのレスポンスに、次に取るべき行動を示すステータスフィールドが含まれます:
{
  "status": "input-required",    // Same values for both protocols
  "message": "Need your budget", // Same human explanation
  // ... protocol-specific formatting below
}
StatusWhat It MeansYour Action
completedTask finishedProcess data, show success
input-requiredNeed user inputRead message, prompt user, follow up
workingProcessing (< 120s)Poll frequently, show progress
submittedLong-running (hours to days)Provide webhook or poll less frequently
failedError occurredShow error, handle gracefully
auth-requiredNeed authPrompt for credentials
Task Lifecycle でステータス処理の完全ガイドを確認してください。

トランスポート形式の違い

ステータスとデータは同じで、パッケージングが異なります:

MCP レスポンス形式

{
  "status": "input-required",
  "message": "I need your budget and target audience",
  "context_id": "ctx-123",
  "products": [],
  "suggestions": ["budget", "audience"]
}

A2A レスポンス形式

{
  "status": "input-required",
  "contextId": "ctx-123",
  "artifacts": [{
    "artifactId": "artifact-product-discovery-xyz",
    "name": "product_discovery",
    "parts": [
      {
        "kind": "text",
        "text": "I need your budget and target audience"
      },
      {
        "kind": "data",
        "data": {
          "products": [],
          "suggestions": ["budget", "audience"]
        }
      }
    ]
  }]
}

非同期処理の違い

両プロトコルは同じステータス遷移で非同期処理を扱います: submittedworkingcompleted/failed

MCP の非同期パターン

// Initial response with task_id
{
  "status": "submitted",
  "message": "Creating media buy, requires manual approval",
  "context_id": "ctx-123",
  "task_id": "task-456",
}

// Poll using tasks/get
const updates = await session.call('tasks/get', {
  task_id: "task-456",
  include_result: true
});

// Optional: Configure webhook
const response = await session.call('create_media_buy', params, {
  push_notification_config: {
    url: "https://buyer.com/webhooks",
    authentication: {
      schemes: ["HMAC-SHA256"],
      credentials: "shared_secret_32_chars"
    }
  }
});

A2A の非同期パターン

// Initial response with native task tracking
{
  "status": "submitted",
  "taskId": "task-456",
  "contextId": "ctx-123",
  "estimatedCompletionTime": "2025-01-23T10:00:00Z"
}

// Real-time updates via SSE
const events = new EventSource(`/tasks/${response.taskId}/events`);
events.onmessage = (event) => {
  const update = JSON.parse(event.data);
  console.log(`Status: ${update.status}, Message: ${update.message}`);
};

// Native webhook support
await a2a.send({
  message: { /* skill invocation */ },
  push_notification_config: {
    webhook_url: "https://buyer.com/webhooks",
    authentication: {
      schemes: ["Bearer"],
      credentials: "secret_token_min_32_chars"
    }
  }
});

コンテキスト管理

MCP: 手動コンテキスト

let contextId = null;

async function callAdcp(request) {
  if (contextId) {
    request.context_id = contextId;
  }

  const response = await mcp.call('get_products', request);
  contextId = response.context_id; // Save for next call

  return response;
}

A2A: 自動コンテキスト

// A2A manages context automatically
const response1 = await a2a.send({ message: "Find video products" });
const response2 = await a2a.send({
  contextId: response1.contextId, // Optional - A2A tracks this
  message: "Focus on premium inventory"
});

確認・追加情報の扱い

両プロトコルは同じ status: "input-required" パターンを使用します:
// Works for both MCP and A2A
function handleResponse(response) {
  if (response.status === 'input-required') {
    const info = promptUser(response.message);
    return sendFollowUp(response.context_id, info);
  }

  if (response.status === 'completed') {
    return processResults(response);
  }
}

エラーハンドリング

両者とも status: "failed" と同じエラー構造を使用します:
{
  "status": "failed",
  "message": "Insufficient inventory for your targeting criteria",
  "context_id": "ctx-123",
  "error_code": "insufficient_inventory",
  "suggestions": ["Expand targeting", "Increase CPM"]
}

プロトコルを選ぶには

MCP を選ぶ場合:

  • Claude Desktop または Claude Code を使用
  • MCP 対応の AI アシスタントを利用
  • シンプルなツールベース統合が必要
  • 直接 JSON のレスポンスが欲しい

A2A を選ぶ場合:

  • Google AI agents または Agent Engine を利用
  • マルチモーダル(テキスト + ファイル)なワークフロー
  • リアルタイムなストリーミング更新
  • アーティファクトベースのデータ処理

両プロトコルが提供するもの:

  • 同じ AdCP タスクと機能
  • クライアントロジックを明確にする統一ステータスシステム
  • 会話のためのコンテキスト管理
  • 非同期処理のサポート
  • Human-in-the-loop ワークフロー
  • エラーハンドリングと復旧

次のステップ

  • MCP Guide: ツールコールとコンテキスト管理は MCP Guide を参照
  • A2A Guide: アーティファクトとストリーミングは A2A Guide を参照
  • Both protocols: 統一ステータスで同じ機能を提供