重要
この記事でマークされている項目 (プレビュー) は、現在パブリック プレビュー段階です。 このプレビューはサービス レベル アグリーメントなしで提供されており、運用環境のワークロードにはお勧めしません。 特定の機能がサポートされていないか、機能が制限されている可能性があります。 詳細については、「Microsoft Azure プレビューの使用条件を参照してください。
1 つのエージェントは、複数のツール (API、モデル コンテキスト プロトコル (MCP) サーバー、コネクタ、フロー) に依存できます。それぞれに独自の認証モデルと所有チームがあります。 組織全体でスケーリングすると、チームは同じツールを個別に再実装し、資格情報が重複し、ガバナンスに一貫性がなくなり、どのツールが存在するか、誰が使用しているのかをほとんど把握できなくなります。 開発者は、モデルが機能しないためではなく、ツールの統合がボトルネックになるため、ストールします。
企業には、ゲートウェイ、資格情報コンテナー、ポリシー、可観測性というインフラストラクチャが既に用意されています。 不足しているのは、このインフラストラクチャを再利用可能で検出可能なものにパッケージ化し、既定で管理する開発者エクスペリエンスです。
ツールボックスは、そのエクスペリエンスを提供します。 キュレーションされた一連のツールを 1 回定義し、Foundry で一元的に管理し、任意のエージェントが使用できる単一の MCP 互換エンドポイントを介して公開します。 プラットフォームは、実行時に資格情報の挿入、トークンの更新、およびエンタープライズ ポリシーの適用を処理します。
ツールボックスは、4 つの柱を通じてツールのライフサイクル全体をカバーします。 ビルド と 消費 は現在利用できます。
| 柱 | ステータス | それが可能にすること |
|---|---|---|
| ビルド | 本日ご利用いただけます | ツールを選択し、認証を一元的に構成し、任意のチームが使用できる再利用可能なツールボックスを発行します。 |
| 消費 | 本日ご利用いただけます | 任意のエージェントを単一の MCP 互換エンドポイントに接続して、ツールボックス内のすべてのツールを動的に検出して呼び出します。 |
Foundryアーキテクチャのツールボックスを示すダイアグラム: LangGraph、Microsoft Agent Framework、GitHub Copilot、Claude Code、およびMicrosoft Copilot Studioによって消費されるビルドと消費の柱は、デフォルト設定で管理されます。
Foundry でツールボックスを作成しますが、利用側のインターフェースは開いています。 MCP 互換のエージェント ランタイムまたはクライアントは、ツールボックス (任意のフレームワークで構築されたエージェント、MCP 対応 IDE、カスタム コードなど) を使用できます。
ツールボックスはマネージド リソースであるため、エージェントのコードを変更せずにツールを追加、削除、または再構成できます。 エージェントは常に 1 つのエンドポイントに接続します。 ツールボックスのバージョン管理では、変更が有効なタイミングを明示的に制御できます。新しいバージョンを作成してテストしてから、準備ができたら既定に昇格させます。 ツールボックスを指すすべてのエージェントは、昇格されたバージョンを自動的に取得します。コードの変更も再デプロイも行われません。
この記事では、次の方法について説明します。
- 1 つまたは複数のツールを使用してツールボックスを作成します。
- ツールボックス MCP エンドポイントを取得します。
- ツールが正しく読み込まれることを確認します。
- ツールボックスをホストされるエージェントに統合します。
- ツールボックスのバージョンを管理し、バージョンを既定に昇格します。
ツールの種類ごとのツール構成構文と認証オプションについては、「 ツールの構成」を参照してください。
機能のサポート
| 機能 | Python SDK | REST API | .NET SDK | JavaScript SDK | azd(デプロイ) | Foundry ツールキット |
|---|---|---|---|---|---|---|
| ツールボックスの更新、一覧表示、取得、削除 | ✔️ | ✔️ | ✔️ | ✔️ | N/a | ✔️ |
| ツールボックス バージョンの作成 | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| ツールボックスのバージョン一覧、取得、および削除 | ✔️ | ✔️ | ✔️ | ✔️ | N/a | いいえ。 UI には最新バージョンのみが表示されます。 |
| MCP ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Web 検索ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| Azure AI 検索 ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| コード インタープリター ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| ファイル検索ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
| OpenAPI ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | いいえ |
| エージェント同士 (A2A) ツール | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | いいえ |
前提 条件
- アクティブな Microsoft Foundry プロジェクト。
-
RBAC: Foundry プロジェクトの Azure AI User ロールを、シナリオに適用される各 ID に付与します。
- 開発者 (常に必要) — ツールボックスのバージョンを作成、更新、管理する ID。
- エージェント ID (ホストされたエージェントを使用する場合に必要) - 実行時にツールを呼び出すエージェントのマネージド ID。
- エンド ユーザー (OAuth フローにのみ必要) - OAuth または UserEntraToken 接続 (OAuth ベースの MCP や 1P OBO フローなど) を介して ID がプロキシされるユーザー。
- Foundry プロジェクトは、サポートされている リージョンのいずれかに存在する必要があります。 ツールボックス内の個々のツールの種類は、リージョンとモデルによってさらに制限されます。すべてのツールの種類が、すべてのリージョンまたはすべてのモデルで使用できるわけではありません。 「リージョンとモデルの互換性」を参照してください。
- Visual Studio Code (VS Code)。
- Visual Studio Code Marketplace から Microsoft Foundry Toolkit for Visual Studio Code (旧称 AI Toolkit for VS Code) をインストールします。 Foundry Toolkit でのツールボックスのサポートは現在プレビュー段階です。
-
Python SDK:
pip install azure-ai-projects azure-identity -
.NET SDK:
dotnet add package Azure.AI.Projects --prereleaseとdotnet add package Azure.Identity -
JavaScript SDK:
npm install @azure/ai-projects @azure/identity -
azd (deploy): Azure Developer CLI およびエージェント拡張機能をインストールします:
azd extension install azure.ai.agents
重要
- ツールボックスは、ツールの種類 (Web 検索、Azure AI 検索、コード インタープリター、ファイル検索) ごとに
フィールドを持たない最大 1 つのツールをサポートします。 同じツールの種類の複数のインスタンスを含めるには、各インスタンスに一意の nameを設定して区別します。nameなしで同じ型の 2 つのインスタンスを含めると、invalid_payloadエラーが返されます。 詳細については、「 複数のツールの種類」を参照してください。 - ツールボックス内のすべてのツールに
descriptionを追加して、モデルが要求ごとに適切なツールを選択できるようにします。 - 個々のツールのセットアップ、制限事項、警告の詳細については、各ツールのドキュメントを慎重に確認してください。
手順 1: ツールボックス バージョンを作成する
必要なツールに基づいてツールボックス バージョンを作成します。
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, WebSearchTool
# Create Foundry project client
endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(
endpoint=endpoint,
credential=DefaultAzureCredential(),
)
# Create toolbox version with web search and MCP tools
toolbox_version = project.beta.toolboxes.create_toolbox_version(
toolbox_name="my-toolbox",
description="Toolbox with web search and an MCP server",
tools=[
WebSearchTool(),
MCPTool(
server_label="myserver",
server_url="https://your-mcp-server.example.com",
require_approval="never",
project_connection_id="my-key-auth-connection",
),
],
)
print(f"Created toolbox: {toolbox_version.name}, version: {toolbox_version.version}")
using Azure.Identity;
using Azure.AI.Projects;
// Create Foundry project client
var projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";
AIProjectClient projectClient = new(new Uri(projectEndpoint), new DefaultAzureCredential());
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();
ProjectsAgentTool webTool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateWebSearchTool());
ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
serverLabel: "myserver",
serverUri: new Uri("https://your-mcp-server.example.com"),
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.NeverRequireApproval
)
));
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [webTool, mcpTool],
description: "Toolbox with web search and an MCP server"
);
Console.WriteLine($"Created toolbox: {toolboxVersion.Name}, version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Toolbox with web search and an MCP server",
"tools": [
{
"type": "web_search",
"description": "Search the web for current information"
},
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "never",
"project_connection_id": "my-key-auth-connection"
}
]
}
メモ
ベアラー トークンを取得するときに、トークン スコープ https://ai.azure.com/.default を使用します。
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
// Create Foundry project client
const projectEndpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>";
const project = new AIProjectClient(projectEndpoint, new DefaultAzureCredential());
const toolboxVersion = await project.beta.toolboxes.createVersion(
"my-toolbox",
[
{
type: "web_search",
description: "Search the web for current information",
},
{
type: "mcp",
server_label: "myserver",
server_url: "https://your-mcp-server.example.com",
require_approval: "never",
project_connection_id: "my-key-auth-connection",
},
],
{
description: "Toolbox with web search and an MCP server",
},
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);
Visual Studio Codeで Foundry Toolkit を使用して、Tools ビューからツールボックスを作成して発行します。
- アクティビティ バーで Foundry Toolkit を選択します。
- [ マイ リソース] で、[ プロジェクト名>Tools] を展開します。
- [+ ツールボックスの追加] アイコンを選択します。
- [ カスタム ツールボックスのビルド ] タブで、ツールボックスの名前と説明を入力し、目的のツールを追加して、[ 発行] を選択します。
新しいツールボックスを発行すると、最初のバージョンが作成されます。 そのバージョンは自動的に既定のバージョンになります。
azdを使用すると、SDK を呼び出す代わりに、agent.yaml ファイルでツールボックス リソースを宣言できます。
resources セクションでツールを定義し、azd ai agent initを使用してデプロイします。 各ツールの種類 agent.yaml 例については、「 ツールの構成」を参照してください。 完全なデプロイ ワークフローについては、「 azd を使用したデプロイ」を参照してください。
重要
-mには、--manifest (または) フラグがazd ai agent initです。
エージェント定義とソース ファイルを検索する場所をコマンドに指示します。
-m は、次のいずれかを指すことができます。
-
特定の
agent.yamlファイル — init はマニフェストと同じディレクトリからすべてのファイルをコピーします -
agent.yamlを含むフォルダー— init は、そのフォルダーからすべてのファイルをコピーします
マニフェスト ディレクトリ内のすべてのファイル (main.py、Dockerfile、requirements.txt、setup.py など) は、 src/<agent-name>/の下のスキャフォールディング されたプロジェクトにコピーされます。
# 1. Create a manifest directory with your agent.yaml + source files
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/
# 2. Initialize the azd project (note: -m is REQUIRED)
cd my-agent
$PROJECT_ID = "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m https://github.com/microsoft/hosted-agents-vnext-private-preview/main/samples/python/toolbox/azd/agent.yaml --project-id $PROJECT_ID -e my-env
# Or equivalently: azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# ↑ If your agent.yaml declares {{ param }} secrets (e.g., github_pat), you will be prompted to enter
# them interactively HERE — before init completes. This is the only safe time to supply credentials.
# NOTE: Do NOT use --no-prompt here — it skips the prompt and leaves {{ param }} credentials empty (see Troubleshooting: Credentials Empty with --no-prompt)
# 3. CRITICAL post-init fixes (see "Post-Init Checklist" below)
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env # must match the deployment name in azure.yaml
# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env
# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env
# 6. Invoke the agent (MUST run from the scaffolded project directory)
azd ai agent invoke --new-session "tell me about the latest news in Microsoft Foundry" --timeout 120
Agent.yaml:
kind: hosted
name: toolbox-azd-test
description: LangGraph agent wired for toolbox MCP.
metadata:
tags:
- AI Agent Hosting
- LangGraph
# template: contains the ContainerAgent definition (kind: hosted).
# These fields are used to generate src/<agent>/agent.yaml during init.
template:
kind: hosted
protocols:
- protocol: responses
version: 1.0.0
environment_variables:
# FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
# automatically by the platform at runtime — do NOT declare them here.
- name: AZURE_OPENAI_ENDPOINT
value: ${AZURE_OPENAI_ENDPOINT}
- name: AZURE_AI_MODEL_DEPLOYMENT_NAME
value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
- name: TOOLBOX_NAME
value: ${TOOLBOX_NAME=agent-tools}
# parameters: secret values prompted at init time (or set via azd env).
# azd uppercases the param name to find the env var: github_pat → GITHUB_PAT.
parameters:
github_pat:
secret: true
description: GitHub Personal Access Token (classic ghp_... or fine-grained github_pat_...)
# resources: connections and toolboxes scaffolded into azure.yaml by azd ai agent init.
resources:
- kind: connection
name: github-mcp-conn
target: https://api.githubcopilot.com/mcp
category: remoteTool
credentials:
type: CustomKeys
keys:
Authorization: "Bearer {{ github_pat }}"
- kind: toolbox
name: agent-tools
tools:
- type: web_search
- type: mcp
server_label: github
server_url: https://api.githubcopilot.com/mcp
project_connection_id: github-mcp-conn
手順 2: ツールボックス MCP エンドポイントを取得する
ロールに応じて、次の 2 つのエンドポイント パターンが存在します。
| 役割 | エンドポイント | 使用するタイミング |
|---|---|---|
| ツールボックス開発者 | {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 |
特定のバージョンを既定に昇格させる前に、テストまたは検証します。 |
| ツールボックス ユーザー | {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 |
エージェントをツールボックスに接続します。 常に default_versionが提供されます。 最初に作成するバージョンは、既定として自動的に設定されます。 |
重要
ツールボックス MCP エンドポイントに対するすべての要求には、ヘッダー Foundry-Features: Toolboxes=V1Previewが含まれている必要があります。 このヘッダーを省略する呼び出しは失敗します。 ツールボックス エンドポイントを呼び出すすべての HTTP クライアント、MCP トランスポート、SDK ラッパーに含めます。
メモ
新しいツールボックスの最初のバージョンは、自動的に default_version (v1) に昇格されます。 後で既定値を変更する必要がある場合は、「 バージョンを既定に昇格する」を参照してください。
Foundry Toolkit for Visual Studio Codeで、ツールボックス コンシューマー エンドポイントを Toolboxes ビューからコピーします。
- アクティビティ バーで Foundry Toolkit を選択します。
- [ マイ リソース] で、[ プロジェクト名>Tools] を展開します。
- [ツールボックス] タブ で 、ツールボックスを見つけます。
- [ エンドポイント URL ] 列で、エンドポイントをコピーします。
エンドポイント URL 値はツールボックス コンシューマー エンドポイントです。 バージョン固有のエンドポイントを構築するには、前の表に示した開発者パターンを使用します。
手順 3: ツールの可用性を確認する
完全なエージェントを実行する前に、エンドポイントに対して MCP クライアント SDK を使用して、ツールボックスによって予期されるツールが読み込まれることを確認します。 バージョンを既定に昇格させる前に、 バージョン固有のエンドポイント を使用してバージョンを検証します。
MCP クライアント SDK をインストールします。
pip install mcp
ツールボックスとリスト ツールに接続する
import asyncio
from azure.identity import DefaultAzureCredential
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
url = "https://<account>.services.ai.azure.com/api/projects/<proj>/toolboxes/<name>/versions/<version>/mcp?api-version=v1"
token = DefaultAzureCredential().get_token("https://ai.azure.com/.default").token
headers = {
"Authorization": f"Bearer {token}",
"Foundry-Features": "Toolboxes=V1Preview",
}
async def verify_toolbox():
async with streamablehttp_client(url, headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
# List available tools
tools_result = await session.list_tools()
print(f"Tools found: {len(tools_result.tools)}")
for tool in tools_result.tools:
print(f" - {tool.name}: {(tool.description or '')[:80]}")
# Call a tool (replace with actual tool name and arguments)
result = await session.call_tool("<tool_name>", arguments={})
print(result)
asyncio.run(verify_toolbox())
メモ
REST API タブを使用して、.NETからのツールの可用性を確認するか、Python MCP クライアント SDK を使用します。
バージョン固有のエンドポイント (/versions/{version}/mcp) を使用して、昇格する前にバージョンを検証します。
1. MCP セッションを初期化します。
POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"test","version":"1.0"}}}
2. 初期化された通知を送信します。
POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview
{"jsonrpc":"2.0","method":"notifications/initialized"}
3. 使用可能なツールを一覧表示します。
POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview
{"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}}
4. ツールを呼び出す:
POST {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Foundry-Features: Toolboxes=V1Preview
{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"<TOOL_NAME>","arguments":{}}}
MCP クライアント SDK をインストールします。
npm install @modelcontextprotocol/sdk
ツールボックスとリスト ツールに接続する
import { DefaultAzureCredential } from "@azure/identity";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
const url = "https://<account>.services.ai.azure.com/api/projects/<proj>/toolboxes/<name>/versions/<version>/mcp?api-version=v1";
const credential = new DefaultAzureCredential();
const token = await credential.getToken("https://ai.azure.com/.default");
const transport = new StreamableHTTPClientTransport(
new URL(url),
{
requestInit: {
headers: {
Authorization: `Bearer ${token.token}`,
"Foundry-Features": "Toolboxes=V1Preview",
},
},
},
);
const client = new Client({ name: "test", version: "1.0" });
await client.connect(transport);
// List available tools
const toolsResult = await client.listTools();
console.log(`Tools found: ${toolsResult.tools.length}`);
for (const tool of toolsResult.tools) {
console.log(` - ${tool.name}: ${(tool.description || "").slice(0, 80)}`);
}
// Call a tool (replace with actual tool name and arguments)
const result = await client.callTool({ name: "<tool_name>", arguments: {} });
console.log(result);
await client.close();
ステップ 2 のエンドポイントをスキャフォールディングされたホステッド エージェント サンプルと共に使用して、VS Code でのツールボックスの読み込みを検証します。
- Foundry Toolkit の [マイ リソース>プロジェクト名>Tools で、テストするツールボックスを見つけます。
- スキャフォールディング コード テンプレートを選択します。
- メッセージが表示されたら、プロジェクト フォルダーを選択します。
- 生成された
README.mdに従って依存関係をインストールし、環境変数を構成し、サンプルをローカルで実行します。 -
Agent Inspector を使用するか、
python main.pyを実行してツールボックス ツールの読み込みと応答を確認します。
新しいツールボックス バージョンを昇格させる前にバージョン固有の検証を行うには、この手順の [Pythonまたは REST API] タブを使用します。
メモ
[REST API] タブを使用してツールの可用性を確認するか、Python MCP クライアント SDK を使用します。
Check — initialize: HTTP 200。 初期化手順をスキップすると、後続の呼び出しは失敗します。
チェック — tools/list:
-
len(tools) > 0— 空は、ツールボックスのバージョンが正しくプロビジョニングされなかったことを意味します。 - 各ツールには、
name、description、およびinputSchemaがあります。 ツールの名前付け規則については、 MCP の仕様を参照してください。 -
inputSchemaにはpropertiesフィールドがあります (一部の MCP サーバーではこのフィールドが省略され、OpenAI が中断されます)。 - MCP ツールの場合、名前の前に
server_label(たとえば、myserver.some_tool) が付きます。 その他のすべてのツールの種類の名前は、nameフィールド値または既定のツール名です。 - MCP ツールには、
_meta.tool_configurationなどのランタイム設定を含むrequire_approvalブロックが含まれています。 「 ツールの承認要件を処理する」を参照してください。 - 呼び出しステップの正確なパラメーター名をメモします (たとえば、
queryとqueries)。
チェック - tools/call:
- 最上位レベルの
errorフィールドはありません。 存在する場合は、error.codeを調べます。 標準の MCP エラー コードについては、 MCP の仕様を参照してください。-
-32006→ OAuth の同意が必要です (error.messageから URL を抽出します)。 - その他のコード→サーバー側の障害です。
-
-
result.content[]には、"type": "text"を含むエントリが含まれています。これはツールの出力です。 - AI Search では、
result.structuredContent.documents[]を確認し、チャンクメタデータ (title、url、id、score) をチェックしてください。 - ファイル検索では、チャンクメタデータ (
result.content[].resource._meta、title、file_id、document_chunk_id、score) を確認します。 - Web Search の場合は、URL 引用の
result.content[].resource._meta.annotations[](type、url、title、start_index、end_index) を確認します。 - テキスト コンテンツ内の
"ServerError"を監視します。ツールは実行されましたが、内部エラーが発生します。
ツール固有の tools/call 引数の例:
| ツールの種類 | 引数 |
|---|---|
| AI 検索 | {"query": "search text"} |
| ファイル検索 | {"queries": ["search text"]} |
| コード インタープリター | {"code": "print(2 ** 100)"} |
| Web Search | {"search_query": "weather in seattle"} |
| A2A | {"message": {"parts": [{"type": "text", "text": "Hello"}]}} |
| MCP | {"query": "what is agent service"} |
手順 4: ツールボックスをエージェントに統合する
LangGraph
.env ファイル:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
main.py (キー パターン):
from langchain_azure_ai.tools import AzureAIProjectToolbox
toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()
完全な実装については、 完全なサンプル を参照してください。
重要
クラス langchain_azure_ai.tools.AzureAIProjectToolbox には langchain-azure-ai[tools]>1.2.3が必要です。
Microsoft Agent Framework
Agent Framework SDK の MCPStreamableHTTPTool を使用して、ツールボックス MCP エンドポイントに直接接続します。
.env ファイル:
FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
FOUNDRY_AGENT_TOOLBOX_FEATURES=Toolboxes=V1Preview
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
main.py (キー パターン):
# Auth: wrap token provider in an httpx.Auth subclass
credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://ai.azure.com/.default")
http_client = httpx.AsyncClient(
auth=_ToolboxAuth(token_provider),
headers={"Foundry-Features": "Toolboxes=V1Preview"},
timeout=120.0,
)
# Toolbox MCP endpoint (platform-injected at runtime via FOUNDRY_AGENT_TOOLBOX_ENDPOINT)
TOOLBOX_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1"
# Connect MCPStreamableHTTPTool to the toolbox endpoint
mcp_tool = MCPStreamableHTTPTool(
name="toolbox",
url=TOOLBOX_ENDPOINT,
http_client=http_client,
load_prompts=False,
)
agent = chat_client.as_agent(
name="my-toolbox-agent",
instructions="You are a helpful assistant with access to Foundry toolbox tools.",
tools=[mcp_tool],
)
ResponsesAgentServerHost().run()
完全な実装については、 完全なサンプル を参照してください。
Copilot SDK
GitHub Copilot SDK を使用して、Copilotのツール呼び出しを Foundry ツールボックス MCP エンドポイントにブリッジするツールボックスを利用したエージェントを構築します。
メモ
Copilot SDK は、ドットを含むツール名を拒否します。 ブリッジは、 . をツール名の _ に自動的に置き換えます。 たとえば、 myserver.get_info は myserver_get_infoになります。
.env ファイル:
GITHUB_TOKEN=<your-github-token>
FOUNDRY_AGENT_TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
agent.py (キー パターン — MCP ブリッジ):
# 1. Open an MCP session to the toolbox endpoint
bridge = McpBridge(endpoint=TOOLBOX_ENDPOINT, token=_get_toolbox_token())
await bridge.initialize()
mcp_tools = await bridge.list_tools()
# 2. Map MCP tool list to Copilot SDK tool definitions
# Dots in tool names are replaced with underscores (Copilot SDK requirement)
copilot_tools = [
{
"name": t["name"].replace(".", "_"),
"description": t.get("description", ""),
"parameters": t.get("inputSchema", {}),
}
for t in mcp_tools
]
# 3. Wire tool calls back to the MCP session
async def tool_handler(name: str, arguments: dict) -> str:
return await bridge.call_tool(name.replace("_", ".", 1), arguments)
# 4. Run the Copilot SDK agent
agent = Agent(
tools=copilot_tools,
tool_handler=tool_handler,
token=os.environ["GITHUB_TOKEN"],
)
完全な実装については、 完全なサンプル を参照してください。
Microsoft Agent Framework
カスタム ResponsesServerと共に Agent Framework SDK のToolboxMcpClientを使用して、MCP エンドポイントを介してツールボックス ツールを検出して呼び出します。
環境変数:
AZURE_OPENAI_ENDPOINT=https://<account>.services.ai.azure.com
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
TOOLBOX_MCP_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
Program.cs (キー パターン):
using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;
// Azure OpenAI endpoint and model deployment
var openAiEndpoint = "https://<account>.services.ai.azure.com";
var deployment = "gpt-4o"; // supports all toolbox tool types
// Toolbox MCP endpoint (platform-injected at runtime via TOOLBOX_MCP_ENDPOINT)
var toolboxEndpoint = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1";
// Azure OpenAI client
var credential = new DefaultAzureCredential();
var openAIClient = new AzureOpenAIClient(new Uri(openAiEndpoint), credential);
var chatClient = openAIClient.GetChatClient(deployment);
// Toolbox MCP client — discovers tools via tools/list, calls them via tools/call
var toolboxClient = new ToolboxMcpClient(toolboxEndpoint, credential);
ResponsesServer.Run<ToolboxHandler>(configure: builder =>
{
builder.Services.AddSingleton(new AgentConfig(chatClient, toolboxClient));
});
ToolboxMcpClient は、MCP エンドポイントへの直接 JSON-RPC 呼び出しをラップします。
ToolboxHandler は、標準のツール呼び出しループを使用して LLM ツールの呼び出しを MCP クライアントに接続します。 両方のクラスの完全な実装については、 完全なサンプルを参照してください。
メモ
この手順の統合サンプルは、Pythonと.NETでのみ使用できます。
メモ
この手順の統合サンプルは、Pythonと.NETでのみ使用できます。
Foundry Toolkit を使用して、ツールボックスに既にワイヤードされているホストされたエージェント サンプルをスキャフォールディングします。
- アクティビティ バーで Foundry Toolkit を選択します。
- [ マイ リソース] で、[ プロジェクト名>Tools] を展開します。
- [ ツールボックス ] タブで、使用するツールボックスを見つけて、[ スキャフォールディング コード テンプレート] を選択します。
- コマンド パレットで、メッセージが表示されたらプロジェクト フォルダーを選択します。
- 生成された
README.mdを開き、スキャフォールディングのセットアップ、ローカル実行、デプロイの手順に従います。
生成されたプロジェクトには、ホストされたエージェント エントリ ポイント、デプロイ ファイル、および正確なセットアップ、実行、およびデプロイの手順を含む README.md が含まれます。 スキャフォールディングされたエージェントが、Foundry-Features: Toolboxes=V1Preview ヘッダーを処理します。
新しいサンプルを生成する代わりに、ツールボックスを既存のホステッド エージェント プロジェクトに統合する場合は、手順 2 でコピーしたエンドポイントを、このセクションのPythonまたは.NETパターンと共に使用します。
azd を使用したデプロイ
Azure Developer CLI (azd) を使用して、ツールボックス リソースを agent.yaml ファイルに直接宣言し、1 つのコマンドでエージェントをデプロイします。 この方法を使用すると、SDK または REST を使用してツールボックスを個別に作成する必要はありません。
azd では、ツールボックス、接続、モデルのデプロイが一緒にプロビジョニングされます。
重要
-mには、--manifest (またはazd ai agent init) フラグが必要です。 エージェント定義とソース ファイルを検索する場所をコマンドに指示します。
-m は、特定の agent.yaml ファイルまたはファイルを含むフォルダーを指すことができます。 マニフェスト ディレクトリ内のすべてのファイル (main.py、 Dockerfile、 requirements.txtなど) は、 src/<agent-name>/の下のスキャフォールディングされたプロジェクトに逐語的にコピーされます。
フォルダー構造:
my-agent/
├── agent.yaml # Agent, toolbox, and connection declarations
├── main.py # LangGraph agent
├── requirements.txt # All dependencies (Azure SDK + PyPI packages)
├── Dockerfile # Container build
agent.yaml (Web Search + GitHub MCP の例):
name: my-toolbox-agent
description: LangGraph agent with Azure AI Foundry toolbox MCP.
metadata:
tags:
- AI Agent Hosting
- LangGraph
template:
name: my-toolbox-agent
kind: hosted
protocols:
- protocol: responses
version: 1.0.0
environment_variables:
# FOUNDRY_PROJECT_ENDPOINT and FOUNDRY_AGENT_TOOLBOX_* are injected
# automatically by the platform at runtime — do NOT declare them here.
- name: AZURE_AI_MODEL_DEPLOYMENT_NAME
value: ${AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o}
- name: TOOLBOX_NAME
value: ${TOOLBOX_NAME=agent-tools}
parameters:
github_pat:
secret: true
description: GitHub Personal Access Token for MCP connection
resources:
- kind: connection
name: github-mcp-conn
target: https://api.githubcopilot.com/mcp
category: RemoteTool
authType: CustomKeys
credentials:
keys:
Authorization: "Bearer {{ github_pat }}"
- kind: toolbox
name: agent-tools
description: Web search and GitHub MCP tools
tools:
- type: web_search
- type: mcp
server_label: github
server_url: https://api.githubcopilot.com/mcp
project_connection_id: github-mcp-conn
メモ
agent.yamlでツールボックス リソースを使用してデプロイすると、プラットフォームは環境変数としてFOUNDRY_AGENT_TOOLBOX_ENDPOINT (ベース URL) とTOOLBOX_{toolbox_name}_MCP_ENDPOINT (ツールボックスごとの完全なエンドポイント) を挿入します。
agent-toolsという名前のツールボックスの場合、ツールボックスごとの変数はTOOLBOX_AGENT_TOOLS_MCP_ENDPOINTになります。
main.pyは、ツールボックスごとの変数を読み取るか、実行時にFOUNDRY_AGENT_TOOLBOX_ENDPOINTとTOOLBOX_NAMEから URL を構築します。
main.py は、前に示したのと同じ LangGraph パターンに従います。
azdを使用すると、FOUNDRY_AGENT_TOOLBOX_ENDPOINTとTOOLBOX_{toolbox_name}_MCP_ENDPOINTが自動的に挿入されます。コードに追加のエンドポイント構成は必要ありません。
デプロイ:
# 1. Place agent.yaml and source files in a manifest directory
mkdir my-agent/manifest
# Copy agent.yaml, main.py, Dockerfile, requirements.txt into my-agent/manifest/
# 2. Initialize the azd project (-m is required)
cd my-agent
PROJECT_ID="/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.CognitiveServices/accounts/<account>/projects/<project>"
azd ai agent init -m manifest/ --project-id $PROJECT_ID -e my-env
# If agent.yaml declares {{ param }} secrets (for example, github_pat), you are prompted
# to enter them interactively here. Do NOT use --no-prompt — it leaves credentials empty.
# 3. Set required environment variables
azd env set enableHostedAgentVNext "true" -e my-env
azd env set AZURE_AI_MODEL_DEPLOYMENT_NAME "gpt-4o" -e my-env
# 4. Provision infrastructure (creates connections via Bicep)
azd provision -e my-env
# 5. Deploy agent (creates toolboxes, container image, agent version)
azd deploy -e my-env
# 6. Invoke the agent
azd ai agent invoke --new-session "Hello, what tools do you have?" --timeout 120
ツールの承認要件を処理する
ツールボックスは、_meta.tool_configurationによって返されるすべてのツール エントリにtools/list オブジェクトを返します。 ツールがrequire_approvalに設定"always"場合、エージェント ランタイムは保留中のアクションをユーザーに提示し、確認を待ってからツールを呼び出す必要があります。 MCP エンドポイントはをブロックtools/call。適用はエージェント ランタイムの責任です。
tools/list から require_approval を読み取る
tools/list応答の各ツール エントリには、ツールボックスによって返される_meta ブロックが含まれます。
{
"name": "myserver.my_tool",
"description": "...",
"inputSchema": { "type": "object" },
"_meta": {
"tool_configuration": {
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "always"
}
}
}
require_approval 値 |
動作 |
|---|---|
"always" |
エージェントは、呼び出しのたびにユーザーに確認を求める必要があります。 |
"never" |
エージェントはツールを自由に呼び出すことができます。 |
承認ゲートを実装する (LangGraph)
起動時に tools/list クエリを実行して承認マップを作成し、承認が必要なツールの制約をシステム プロンプトに挿入します。
async def _fetch_require_approval_tools(
endpoint: str,
auth: httpx.Auth,
extra_headers: dict,
) -> dict[str, str]:
async with httpx.AsyncClient(auth=auth, headers=extra_headers, timeout=30.0) as hc:
payload = {"jsonrpc": "2.0", "id": 1, "method": "tools/list", "params": {}}
resp = await hc.post(endpoint, json=payload)
resp.raise_for_status()
return {
t["name"]: t["_meta"]["tool_configuration"]["require_approval"]
for t in resp.json().get("result", {}).get("tools", [])
if t.get("_meta", {}).get("tool_configuration", {}).get("require_approval")
}
MCP クライアントからツールを読み込んだ後、承認が必要なツールを検出し、システム プロンプトを調整します。
approval_map = await _fetch_require_approval_tools(
TOOLBOX_ENDPOINT, toolbox_auth, extra_headers
)
always_approval = [name for name, val in approval_map.items() if val == "always"]
メモ
- 検出は起動時に発生します。 承認チェックは、エージェントの初期化時に 1 回実行されます。 呼び出しごとにオーバーヘッドは発生しません。
- 優雅な代替策。
require_approval: "always"ツールがない場合、システム プロンプトは変更されず、エージェントは以前と同様に動作します。 -
require_approvalはエージェントによって強制されます。 ツールボックス MCP プロキシは、この設定に関係なくtools/call実行されます。 エージェント ランタイムは、呼び出しを管理する役割を担っています。
ツールで require_approval を構成する
ツールボックス バージョンを作成するときに require_approval を設定します。
手順 1 の MCP ツールの例は、"always"値と"never"値の両方を示しています。 SDK を使用して設定することもできます。
from azure.ai.projects.models import MCPTool
# Set require_approval on an MCP tool
toolbox_version = project.beta.toolboxes.create_toolbox_version(
toolbox_name="my-toolbox",
tools=[
MCPTool(
server_label="myserver",
server_url="https://your-mcp-server.example.com",
require_approval="always", # "always" | "never"
project_connection_id="my-connection",
)
],
)
{
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "always",
"project_connection_id": "my-connection"
}
]
}
ProjectsAgentTool mcpTool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
serverLabel: "myserver",
serverUri: new Uri("https://your-mcp-server.example.com"),
toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
)
));
const tools = [
{
type: "mcp",
server_label: "myserver",
server_url: "https://your-mcp-server.example.com",
require_approval: "always",
project_connection_id: "my-connection",
},
];
Python、.NET、JavaScript、REST API、または azd タブを使用して、ツールボックス定義で require_approval を構成します。 この記事の Foundry Toolkit ワークフローでは、Visual Studio Codeでツールボックスを作成して使用することに重点を置いています。
resources:
- kind: toolbox
name: my-toolbox
tools:
- type: mcp
server_label: myserver
server_url: https://your-mcp-server.example.com
require_approval: always
project_connection_id: my-connection
手順 5: ツールボックスのバージョンを管理する
メモ
ツールボックスのバージョン (リスト、取得、昇格、削除) は、Python SDK、.NET SDK、JavaScript SDK、REST API を使用して管理できます。 azd CLI では、デプロイ時のツールボックス バージョンの作成のみがサポートされます。
ツールボックスのバージョンは、ツールボックスのツール構成の変更できないスナップショットです。 作成エンドポイントを呼び出すたびに、新しい ToolboxVersionObjectが生成されます。 親 ToolboxObject には、MCP エンドポイントが提供するバージョンを制御する default_version フィールドがあります。 新しいバージョンを作成しても自動的には昇格されません。 default_versionを更新するタイミングを決定します。 このプロセスにより、変更をステージングし、新しいバージョンを個別にテストし、独自のスケジュールで運用環境に昇格できます。
| オブジェクト | キー フィールド | 説明 |
|---|---|---|
ToolboxObject |
id、 name、 default_version |
ツールボックス コンテナー。
default_version はアクティブなバージョンを指します。 |
ToolboxVersionObject |
id、 name、 version、 description、 created_at、 tools[]、 policies |
ある時点でのツールボックスのツール リストの変更できないスナップショット。 |
新しいバージョンを作成する
作成呼び出しごとに新しいバージョンが生成されます。 ツールボックスがまだ存在しない場合は、プロセスによって自動的に作成されます。 新しいツールボックスの最初のバージョンを作成すると、v1が既定のバージョンとして設定され、手動で別のバージョンに更新するまで使用されます。
# Create a new toolbox version
toolbox_version = project.beta.toolboxes.create_toolbox_version(
toolbox_name="my-toolbox",
description="Updated tools v2",
tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");
POST {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"description": "Updated tools v2",
"tools": [...]
}
const toolboxVersion = await project.beta.toolboxes.createVersion(
"my-toolbox",
[/* tools array */],
{ description: "Updated tools v2" },
);
console.log(`Created version: ${toolboxVersion.version}`);
Python、.NET、JavaScript、または REST API タブを使用して、新しいツールボックス バージョンを作成します。 この記事の Foundry Toolkit ワークフローでは、ツールボックスを作成し、それを使用するホストされたエージェントをスキャフォールディングすることに重点を置いています。
この操作は azd ではサポートされていません。 ツールボックスバージョンを作成するには、Python、.NET、REST API、または JavaScript タブを使用します。
応答は、新しいversion識別子を含むToolboxVersionObjectです。
バージョンを一覧表示する
# List all toolbox versions
versions = list(project.beta.toolboxes.list_toolbox_versions(toolbox_name="my-toolbox"))
for v in versions:
print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
.GetToolboxVersionsAsync("my-toolbox")
.ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
Console.WriteLine($" - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/my-toolbox/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.beta.toolboxes.listVersions("my-toolbox");
for await (const v of versions) {
console.log(`${v.version} — created ${v.createdAt}`);
}
Python、.NET、JavaScript、または REST API タブを使用して、ツールボックスのバージョンを一覧表示します。
この操作は azd ではサポートされていません。 ツールボックスのバージョンを一覧表示するには、Python、.NET、REST API、または JavaScript タブを使用します。
特定のバージョンを取得する
# Get a specific toolbox version
version_obj = project.beta.toolboxes.get_toolbox_version(
toolbox_name="my-toolbox",
version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
"my-toolbox",
"<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.beta.toolboxes.getVersion(
"my-toolbox",
"<version_id>",
);
console.log(`Retrieved version: ${versionObj.version}`);
Python、.NET、JavaScript、または REST API タブを使用して、特定のツールボックス バージョンを取得します。
この操作は azd ではサポートされていません。 特定のツールボックスバージョンを取得するには、Python、.NET、REST API、または JavaScript タブを使用します。
バージョンを既定に昇格させる
MCP エンドポイントは常に default_versionを提供します。 アクティブなバージョンを切り替えるには、ツールボックスを更新します。
# Promote a version to default
toolbox = project.beta.toolboxes.update(
toolbox_name="my-toolbox",
default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
"my-toolbox",
"<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/my-toolbox?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
{
"default_version": "<version_id>"
}
default_version を空にすることはできません。 新しいバージョンに置き換えます。
const toolbox = await project.beta.toolboxes.update(
"my-toolbox",
"<version_id>",
);
console.log(`Active version: ${toolbox.defaultVersion}`);
ツールボックスのバージョンを既定に昇格するには、Python、.NET、JavaScript、または REST API タブを使用します。
この操作は azd ではサポートされていません。 バージョンを既定に昇格するには、Python、.NET、REST API、または JavaScript タブを使用します。
バージョンを削除する
# Delete a toolbox version
project.beta.toolboxes.delete_toolbox_version(
toolbox_name="my-toolbox",
version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
"my-toolbox",
"<version_id>"
);
DELETE {project_endpoint}/toolboxes/my-toolbox/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.beta.toolboxes.deleteVersion(
"my-toolbox",
"<version_id>",
);
ツールボックスのバージョンを削除するには、Python、.NET、JavaScript、または REST API タブを使用します。
この操作は azd ではサポートされていません。 ツールボックスのバージョンを削除するには、Python、.NET、REST API、または JavaScript タブを使用します。
ツールの構成
シナリオに合ったツールの種類と認証パターンを選択します。 お好みの SDK またはデプロイ方法のタブを選択します。
複数のツールの種類
1 つのツールボックスで、さまざまな種類のツールをバンドルできます。 次の例では、Web Search、Azure AI 検索、MCP サーバーを 1 つのツールボックスに結合します。
{
"description": "Web search, knowledge base search, and custom MCP server",
"tools": [
{
"type": "web_search",
"description": "Search the web for current information"
},
{
"type": "azure_ai_search",
"name": "my_aisearch",
"description": "Search internal product documentation",
"azure_ai_search": {
"indexes": [
{
"index_name": "<INDEX_NAME>",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
},
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"require_approval": "never",
"project_connection_id": "my-key-auth-connection"
}
]
}
メモ
各ツールの種類 (web_search、 azure_ai_search、 code_interpreter、 file_search) は、 name フィールドなしで最大で 1 回表示できます。 同じ型の複数のインスタンスを含めるには、各インスタンスに一意の name を設定します。次の例を参照してください。
マルチツールの制限
ツールボックスには、 name フィールドを使用せずに、組み込みツールの種類ごとに最大 1 つのインスタンスを含めることができます。
nameなしで同じ型の 2 つのインスタンスを含める場合、API は次を返します。
400 invalid_payload: Multiple tools without identifiers found...
同じツールの種類の 2 つのインスタンス
name フィールドを使用して、同じツールの種類の複数のインスタンスを 1 つのツールボックスに含めます。 各名前付きインスタンスは個別のツールとして扱われ、一意の名前が必要です。
{
"description": "Two Azure AI Search indexes in a single toolbox",
"tools": [
{
"type": "azure_ai_search",
"name": "product-search",
"description": "Search product catalog and specifications",
"azure_ai_search": {
"indexes": [
{
"index_name": "<PRODUCT_INDEX_NAME>",
"project_connection_id": "<PRODUCT_CONNECTION_NAME>"
}
]
}
},
{
"type": "azure_ai_search",
"name": "support-search",
"description": "Search support tickets and troubleshooting guides",
"azure_ai_search": {
"indexes": [
{
"index_name": "<SUPPORT_INDEX_NAME>",
"project_connection_id": "<SUPPORT_CONNECTION_NAME>"
}
]
}
}
]
}
次のセクションでは、各ツールの種類の構成について詳しく説明します。
モデル コンテキスト プロトコル (MCP)
キーベースの認証:
{
"description": "my-mcp-toolbox",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"project_connection_id": "my-mcp-connection"
}
]
}
認証なし (パブリック MCP サーバー):
{
"description": "Public MCP server",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com"
}
]
}
OAuth または ID ベースの認証:
OAuth (マネージド コネクタ、カスタム アプリ登録)、エージェント ID、またはユーザー Entra トークン認証の場合は、まず Foundry プロジェクトに適切な接続を作成してから、 project_connection_idで参照します。
{
"description": "MCP server with OAuth/identity auth",
"tools": [
{
"type": "mcp",
"server_label": "myserver",
"server_url": "https://your-mcp-server.example.com",
"project_connection_id": "<OAUTH_OR_IDENTITY_CONNECTION_NAME>"
}
]
}
接続の authType によって認証フローが決まります。 MCP でサポートされている接続認証の種類には、 CustomKeys、 OAuth2 (マネージドまたはカスタム)、 AgenticIdentity、および UserEntraTokenが含まれます。 各認証の種類の接続構成例については、 azd タブ を参照してください。
from azure.ai.projects.models import MCPTool
tools = [
MCPTool(
server_label="myserver",
server_url="https://your-mcp-server.example.com",
project_connection_id="my-mcp-connection",
)
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(ResponseTool.CreateMcpTool(
serverLabel: "myserver",
serverUri: new Uri("https://your-mcp-server.example.com")
));
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "my-mcp-toolbox"
);
const tools = [
{
type: "mcp",
server_label: "myserver",
server_url: "https://your-mcp-server.example.com",
project_connection_id: "my-mcp-connection",
},
];
認証なし:
resources:
- kind: toolbox
name: mcp-tools
description: Public MCP server tools
tools:
- type: mcp
server_label: myserver
server_url: https://your-mcp-server.example.com
キーベースの認証:
parameters:
mcp_api_key:
secret: true
description: API key for the MCP server
resources:
- kind: connection
name: mcp-conn
target: https://your-mcp-server.example.com
category: RemoteTool
authType: CustomKeys
credentials:
keys:
Authorization: "Bearer {{ mcp_api_key }}"
- kind: toolbox
name: mcp-tools
description: MCP server tools with key auth
tools:
- type: mcp
server_label: myserver
server_url: https://your-mcp-server.example.com
project_connection_id: mcp-conn
OAuth - マネージド コネクタ:
Foundry のマネージド OAuth フローをサポートする MCP サーバーには、このパターンを使用します。
connectorName値は、Foundry Tools カタログで使用できるマネージド コネクタと一致する必要があります。
resources:
- kind: connection
name: github-oauth-conn
category: RemoteTool
authType: OAuth2
target: https://api.githubcopilot.com/mcp
connectorName: foundrygithubmcp
- kind: toolbox
name: oauth-tools
description: GitHub OAuth MCP toolbox
tools:
- type: mcp
server_label: github
project_connection_id: github-oauth-conn
OAuth - カスタム アプリの登録:
このパターンは、MCP サーバー用に独自の OAuth アプリ登録を行う場合に使用します。
parameters:
oauth_client_id:
secret: true
description: OAuth client ID
oauth_client_secret:
secret: true
description: OAuth client secret
resources:
- kind: connection
name: mcp-oauth-custom-conn
category: RemoteTool
authType: OAuth2
target: https://your-mcp-server.example.com
authorizationUrl: https://auth.example.com/authorize
tokenUrl: https://auth.example.com/token
refreshUrl: https://auth.example.com/token
scopes: []
credentials:
clientID: "{{ oauth_client_id }}"
clientSecret: "{{ oauth_client_secret }}"
- kind: toolbox
name: oauth-custom-tools
description: MCP toolbox with custom OAuth
tools:
- type: mcp
server_label: myserver
project_connection_id: mcp-oauth-custom-conn
エージェント ID (Entra ID):
このパターンは、Microsoft Entra ID認証をサポートする MCP サーバーに使用します。 Foundry エージェント ID は、ターゲット リソースに対して認証を行います。
resources:
- kind: connection
name: language-mcp
category: RemoteTool
authType: AgenticIdentity
audience: <entra-audience>
target: https://<resource>.cognitiveservices.azure.com/language/mcp?api-version=2025-11-15-preview
- kind: toolbox
name: agent-identity-tools
description: MCP toolbox with agent identity auth
tools:
- type: mcp
server_label: language
project_connection_id: language-mcp
メモ
MCP サーバーが要求を受け入れる前に、エージェント ID にターゲット リソースに必要な RBAC ロールを割り当てる必要があります。
ユーザー Entra トークン (1P OBO):
このパターンは、オンビーハーフ・オブ (OBO) フローを介してユーザー ID を必要とする MCP サーバーに使用します。 Foundry は、ユーザーの Entra トークンを MCP サーバーにプロキシします。
resources:
- kind: connection
name: workiq-mail-conn
category: RemoteTool
authType: UserEntraToken
audience: <entra-app-id>
target: https://agent365.svc.cloud.microsoft/agents/servers/mcp_MailTools
- kind: toolbox
name: workiq-tools
description: MCP toolbox with user Entra token auth
tools:
- type: mcp
server_label: workiq
project_connection_id: workiq-mail-conn
メモ
audience接続には、UserEntraToken フィールドが必要です。 これを指定しないと、 tools/list は 0 個のツールを返します。
重要
ユーザーがプロジェクトで OAuth ベースの MCP を使用してツールボックスを初めて呼び出した場合、MCP エンドポイントは同意 URL を持つ CONSENT_REQUIRED エラー (コード -32006) を返します。
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
このエラーは想定されています。 ブラウザーで同意 URL を開き、OAuth 承認フローを完了してから、エージェントの呼び出しを再試行します。 後続の呼び出しは、再プロンプトを表示せずに成功します。
Web 検索
重要
- Web Search では、Bing 検索のグラウンディングと Bing Custom Search のグラウンディングが使用されます。これらは、First Party Consumption Services というサービスに該当し、これらのBingの使用条件およびMicrosoft プライバシーに関する声明によって管理されます。
- Microsoft Data Protection Addendum は、Bing 検索や Bing Custom Search 経由でグラウンディングに送信されるデータには適用されません。 Bing検索とBingカスタム検索におけるグラウンド処理機能を使用する場合、データ転送はコンプライアンスおよび地理的境界を超えて発生します。
- Bing でのグラウンディング検索および Bing カスタム検索でのグラウンディングの使用にはコストがかかります。 詳細については 、価格 を参照してください。
- 管理者が Web 検索の使用に対するアクセスを管理する方法については、「管理」セクションAzure参照してください。
このパターンを使用して、Web 検索を追加します。 Bingを使用した Grounding を使用した Web 検索には、プロジェクト接続は必要ありません。 カスタム Bing Search インスタンスで Grounding を使用するには、Bing Custom Search 接続を使用して Grounding を指す web_search.custom_search_configuration オブジェクトを追加します。
{
"description": "Built-in web search",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>"
}
]
}
Bing カスタム検索コネクションによるグラウンディングの場合:
{
"description": "Custom Bing Search instance",
"tools": [
{
"type": "web_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"web_search": {
"custom_search_configuration": {
"project_connection_id": "<BING_CONNECTION_NAME>",
"instance_name": "<BING_INSTANCE_NAME>"
}
}
}
]
}
from azure.ai.projects.models import WebSearchTool
tools = [
WebSearchTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateWebSearchTool()
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Built-in web search"
);
const tools = [
{
type: "web_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
},
];
resources:
- kind: toolbox
name: websearch-tools
description: Web search toolbox
tools:
- type: web_search
Bing Custom Search を使用したグラウンディングの場合:
parameters:
bing_api_key:
secret: true
description: Bing API key
resources:
- kind: connection
name: bing-custom-conn
category: GroundingWithCustomSearch
authType: ApiKey
target: ""
credentials:
key: "{{ bing_api_key }}"
metadata:
ResourceId: /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.Bing/accounts/<bing-account>
type: bing_custom_search
- kind: toolbox
name: bing-custom-tools
description: Bing Custom Search toolbox
tools:
- type: bing_custom_search
custom_search_configuration:
instance_name: your-bing-custom-instance
project_connection_id: bing-custom-conn
メモ
Web Search が MCP 経由で結果を返す場合、応答は、インライン Markdown ソース リンクを含む合成された回答を含む resource コンテンツ項目です。 URL の引用は content[].resource._meta.annotations[]。 例えば:
{
"jsonrpc": "2.0",
"id": "ws-call-1",
"result": {
"_meta": {
"tool_configuration": {
"type": "web_search",
"name": "web-search-default"
}
},
"content": [
{
"type": "resource",
"resource": {
"uri": "about:web-search-answer",
"mimeType": "text/plain",
"text": "Here are the latest updates on Azure OpenAI Service...\n\n- **GPT-image-1 Release (January 7, 2026)** Microsoft introduced GPT-image-1 ([serverless-solutions.com](https://...)).\n\n..."
},
"annotations": {
"audience": ["assistant"]
},
"_meta": {
"annotations": [
{
"type": "url_citation",
"url": "https://www.serverless-solutions.com/blog/...",
"title": "Microsoft Expands Azure AI Foundry with Powerful New OpenAI Models",
"start_index": 741,
"end_index": 879
}
],
"action": {
"type": "search",
"query": "Azure OpenAI service updates 2026",
"queries": ["Azure OpenAI service updates 2026"]
},
"response_id": "resp_001fcebcc300..."
}
}
],
"isError": false
}
}
Azure AI 検索
{
"description": "Azure AI Search over my data",
"tools": [
{
"type": "azure_ai_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"azure_ai_search": {
"indexes": [
{
"index_name": "<INDEX_NAME>",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
}
]
}
from azure.ai.projects.models import AzureAISearchTool
tools = [
AzureAISearchTool(
index_name="<INDEX_NAME>",
project_connection_id="<CONNECTION_NAME>",
)
]
ProjectsAgentTool tool = new AzureAISearchTool(
new AzureAISearchToolOptions(
indexes: [
new AzureAISearchIndexResource(
indexName: "<INDEX_NAME>",
projectConnectionId: "<CONNECTION_NAME>"
)
]
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Azure AI Search over my data"
);
const tools = [
{
type: "azure_ai_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
azure_ai_search: {
indexes: [
{
index_name: "<INDEX_NAME>",
project_connection_id: "<CONNECTION_NAME>",
},
],
},
},
];
parameters:
ai_search_key:
secret: true
description: Azure AI Search admin key
resources:
- kind: connection
name: aisearch-conn
category: CognitiveSearch
authType: ApiKey
target: https://your-search-service.search.windows.net/
credentials:
key: "{{ ai_search_key }}"
- kind: toolbox
name: search-tools
description: Azure AI Search toolbox
tools:
- type: azure_ai_search
index_name: your-index-name
project_connection_id: aisearch-conn
ツール パラメーターの構成
| Azure AI 検索 ツール パラメーター | 必須 | ノート |
|---|---|---|
project_connection_id |
はい | Azure AI 検索へのプロジェクト接続のリソース ID。 |
index_name |
はい | Azure AI 検索 リソース内のインデックスの名前。 |
top_k |
いいえ | 既定値は 5 です。 |
query_type |
いいえ | 既定値は vector_semantic_hybrid です。 サポートされている値: simple、 vector、 semantic、 vector_simple_hybrid、 vector_semantic_hybrid。 |
filter |
いいえ | エージェントがインデックスに対して行うすべてのクエリに適用されます。 |
検索結果には、チャンク メタデータが result.structuredContent.documents[]に含まれます。 各ドキュメントには、アプリケーションで引用文献の詳細を生成するために使用できる title、 url、 id、および score フィールドが含まれています。
コード インタープリター
エージェントがコードを記述して実行できるようにするには、このパターンPython使用します。 このパターンでは、プロジェクト接続や追加の構成は必要ありません。
コード インタープリターで使用するファイルをアップロードするには、POST {project_endpoint}/openai/v1/filesを使用してpurpose=assistantsを呼び出します。 返されるファイル ID は、ツール構成で <FILE_ID> として指定した値です。 完全なアップロードの例については、 コード インタープリター を参照してください。
重要
ホストされているエージェントのツールボックスを介してコード インタープリターを使用する場合、 ユーザーの分離はサポートされません。 同じプロジェクト内のすべてのユーザーが同じコンテナー コンテキストを共有します。
{
"description": "Code interpreter for data analysis",
"tools": [
{
"type": "code_interpreter",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"container": {
"type": "auto",
"file_ids": ["<FILE_ID>"]
}
}
]
}
from azure.ai.projects.models import CodeInterpreterTool
tools = [
CodeInterpreterTool()
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateCodeInterpreterTool(
new CodeInterpreterToolContainer()
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Code interpreter for data analysis"
);
const tools = [
{
type: "code_interpreter",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
container: {
type: "auto",
file_ids: ["<FILE_ID>"],
},
},
];
resources:
- kind: toolbox
name: codeinterp-tools
description: Code interpreter toolbox
tools:
- type: code_interpreter
コード インタープリターから出力ファイルをダウンロードする
コード インタープリターが出力ファイル (生成された CSV やグラフなど) を生成する場合は、次の手順に従って一覧表示してダウンロードします。
手順 1: Container API を使用してファイルを一覧表示する
container_id応答のcontent[]._meta.container_idからtools/callを抽出し、Container Files API を呼び出してコンテナー内のすべてのファイルを一覧表示します。
GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}
応答は、名前と ID を含むファイルの一覧を返します。
手順 2: File API を使用してファイルをダウンロードする
手順 1 で返されたファイル名を使用して、 File API ダウンロード エンドポイントを使用してファイルをダウンロードします。
ファイル検索
このパターンを使用して、エージェントがベクター ストアに格納されているアップロードされたファイルを検索できるようにします。 Foundry プロジェクトで既に作成されているベクター ストアを参照する vector_store_ids を指定します。
ファイルとベクター ストアを作成するには、 {project_endpoint}/openai/v1 API を使用します。
- ファイルをアップロードする:
purpose=assistantsでPOST {project_endpoint}/openai/v1/filesを使用。 - 返されたファイル ID を持つ
POST {project_endpoint}/openai/v1/vector_storesベクター ストアを作成します。
結果のベクター ストア ID は、 <VECTOR_STORE_ID>として指定した値です。 各言語の完全な例については、「 ファイル検索」 を参照してください。
重要
ホストされているエージェントのツールボックスでファイル検索を使用する場合、 ユーザーの分離はサポートされません。 同じプロジェクト内のすべてのユーザーが、同じベクター ストアへのアクセスを共有します。
{
"description": "Search over uploaded documents",
"tools": [
{
"type": "file_search",
"name": "<OPTIONAL_TOOL_NAME>",
"description": "<Optional description for the model>",
"file_search": {
"vector_store_ids": ["<VECTOR_STORE_ID>"]
}
}
]
}
from azure.ai.projects.models import FileSearchTool
tools = [
FileSearchTool(
vector_store_ids=["<VECTOR_STORE_ID>"]
)
]
ProjectsAgentTool tool = ProjectsAgentTool.AsProjectTool(
ResponseTool.CreateFileSearchTool(
vectorStoreIds: ["<VECTOR_STORE_ID>"]
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Search over uploaded documents"
);
const tools = [
{
type: "file_search",
name: "<OPTIONAL_TOOL_NAME>",
description: "<Optional description for the model>",
file_search: {
vector_store_ids: ["<VECTOR_STORE_ID>"],
},
},
];
resources:
- kind: toolbox
name: filesearch-tools
description: File search toolbox
tools:
- type: file_search
vector_store_ids:
- ${FILE_SEARCH_VECTOR_STORE_ID}
デプロイする前にベクター ストア ID を設定します。
azd env set FILE_SEARCH_VECTOR_STORE_ID "vs_xxxxxxxxxxxx"
メモ
ファイル検索で MCP 経由で結果が返されると、チャンク メタデータがツールの応答コンテンツに 【index†filename†file_id】 マーカーとして埋め込まれます。 例えば:
{
"jsonrpc": "2.0",
"id": "fs-call-1",
"result": {
"content": [
{
"type": "resource",
"resource": {
"uri": "file://assistant-tvfqncbtruyffxkfewenyy/",
"_meta": {
"title": "mcp-test-file.txt",
"file_id": "assistant-TVfQnCBtRuyfFxkfeweNYY",
"document_chunk_id": "f7327b7f-5ed0-43c6-9bee-e8e9552afcb5",
"score": 0.03333333507180214
},
"text": "# 【0†mcp-test-file.txt†assistant-TVfQnCBtRuyfFxkfeweNYY】\nContent Snippet:\nAzure OpenAI Service is a cloud service..."
}
}
]
}
}
各リソース項目内の _meta ブロックには、一致したチャンクの title、 file_id、 document_chunk_id、関連性の score が含まれます。 アプリケーションでこれらのメタデータ フィールドを使用して、引用の詳細を生成したり、ソース ファイルにディープ リンクしたりします。
OpenAPI
OpenAPI 仕様で記述されている REST API を公開するには、このパターンを使用します。API のセキュリティ モデルに一致する auth.type を選択します。
重要
マネージド ID 認証を使用する場合は、ターゲット サービスで Foundry プロジェクトの マネージド ID に適切な RBAC ロールを割り当てる必要があります。 たとえば、ターゲット Azure リソースに Reader 以上を割り当てます。 この割り当てがない場合、エージェントは API の呼び出し時に 401 Unauthorized 応答を受け取ります。 完全なセットアップ手順については、「 マネージド ID を使用した認証」を参照してください。
匿名認証:
{
"description": "REST API via OpenAPI spec",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "anonymous"
}
}
}
]
}
Project接続認証:
このパターンは、API で Foundry プロジェクト接続に格納されているキーまたはトークンが必要な場合に使用します。
{
"description": "REST API with connection-based auth",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "connection",
"security_scheme": {
"project_connection_id": "<CONNECTION_NAME>"
}
}
}
}
]
}
マネージド ID 認証:
ターゲット API がMicrosoft Entra ID経由で認証する場合は、このパターンを使用します。 Foundry プロジェクトのマネージド ID は、エージェントの代わりに API を呼び出します。 このパターンを使用する前に、マネージド ID にターゲット サービスに必要な RBAC ロールがあることを確認します。
{
"description": "REST API with managed identity auth",
"tools": [
{
"type": "openapi",
"openapi": {
"name": "my-api",
"spec": { "<paste OpenAPI spec object here>" },
"auth": {
"type": "managed_identity",
"security_scheme": {
"audience": "<TARGET_SERVICE_AUDIENCE>"
}
}
}
}
]
}
from azure.ai.projects.models import OpenAPITool
tools = [
OpenAPITool(
name="my-api",
spec={"<paste OpenAPI spec object here>"},
auth={"type": "anonymous"},
)
]
BinaryData specBytes = BinaryData.FromString("<OpenAPI spec JSON>");
ProjectsAgentTool tool = new OpenAPITool(
new OpenApiFunctionDefinition(
name: "my-api",
spec: specBytes,
openApiAuthentication: new OpenApiAnonymousAuthDetails()
)
);
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "REST API via OpenAPI spec"
);
const tools = [
{
type: "openapi",
openapi: {
name: "my-api",
spec: { /* paste OpenAPI spec object here */ },
auth: {
type: "anonymous",
},
},
},
];
キーベースの認証:
parameters:
api_key:
secret: true
description: API key for the target service
resources:
- kind: connection
name: api-conn
category: CustomKeys
authType: CustomKeys
target: https://api.example.com
credentials:
keys:
key: "{{ api_key }}"
- kind: toolbox
name: openapi-tools
description: OpenAPI key-auth toolbox
tools:
- type: openapi
openapi:
name: my-api
spec:
openapi: "3.0.1"
info:
title: "My API"
version: "1.0"
servers:
- url: https://api.example.com/v1
paths:
/search:
get:
operationId: search
parameters:
- name: query
in: query
required: true
schema:
type: string
responses:
"200":
description: OK
auth:
type: connection_auth
connection_id: api-conn
エージェント間 (A2A)
このパターンを使用して、別のエージェントをツールとして呼び出します。 リモート エージェントのベース URL と、認証が必要な場合はプロジェクト接続を指定します。
{
"description": "Delegate tasks to a specialist agent",
"tools": [
{
"type": "a2a_preview",
"name": "<AGENT_NAME>",
"description": "<What this agent does>",
"base_url": "<AGENT_BASE_URL>",
"project_connection_id": "<CONNECTION_NAME>"
}
]
}
from azure.ai.projects.models import A2APreviewTool
tools = [
A2APreviewTool(
name="<AGENT_NAME>",
description="<What this agent does>",
base_url="<AGENT_BASE_URL>",
project_connection_id="<CONNECTION_NAME>",
)
]
ProjectsAgentTool tool = new A2APreviewTool()
{
ProjectConnectionId = "<CONNECTION_NAME>",
};
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
toolboxName: "my-toolbox",
tools: [tool],
description: "Delegate tasks to a specialist agent"
);
const tools = [
{
type: "a2a_preview",
name: "<AGENT_NAME>",
description: "<What this agent does>",
base_url: "<AGENT_BASE_URL>",
project_connection_id: "<CONNECTION_NAME>",
},
];
resources:
- kind: connection
name: a2a-conn
category: RemoteA2A
authType: None
target: https://your-remote-agent.azurecontainerapps.io
- kind: toolbox
name: a2a-tools
description: Agent-to-Agent toolbox
tools:
- type: a2a_preview
project_connection_id: a2a-conn
トラブルシューティング
| 症状 | 考えられる原因 | 修正 |
|---|---|---|
tools/list は、MCP または A2A ツール用の 0 個のツールを返します |
リモート MCP サーバーまたは A2A エージェントの接続資格情報が無効または不足しています。 ツールボックスは、有効な認証なしでは、リモート エンドポイントからツール マニフェストを取得できません。 | Foundry プロジェクトに project_connection_id が存在し、資格情報が正しいことを確認します。 認証のセットアップをテストするには、MCP サーバーに直接接続してみてください。 マネージド ID (PMI、エージェント ID、または MI) を使用している場合は、ターゲット リソースの呼び出し元に対する正しい RBAC ロールの割り当てを確認します。 |
tools/list OpenAPI ツール用の 0 個のツールが返されます |
OpenAPI 仕様が無効です。ツールボックスは、スペックからツール マニフェストを構築します。これは、スペックの形式が正しくない場合は失敗します。 | OpenAPI 仕様のコンテンツを検証します。 OpenAPI 3.0 または 3.1 に準拠しており、有効な paths、 operationId 値、およびパラメーター スキーマが含まれていることを確認します。 マネージド ID 認証を使用している場合は、ターゲット サービスでの RBAC ロールの割り当ても確認します。 |
tools/list 返されるツールの数が予想よりも少なくなります |
allowed_tools フィルターに不適切なツール名またはスペルミスのツール名が含まれています。 ツール名では大文字と小文字が区別され、 ツール名の MCP 仕様 に従う必要があります (空白文字や特殊文字は使用しません)。 |
allowed_toolsを一時的に削除し、tools/listを呼び出して完全なツール 一覧を取得します。 応答の正確な名前を使用して、 allowed_toolsの値を設定します。 |
tools/list は 0 個のツールを返します (その他のツールの種類) |
ツールボックスが完全にプロビジョニングされていないか、ツールの種類がリージョンでサポートされていません。 組み込みツール (Web Search、AI Search、コード インタープリター、ファイル検索) の場合、ツール マニフェストはサーバー側で構築され、認証は必要ありません。空のツールが返された場合、ツールボックスのバージョンはまだプロビジョニングされていない可能性があります。 | 10 秒待ってから再試行します。 |
400 Multiple tools without identifiers |
1 つのツールボックスに 2 つの名前のないツールの種類 | 名前のない型を最大 1 つ保持します。すべての MCP ツールに server_label を追加します。 |
CONSENT_REQUIRED (コード -32006) |
OAuth 接続にはユーザーの同意が必要 | ブラウザーで同意 URL を開き、OAuth フローを完了してから再試行します。 |
401 MCP 呼び出し時 |
期限切れのトークンまたは間違ったスコープ | スコープ https://ai.azure.com/.default を使用し、トークンを更新します。 |
| ツール名が一致しない | MCP ツール名の先頭は server_label で始まります。 |
{server_label}.{tool_name}形式 (たとえば、myserver.get_info) を使用します。 |
500 に send_ping() |
ツールボックス MCP サーバーは、MCP ping メソッドを実装していません。 |
send_ping()を呼び出さないでください。 フレームワークが自動的に呼び出す場合 (たとえば、Microsoft Agent Framework の MCPStreamableHTTPTool._ensure_connected())、ping チェックを無効にするか、メソッドを no-opでオーバーライドします。 |
500 に prompts/list |
Foundry MCP サーバーは prompts/listを実装していません。 |
load_prompts=False (またはそれと同等の) を MCP クライアント コンストラクターに渡します。 |
500 ストリーミング以外の場合 tools/call |
非ストリーミング モード (stream=False) は、ツールボックス MCP エンドポイントではサポートされていません。 |
ツールボックス MCP ツールを呼び出すときは、常に stream=True を使用します。 |
500 に tools/list |
一時的なサーバー エラー | 数秒後に再試行してください。 |
| 実行時に上書きされる環境変数 | プラットフォームは、 FOUNDRY_ プレフィックスが付いたすべての環境変数を予約し、ユーザー定義の値を自動的に上書きする可能性があります。 |
FOUNDRY_ プレフィックスを使用しないようにカスタム環境変数の名前を変更します (たとえば、TOOLBOX_MCP_ENDPOINTではなくFOUNDRY_TOOLBOX_ENDPOINTを使用します)。 |
仮想ネットワークのサポート
Foundry プロジェクトで ネットワーク分離 (プライベート リンク) を使用する場合、すべてのツールボックス ツールの種類がサポートされているわけではありません。 次の表は、各ツールの種類のサポート状態と、ネットワーク分離環境でのトラフィックフローを示しています。
| ツールの種類 | VNet のサポート | トラフィック フロー |
|---|---|---|
| Mcp | ✅ サポート | VNet サブネット経由 |
| Azure AI 検索 | ✅ サポート | プライベート エンドポイント経由 |
| コード インタープリター | ✅ サポート | Microsoftバックボーン ネットワーク |
| Web 検索 | ✅ サポート | パブリック エンドポイント |
| OpenAPI | ✅ サポート | ターゲット API ネットワーク構成に依存 |
| ファイル検索 | ❌ サポートされていません | まだ利用できません |
| エージェント間 (A2A) | ✅ サポート | プライベート エンドポイント経由 |
エージェント クライアントの VNet インジェクション、DNS 構成、プライベート エンドポイントの要件など、完全なネットワーク分離のセットアップ手順については、
リージョンとモデルの互換性
ツールボックスの可用性は、プロジェクト リージョン以外の 2 つの要因によって異なります。
- リージョン: 一部のツールの種類は、エージェント サービスをサポートするすべてのリージョンでは使用できません。 たとえば、ツールボックス エンドポイントをサポートするリージョンでは、すべての組み込みツールの種類がサポートされていない場合があります。
ツールボックスをデプロイする前に、使用する予定のツールの種類がターゲット リージョンでサポートされていることを確認します。 完全な互換性テーブルについては、 リージョンとモデル別のツールのサポートを参照してください。