𝕏 f B! L
案件・求人数 12,345
案件を探す(準備中) エージェントを探す(準備中) お役立ち情報 ログイン
案件・求人数 12,345
Google Antigravity × A2Aプロトコル連携ガイド|エージェント間通信の実装と活用【2026年版】

Google Antigravity × A2Aプロトコル連携ガイド|エージェント間通信の実装と活用【2026年版】

AntigravityA2Aエージェントプロトコル
目次
⚡ 3秒でわかる!この記事のポイント
  • A2Aプロトコルは異なるAIエージェント同士が標準化された方法で通信するための仕様
  • Google AntigravityはA2Aネイティブサポートにより、他のAIツールとのシームレスな連携が可能
  • マルチエージェントワークフローでチーム全体の開発生産性を10倍にする実践パターンを紹介

「AntigravityでA2Aプロトコルを使うにはどうすればいい?」「複数のAIエージェントを連携させたい」「A2Aってそもそも何なの?」

A2A(Agent-to-Agent)プロトコルは、Googleが提唱する異なるAIエージェント間の標準通信仕様です。 Google Antigravityは、A2Aプロトコルのネイティブサポートにより、Claude Code、Codex CLI、OpenClawなど他のAIツールとシームレスに連携できます。

この記事では、Google Antigravity完全攻略シリーズEp.55として、A2Aプロトコルの基礎から実践的な連携パターンまでを徹底解説します。

この記事でわかること
  • A2Aプロトコルの基本概念とアーキテクチャ
  • Antigravityでの A2A実装方法
  • マルチエージェントワークフローの設計パターン
  • SES現場での具体的な活用事例

A2Aプロトコルとは?エージェント間通信の新標準

A2Aプロトコルのアーキテクチャ全体像

A2Aプロトコルの基本概念

A2A(Agent-to-Agent)プロトコルは、GoogleがCloud Next 2025で発表したオープンなエージェント間通信の標準仕様です。MCPがエージェントとツール間の通信を標準化したのに対し、A2Aはエージェント同士の通信を標準化します。

MCP(Model Context Protocol):
  エージェント ←→ ツール/データソース

A2A(Agent-to-Agent Protocol):
  エージェント ←→ エージェント

A2Aの主要コンセプト

A2Aプロトコルは以下の核心的な概念で構成されています:

1. Agent Card(エージェントカード)

各エージェントの能力とインターフェースを記述するメタデータ。他のエージェントが発見・理解できるように公開されます。

{
  "name": "CodeReviewAgent",
  "description": "TypeScript/JavaScriptのコードレビューを行うエージェント",
  "url": "https://agent.example.com/code-review",
  "version": "2.0",
  "capabilities": {
    "streaming": true,
    "pushNotifications": true
  },
  "skills": [
    {
      "id": "typescript-review",
      "name": "TypeScriptコードレビュー",
      "description": "型安全性、パフォーマンス、セキュリティの観点でレビュー",
      "inputModes": ["text/plain", "application/typescript"],
      "outputModes": ["text/plain", "application/json"]
    }
  ]
}

2. Task(タスク)

エージェント間で委譲される作業単位。ライフサイクル管理が組み込まれています。

{
  "id": "task-001",
  "status": "working",
  "message": {
    "role": "user",
    "parts": [
      {
        "type": "text",
        "text": "src/controllers/auth.tsのセキュリティレビューを行ってください"
      }
    ]
  },
  "artifacts": []
}

3. Artifact(成果物)

タスクの完了時に生成される出力。テキスト、ファイル、構造化データなどさまざまな形式をサポートします。

{
  "name": "review-result",
  "parts": [
    {
      "type": "text",
      "text": "## レビュー結果\n- SQLインジェクション脆弱性が2箇所検出...\n"
    },
    {
      "type": "data",
      "data": {
        "severity": "high",
        "issues_found": 2,
        "files_reviewed": 1
      }
    }
  ]
}

A2Aプロトコルのフロー

1. 発見(Discovery)
   クライアント → /.well-known/agent.json → エージェントのAgent Cardを取得

2. タスク作成(Task Creation)
   クライアント → POST /tasks/send → タスクを作成・送信

3. 処理(Processing)
   エージェント → タスクを受信 → 内部処理

4. 進捗報告(Status Update)
   エージェント → SSE/Webhook → 進捗を通知

5. 完了(Completion)
   エージェント → Artifactを含む完了レスポンスを返却

AntigravityでのA2A実装

A2Aサーバーの構築

Antigravityプロジェクト内で、他のエージェントからの要求を受け付けるA2Aサーバーを構築します。

// a2a-server.ts
import { A2AServer, AgentCard, TaskHandler } from '@google/a2a-sdk';

const agentCard: AgentCard = {
  name: 'AntigravityDevAgent',
  description: 'フルスタック開発タスクを実行するAntigravityエージェント',
  url: 'http://localhost:3100',
  version: '1.0',
  capabilities: {
    streaming: true,
    pushNotifications: true,
    stateTransitions: true
  },
  skills: [
    {
      id: 'code-generation',
      name: 'コード生成',
      description: 'TypeScript/Python/Goのコード生成',
      inputModes: ['text/plain'],
      outputModes: ['text/plain', 'application/json']
    },
    {
      id: 'test-generation',
      name: 'テスト生成',
      description: 'ユニットテスト・E2Eテストの自動生成',
      inputModes: ['text/plain', 'application/typescript'],
      outputModes: ['text/plain']
    }
  ]
};

const taskHandler: TaskHandler = async (task) => {
  const skillId = task.metadata?.skillId || 'code-generation';

  switch (skillId) {
    case 'code-generation':
      return await handleCodeGeneration(task);
    case 'test-generation':
      return await handleTestGeneration(task);
    default:
      throw new Error(`Unknown skill: ${skillId}`);
  }
};

const server = new A2AServer({
  agentCard,
  taskHandler,
  port: 3100
});

server.start();
console.log('A2A Server running on port 3100');

A2Aクライアントとしての利用

AntigravityのA2Aクライアントは、他のエージェントにタスクを委譲します。

// a2a-client.ts
import { A2AClient } from '@google/a2a-sdk';

// エージェントの発見
const client = new A2AClient();
const reviewAgent = await client.discover('https://review-agent.example.com');

console.log('発見したエージェント:', reviewAgent.name);
console.log('提供スキル:', reviewAgent.skills.map(s => s.name));

// タスクの送信
const task = await client.sendTask(reviewAgent.url, {
  message: {
    role: 'user',
    parts: [
      {
        type: 'text',
        text: 'src/controllers/order.ts のパフォーマンスレビューをお願いします'
      },
      {
        type: 'file',
        file: {
          name: 'order.ts',
          mimeType: 'application/typescript',
          bytes: btoa(await readFile('src/controllers/order.ts', 'utf8'))
        }
      }
    ]
  },
  metadata: {
    skillId: 'performance-review',
    priority: 'high'
  }
});

// ストリーミングで結果を受信
for await (const update of client.streamTask(task.id)) {
  if (update.status === 'working') {
    console.log('進捗:', update.message?.parts[0]?.text);
  } else if (update.status === 'completed') {
    console.log('完了:', update.artifacts);
    break;
  }
}

Antigravity設定ファイルでのA2A連携

# .antigravity/config.yaml
a2a:
  server:
    enabled: true
    port: 3100
    auth:
      type: bearer
      token: ${A2A_AUTH_TOKEN}

  agents:
    - name: code-reviewer
      url: https://review-agent.example.com
      auth:
        type: bearer
        token: ${REVIEW_AGENT_TOKEN}
      skills:
        - typescript-review
        - security-audit

    - name: test-generator
      url: https://test-agent.example.com
      skills:
        - unit-test
        - e2e-test

    - name: doc-generator
      url: https://doc-agent.example.com
      skills:
        - api-docs
        - readme-generation

マルチエージェントワークフローの設計パターン

パターン1: パイプライン型(Sequential)

各エージェントが順番にタスクを処理し、結果を次のエージェントに渡します。

// pipeline-workflow.ts
async function developmentPipeline(requirement: string) {
  // Step 1: 設計エージェントがアーキテクチャを設計
  const designResult = await a2aClient.sendTask(designAgent, {
    message: { parts: [{ type: 'text', text: `要件: ${requirement}` }] },
    metadata: { skillId: 'architecture-design' }
  });

  // Step 2: コーディングエージェントが実装
  const codeResult = await a2aClient.sendTask(codingAgent, {
    message: {
      parts: [
        { type: 'text', text: '以下の設計に基づいて実装してください' },
        ...designResult.artifacts[0].parts
      ]
    },
    metadata: { skillId: 'code-generation' }
  });

  // Step 3: テストエージェントがテストを生成・実行
  const testResult = await a2aClient.sendTask(testAgent, {
    message: {
      parts: [
        { type: 'text', text: '以下のコードのテストを生成して実行してください' },
        ...codeResult.artifacts[0].parts
      ]
    },
    metadata: { skillId: 'test-generation' }
  });

  // Step 4: レビューエージェントが最終チェック
  const reviewResult = await a2aClient.sendTask(reviewAgent, {
    message: {
      parts: [
        { type: 'text', text: 'コードとテスト結果をレビューしてください' },
        ...codeResult.artifacts[0].parts,
        ...testResult.artifacts[0].parts
      ]
    },
    metadata: { skillId: 'code-review' }
  });

  return { designResult, codeResult, testResult, reviewResult };
}

パターン2: 並列分散型(Fan-out/Fan-in)

複数のエージェントに同時にタスクを割り振り、結果を統合します。

// parallel-workflow.ts
async function parallelCodeReview(files: string[]) {
  // 複数ファイルを並列でレビュー
  const reviewTasks = files.map(file =>
    a2aClient.sendTask(reviewAgent, {
      message: {
        parts: [
          { type: 'text', text: `${file}をレビューしてください` },
          { type: 'file', file: { name: file, bytes: readFileSync(file) } }
        ]
      }
    })
  );

  // 全結果を待機
  const results = await Promise.all(reviewTasks);

  // 結果を統合
  const summary = await a2aClient.sendTask(summaryAgent, {
    message: {
      parts: [
        { type: 'text', text: '以下のレビュー結果を統合してサマリーを作成してください' },
        ...results.flatMap(r => r.artifacts[0].parts)
      ]
    }
  });

  return summary;
}

パターン3: 監督・委譲型(Supervisor)

監督エージェントがタスクを分析し、適切なワーカーエージェントに委譲します。

// supervisor-workflow.ts
async function supervisorWorkflow(userRequest: string) {
  // 監督エージェントがタスクを分析
  const analysis = await a2aClient.sendTask(supervisorAgent, {
    message: {
      parts: [{
        type: 'text',
        text: `以下のリクエストを分析して、必要なサブタスクに分解してください: ${userRequest}`
      }]
    },
    metadata: { skillId: 'task-decomposition' }
  });

  const subtasks = JSON.parse(analysis.artifacts[0].parts[0].data);

  // 各サブタスクを適切なエージェントに委譲
  const results = [];
  for (const subtask of subtasks) {
    const agent = selectAgent(subtask.type);
    const result = await a2aClient.sendTask(agent, {
      message: { parts: [{ type: 'text', text: subtask.description }] },
      metadata: { skillId: subtask.skillId }
    });
    results.push(result);
  }

  // 監督エージェントが結果を統合・品質チェック
  const finalResult = await a2aClient.sendTask(supervisorAgent, {
    message: {
      parts: [
        { type: 'text', text: '全サブタスクの結果を統合して品質チェックしてください' },
        ...results.flatMap(r => r.artifacts[0].parts)
      ]
    },
    metadata: { skillId: 'quality-assurance' }
  });

  return finalResult;
}

A2Aセキュリティとアクセス制御

認証・認可の設計

// a2a-auth.ts
import { A2AServer, AuthMiddleware } from '@google/a2a-sdk';

const authMiddleware: AuthMiddleware = async (request) => {
  const token = request.headers.get('Authorization')?.replace('Bearer ', '');

  if (!token) {
    throw new Error('認証トークンが必要です');
  }

  // トークン検証
  const claims = await verifyToken(token);

  // スキルベースのアクセス制御
  const requestedSkill = request.metadata?.skillId;
  if (!claims.allowedSkills.includes(requestedSkill)) {
    throw new Error(`スキル ${requestedSkill} へのアクセス権がありません`);
  }

  return claims;
};

const server = new A2AServer({
  agentCard,
  taskHandler,
  auth: authMiddleware,
  rateLimit: {
    maxRequests: 100,
    windowMs: 60000  // 1分あたり100リクエスト
  }
});

通信の暗号化

# .antigravity/a2a-security.yaml
security:
  transport:
    tls:
      enabled: true
      minVersion: "TLSv1.3"

  authentication:
    type: mutual-tls
    clientCert: /path/to/client.pem
    clientKey: /path/to/client-key.pem
    caCert: /path/to/ca.pem

  audit:
    enabled: true
    logDestination: /var/log/a2a/audit.log
    logLevel: info

SES現場でのA2A活用事例

事例1: 大規模マイグレーションプロジェクト

レガシーJavaシステムからTypeScriptへの移行を、A2Aで連携する複数エージェントで実行しました。

Antigravity(コーディネーター)
├── Java解析エージェント → コード構造の分析
├── TypeScript変換エージェント → コード変換
├── テストエージェント → テスト生成・実行
└── ドキュメントエージェント → 差分ドキュメント生成

成果:

  • 移行期間を6ヶ月→2ヶ月に短縮
  • コード変換の精度95%以上
  • テストカバレッジ80%を自動達成

事例2: 24時間監視体制のDevOps

A2Aで連携するエージェント群により、24時間のシステム監視と自動対応を実現しました。

成果:

  • インシデント対応時間を平均30分→5分に短縮
  • 夜間の人員配置を3人→0人に削減
  • 障害の自動復旧率75%を達成

事例3: マルチベンダー連携

異なるSES企業が担当するマイクロサービス間の連携テストを、各社のAIエージェントがA2Aで通信して自動化しました。

成果:

  • 結合テストの準備時間を1日→2時間に短縮
  • 企業間のAPI仕様齟齬を早期発見
  • コミュニケーションコストを60%削減

まとめ: A2Aプロトコルがもたらす未来

A2Aプロトコルは、AIエージェントの世界に「標準化された協力関係」をもたらします。Google Antigravityのネイティブサポートにより、以下が実現可能です:

  • ツール非依存: Claude Code、Codex CLI、Antigravity等を自由に組み合わせ
  • スケーラブル: エージェントの追加・交換が容易
  • セキュア: 標準化された認証・認可フレームワーク
  • オブザーバブル: タスクのライフサイクル全体を追跡可能

SESエンジニアとして、A2Aプロトコルの理解と実装スキルは、マルチエージェント開発の時代において大きな差別化要因になります。

💡 SESエンジニアへのアドバイス
  • A2Aプロトコルは2025年発表の最新技術。面談でアピールすると先端スキルとして評価される
  • マルチエージェント設計パターンの知識は、アーキテクトポジションへのステップアップに直結
  • Google Cloud認定資格とA2A実装経験の組み合わせで、年収50-100万円アップも狙える

関連記事

SES案件をお探しですか?

SES記事をもっと読む →
🏗️

SES BASE 編集長

SES業界歴10年以上のメンバーが在籍する編集チーム。SES企業での営業・エンジニア経験、フリーランス独立経験を持つメンバーが、業界のリアルな情報をお届けします。

📊 業界データに基づく記事制作 🔍 IPA・経済産業省データ参照 💼 SES実務経験者が執筆・監修