A2A

Foundryポータル(new)のA2A機能を用いたエージェント間連携の調査レポート

エグゼクティブサマリ
Foundryポータル(new)におけるA2A(Agent-to-Agent)機能は、Foundry Agent Service上のエージェントが、A2Aプロトコル互換の外部エージェント・エンドポイントを「ツール」として呼び出すことで、標準化された方式でエージェント間連携を実現する仕組みである。A2Aは「Connected Agents」のようなFoundry内専用の点対点機能というより、エージェント同士が相互運用できる“公開プロトコル”として位置づけられ、エージェントカード(Agent Card)による能力発見と、メッセージ/タスク中心のやりとりを中核とする。citeturn20search6turn4view3turn8view3
一方で、現時点(2026年3月時点の公開情報ベース)では、Foundryで作成・公開した「Foundryホスト型エージェント」同士を、A2Aツールで直接呼び出す(Foundry→Foundry)構成は設計上サポートされない、という事例報告がMicrosoft Q&Aで「Accepted Answer」として示されている。理由は、A2Aツールが必須とする“公開されたA2A互換のAgent Cardエンドポイント”が、Foundryホスト型の公開エージェントには提供されないためである(結果としてAgent Card取得段階で401/PermissionDenied等)。citeturn6view0
したがって「FoundryエージェントとFoundryエージェント間連携」を実現したい場合は、(a) Foundryでサポートされるネイティブなマルチエージェント機構(ワークフロー等)に寄せる、または (b) 片側(または両側)をFoundry外にA2Aサーバーとしてホストし、必要ならFoundryのResponses API/Activity Protocolを“背後”で呼び出す中継(プロキシ)構成にする、という代替アーキテクチャが現実的になる。citeturn10view0turn6view3turn4view3

目的

A2A(Agent-to-Agent)は、複数のエージェントが「ツール呼び出し」ではなくエージェントとして相互に発見・対話・タスク遂行できるようにするためのオープンプロトコルである。A2Aでは、外部エージェントが自らの能力(スキル、入出力形式、認証要件など)をAgent Card(JSONメタデータ)として公開し、クライアント側(Foundryエージェントを含む)がそれを取得して適切な通信方式を選ぶというモデルを取る。citeturn4view3turn8view3

Foundryポータル(new)では、このA2Aエンドポイントを「ツール」として登録し、Foundry Agent Service上のエージェントがそのツールを呼ぶことでFoundryエージェント ↔ 外部A2Aエージェント間の連携を実現する。ドキュメント上も、A2Aツールは「Foundryエージェントを、A2Aプロトコルをサポートするエージェント・エンドポイントで拡張する」ための手段として説明される。citeturn20search6turn6view2

また、Foundryの観点では「A2Aツールでつなぐ」方式と「マルチエージェントワークフローでつなぐ」方式が区別され、A2Aツールは標準化されたプロトコルで外部エンドポイントと接続する用途に寄る。citeturn2view0turn20search6

前提条件

本節は「A2A機能を使った連携」を成立させるための一般的要件を、公式ドキュメントに基づき整理する。ユーザー環境の具体値(利用リージョン、対象エンドポイント、認証方式、通信経路)は本依頼では与えられていないため、未指定は明示する。

前提条件一覧

区分要件根拠/補足
アカウント/プロジェクトFoundryポータル(new)でプロジェクトにアクセスできることA2A認証ドキュメントの前提条件として「Foundryポータルとプロジェクトへのアクセス」が列挙される。citeturn12view0
必要ロール(最低限)プロジェクトに対して Azure AI ユーザー ロール以上プロジェクト接続作成とエージェント構成に必要と明記。citeturn12view0
追加ロール(運用・デプロイ要件)ツールやネットワーク構成、公開運用などで追加ロールが必要になる可能性例:ホスト型エージェントやリソース作成では別ロールが必要になる旨が記載される(用途により変動)。citeturn10view3turn10view0
ネットワーク到達性Foundry実行環境から、対象A2AエンドポイントへHTTP/HTTPSで到達できること「Foundryリソースをデプロイしたネットワークがエージェントのエンドポイントに到達できること」が要件として明示。citeturn6view3
A2Aエンドポイント情報対象A2AエンドポイントURL、(必要なら)Agent Card URLA2A接続作成時にエンドポイントURLが必要。Agent Card URLは未指定ならデフォルト /.well-known/agent-card.json が前提として扱われる。citeturn12view0turn8view4turn8view0
認証方式Key / Entra ID(マネージドID)/ OAuthパススルー / 無認証Foundry側で選べるA2A接続の認証方式一覧が示される。citeturn12view1turn11view1
APIキー未指定(ただしKeyベース認証を選ぶ場合は、APIキーやPAT等が必要)Keyベース認証の要件として列挙。citeturn12view0
OAuth詳細(トークンURL等)未指定(OAuthを選ぶ場合はTokenUrl/AuthorizationUrl/Scopes等が必要)カスタムOAuth接続作成の例で、TokenUrl等の指定が必要。citeturn11view4
監査/可観測性(推奨)トレース/ログを参照できるよう構成ツール呼び出しは実行トレースで検証することが推奨される。可観測性は運用上重要。citeturn21view2turn6view3

ネットワーク要件の補足(閉域/制御を行う場合)

  • Foundry側でネットワーク隔離を強める場合、VNet/Private Endpoint/DNS等の設計が絡む。Foundry Agent Serviceのプライベートネットワーク構成ガイダンスが別途提供されている。citeturn14search0turn14search1
  • ただし、Foundryの“新しい体験”におけるネットワーク隔離には既知の制約がある(例:新しいポータル体験や新バージョンAgent Serviceではエンドツーエンド隔離がサポートされない旨、ホスト型エージェントの非対応など)。その場合、A2Aエンドポイントへの到達性確保(許可する送信先の明示、Private Linkの取り回し等)が、設計上のボトルネックになりうる。citeturn14search2

技術仕様

本節では、(a) A2Aプロトコルとしての仕様、(b) Foundry側のA2Aツール(A2APreviewTool)としての仕様、(c) 認証フローとエラーを、一次情報中心に整理する。

A2Aプロトコルの概要(Discovery・メッセージ・タスク)

A2Aプロトコルは、エージェントが相互に能力を発見し、長時間タスクやストリーミング、プッシュ通知なども含めて協働できることを目的としたオープン仕様である。A2Aでは、サーバー側がAgent Cardを公開し、クライアントがそれに従って通信(JSON-RPC/HTTP+JSON/gRPCなど)を行う。citeturn4view3turn8view3

プロトコル定義(最新のdefinitions)では、A2Aサービスに以下のようなエンドポイント(HTTPマッピング)がある(代表例)。citeturn5view1turn5view2

目的メソッド(概念)HTTPエンドポイント例
メッセージ送信(同期)SendMessagePOST /message:send
メッセージ送信(ストリーミング)SendStreamingMessagePOST /message:stream
タスク状態取得GetTaskGET /tasks/{id}
タスク一覧ListTasksGET /tasks
タスクキャンセルCancelTaskPOST /tasks/{id}:cancel
タスク購読(更新受信)SubscribeToTaskGET /tasks/{id}:subscribe
プッシュ通知設定CreateTaskPushNotificationConfig 等POST /tasks/{task_id}/pushNotificationConfigs
拡張Agent CardGetExtendedAgentCardGET /extendedAgentCard

メッセージ形式(Message / Part)

A2AのMessageは、message_id(必須)、context_id / task_id(任意)、role(送信者区分)、parts(本文の構成要素)などを持つ。roleは「ユーザー(クライアント)→サーバー」か「サーバー→クライアント」を区別し、partsはテキスト・バイナリ・URL参照・構造化データなどを格納しうる(rawはJSONではbase64)。citeturn15view0turn15view3turn15view2

Agent Cardの配置と発見

A2A仕様(v0.3.0)では、well-known URI戦略の場合、Agent Cardの推奨配置として https://{server_domain}/.well-known/agent-card.json を示す。citeturn4view3turn7search6
Foundry側も、Agent Card URLが未指定の場合の既定パスを /.well-known/agent-card.json とする(カスタムエージェント登録UI、A2Aツールのパラメータ等)。citeturn8view4turn8view0turn4view3

Foundry側のツール仕様(A2APreviewTool)

FoundryのRESTリファレンスでは、A2Aツール(A2APreviewTool)の主要パラメータとして以下が示される。citeturn8view0

パラメータ意味備考
typeツール種別常に "a2a_preview"
base_urlA2AサーバーのベースURL未指定の場合、project_connection_id側に含まれる前提のケースあり
agent_card_pathbase_urlからの相対パス未指定なら /.well-known/agent-card.json
project_connection_idFoundryプロジェクト内の接続ID認証や接続情報を含む

認証フロー(Foundry側)

FoundryのA2A接続では、大別して「共有認証」と「個別(ユーザーごと)認証」があり、用途に応じて選ぶ。citeturn12view0

  • キー(シークレット)ベース:プロジェクト接続にAPIキーやトークン等を格納し、Agent Serviceが呼び出し時にヘッダーへ付与する。共有シークレットの扱いに注意があり、プロジェクトにアクセスできるユーザーは接続に格納されたシークレットへアクセスできる旨が明記される。citeturn12view1
  • Microsoft Entra ID(マネージドID):エージェントID(公開前はプロジェクト共有ID、公開後はエージェント固有ID)またはプロジェクトマネージドIDでトークンを取得し、要求に含める。基盤サービス側のロール割り当てが必要。citeturn12view1turn10view0
  • OAuth IDパススルー:初回は同意リンクを提示し、ユーザーがサインイン・同意。Agent Serviceがトークン(アクセス/更新)を安全に保管し、以後はユーザーの文脈で呼び出す。citeturn12view2turn12view3

サンプルAPI(A2Aプロトコル側)

以下は、A2A仕様と定義に沿った例示である(実際の必須/任意フィールドやエンドポイントは、対象A2AサーバーのAgent Cardに従う)。citeturn5view1turn15view0turn4view3

Agent Card取得(well-known)

GET https://example-agent.example.com/.well-known/agent-card.json
Accept: application/json

メッセージ送信(HTTP+JSONの例:/message:send)

POST https://example-agent.example.com/message:send
Content-Type: application/json
Authorization: Bearer <token>   # 例:Entra ID / OAuth / APIキー等(方式はAgent CardとFoundry接続設定に依存)

{
  "message": {
    "message_id": "9b7a7c2e-6b36-4c28-9e5a-1b5e2f0b1a11",
    "context_id": "c-001",
    "role": "ROLE_USER",
    "parts": [
      { "text": "このエージェントが提供できるスキルを要約して教えてください。" }
    ]
  },
  "configuration": {
    "accepted_output_modes": ["text/plain", "application/json"]
  }
}

レスポンス例(taskまたはmessageが返り得る)

{
  "task": {
    "id": "t-12345",
    "contextId": "c-001",
    "status": { "state": "TASK_STATE_WORKING" }
  }
}

エラーハンドリング(A2AとFoundryの双方)

A2A仕様(v0.3.0のJSON-RPCバインディング例)では、標準JSON-RPCエラー(parse error/invalid request/method not found/invalid params等)と、A2A固有のエラー(TaskNotFound等)を整理している。citeturn17view0turn17view3

Foundry側(A2A接続認証)では、代表的な失敗として401/403/400等の典型原因と対処が表形式で示される(例:キー期限切れ、ヘッダー形式誤り、ロール割当不足、audience不一致、OAuth同意リンクが出ない等)。citeturn12view4

実装手順

ここでは「Foundryポータル(new)でA2A機能を使い、Foundryエージェントから別エージェントを呼び出す」ための実装を、UI(想定)とAPI/SDKの双方で手順化する。公式のA2Aツール手順はPython/C#/TypeScript/REST向けで、Javaはサポート対象外とされる。citeturn2view0turn8view0

手順の全体像(推奨フロー)

flowchart LR
  U[ユーザー] --> A[Foundryエージェント(オーケストレーター)]
  A -->|A2Aツール呼び出し| C[Foundryプロジェクト接続<br/>(RemoteA2A + 認証設定)]
  A -->|Agent Card取得| B[外部A2Aエージェント<br/>/.well-known/agent-card.json]
  A -->|message:send 等| B
  B -->|task/message| A
  A -->|要約・統合| U

A2Aツールは、Foundryエージェントが会話の主導権を保持したまま、外部A2Aエージェントの結果を取り込み、ユーザーへ返す「オーケストレーター→サブエージェント」パターンで説明される。citeturn2view0turn20search6

Foundryポータル(new)での設定(想定項目)

A2A関連は「ツールカタログ」から扱う導線が明示されている。ツールカタログが見当たらない場合の導線として「Build > Tools」が示される。citeturn6view2turn12view4

想定UI手順(概要)
1) Foundryポータル(new)で対象プロジェクトを開く(新しい体験を利用していることが前提)。citeturn6view3turn12view0
2) Build > Tools(ツールカタログ)へ移動し、Custom(カスタム)から「Agent-to-Agent tool (preview)」相当を選び、A2Aエンドポイントを登録する。citeturn6view2turn20search6
3) 登録時に、A2AエンドポイントURLと認証方式(キー/Entra ID/OAuth/無認証)を指定し、接続(project connection)を作成する。citeturn12view4turn11view1
4) エージェント定義にA2Aツールを追加し、どのA2A接続(project_connection_id)を使うかを紐づける。citeturn8view0turn11view0

REST APIでA2A接続(プロジェクト接続)を作成する

A2Aツールの公式手順には、Azure Resource Manager経由で接続を作るcurl例が複数提示されている(キー、OAuth、プロジェクトMI、エージェントIDなど)。まずARMスコープでトークンを取得する。citeturn11view0

ARMトークン取得(例)

az account get-access-token \
  --scope https://management.azure.com/.default \
  --query accessToken -o tsv

キー(CustomKeys)ベース接続の例(RemoteA2A) citeturn11view0

curl --request PUT \
  --url 'https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group_name}}/providers/Microsoft.CognitiveServices/accounts/{{foundry_account_name}}/projects/{{project_name}}/connections/{{connection_name}}?api-version=2025-04-01-preview' \
  --header 'Authorization: Bearer {{token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "{{connection_name}}",
    "type": "Microsoft.MachineLearningServices/workspaces/connections",
    "properties": {
      "authType": "CustomKeys",
      "category": "RemoteA2A",
      "target": "{{a2a_endpoint}}",
      "isSharedToAll": true,
      "Credentials": {
        "Keys": {
          "{{key_name}}": "{{key_value}}"
        }
      },
      "metadata": {
        "ApiType": "Azure"
      }
    }
  }'

プロジェクトマネージドID(ProjectManagedIdentity)の例 citeturn11view4

curl --request PUT \
  --url 'https://management.azure.com/subscriptions/{{subscription_id}}/resourceGroups/{{resource_group_name}}/providers/Microsoft.CognitiveServices/accounts/{{foundry_account_name}}/projects/{{project_name}}/connections/{{connection_name}}?api-version=2025-04-01-preview' \
  --header 'Authorization: Bearer {{token}}' \
  --header 'Content-Type: application/json' \
  --data '{
    "name": "{{connection_name}}",
    "type": "Microsoft.MachineLearningServices/workspaces/connections",
    "properties": {
      "authType": "ProjectManagedIdentity",
      "category": "RemoteA2A",
      "target": "{{a2a_endpoint}}",
      "isSharedToAll": true,
      "audience": "{{audience}}",
      "Credentials": {},
      "metadata": { "ApiType": "Azure" }
    }
  }'

Foundry側エージェントにA2Aツールを組み込む(SDK例)

公式手順では、接続(project connection)を取得してA2APreviewToolへ設定し、エージェントバージョンを作成する例が提示される。接続タイプがRemoteA2Aでない場合はBaseUriを別途与える分岐が示される。citeturn11view0turn8view0

C#(抜粋要点:A2APreviewToolへProjectConnectionIdを設定し、ツール必須で呼ぶ) citeturn11view0

AIProjectConnection a2aConnection = projectClient.Connections.GetConnection(connectionName: a2aConnectionName);

A2APreviewTool a2aTool = new()
{
    ProjectConnectionId = a2aConnection.Id
};

PromptAgentDefinition agentDefinition = new(model: modelDeploymentName)
{
    Instructions = "You are a helpful assistant.",
    Tools = { a2aTool }
};

AgentVersion agentVersion = projectClient.Agents.CreateAgentVersion(
    agentName: "myAgent",
    options: new(agentDefinition));

CreateResponseOptions responseOptions = new()
{
    ToolChoice = ResponseToolChoice.CreateRequiredChoice(),
    InputItems = { ResponseItem.CreateUserMessageItem("What can the secondary agent do?") },
};

ResponseResult response = responseClient.CreateResponse(responseOptions);

参照すべきサンプルコード(GitHub等)

  • A2A仕様・SDK・サンプルの中核リポジトリ(プロトコルの概要、対応SDK、機能一覧)。citeturn8view3turn8view3
  • A2Aサンプル集(外部エージェントを“信頼できない入力”として扱う注意喚起も含む)。citeturn19view1
  • 「Azure AI Foundry × A2A」デモ(環境変数にFoundryプロジェクトエンドポイントやモデルデプロイ名を設定し、FoundryエージェントとA2Aフレームワークを組み合わせる構成例)。citeturn19view0
  • entity[“company”,”GitHub”,”code hosting platform”]上のMicrosoft Learn演習(deprecated表記はあるが、A2Aで複数リモートエージェントを動かす教材として実在)。citeturn6view4turn13search36

セキュリティと制約

アクセス制御と権限分離

  • Keyベース認証では、プロジェクト接続に共有シークレットを保持する。プロジェクトにアクセスできるユーザーがシークレットへアクセス可能である点が明記されるため、共有用途に限定し、ユーザー固有権限が必要ならOAuthパススルーを選ぶべきである。citeturn12view1turn12view0
  • エージェントID(マネージドID)認証では、公開前はプロジェクト共有ID、公開後はエージェント固有IDに切り替わる。公開によりIDが変わるため、必要な基盤リソース(例:基盤サービス)へのRBAC割当を再設定しないと、開発時に動いていたツールが公開後に失敗する可能性がある。citeturn10view0turn10view3
  • ツール呼び出し全般のベストプラクティスとして、ツール出力を信頼できない入力として扱う、必要最小限の情報のみ送る、プロンプトやログにシークレットを含めない等が推奨される。citeturn21view2

監査ログ・トレーシング

  • ツール呼び出しの検証は、実行トレース(end-to-end tracing)を確認して入力・出力を検査することが推奨される。citeturn21view2
  • A2Aサンプル集側でも、外部エージェントからのAgent Cardやメッセージ等を未検証でLLMプロンプトに混入すると、プロンプトインジェクション等のリスクがある旨の注意喚起がある。citeturn19view1

レート制限・クォータ

  • Foundry Agent Serviceの制限は「サービス側の固定制限(ファイル数、ツール数等)」と「モデルデプロイ側のクォータ/レート制限」に分かれ、Agent Service自体がAPI呼び出しに独自レート制限を課すわけではなく、モデルデプロイ側でレート制限が適用されると明記される。citeturn21view0turn21view1
  • 429(rate_limit_exceeded)等の制限エラーに対しては、指数バックオフ等の推奨が記載される。citeturn21view0turn21view1

既知の制約・互換性

  • A2Aツールはプレビューであり、利用条件・動作が将来変わる可能性がある(公式ドキュメント上、A2A関連はpreview表記が付く)。citeturn20search6turn6view2
  • Agent Application(公開エージェント)では、Responsesプロトコル/Activity Protocolのどちらか一方しか有効化できない、Responses側は一時的制約として /responses のみ・他API(/conversations等)不可、などの制約が明記される。citeturn10view0
  • Agent Applicationの呼び出しではAPIキー認証がサポートされず、RBAC(Entra ID)での呼び出しが前提となる。citeturn10view0
  • Foundry→FoundryをA2Aで直接という観点では、Foundryホスト型公開エージェントが「公開A2AサーバーとしてのAgent Cardエンドポイント」を提供しないため、A2Aツールでは呼べない、という制約報告がある(Agent Card取得段階で拒否されRBAC評価以前に失敗する旨)。citeturn6view0

検証方法

A2A連携は「接続設定(到達性・認証)→ Agent Card取得 → メッセージ送信 → 期待する応答」の順に壊れやすいため、層別にテストするのが合理的である。

動作確認テストケース(推奨)

テスト観点手順(例)期待結果失敗時の切り分け先
Agent Card取得ブラウザ/curlで /.well-known/agent-card.json を取得(必要なら認証付き)200でJSONが返る404/401ならA2Aサーバー実装・公開設定・認証方式不一致
Foundry接続(認証)FoundryでA2Aツールをトリガーする最小プロンプト(例:「このエージェントができることを教えて」)401/403/400が出ないA2A認証トラブルシューティング表に従う(トークン期限切れ、audience違い等)citeturn12view4
ツール呼び出しの確実性tool_choice=required相当で強制的にA2Aツールを呼ばせるツールが呼ばれ、結果が返るツール選択がautoだと呼ばれない可能性があるため、tool_choiceの設計と指示文を見直すciteturn21view2turn11view0
大きなペイロードpartsに長文や構造化データを入れる制限内なら成功Agent Service制限(content_size等)やモデル側制限を参照citeturn21view0turn21view1turn15view2
429耐性高頻度で呼ぶリトライで回復指数バックオフ、モデルデプロイのクォータ見直しciteturn21view0turn21view1

ログ/トレース確認ポイント

  • 実行トレースで、A2Aツールが呼ばれたか、入力(送信メッセージ)が意図通りか、出力(外部エージェント応答)が何かを確認する。citeturn21view2
  • 認証で詰まる場合は、FoundryのA2A認証ガイドの「401/403/400」テーブルに沿って、トークン・ヘッダー形式・ロール割当・audience等を確認する。citeturn12view4
  • 外部エージェント側では、受信リクエストのヘッダー(Authorization等)と、Agent Cardの提供可否(特にwell-known)をまず確認する(Foundry側はAgent Card取得段階で失敗し得る)。citeturn6view0turn4view3

トラブルシューティングの代表パターン

  • OAuth同意リンクが出ない:OAuthパススルーが接続に設定されていない、またはエージェントがツールを呼んでいない。citeturn12view4
  • Entra IDで401/403:基盤サービスがEntra IDを受けない、audience不一致、ロール割当不足(反映遅延最大10分など)。citeturn12view4
  • Foundry→FoundryをA2Aで呼べない:Agent Card取得段階で401/PermissionDeniedになり、RBAC付与で解決しない(設計上の制約)という報告。citeturn6view0

代替案

本依頼は「FoundryエージェントとFoundryエージェント間の連携」を主題としているが、公開情報上、A2AツールによるFoundry→Foundryの直接呼び出しはサポートされない可能性が高い。citeturn6view0
その場合に備え、理由と回避策(代替アーキテクチャ)を整理する。

直接連携が不可能になり得る理由(設計上の制約)

Microsoft Q&Aの受理回答では、A2Aツールが必須とする「公開A2A互換のAgent Cardエンドポイント」が、Foundryホスト型の公開エージェントには提供されず、UIに表示されるActivity Protocol/Responses APIエンドポイントは内部用途であるため、A2A呼び出しは成立しない、と説明されている。citeturn6view0turn10view0

この説明が正しい場合、Foundry内の公開エージェントは「Agent Application」としてResponsesまたはActivity Protocolで外部公開されるが、A2Aプロトコル(Agent Card + A2A runtime)として公開されるわけではない、という整理になる。citeturn10view0turn4view3

回避策と代替アーキテクチャ

ネイティブ機構へ寄せる(Foundry内のマルチエージェント設計)

Foundry Agent Service自体が「複数エージェント協調」やワークフローなどの概念を持つ(サービス概要でオーケストレーションや複数エージェント調整に言及)。この場合、A2AではなくFoundry内の仕組みで連携する方が自然である。citeturn10view2turn6view0

中継サービス(A2Aゲートウェイ/プロキシ)を置く

A2Aツールが「外部A2A互換エンドポイント」を呼べる点を利用し、以下のように“外部にA2Aサーバーを立てて”Foundry公開エージェントを背後で呼ぶ。

flowchart LR
  A[Foundryエージェント(呼び出し元)] -->|A2A tool| P[中継A2Aサーバー<br/>(自前ホスト)]
  P -->|Responses API または Activity Protocol| B[Foundry公開エージェント(呼び出し先)]
  B --> P --> A

根拠となる部品は、(1) 外部エージェントをFoundryに登録してプロキシする仕組み(カスタムエージェント登録:HTTP/A2Aプロトコル対応、到達性要件、AI Gatewayがプロキシになる旨)、(2) 公開エージェントの安定エンドポイント(Responses/Activity)、(3) A2Aサーバーを自前でホストするためのフレームワーク(Agent FrameworkがA2A公開をホスティングオプションとして提示)で構成できる。citeturn6view3turn10view0turn18view0

特にカスタムエージェント登録では、FoundryがAPI Management(AI gateway)を介してプロキシとして通信を仲介し、アクセス制御・監視を行う旨が明記される。citeturn6view3turn8view1

イベントバス/Webhook/非同期連携

A2Aが成立しない、あるいは同期呼び出しが運用上不適の場合は、エージェント間を直接呼び出すのではなく、イベント駆動で分離する(例:

  • エージェントAがイベントを発行(Queue/Topic)
  • エージェントBがサブスクライブして処理
  • 結果をデータストアへ格納、またはWebhookで通知
    )。
    Foundry自体が多様な外部連携(ツール、HTTP、ワークフロー)を前提としているため、A2Aの代替としても整合する。ただし、この部分はFoundry A2A公式ドキュメントが直接規定する領域ではなく、一般的アーキテクチャとしての提案である(=本レポートでは“推奨設計パターン”としての位置づけに留める)。citeturn6view2turn21view2

参考情報

一次情報(公式ドキュメント/仕様/公式GitHub)を優先し、参照価値が高い順に整理する。URLは可読性のためコードブロックにまとめる(本文中の引用は各所の参照リンク=cite…で提示済み)。

【Microsoft Learn(Foundry / Agent Service)】 – A2A エージェント エンドポイントを Foundry Agent Service に追加する(プレビュー) https://learn.microsoft.com/ja-jp/azure/foundry/agents/how-to/tools/agent-to-agent – Agent2Agent (A2A) 認証 https://learn.microsoft.com/ja-jp/azure/foundry/agents/concepts/agent-to-agent-authentication – Foundry tool catalog(A2AツールがCustomに含まれる旨) https://learn.microsoft.com/en-us/azure/foundry/agents/concepts/tool-catalog – Microsoft Foundry REST リファレンス(A2APreviewToolパラメータ) https://learn.microsoft.com/ja-jp/azure/foundry/reference/foundry-project – Publish and share agents(Agent Application:Responses/Activity、APIキー非対応等) https://learn.microsoft.com/en-us/azure/foundry/agents/how-to/publish-agent – Foundry Agent Service の制限、クォータ、およびリージョンサポート https://learn.microsoft.com/ja-jp/azure/foundry/agents/concepts/limits-quotas-regions – ツールのベストプラクティス(トレース確認、機密情報非ログ等) https://learn.microsoft.com/ja-jp/azure/foundry/agents/concepts/tool-best-practice 【A2A仕様(プロトコル一次情報)】 – A2A Protocol Specification https://a2a-protocol.org/latest/ https://a2a-protocol.org/v0.3.0/specification/ – A2A Protocol Definitions(エンドポイント/メッセージスキーマ) https://a2a-protocol.org/latest/definitions/ 【公式GitHub(仕様・サンプル)】 – Agent2Agent (A2A) Protocol repo https://github.com/a2aproject/A2A – A2A Samples repo https://github.com/a2aproject/a2a-samples 【Microsoft Learn(Agent Framework:A2Aサーバーホスト例)】 – 手順 6: エージェントをホストする(A2A公開、MapA2AServer等の例示) https://learn.microsoft.com/ja-jp/agent-framework/get-started/hosting 【補助資料(注意:Q&Aは公式フォーラムだが“仕様確定”ではない)】 – Foundry→FoundryをA2Aで呼べない(Agent Card取得の設計制約)というAccepted Answer事例 https://learn.microsoft.com/en-au/answers/questions/5774138/how-to-set-permission-for-microsoft-foundry-to-cal

{
  "openapi": "3.1.0",
  "info": {
    "title": "JSONPlaceholder Minimal API",
    "version": "1.0.0",
    "description": "Minimal OpenAPI spec for Microsoft Foundry agent testing."
  },
  "servers": [
    {
      "url": "https://jsonplaceholder.typicode.com"
    }
  ],
  "paths": {
    "/posts/{id}": {
      "get": {
        "operationId": "get_post_by_id",
        "summary": "Get a post by ID",
        "description": "Retrieve a single demo post by its ID from JSONPlaceholder.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "The post ID.",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "userId": {
                      "type": "integer"
                    },
                    "id": {
                      "type": "integer"
                    },
                    "title": {
                      "type": "string"
                    },
                    "body": {
                      "type": "string"
                    }
                  },
                  "required": ["userId", "id", "title", "body"]
                }
              }
            }
          }
        }
      }
    }
  }
}

コメント

タイトルとURLをコピーしました