Foundry でツールボックスを作成および管理する

Warning

Foundry 以外のツールに接続すると、コストが発生し、データが Foundry のコンプライアンス境界外に送信され、該当する用語とデータ処理ポリシーに従って処理される可能性があります。 ツールへのアクセスを管理する方法については、ツールのドキュメントを参照してください。

この記事では、ツールボックスの作成、ツールの追加と構成、ツールの読み込みの確認、ツールボックスのホストされたエージェントへの統合、ツールボックスのバージョンの管理を行う方法について説明します。 ツールボックスの概念の概要については、「 Foundry のツールボックスとは」を参照してください。 ツールの種類ごとのツール構成構文と認証オプションについては、「 ツールの構成」を参照してください。

前提 条件

  • アクティブな Microsoft Foundry プロジェクト

  • RBAC: Foundry プロジェクトの Foundry ユーザー ロールを、シナリオに適用される各 ID に付与します。

    • 開発者 (常に必要) — ツールボックスのバージョンを作成、更新、管理する ID。
    • エージェント ID (プロンプト エージェントを使用する場合に必要) - 実行時にツールを呼び出すエージェントのマネージド ID。
    • エンド ユーザー (OAuth フローにのみ必要) - OAuth または UserEntraToken 接続 (OAuth ベースの MCP またはユーザー Entra トークン (マネージド ユーザー ID パススルー) フローなど) を介して ID がプロキシされるユーザー。

    Foundry User ロールをエージェント ID に割り当てる手順については、「エージェント ID へのアクセス許可の割り当て」を参照してください。

  • Foundry プロジェクトは、サポートされている リージョンのいずれかに存在する必要があります。 ツールボックス内の個々のツールの種類は、リージョンとモデルによってさらに制限されます。すべてのツールの種類が、すべてのリージョンまたはすべてのモデルで使用できるわけではありません。 「リージョンとモデルの互換性」を参照してください。

  • Visual Studio Code (VS Code)

  • Visual Studio Code Marketplace から Microsoft Foundry Toolkit for Visual Studio Code 拡張機能をインストールします。

  • Python SDK:pip install azure-ai-projects azure-identity

  • .NET SDK: コヒーレント プレビュー パッケージ セットとAzure ID をインストールします。

    dotnet add package Azure.AI.Projects --version 2.1.0-beta.4
    dotnet add package Azure.AI.Projects.Agents --version 2.1.0-beta.4
    dotnet add package Azure.AI.Extensions.OpenAI --version 2.1.0-beta.4
    dotnet add package Azure.Identity
    
  • JavaScript SDK: npm install @azure/ai-projects @azure/identity

  • Azure開発者 CLI: Azure Developer CLI (azd 1.27.1 以降) と統合 Foundry CLI 拡張機能バンドルをインストールします。

    # Install the unified bundle (provides azd ai agent, connection, inspector,
    # project, routine, skill, and toolbox).
    azd ext install microsoft.foundry
    

重要

  • ツールボックスは、name フィールド (Web 検索、Azure AI 検索、コード インタープリター、ファイル検索) のない最大 1 つのツールをサポートします。 同じツールの種類の複数のインスタンスを含めるには、各インスタンスに一意の name を設定して区別します。 nameなしで同じ型の 2 つのインスタンスを含めると、invalid_payload エラーが返されます。 詳細については、「 複数のツールの種類」を参照してください。
  • ツールボックス内のすべてのツールに description を追加して、モデルが要求ごとに適切なツールを選択できるようにします。
  • 個々のツールのセットアップ、制限事項、警告の詳細については、各ツールのドキュメントを慎重に確認してください。

Azure GitHub Copilotを使用してツールボックスを使用するホスト型エージェントをスキャフォールディングする場合、次のスキル参照では、エージェントが実装する必要があるのと同じエンドポイント コントラクト (env var、headers、MCP プロトコル、引用パターン、およびトラブルシューティング) が記述されています。

クイック パス

  1. Create:1 つ以上のツールを使用してツールボックス バージョンを作成します。 各スニペットを 1 つのタスクに集中させ、30 行以内に収めます。完全なアプリケーションには、リンクされた保守済みサンプルを使用します。
  2. バージョンを発行または選択します。 最初のバージョンが自動的に既定値になります。 以降のバージョンについては、そのバージョンをデフォルトに設定する準備ができたら、バージョンをテストして昇格させます
  3. アタッチして使用する:ツールボックス コンシューマー エンドポイントをコピーし、エージェントに統合します。
  4. 確認: バージョン固有のエンドポイントを使用して 使用可能なツールを一覧表示し、必要なツールを呼び出す 1 つのエージェント要求を実行します。

機能のサポート

次の表に示すように、SDK とツールはツールボックス管理操作をサポートします。

Operation Python SDK REST API .NET SDK JavaScript SDK Azure Developer CLI Foundry ツールキット
ツールボックスの更新、一覧表示、取得、削除 ✔️ ✔️ ✔️ ✔️ N/a ✔️
ツールボックス バージョンの作成 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ツールボックスのバージョン一覧、取得、および削除 ✔️ ✔️ ✔️ ✔️ N/a いいえ。 UI には最新バージョンのみが表示されます。
ガードレール (RAI ポリシー) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

また、Foundry MCP Server と対話してツールボックスを管理することもできます。 Foundry MCP Server を使用したツールボックスの管理を参照してください。

次のツールをツールボックスに追加できます。 次の表は、各ツールの SDK とツールのサポートと、ツールをエージェント (ツールボックスの外部) に直接アタッチできるかどうかを示しています。 プロジェクトでネットワーク分離を使用する場合の各ツールのトラフィックフローについては、「 ツールボックスのネットワーク分離」を参照してください。

ツール ツールボックス内 直接ツールの統合 Python SDK REST API .NET SDK JavaScript SDK Azure Developer CLI Foundry ツールキット
モデル コンテキスト プロトコル (MCP) ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Web 検索 ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Azure AI 検索 ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
コード インタープリター ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ファイル検索 ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
OpenAPI ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ いいえ
エージェントからエージェント (A2A) ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ いいえ
ブラウザー自動化 ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ いいえ
Fabric IQ ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ワークインテリジェンス ✅ はい ✅ はい ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
ツールの検索 ✅ はい ❌ いいえ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
スキル ✅ はい ❌ いいえ ✔️ ✔️ ✔️ ✔️ ✔️ いいえ

ツールの可用性は、プロジェクトのリージョンとモデルによっても異なります。 ツールボックスを展開する前に、使用する予定のツールの種類がターゲット リージョンでサポートされていることを確認します。 リージョンとモデル別のツールのサポートを参照してください。

ツールボックスバージョンを作成する

必要なツールに基づいてツールボックス バージョンを作成します。

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPToolboxTool, ToolSearchToolboxTool, WebSearchToolboxTool

# 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.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with web search and an MCP server",
    tools=[
        WebSearchToolboxTool(),
        MCPToolboxTool(
            server_label="myserver",
            server_url="https://your-mcp-server.example.com",
            require_approval="never",
            project_connection_id="my-key-auth-connection",
        ),
        ToolSearchToolboxTool(),
    ],
)
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();

WebSearchToolboxTool webTool = new();
MCPToolboxTool mcpTool = new(serverLabel: "myserver")
{
  ServerUri = new Uri("https://your-mcp-server.example.com"),
  ToolCallApprovalPolicy = new McpToolCallApprovalPolicy(
    GlobalMcpToolCallApprovalPolicy.NeverRequireApproval),
};

ToolSearchToolboxTool searchTool = new() { Name = "ToolBoxSearch" };

ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
  name: "my-toolbox",
    tools: [webTool, mcpTool, searchTool],
    description: "Toolbox with web search, MCP, and tool search"
);
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, MCP, and tool search",
  "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"
    },
    {
      "type": "toolbox_search"
    }
  ]
}

メモ

ベアラー トークンを取得するときに、トークン スコープ 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.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",
    },
    { type: "toolbox_search" },
  ],
  {
    description: "Toolbox with web search, MCP, and tool search",
  },
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);

Microsoft Foundry Toolkit for Visual Studio Code 拡張機能を使用して、Tools ビューからツールボックスを作成して発行します。

  1. アクティビティ バーで Foundry Toolkit を選択します。
  2. [ マイ リソース] で、[ プロジェクト名>Tools] を展開します。
  3. [+ ツールボックスの追加] アイコンを選択します。
  4. [ カスタム ツールボックスのビルド ] タブで、ツールボックスの名前と説明を入力し、目的のツールを追加します。
  5. 意図ベースのツール ルーティングを有効にするには、[ ツール検索] を選択します。
  6. 公開を選択します。

新しいツールボックスを発行すると、最初のバージョンが作成されます。 そのバージョンは自動的に既定のバージョンになります。

ツールボックス名、説明、ツール、発行アクションを示す Foundry Toolkit のスクリーンショット。

統合 microsoft.foundry 拡張機能バンドル ( 前提条件を参照) を使用して、次の 2 つの手順でツールボックスを作成します。

  1. azd ai connection createを使用して、ツールボックスが参照する各プロジェクト接続を登録します (資格情報レコードごとに 1 回の呼び出し)。
  2. azd ai toolbox create --from-file <toolbox.yaml>を使用してツールボックスを作成します。 YAML は名前で接続を参照し、資格情報を埋め込むことはありません。

このパターンは、接続の種類と認証の種類ごとに同じです。

  1. シェルごとにアクティブなプロジェクトを 1 回設定します。

    azd ai project set $PROJECT_ENDPOINT
    
  2. azd ai connection createを使用して接続を作成します。 フラグは認証の種類ごとに異なりますが、コマンドの形状は常に次のようになります。

    azd ai connection create <name> \
      --kind <remote-tool|remote-a2a|cognitive-search|GroundingWithCustomSearch> \
      --target <endpoint-url> \
      --auth-type <none|custom-keys|api-key|oauth2|user-entra-token|project-managed-identity|agentic-identity> \
      [--custom-key "Header=Value" | --key <key> | --client-id ... --client-secret ... --authorization-url ... --token-url ... | --audience <aad-resource-uri>]
    

    azd ai connection listazd ai connection show <name>を使用して接続を検査し、azd ai connection delete <name> --forceして削除します。

  3. 1 つ以上の既存の接続を名前で参照するツールボックス YAML を作成します。 YAML は資格情報を埋め込むことはありません。

    # my-toolbox.yaml
    description: <human-readable description>
    connections:
      - name: <project-connection-name>   # must already exist in the project
    # Optional: add connectionless built-in tools and policies.
    tools:
      - type: web_search
        name: web
      - type: code_interpreter
        container: { type: auto }
        name: code
      # Tool search is connectionless.
      - type: toolbox_search
      # For Azure AI Search, set the index in the tool entry:
      # - type: azure_ai_search
      #   name: search
      #   azure_ai_search:
      #     indexes:
      #       - project_connection_id: <azure-ai-search-connection-name>
      #         index_name: <search-index-name>
      # For Bing Custom Search, set the instance in the tool entry:
      # - type: web_search
      #   name: bing
      #   custom_search_configuration:
      #     project_connection_id: <bing-connection-name>
      #     instance_name: <bing-instance-name>
    # Optional: attach existing project skills as MCP resources.
    skills:
      - name: <skill-name>          # uses the skill's default version
      - name: <other-skill>
        version: "2"               # pin to a specific skill version (string)
    policies:
      rai_config:
        rai_policy_name: <policy-name>    # must already exist on the project
    

    少なくとも 1 つの connectionsskills、または tools が空でない必要があります。 スキル参照は、同じ Foundry プロジェクトに既に存在するスキルを指している必要があります。「 Foundry のスキルを使用してazd ai skill createでスキルを作成する」を参照してください。 エンド ツー エンドのツール検索のセットアップの詳細については、「 ツール検索を使用する」を参照してください。

  4. そのファイルからツールボックスを作成します。

    azd ai toolbox create <toolbox-name> --from-file ./my-toolbox.yaml
    

    最初のバージョンが自動的に既定値になります。 ツールボックスを管理するには、 azd ai toolbox listazd ai toolbox show <name>azd ai toolbox version list <name>、および azd ai toolbox delete <name> --force を使用します。

例: キーベースの認証を使用する MCP サーバー

# 1. Create the connection
azd ai connection create my-gh-conn \
  --kind remote-tool \
  --target https://api.githubcopilot.com/mcp/ \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer $GITHUB_PAT"

# 2. Create the toolbox
azd ai toolbox create my-toolbox \
  --from-file ./my-toolbox.yaml \
  --no-prompt
# my-toolbox.yaml
description: GitHub MCP toolbox
connections:
  - name: my-gh-conn

ツールボックス MCP エンドポイントを取得する

ロールに応じて、次の 2 つのエンドポイント パターンが存在します。

役割 エンドポイント 使用するタイミング
ツールボックス開発者 {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 特定のバージョンを既定に昇格させる前に、テストまたは検証します。
ツールボックス ユーザー {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 エージェントをツールボックスに接続します。 常に default_versionを提供します。 最初に作成するバージョンは、既定として自動的に設定されます。

プレースホルダーを独自の値に置き換えます。

  • {project_endpoint} は Foundry プロジェクト エンドポイントです。 https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>形式です。 Foundry ポータルのプロジェクトの [概要] ページから、または Microsoft Foundry Toolkit for Visual Studio Codeの [ツールボックス] ビューの [エンドポイント URL] 列からコピーします。
  • {toolbox_name} {version}は、「ツールボックスのバージョンを作成する」で作成したツールボックス名とバージョンです

Tip

エージェントをツールボックス コンシューマー エンドポイントに接続します。 常に default_versionを提供するため、エージェント コードを変更したり、再デプロイしたりすることなく、新しいバージョンを昇格させることができます。 そのバージョンを昇格する前にテストするために、ツールボックス開発者(バージョン固有)エンドポイントを確保してください。

メモ

新しいツールボックスの最初のバージョンは、自動的に default_version (v1) に昇格されます。 後で既定値を変更する必要がある場合は、「 バージョンを既定に昇格する」を参照してください。

Microsoft Foundry Toolkit for Visual Studio Code拡張機能で、ツールボックス コンシューマー エンドポイントを Toolboxes ビューからコピーします。

  1. アクティビティ バーで Foundry Toolkit を選択します。
  2. [ マイ リソース] で、[ プロジェクト名>Tools] を展開します。
  3. [ツールボックス] タブ 、ツールボックスを見つけます。
  4. [ エンドポイント URL ] 列で、エンドポイントをコピーします。

エンドポイント URL 値はツールボックス コンシューマー エンドポイントです。 バージョン固有のエンドポイントを構築するには、前の表に示した開発者パターンを使用します。

ツールの可用性を確認する

完全なエージェントを実行する前に、エンドポイントに対して 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}",
}

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

{"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

{"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

{"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

{"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}`,
      },
    },
  },
);

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();

スキャフォールディングされたホステッド エージェント サンプルと共に ツールボックス MCP エンドポイント を使用して、VS Code でのツールボックスの読み込みを検証します。

  1. Foundry Toolkit の [マイ リソース>プロジェクト名>Tools で、テストするツールボックスを見つけます。
  2. スキャフォールディング コード テンプレートを選択します。
  3. メッセージが表示されたら、プロジェクト フォルダーを選択します。
  4. 生成された README.md に従って依存関係をインストールし、環境変数を構成し、サンプルをローカルで実行します。
  5. Agent Inspector を使用するか、python main.pyを実行してツールボックス ツールの読み込みと応答を確認します。

新しいツールボックス バージョンを昇格させる前にバージョン固有の検証を行うには、この手順の [Pythonまたは REST API] タブを使用します。

メモ

[REST API] タブを使用してツールの可用性を確認するか、Python MCP クライアント SDK を使用します。

Check — initialize: HTTP 200。 初期化手順をスキップすると、後続の呼び出しは失敗します。

チェック — tools/list:

  • len(tools) > 0 — 空は、ツールボックスのバージョンが正しくプロビジョニングされなかったことを意味します。

  • 各ツールには、 namedescription、および inputSchemaがあります。 ツールの名前付け規則については、 MCP の仕様を参照してください。

  • inputSchema には properties フィールドがあります (一部の MCP サーバーではこのフィールドが省略され、OpenAI が中断されます)。

  • ツール名は、ツールの種類によって名前空間が設定されます。

    ツールの種類 ツール名の形式
    MCP {server_label}.{tool_name} myserver.some_tool
    OpenAPI {openapi_name}.{operationId} weatherapi.getForecast
    A2A ツールの name (エージェント名)、または接続名 ( name を省略した場合) myagent
    その他のすべてのツールの種類 name フィールドの値または既定のツール名 web_search
  • MCP ツールには、_meta.tool_configurationなどのランタイム設定を含むrequire_approval ブロックが含まれています。 「 ツールの承認を強制する」を参照してください。

  • 呼び出しステップの正確なパラメーター名をメモします (たとえば、 queryqueries)。

チェック - tools/call:

  • 最上位レベルの error フィールドはありません。 存在する場合は、 error.codeを調べます。 標準の MCP エラー コードについては、 MCP の仕様を参照してください。
    • -32006 → OAuth の同意が必要です ( error.message から URL を抽出します)。
    • その他のコード→サーバー側の障害です。
  • result.content[] には、 "type": "text" を含むエントリが含まれています。これはツールの出力です。
  • AI Search では、result.structuredContent.documents[] を確認し、チャンクメタデータ (titleurlidscore) をチェックしてください。
  • ファイル検索では、チャンクメタデータ (result.content[].resource._metatitlefile_iddocument_chunk_idscore) を確認します。
  • Web Search の場合は、URL 引用の result.content[].resource._meta.annotations[] (typeurltitlestart_indexend_index) を確認します。
  • Fabric IQ の引用チャンクについては、result.structuredContent.documents[] を確認してください。 各ドキュメントには、応答の根拠として使用される Fabric 項目(オントロジー、データ エージェント、または Power BI セマンティック モデル)を参照する title および url フィールドが含まれています。
  • テキスト コンテンツ内の "ServerError" を監視します。ツールは実行されましたが、内部エラーが発生します。

ツール固有の tools/call 引数の例:

ツールの種類 引数
AI 検索 {"query": "search text"}
ファイル検索 {"queries": ["search text"]} — またはベクターストアが動的に渡される場合は {"queries": ["search text"], "vector_store_ids": ["<VECTOR_STORE_ID>"]}
コード インタープリター {"code": "print(2 ** 100)"}
Web Search {"search_query": "weather in seattle"}
A2A {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
ファブリックIQ 公開されたツールによって異なります。通常、クエリツールでは {"query": "..."} です。
作業 IQ {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
MCP {"query": "what is agent service"}

ツールボックスをエージェントに統合する

LangGraph

ホストされた統合フラグメントの要件:langchain-azure-ai[tools]>1.2.3をインストールします。 フラグメントでは、 AzureAIProjectToolboxを使用します。エージェント、パッケージ セット、およびデプロイ ファイル全体については、 保守されている LangGraph サンプル を使用します。

.env ファイル:

FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
TOOLBOX_NAME=agent-tools
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

前提条件Azure ID パッケージに加えて、agent-framework-foundryをインストールします。 完全な実装については、 管理されているエージェント フレームワークのサンプルを参照してください。

Agent Framework SDK の FoundryToolbox を使用してツールボックス エンドポイントに接続します。 クラスはツールボックス認証を処理し、hosted-agent 呼び出しコンテキストを転送します。

.env ファイル:

FOUNDRY_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o

main.py (キー パターン):

from agent_framework.foundry import FoundryToolbox
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

# Toolbox MCP endpoint (platform-injected at runtime via TOOLBOX_ENDPOINT)
TOOLBOX_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/versions/<version>/mcp?api-version=v1"

toolbox = FoundryToolbox(
    credential,
    url=TOOLBOX_ENDPOINT,
)

agent = chat_client.as_agent(
    name="my-toolbox-agent",
    instructions="You are a helpful assistant with access to Foundry toolbox tools.",
    tools=[toolbox],
)
ResponsesAgentServerHost().run()

Copilot SDK

ホストされた統合フラグメントの要件:ランタイムの GitHub Copilot SDK をインストールします。 アウトラインは、ここでは実装されていないアプリケーション所有の McpBridge および _get_toolbox_token ヘルパーに依存します。 既存のツールボックス エンドポイントと認証コントラクトとホステッド エージェント統合パターンに従います。 メンテナンスされている完全なサンプルは、まだ提供されていません。

GitHub Copilot SDK を使用して、Copilotのツール呼び出しを Foundry ツールボックス MCP エンドポイントにブリッジするツールボックスを利用したエージェントを構築します。

メモ

Copilot SDK は、ドットを含むツール名を拒否します。 ブリッジは、 . をツール名の _ に自動的に置き換えます。 たとえば、 myserver.get_infomyserver_get_infoになります。

.env ファイル:

GITHUB_TOKEN=<your-github-token>
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

Microsoft.Agents.AI.Foundry.HostingAzure.Identityをインストールします。 完全なプロジェクトについては、パブリック Agent Framework hosted-toolbox サンプルを参照してください。

AddFoundryToolboxesを使用して、ホストされるエージェントに 1 つ以上のツールボックスを登録します。 この統合により、マネージド MCP のエンドポイントが解決され、要求の認証が行われ、準備プローブにツールボックスの正常性が含まれるようになります。

環境変数:

AZURE_AI_PROJECT_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>
AZURE_AI_MODEL_DEPLOYMENT_NAME=gpt-4o
TOOLBOX_NAME=<toolbox-name>

Program.cs (キー パターン):

using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;

string projectEndpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
    ?? throw new InvalidOperationException("AZURE_AI_PROJECT_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable(
    "AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-4o";
string toolboxName = Environment.GetEnvironmentVariable("TOOLBOX_NAME")
    ?? throw new InvalidOperationException("TOOLBOX_NAME is not set.");

var credential = new DefaultAzureCredential();
AIAgent agent = new AIProjectClient(new Uri(projectEndpoint), credential)
    .AsAIAgent(
        model: deploymentName,
        instructions: "You are a helpful assistant with access to toolbox tools.",
        name: "hosted-toolbox-agent");

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.Services.AddFoundryToolboxes(credential, toolboxName);

var app = builder.Build();
app.MapFoundryResponses();
app.Run();

メモ

この手順の統合サンプルは、Pythonと.NETでのみ使用できます。

メモ

この手順の統合サンプルは、Pythonと.NETでのみ使用できます。

Microsoft Foundry Toolkit for Visual Studio Code 拡張機能を使用して、ツールボックスに既にワイヤードされているホスト型エージェント サンプルをスキャフォールディングします。

  1. アクティビティ バーで Foundry Toolkit を選択します。
  2. [ マイ リソース] で、[ プロジェクト名>Tools] を展開します。
  3. [ ツールボックス ] タブで、使用するツールボックスを見つけて、[ スキャフォールディング コード テンプレート] を選択します。
  4. コマンド パレットで、メッセージが表示されたらプロジェクト フォルダーを選択します。
  5. 生成された README.md を開き、スキャフォールディングのセットアップ、ローカル実行、デプロイの手順に従います。

生成されたプロジェクトには、ホストされたエージェントのエントリ ポイント、デプロイ ファイル、および正確なセットアップ、実行、デプロイの手順を含む README.md が含まれます。

新しいサンプルを生成するのではなく、ツールボックスを既存のホステッド エージェント プロジェクトに統合する場合は、このセクションのPythonまたは.NET パターンでツールボックス MCP エンドポイントを使用します。

ツールボックス エンドポイントをエージェントに渡す

ツールボックスを作成したら、azd ai toolbox showを使用して MCP エンドポイントを取得し、そのエンドポイントを環境変数としてエージェント コードに渡します。 エージェントは起動時に変数を読み取り、それを使用してツールボックスに接続します。

  1. ツールボックス エンドポイントを取得します。

    azd ai toolbox show <toolbox-name> --output json
    

    応答の endpoint フィールドは、選択したバージョンを識別します。 これを使用して、昇格の前にそのバージョンをテストします。 default_versionに従う必要があるエージェントの場合は、「ツールボックス MCP エンドポイントの取得」に示されているバージョン管理されていないコンシューマー エンドポイントを構築します。

  2. 起動時にエージェントが読み取る環境変数としてエンドポイントを設定します。

    # .env (or however your runtime loads environment variables)
    TOOLBOX_ENDPOINT=https://<account>.services.ai.azure.com/api/projects/<project>/toolboxes/<toolbox-name>/mcp?api-version=v1
    
  3. エージェント コードで、 TOOLBOX_ENDPOINT を読み取り、MCP クライアントで接続します。 このセクションで前述したPythonまたは.NET統合パターンを、クライアントセットアップのリファレンスとして使用し、Entra トークン (https://ai.azure.com/.default スコープ) として使用します。

ツールの承認要件を処理する

ツールボックスは、_meta.tool_configurationによって返されるすべてのツール エントリにtools/list オブジェクトを返します。 ツールがrequire_approvalに設定"always"場合、エージェント ランタイムは保留中のアクションをユーザーに提示し、確認を待ってからツールを呼び出す必要があります。 MCP エンドポイントは、 tools/callをブロックしません。 強制は完全にエージェント ランタイムの責任です。

ツールボックスを作成してテストしたら、それをエージェントに接続します。 統合パターンは、エージェントの種類によって異なります。

ツールで require_approval を構成する

ツールボックス バージョンを作成するときに require_approval を設定します。 ツールボックスバージョンの作成の MCP ツールの例では、"always""never"の両方の値が表示されます。 SDK を使用して設定するには:

from azure.ai.projects.models import MCPToolboxTool

# Set require_approval on an MCP tool
toolbox_version = project.toolboxes.create_version(
    name="my-toolbox",
    tools=[
        MCPToolboxTool(
            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"
    }
  ]
}
MCPToolboxTool mcpTool = new(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、または Azure Developer CLI タブを使用して、ツールボックス定義でrequire_approvalを構成します。 この記事の Microsoft Foundry Toolkit for Visual Studio Code 拡張機能ワークフローでは、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

ツールボックスのバージョンを管理する

メモ

ツールボックスのバージョンは、Python SDK、.NET SDK、JavaScript SDK、REST API でのみ削除できます。 Azure Developer CLI では、一覧表示、取得、発行(既定のバージョンへの昇格)の各操作をサポートしています。

ツールボックスのバージョンは、ツールボックスのツール構成の変更できないスナップショットです。 作成エンドポイントを呼び出すたびに、新しい ToolboxVersionObjectが生成されます。 親 ToolboxObject には、MCP エンドポイントが提供するバージョンを制御する default_version フィールドがあります。 新しいバージョンを作成しても自動的には昇格されません。 default_versionを更新するタイミングを決定します。 このプロセスにより、変更をステージングし、新しいバージョンを個別にテストし、独自のスケジュールで運用環境に昇格できます。

メモ

Azure Developer CLI の場合、現在の既定のバージョン (azd ai toolbox connection add/removeazd ai toolbox skill add/remove) を対象とする変更操作はすべて、new ツールボックス バージョンを作成し、要求された変更が適用されたすべての接続とスキルを転送します。 これらのコマンドはいずれも default_version を自動的に変更しません。新しいバージョンを有効にする準備ができたら、azd ai toolbox publish <toolbox-name> <version> を実行してください。 保留中の (既定以外の) バージョンを検査するには、 azd ai toolbox show <name> --version <n>を使用します。

オブジェクト キー フィールド 説明
ToolboxObject idnamedefault_version ツールボックス コンテナー。 default_version はアクティブなバージョンを指します。
ToolboxVersionObject idnameversiondescriptioncreated_attools[]policies ある時点でのツールボックスのツール リストの変更できないスナップショット。 policies.rai_config.rai_policy_name は、このバージョンに適用されるオプションのガードレールを指定します。

新しいバージョンを作成する

作成呼び出しごとに新しいバージョンが生成されます。 ツールボックスがまだ存在しない場合は、プロセスによって自動的に作成されます。 新しいツールボックスの最初のバージョンを作成すると、v1が既定のバージョンとして設定され、手動で別のバージョンに更新するまで使用されます。

# Create a new toolbox version
toolbox_version = project.toolboxes.create_version(
    name="my-toolbox",
    description="Updated tools v2",
    tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateVersionAsync(
  name: "<toolbox-name>",
    tools: [tool],
    description: "Updated tools v2"
);
Console.WriteLine($"Created version: {toolboxVersion.Version}");

POST {project_endpoint}/toolboxes/<toolbox-name>/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "description": "Updated tools v2",
  "tools": [...]
}
const toolboxVersion = await project.toolboxes.createVersion(
  "<toolbox-name>",
  [/* tools array */],
  { description: "Updated tools v2" },
);
console.log(`Created version: ${toolboxVersion.version}`);

Python、.NET、JavaScript、または REST API タブを使用して、新しいツールボックス バージョンを作成します。 この記事の Microsoft Foundry Toolkit for Visual Studio Code 拡張機能ワークフローでは、ツールボックスを作成し、それを使用するホスト型エージェントをスキャフォールディングすることに重点を置いています。

この操作は、Azure Developer CLI ではサポートされていません。 ツールボックスバージョンを作成するには、Python.NETREST API、または JavaScript タブを使用します。

応答は、新しいToolboxVersionObject識別子を含むversionです。

バージョンを一覧表示する

# List all toolbox versions
versions = list(project.toolboxes.list_toolbox_versions(name="<toolbox-name>"))
for v in versions:
    print(f"{v.version} — created {v.created_at}")
List<ToolboxVersion> versions = await toolboxClient
    .GetToolboxVersionsAsync("<toolbox-name>")
    .ToListAsync();
Console.WriteLine($"Found {versions.Count} toolbox version(s).");
foreach (ToolboxVersion v in versions)
{
    Console.WriteLine($"  - {v.Name} ({v.Version})");
}
GET {project_endpoint}/toolboxes/<toolbox-name>/versions?api-version=v1
Authorization: Bearer {token}
const versions = project.toolboxes.listVersions("<toolbox-name>");
for await (const v of versions) {
  console.log(`${v.version} — created ${v.created_at}`);
}

Python、.NET、JavaScript、または REST API タブを使用して、ツールボックスのバージョンを一覧表示します。

# The current default version is marked with *
azd ai toolbox version list <toolbox-name>

特定のバージョンを取得する

# Get a specific toolbox version
version_obj = project.toolboxes.get_toolbox_version(
    toolbox_name="<toolbox-name>",
    version="<version_id>",
)
ToolboxVersion versionObj = await toolboxClient.GetToolboxVersionAsync(
    "<toolbox-name>",
    "<version_id>"
);
Console.WriteLine($"Retrieved toolbox: {versionObj.Name} ({versionObj.Id})");
GET {project_endpoint}/toolboxes/<toolbox-name>/versions/{version}?api-version=v1
Authorization: Bearer {token}
const versionObj = await project.toolboxes.getVersion(
  "<toolbox-name>",
  "<version_id>",
);
console.log(`Retrieved version: ${versionObj.version}`);

Python、.NET、JavaScript、または REST API タブを使用して、特定のツールボックス バージョンを取得します。

azd ai toolbox version get <toolbox-name> <version_id>

バージョンを既定に昇格させる

MCP エンドポイントは常に default_versionを提供します。 アクティブなバージョンを切り替えるには、ツールボックスを更新します。

# Promote a version to default
toolbox = project.toolboxes.update(
    toolbox_name="<toolbox-name>",
    default_version="<version_id>",
)
print(f"Active version: {toolbox.default_version}")
ToolboxRecord record = await toolboxClient.UpdateToolboxAsync(
    "<toolbox-name>",
    "<version_id>"
);
Console.WriteLine($"Active version: {record.DefaultVersion}");
PATCH {project_endpoint}/toolboxes/<toolbox-name>?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "default_version": "<version_id>"
}

default_version を空にすることはできません。 新しいバージョンに置き換えます。

const toolbox = await project.toolboxes.update(
  "<toolbox-name>",
  "<version_id>",
);
console.log(`Active version: ${toolbox.default_version}`);

ツールボックスのバージョンを既定に昇格するには、Python、.NET、JavaScript、または REST API タブを使用します。

ツールボックスのバージョンは変更できません。 publishを使用して、既存のバージョンを新しい既定値にします。

# Roll back or forward to a specific version
azd ai toolbox publish <toolbox-name> <version_id> --no-prompt

publish は、CLI から default_version を変更する唯一の方法です。変更を伴う動詞 (connection add/removeskill add/remove) は、常に新しいバージョンを作成しますが、それを昇格させません。

バージョンを削除する

# Delete a toolbox version
project.toolboxes.delete_toolbox_version(
    toolbox_name="<toolbox-name>",
    version="<version_id>",
)
await toolboxClient.DeleteToolboxVersionAsync(
    "<toolbox-name>",
    "<version_id>"
);
DELETE {project_endpoint}/toolboxes/<toolbox-name>/versions/{version}?api-version=v1
Authorization: Bearer {token}
await project.toolboxes.deleteVersion(
  "<toolbox-name>",
  "<version_id>",
);

ツールボックスのバージョンを削除するには、Python、.NET、JavaScript、または REST API タブを使用します。

この操作は、Azure Developer CLI ではサポートされていません。 ツールボックスのバージョンを削除するには、Python.NETREST API、または JavaScript タブを使用します。

Foundry MCP Server を使用してツールボックスを管理する

Foundry MCP Server (プレビュー) は、ツールボックス管理を MCP ツールとして公開するため、Visual Studio CodeのGitHub Copilotなどの MCP クライアントからツールボックスを取得、バージョン管理、更新、および削除できます。 サーバーを設定するには、「 Foundry MCP Server の概要 (プレビュー)」を参照してください。

ツール アクセス 説明
toolbox_get 読み取り ツールボックスとその現在の既定のバージョンを取得します。
toolbox_version_get 読み取り ツールボックスのバージョンを一覧表示するか、特定のバージョンを取得します。
toolbox_version_create 書き込み 変更できないツールボックス バージョンを作成します。 ツールボックスが存在しない場合は、このツールによっても作成されます。
toolbox_update 書き込み ツールボックス (既定のバージョンを含む) を作成または更新します。
toolbox_delete 書き込み ツールボックスを削除します。
toolbox_version_delete 書き込み 特定のツールボックス バージョンを削除します。

SDK と同じバージョン管理規則が適用されます。 既存のツールボックスのバージョンを作成しても、既定のバージョンは変更されません。 バージョンを昇格させるには、toolbox_update を新しいバージョンに設定して defaultVersion を呼び出します。 現在の既定のバージョンを削除する前に、別のバージョンを既定値として設定します。

プロンプトの例:

  • " customer-support-tools ツールボックスを表示してください。"
  • " customer-support-tools のバージョン 2 を取得します。"
  • " customer-support-toolsの新しいバージョンを作成します。"
  • " customer-support-tools のバージョン 2 を既定値として設定します。"
  • " customer-support-tools のバージョン 1 を既定値として設定し、バージョン 2 を削除します。"
  • " old-support-tools ツールボックスを削除します。"

完全なツール リファレンスについては、「 Foundry MCP Server の使用可能なツールとプロンプトの例」を参照してください。

ツールの構成

シナリオに合ったツールの種類と認証パターンを選択します。 お好みの SDK またはデプロイ方法のタブを選択します。

下の各ツールの azd タブは、宣言型ツールボックス YAML を示しています。 エージェント プロジェクトなしでツールボックスを強制的に作成するには、 azd ai toolbox create --from-file ワークフロー を使用し、次のセクションに示すツールごとのデータを適用します。 ホストされたエージェントを使用してツールボックスをデプロイするには、それをazure.ai.toolboxazure.yaml サービスとしてモデル化し、uses:またはtoolboxes:を使用してエージェントを接続します。

複数のツールの種類

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_searchazure_ai_searchcode_interpreterfile_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>"
          }
        ]
      }
    }
  ]
}

各ツールの種類には、接続認証の種類、言語ごとの SDK スニペット、ツールボックス固有の動作など、独自のツールボックス構成があります。 これらの詳細は、各ツールのリファレンス記事に記載されています。 各ツールへのリンクについては、 機能サポート の表を参照してください。

コード インタープリターとファイル検索のファイル検索の動的ベクター ストア (パラメーターオーバーライド) やリソース レベルのファイルアップロードなど、ツールボックス固有の動作については、各ツールのリンクされた記事を参照してください。

ガードレールの構成

ツールボックス バージョンに名前付き ガードレール ポリシー を適用して、ツールの入力と出力に対して責任ある AI コンテンツ のフィルター処理を適用します。 ガードレールは、モデル レベルのコンテンツ フィルターとは関係なく、ツールボックス レイヤーで実行されます。

Foundry ポータルの Guardrails で構成したポリシー名を指定して、ガードレールを参照します。 ツールボックス バージョンを作成するときに、 policies.rai_config.rai_policy_name にポリシーの名前を設定します。

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import WebSearchToolboxTool

endpoint = "https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>"
project = AIProjectClient(endpoint=endpoint, credential=DefaultAzureCredential())

toolbox_version = project.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with guardrail",
    tools=[WebSearchToolboxTool()],
    policies={
        "rai_config": {
            "rai_policy_name": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>"
        }
    },
)
print(f"Created version: {toolbox_version.version}")
POST {endpoint}/toolboxes/{toolbox_name}/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json

{
  "description": "Toolbox with guardrail",
  "tools": [{ "type": "web_search" }],
  "policies": {
    "rai_config": {
      "rai_policy_name": "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>"
    }
  }
}
#pragma warning disable AAIP001
using Azure.AI.Projects;
using Azure.AI.Projects.Agents;
using Azure.Identity;

var projectEndpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT");
DefaultAzureCredential credential = new();
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();

var toolboxVersion = toolboxClient.CreateVersion(
  name: "my-toolbox",
    description: "Toolbox with guardrail",
    tools: [new WebSearchToolboxTool()],
    policies: new ToolboxPolicies
    {
        RaiConfig = new RaiConfig { RaiPolicyName = "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>" }
    });
Console.WriteLine($"Created version: {toolboxVersion.Version}");
const toolboxVersion = await project.toolboxes.createVersion(
  "my-toolbox",
  [{ type: "web_search" }],
  {
    description: "Toolbox with guardrail",
    policies: {
      rai_config: {
        rai_policy_name: "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>",
      },
    },
  },
);
console.log(`Created version: ${toolboxVersion.version}`);
name: my-toolbox
description: Toolbox with guardrail
policies:
  rai_config:
    rai_policy_name: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.CognitiveServices/accounts/<account-name>/raiPolicies/<policy-name>
tools:
  - type: web_search

VS Code 拡張機能では、Guardrail の構成はまだ使用できません。 REST API、SDK、または Azure Developer CLI を使用してガードレールを構成します。

ツールボックスにスキルをアタッチする

ツールボックス バージョンに スキル をアタッチして、ツールボックス MCP エンドポイントを介してエージェントがスキルを使用できるようにします。 各スキル参照は、スキル名とオプションのバージョンを指定します。 スキルのversionを使用するにはdefault_versionを省略し、変更できないスナップショットを使用するようにversion文字列をピン留めします。

ツールボックスのバージョンには、ツール、スキル、またはその両方を含めることができます。 次の例では、1 つのスキル参照を含むツールボックス バージョンを作成します。 すでにツールが含まれているツールボックスにスキルを追加するには、ツールボックス バージョンを作成するで使用したものと同じtoolsを、skills配列と併せて含めます。

重要

ツールボックスにアタッチされているスキルは、同じ Foundry プロジェクトに存在する必要があります。 プロジェクト間参照はサポートされていません。

エージェントまたは MCP クライアントがツールボックス エンドポイントに接続すると、スキルは MCP リソースとして公開されます。 MCP クライアントまたはエージェント フレームワークは、スキルを自動検出して読み込む MCP リソース プロトコルをサポートする必要があります。 スキルが検出可能であることを確認するには、ツールボックス MCP エンドポイントで resources/list を呼び出し、応答にスキル名が表示されることを確認します。

POST {endpoint}/toolboxes/{toolbox_name}/versions?api-version=v1
Authorization: Bearer {token}
Content-Type: application/json
Accept: application/json
Foundry-Features: Skills=V1Preview

{
  "description": "Toolbox with a skill reference",
  "tools": [],
  "skills": [
    {
      "type": "skill_reference",
      "name": "greeting"
    }
  ]
}

特定のバージョンをピン留めするには:

{
  "skills": [
    {
      "type": "skill_reference",
      "name": "greeting",
      "version": "v1"
    }
  ]
}
from azure.ai.projects.models import ToolboxSkillReference

toolbox_version = project.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with a skill reference",
    tools=[],
    skills=[
        ToolboxSkillReference(name="greeting"),              # use default version
        # ToolboxSkillReference(name="greeting", version="1"),  # pin to version 1
    ],
)
print(f"Created toolbox version: {toolbox_version.id}")
#pragma warning disable AAIP001
// Reuse the AgentToolboxes client (toolboxClient) from Step 1.
ToolboxSkillReference skillRef = new("greeting");
// To pin a version: new ToolboxSkillReference("greeting") { Version = "1" }

ToolboxVersion toolboxVersion = toolboxClient.CreateVersion(
    name: "my-toolbox",
    tools: [],
    skills: [skillRef],
    description: "Toolbox with a skill reference"
);
Console.WriteLine($"Created toolbox version: {toolboxVersion.Id}");
const toolboxVersion = await project.toolboxes.createVersion(
  "my-toolbox",
  [],
  {
    description: "Toolbox with a skill reference",
    skills: [
      { type: "skill_reference", name: "greeting" },
      // { type: "skill_reference", name: "greeting", version: "v1" },  // pin to v1
    ],
  },
);
console.log(`Created toolbox version: ${toolboxVersion.id}`);

Azure Developer CLI では、skills: YAML の最上位azd ai toolbox create --from-file ブロックとして宣言型と、azd ai toolbox skill add/list/remove 動詞を使用した命令型の 2 つの場所でスキル参照がサポートされています。 各参照は、 name (必須) と省略可能な version (文字列) を受け取ります。 version を省略して、スキルの default_version に従う: バージョン文字列を固定して、ツールボックスを不変のスナップショットにロックします。

ツールボックスの作成時にスキルを宣言する

# my-toolbox.yaml
description: Toolbox with skill references
connections:
  - name: my-gh-conn
skills:
  - name: greeting              # follows the skill's default version
  - name: review-checklist
    version: "2"               # pin to skill version 2
azd ai toolbox create my-toolbox --from-file ./my-toolbox.yaml --no-prompt

既存のツールボックスでスキルを追加、一覧表示、削除する

# Add a skill (follows default version)
azd ai toolbox skill add my-toolbox greeting

# Add a skill pinned to a specific version
azd ai toolbox skill add my-toolbox review-checklist@2

# Add multiple skills from a file (same shape as the create YAML's skills block)
azd ai toolbox skill add my-toolbox --from-file ./skills.yaml

# List skill references on the current default version
azd ai toolbox skill list my-toolbox --output table

# Remove a skill (--force skips the confirmation prompt; multiple names allowed)
azd ai toolbox skill remove my-toolbox greeting --force

skill list には、既定のバージョンのみが表示されます。 ピン留めされたスキルは自分のバージョンを表示します。ピン留めされていないスキルは (default)を示します。 保留中のバージョンのスキルを検査するには、 azd ai toolbox show <toolbox> --version <n> --output json を実行し、 skills 配列を読み取る必要があります。

重要

skill addskill remove はそれぞれ、要求された変更を適用し、これまでに関連付けられていたすべての接続とスキルを引き継いだ新しいツールボックス バージョンを作成します。 新しいバージョンは既定に昇格されないためazd ai toolbox publish <toolbox> <version>を実行するまで変更は MCP クライアントに表示されません。 既にアタッチされているスキルのピン留めされたバージョンを変更するには (たとえば、 greeting を v1 から v2 にアップグレードする) には、 skill remove、新しいバージョン publishskill add <name>@<new-version> の順に 3 つのコマンドを実行します (skill add 、現在の既定のバージョンに対してオンにすると重複がブロックされます)。

スキル名は ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$ (小文字、数字、ハイフン、最大 64 文字、先頭または末尾のハイフンなし) と一致する必要があります。 @の末尾の<name>@<version> (空のバージョン) は拒否されます。

現在、スキル参照は VS Code 拡張機能を通じて構成できません。 REST API または SDK を使用してスキルを構成します。

スキル検出を検証する

ツールボックス バージョンにスキルをアタッチした後、MCP Python SDK を使用して、ツールボックス MCP エンドポイントを介してスキルを検出できることを確認します。

import asyncio
from azure.identity import DefaultAzureCredential
from mcp import ClientSession
from mcp.client.streamable_http import streamablehttp_client

async def list_skills():
    credential = DefaultAzureCredential()
    token = credential.get_token("https://ai.azure.com/.default").token
    toolbox_url = "{endpoint}/toolboxes/my-toolbox/mcp?api-version=v1"
    headers = {
        "Authorization": f"Bearer {token}",
    }
    async with streamablehttp_client(toolbox_url, headers=headers) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            resources = await session.list_resources()
            for resource in resources.resources:
                print(f"Skill: {resource.uri} - {resource.name}")

asyncio.run(list_skills())

スキルは、skill://{name} 形式の URI を持つ MCP リソースとして表示されます。

エージェントのスキルを利用する (Microsoft Agent Framework, .NET)

.NETでは、Microsoft Agent Framework SDK の AgentSkillsProviderBuilder().UseMcpSkills(mcpClient) を使用して、ツールボックス エンドポイントから MCP ベースのスキルを検出し、エージェントに AIContextProviders として挿入します。 その後、エージェントは、モデルが関連すると判断したときに、実行時に各スキルの命令を読み込みます。 次の Program.cs は、Responses ホスティング レイヤー (AddFoundryResponsesMapFoundryResponses) を使用してエージェントをホストします。

using System.Net.Http.Headers;
using Azure.AI.Projects;
using Azure.Core;
using Azure.Identity;
using DotNetEnv;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;

// Load .env file if present (for local development).
Env.TraversePath().Load();

string projectEndpoint = Environment.GetEnvironmentVariable("FOUNDRY_PROJECT_ENDPOINT")
    ?? throw new InvalidOperationException("FOUNDRY_PROJECT_ENDPOINT environment variable is not set.");

string deployment = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME")
    ?? throw new InvalidOperationException("AZURE_AI_MODEL_DEPLOYMENT_NAME environment variable is not set.");

string toolboxName = Environment.GetEnvironmentVariable("TOOLBOX_NAME")
    ?? throw new InvalidOperationException("TOOLBOX_NAME environment variable is not set.");

// Build the Foundry Toolbox MCP URL from the project endpoint and toolbox name.
string toolboxMcpServerUrl = $"{projectEndpoint.TrimEnd('/')}/toolboxes/{toolboxName}/mcp?api-version=v1";

TokenCredential credential = new DefaultAzureCredential();

// HttpClient that attaches a fresh Foundry bearer token to every request.
// CheckCertificateRevocationList = true satisfies CA5399.
using var httpClient = new HttpClient(
    new BearerTokenHandler(credential, "https://ai.azure.com/.default")
    {
        CheckCertificateRevocationList = true,
    });

Console.WriteLine($"Connecting to Foundry Toolbox '{toolboxName}' MCP server...");

// Connect to the Foundry Toolbox MCP endpoint.
await using var mcpClient = await McpClient.CreateAsync(
    new HttpClientTransport(
        new HttpClientTransportOptions
        {
            Endpoint = new Uri(toolboxMcpServerUrl),
            Name = toolboxName,
            TransportMode = HttpTransportMode.StreamableHttp,
        },
        httpClient));

// AgentSkillsProvider implements progressive disclosure over the MCP-discovered skills:
// names and descriptions are advertised in the system prompt, and the full skill body
// (and any supplementary resources) is loaded on demand when the model decides it is
// relevant.
var skillsProvider = new AgentSkillsProviderBuilder()
    .UseMcpSkills(mcpClient)
    .Build();

AIAgent agent = new AIProjectClient(new Uri(projectEndpoint), credential)
    .AsAIAgent(new ChatClientAgentOptions
    {
        Name = "foundry-toolbox-mcp-skills",
        Description = "Agent that discovers MCP-based skills from a Foundry Toolbox and exposes them via AgentSkillsProvider.",
        ChatOptions = new ChatOptions
        {
            ModelId = deployment,
            Instructions = "You are a helpful assistant.",
        },
        AIContextProviders = [skillsProvider],
    });

var builder = AgentHost.CreateBuilder(args);
builder.Services.AddFoundryResponses(agent);
builder.RegisterProtocol("responses", endpoints => endpoints.MapFoundryResponses());

var app = builder.Build();
app.Run();

// HttpClientHandler that attaches a fresh Foundry bearer token to every outgoing request.
internal sealed class BearerTokenHandler(TokenCredential credential, string scope) : HttpClientHandler
{
    private readonly TokenRequestContext _tokenContext = new([scope]);

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        AccessToken token = await credential.GetTokenAsync(this._tokenContext, cancellationToken).ConfigureAwait(false);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token.Token);
        return await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
    }
}

プロジェクト ファイルや配置手順を含む完全なサンプルについては、 ツールボックスのスキルのサンプルを参照してください。

リマインダー

reminder_preview ツールを使用すると、ホストされたエージェントは、将来の時点で再度実行されるように 自身 をスケジュールできます。 エージェントがこのツールを呼び出すと、遅延が分単位で指定されます。 その遅延の後、Foundry は同じ会話で同じエージェントを再度呼び出します。

トラブルシューティング

症状 考えられる原因 修正
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 に準拠しており、有効な pathsoperationId 値、およびパラメーター スキーマが含まれていることを確認します。 マネージド 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) を使用します。
500send_ping() ツールボックス MCP サーバーは、MCP ping メソッドを実装していません。 ツールボックス接続を処理する Microsoft Agent Framework FoundryToolbox クラスを使用します。 send_ping()を直接呼び出さないでください。
500prompts/list Foundry MCP サーバーは prompts/listを実装していません。 load_prompts=False (またはそれと同等の) を MCP クライアント コンストラクターに渡します。
500 ストリーミング以外の場合 tools/call 非ストリーミング モード (stream=False) は、ツールボックス MCP エンドポイントではサポートされていません。 ツールボックス MCP ツールを呼び出すときは、常に stream=True を使用します。
500tools/list 一時的なサーバー エラー 数秒後に再試行してください。
実行時に上書きされる環境変数 プラットフォームは、 FOUNDRY_ プレフィックスが付いたすべての環境変数を予約し、ユーザー定義の値を自動的に上書きする可能性があります。 FOUNDRY_ プレフィックスを使用しないようにカスタム環境変数の名前を変更します (たとえば、TOOLBOX_MCP_ENDPOINTではなくFOUNDRY_TOOLBOX_ENDPOINTを使用します)。

アラーム ツールは、ホストされているエージェントでのみ使用できます。 プロンプト エージェントでアラーム ツールを使用することはできません。

完全なセットアップ手順、使用例、および制限事項については、 自己スケジューリング エージェントのアラーム ツールを参照してください。

リージョンとモデルの互換性

ツールボックスの可用性は、プロジェクト リージョン以外の 2 つの要因によって異なります。

  • リージョン: 一部のツールの種類は、エージェント サービスをサポートするすべてのリージョンでは使用できません。 たとえば、ツールボックス エンドポイントをサポートするリージョンでは、すべての組み込みツールの種類がサポートされていない場合があります。

ツールボックスをデプロイする前に、使用する予定のツールの種類がターゲット リージョンでサポートされていることを確認します。 完全な互換性テーブルについては、 リージョンとモデル別のツールのサポートを参照してください。