Erstellen, Testen und Bereitstellen einer Toolbox in Foundry

Warning

Wenn Sie eine Verbindung zu Nicht-Foundry-Tools herstellen, können Ihnen Kosten entstehen, und Daten können außerhalb des Compliance-Bereichs von Foundry gesendet und gemäß den geltenden Bedingungen und Richtlinien zur Datenverarbeitung verarbeitet werden. In der Dokumentation des Tools erfahren Sie, wie Sie den Zugriff auf das Tool verwalten.

Ein einzelner Agent kann von mehreren Tools abhängig sein – APIs, MCP-Server (Model Context Protocol), Connectors und Flows – jeweils mit seinem eigenen Authentifizierungsmodell und einem eigenen Team. Wenn Sie in einer Organisation skalieren, implementieren Teams die gleichen Tools unabhängig neu, Anmeldeinformationen werden dupliziert, Die Governance wird inkonsistent, und es gibt wenig Einblick in die vorhandenen Tools oder wer sie verwendet. Entwickler stocken, nicht weil die Modelle nicht in der Lage sind, sondern weil die Integration von Werkzeugen zum Engpass wird.

Diagramm mit mehreren Agents, die jeweils ihre eigenen Tools mit unterschiedlichen Authentifizierungsmodellen und duplizierten Anmeldeinformationen verkabeln.

Unternehmen verfügen bereits über die Infrastruktur: Gateways, Anmeldedaten-Tresore, Richtlinien und Observierbarkeit. Es fehlt eine Entwicklererfahrung, die diese Infrastruktur in etwas wiederverwendbares, auffindbares und automatisch verwaltetes verwandelt.

Toolbox bietet diese Erfahrung. Definieren Sie einen kuratierten Satz von Tools einmal, verwalten Sie sie zentral in Foundry, und machen Sie sie über einen einzelnen MCP-kompatiblen Endpunkt verfügbar, den jeder Agent nutzen kann. Die Plattform führt die Injektion von Anmeldeinformationen, die Tokenaktualisierung und die Durchsetzung von Unternehmensrichtlinien zur Laufzeit durch.

Toolbox deckt den vollständigen Toollebenszyklus über vier Säulen ab – Build und Konsumieren sind heute bereitgestellt:

Säule Status Was dies ermöglicht
Bauen Heute verfügbar Wählen Sie Tools aus, konfigurieren Sie die Authentifizierung zentral, und veröffentlichen Sie eine wiederverwendbare Toolbox, die jedes Team nutzen kann.
Verbrauchen Heute verfügbar Verbinden Sie jeden Agent mit einem einzelnen MCP-kompatiblen Endpunkt, um alle Tools in der Toolbox dynamisch zu ermitteln und aufzurufen.

Diagramm mit Toolboxen in der Foundry-Architektur: Die Säulen Build und Consume, die von LangGraph, Microsoft Agent Framework, GitHub Copilot, Claude Code und Microsoft Copilot Studio verwendet und standardmäßig verwaltet werden.

Sie erstellen Toolboxen in Foundry, aber die Verbrauchsoberfläche ist geöffnet. Jede MCP-kompatible Agentlaufzeit oder jeder Client kann eine Toolbox verwenden – einschließlich Agents, die mit jedem Framework, MCP-fähigen IDEs und benutzerdefiniertem Code erstellt wurden.

Da es sich bei einer Toolbox um eine verwaltete Ressource handelt, können Sie Tools hinzufügen, entfernen oder neu konfigurieren, ohne Code in Ihrem Agent zu ändern. Ihr Agent stellt immer eine Verbindung zu einem einzelnen Endpunkt her. Die Versionierung von Toolboxes bietet Ihnen die explizite Kontrolle darüber, wann Änderungen wirksam werden - Sie können eine neue Version erstellen und testen und diese dann als Standardversion festlegen, wenn Sie bereit sind. Jeder Agent, der auf die Toolbox verweist, nimmt die höhergestufte Version automatisch auf, ohne Codeänderungen und keine erneute Bereitstellung.

In diesem Artikel erfahren Sie, wie Sie:

  • Erstellen Sie eine Toolbox mit einem oder mehreren Tools.
  • Rufen Sie den MCP-Endpunkt der Toolbox ab.
  • Stellen Sie sicher, dass Tools ordnungsgemäß geladen werden.
  • Integrieren Sie eine Toolbox in Ihren gehosteten Agent.
  • Toolboxversionen verwalten und eine Version zur Standardversion machen.
  • Wenden Sie eine Leitlinie (RAI-Richtlinie) auf eine Toolboxversion an.

Informationen zur Toolkonfigurationssyntax und Authentifizierungsoptionen für jeden Tooltyp finden Sie unter Konfigurieren von Tools.

Featureunterstützung

Funktion Python SDK REST-API .NET SDK JavaScript SDK azd Gießerei-Werkzeugsatz
Toolbox Aktualisierung, auflisten, abrufen und löschen ✔️ ✔️ ✔️ ✔️ N/A ✔️
Toolboxversion erstellen ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Toolboxversionsliste, Abrufen und Löschen ✔️ ✔️ ✔️ ✔️ N/A Nein. Die Benutzeroberfläche zeigt nur die neueste Version an.
MCP-Tool ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Websuche-Tool ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Azure KI-Suche Tool ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Codedolmetschertool ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Tool für die Dateisuche ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
OpenAPI-Tool ✔️ ✔️ ✔️ ✔️ ✔️ Nein
Agent-zu-Agent-Tool (A2A) ✔️ ✔️ ✔️ ✔️ ✔️ Nein
Fabric IQ Tool ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Leitplanke (RAI-Richtlinie) ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Qualifikationsreferenzen ✔️ ✔️ ✔️ ✔️ ✔️ Nein
Tool der Toolsuche ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Arbeits-IQ-Tool ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Browserautomatisierungstool ✔️ ✔️ ✔️ ✔️ ✔️ Nein

Voraussetzungen

  • Ein aktives Microsoft Foundry-Projekt.

  • RBAC: Gewähren Sie der Rolle " Foundry User " im Foundry-Projekt jede Identität, die für Ihr Szenario gilt:

    • Entwickler (immer erforderlich) – die Identität, die Toolboxversionen erstellt, aktualisiert und verwaltet.
    • Agentidentität (erforderlich bei Verwendung eines gehosteten Agents) – die verwaltete Identität des Agents, die Tools zur Laufzeit aufruft.
    • Endbenutzer (nur für OAuth-Flüsse erforderlich) – jeder Benutzer, dessen Identität über OAuth- oder UserEntraToken-Verbindungen (z. B. OAuth-basiertes MCP- oder Benutzer-Entra-Token (verwaltete Benutzeridentitäts-Passthrough) übertragen wird.
  • Ihr Foundry-Projekt muss sich in einer der unterstützten Regionen befinden. Einzelne Werkzeugtypen in einer Toolbox sind nach Region und Modell weiter eingeschränkt – nicht alle Werkzeugtypen sind in jeder Region oder mit jedem Modell verfügbar. Siehe Region und Modellkompatibilität.

  • Visual Studio Code (VS Code).

  • Installieren Sie das Microsoft Foundry Toolkit für Visual Studio Code Erweiterung aus dem Visual Studio Code Marketplace.

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

  • .NET SDK: dotnet add package Azure.AI.Projects --prerelease und dotnet add package Azure.Identity

  • JavaScript SDK: npm install @azure/ai-projects @azure/identity

  • Azure Developer CLI: Installieren Sie die Azure Developer CLI (azd, 1,25 oder höher) und das einheitliche Foundry CLI-Erweiterungspaket:

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

Wichtig

  • Eine Toolbox unterstützt höchstens one Tool ohne name Feld pro Tooltyp (Websuche, Azure KI-Suche, Codedolmetscher, Dateisuche). Wenn Sie mehrere Instanzen desselben Tooltyps einschließen möchten, legen Sie für jede Instanz eine eindeutige name Instanz fest, um sie zu unterscheiden. Wenn Sie zwei Instanzen desselben Typs ohne ein name einschließen, wird ein invalid_payload Fehler zurückgegeben. Ausführliche Informationen finden Sie unter "Mehrere Tooltypen".
  • Fügen Sie jedem Werkzeug in Ihrem Werkzeugkasten ein description hinzu, um dem Modell bei der Auswahl des richtigen Werkzeugs für jede Anforderung zu helfen.
  • Lesen Sie die Dokumentation der einzelnen Tools sorgfältig, um mehr über die Einrichtung, Einschränkungen und Warnungen der einzelnen Tools zu erfahren.

Tip

Wenn Sie GitHub Copilot für Azure zum Erstellen eines Gerüsts für einen gehosteten Agent verwenden, der die Toolbox verwendet, beschreiben die folgenden Qualifikationsverweise denselben Endpunktvertrag (env var, headers, MCP-Protokoll, Zitatmuster und Problembehandlung), den der Agent implementieren muss:

Schritt 1: Erstellen einer Toolboxversion

Erstellen Sie eine Toolboxversion basierend auf den benötigten Tools.

from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPTool, ToolboxSearchPreviewTool, 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.toolboxes.create_toolbox_version(
    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",
        ),
        ToolboxSearchPreviewTool(),
    ],
)
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
    )
));

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

ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "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_preview"
    }
  ]
}

Hinweis

Verwenden Sie den Tokenbereich https://ai.azure.com/.default beim Abrufen des Bearer-Tokens.

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_preview" },
  ],
  {
    description: "Toolbox with web search, MCP, and tool search",
  },
);
console.log(`Created toolbox: ${toolboxVersion.name}, version: ${toolboxVersion.version}`);

Verwenden Sie das Microsoft Foundry Toolkit für Visual Studio Code Erweiterung, um eine Toolbox aus der Ansicht Tools zu erstellen und zu veröffentlichen.

  1. Wählen Sie das Foundry Toolkit in der Aktivitätsleiste aus.
  2. Erweitern Sie unter "Meine Ressourcen"Ihren Projektnamen>Tools.
  3. Wählen Sie das Symbol "+Toolbox hinzufügen " aus.
  4. Geben Sie auf der Registerkarte " Benutzerdefinierte Toolbox erstellen" den Namen und die Beschreibung der Toolbox ein, und fügen Sie die gewünschten Tools hinzu.
  5. Wählen Sie zum Aktivieren der absichtsbasierten Toolrouting die Option "Toolsuche" aus.
  6. Wählen Sie "Veröffentlichen" aus.

Beim Veröffentlichen einer neuen Toolbox wird die erste Version erstellt. Diese Version wird automatisch zur Standardversion.

Screenshot der Erweiterung Microsoft Foundry Toolkit für Visual Studio Code, der die Ansicht „Build a Custom Toolbox“ mit Feldern für den Namen der Toolbox, die Beschreibung und die Tools sowie die Aktion „Publish“ zeigt.

Erstellen Sie mit dem einheitlichen microsoft.foundryErweiterungspaket (siehe Voraussetzungen) eine Toolbox in zwei Schritten:

  1. Verwenden Sie azd ai connection create, um jede Projektverbindung zu registrieren, auf die die Toolbox verweist (ein Aufruf pro Anmeldeinformationssatz).
  2. Verwenden Sie azd ai toolbox create --from-file <toolbox.yaml>, um die Toolbox zu erstellen. Die YAML verweist auf Verbindungen nach Namen und bettet niemals Anmeldeinformationen ein.

Das Muster ist für jede Verbindungsart und jeden Authentifizierungstyp identisch:

  1. Legen Sie das aktive Projekt einmal pro Shell fest:

    azd ai project set $PROJECT_ENDPOINT
    
  2. Erstellen Sie eine Verbindung mit azd ai connection create. Die Flags unterscheiden sich je nach Authentifizierungstyp, aber die Befehlsstruktur ist immer:

    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>]
    

    Verwenden Sie azd ai connection list und azd ai connection show <name>, um Verbindungen zu prüfen, und azd ai connection delete <name> --force, um sie zu entfernen.

  3. Erstellen Sie eine Toolbox-YAML, die auf eine oder mehrere vorhandene Verbindungen anhand des Namens verweist. YaML bettet niemals Anmeldeinformationen ein:

    # 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_preview
      # 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: bing_custom_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
    

    Mindestens einer von connections, skillsoder tools muss nicht leer sein. Verweise auf Fähigkeiten müssen auf Fähigkeiten verweisen, die bereits im selben Foundry-Projekt vorhanden sind; siehe Fähigkeiten in Foundry verwenden, um sie mit azd ai skill create zu erstellen. Einzelheiten zur Einrichtung der End-to-End-Toolsuche finden Sie unter Toolsuche verwenden.

  4. Erstellen Sie die Toolbox aus dieser Datei:

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

    Die erste Version wird automatisch zum Standard. Verwenden Sie azd ai toolbox list, azd ai toolbox show <name>, azd ai toolbox version list <name> und azd ai toolbox delete <name> --force zum Verwalten von Toolboxen.

Beispiel: MCP-Server mit schlüsselbasierter Authentifizierung

# 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

Schritt 2: Abrufen des MCP-Endpunkts der Toolbox

Je nach Rolle sind zwei Endpunktmuster vorhanden:

Rolle Endpunkt Wann verwendet werden soll
Toolboxentwickler {project_endpoint}/toolboxes/{toolbox_name}/versions/{version}/mcp?api-version=v1 Testen oder überprüfen Sie eine bestimmte Version, bevor Sie sie als Standard bewerben.
Toolbox-Verbraucher {project_endpoint}/toolboxes/{toolbox_name}/mcp?api-version=v1 Verbinden Sie Agents mit der Toolbox. Dient immer dem default_version. Die von Ihnen erstellte erste Version wird automatisch als Standard festgelegt.

Ersetzen Sie die Platzhalter durch Ihre eigenen Werte:

  • {project_endpoint} ist Ihr Foundry-Projektendpunkt im Formular https://<your-foundry-account>.services.ai.azure.com/api/projects/<your-project>. Kopieren Sie es von der Seite „Übersicht“ Ihres Projekts im Foundry-Portal oder aus der Spalte Endpunkt-URL in der Ansicht „Toolboxes“ des Microsoft Foundry Toolkit für Visual Studio Code.
  • {toolbox_name} und {version} sind der Name und die Version der Toolbox, die Sie in Schritt 1 erstellt haben.

Tip

Verbinden Sie Agenten mit dem Toolbox-Consumerendpunkt. Es liefert immer das default_version aus, sodass Sie neue Versionen freigeben können, ohne den Agentcode zu ändern oder ihn neu bereitzustellen. Reservieren Sie den Toolbox-Entwicklerendpunkt (versionsspezifisch) zum Testen einer Version, bevor Sie sie höher stufen.

Hinweis

Die erste Version einer neuen Toolbox wird automatisch auf default_version (v1) heraufgestuft. Wenn Sie die Standardeinstellung später ändern müssen, lesen Sie Eine Version als Standardversion festlegen.

Kopieren Sie in der Erweiterung Microsoft Foundry Toolkit for Visual Studio Code den Verbraucher-Endpunkt der Toolbox aus der Ansicht Toolboxes.

  1. Wählen Sie das Foundry Toolkit in der Aktivitätsleiste aus.
  2. Erweitern Sie unter "Meine Ressourcen"Ihren Projektnamen>Tools.
  3. Suchen Sie auf der Registerkarte "Toolboxes " Ihre Toolbox.
  4. Kopieren Sie den Endpunkt in der Spalte "Endpunkt-URL ".

Der Endpunkt-URL-Wert ist der Toolbox-Verbraucherendpunkt. Verwenden Sie das in der vorherigen Tabelle gezeigte Entwicklermuster, um einen versionsspezifischen Endpunkt zu erstellen.

Screenshot der Erweiterung „Microsoft Foundry Toolkit für Visual Studio Code“ mit der Toolboxes-Ansicht, der Endpunkt-URL der Toolbox und der Aktion zum Erstellen einer Gerüstcodevorlage.

Schritt 3: Überprüfen der Verfügbarkeit des Tools

Vergewissern Sie sich vor dem Ausführen des vollständigen Agents, dass die Toolbox die erwarteten Tools mithilfe eines MCP-Client-SDK für den Endpunkt lädt. Verwenden Sie den versionsspezifischen Endpunkt , um eine Version zu überprüfen, bevor Sie sie als Standard festlegen.

Installieren Sie das MCP-Client-SDK:

pip install mcp

Verbinden Sie sich mit der Toolbox und listen Sie die Werkzeuge auf.

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

Hinweis

Verwenden Sie die Registerkarte "REST-API", um die Verfügbarkeit von Tools aus .NET zu überprüfen, oder verwenden Sie das Python MCP-Client-SDK.

Verwenden Sie den versionsspezifischen Endpunkt (/versions/{version}/mcp), um eine Version zu überprüfen, bevor Sie sie bewerben.

1. Initialisieren der MCP-Sitzung:

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. Senden Sie die initialisierte Benachrichtigung:

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. Verfügbare Tools auflisten:

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. Aufrufen eines Tools:

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

Installieren Sie das MCP-Client-SDK:

npm install @modelcontextprotocol/sdk

Verbinden Sie sich mit der Toolbox und listen Sie die Werkzeuge auf.

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

Verwenden Sie den Endpunkt aus Schritt 2 zusammen mit einer Gerüstvorlage für gehostete Agenten, um die Toolbox-Ladung in Visual Studio Code zu validieren.

  1. Suchen Sie im Foundry Toolkit unter Meine Ressourcen>dein Projektname>Tools die Toolbox, die Sie testen möchten.
  2. Wählen Sie "Scaffold Code-Template" aus.
  3. Wählen Sie einen Projektordner aus, wenn Sie dazu aufgefordert werden.
  4. Folgen Sie der generierten README.md, um Abhängigkeiten zu installieren, Umgebungsvariablen zu konfigurieren und das Beispiel lokal auszuführen.
  5. Verwenden Sie Agent Inspector oder führen Sie python main.py aus, um zu bestätigen, dass die Werkzeuge der Toolbox geladen werden und reagieren.

Verwenden Sie für die versionsspezifische Überprüfung in diesem Schritt die Python- oder REST-API-Registerkarte, bevor Sie eine neue Toolbox-Version veröffentlichen.

Hinweis

Verwenden Sie die Registerkarte "REST-API", um die Verfügbarkeit des Tools zu überprüfen, oder verwenden Sie das Python MCP-Client-SDK.

Check – initialize: HTTP 200. Wenn Sie den Initialisierungsschritt überspringen, schlagen nachfolgende Aufrufe fehl.

Prüfung — tools/list:

  • len(tools) > 0 – leer bedeutet, dass die Toolboxversion nicht ordnungsgemäß bereitgestellt wurde.

  • Jedes Tool verfügt über name, description und inputSchema. Informationen zu Toolbenennungskonventionen finden Sie in der MCP-Spezifikation.

  • inputSchema weist ein properties Feld auf (einige MCP-Server lassen dieses Feld aus, wodurch OpenAI unterbrochen wird).

  • Toolnamen werden nach Tooltyp namespacesiert:

    Tooltyp Toolnamenformat Example
    MCP {server_label}.{tool_name} myserver.some_tool
    OpenAPI {openapi_name}.{operationId} weatherapi.getForecast
    A2A Der Name des Tools name (Agentname) oder der Verbindungsname, falls name weggelassen wird myagent
    Alle anderen Tooltypen Der name Feldwert oder der Standardtoolname web_search
  • MCP-Tools enthalten einen _meta.tool_configuration Block, der Laufzeiteinstellungen enthält, z. B. require_approval. Siehe Behandeln von Toolgenehmigungsanforderungen.

  • Notieren Sie sich die genauen Parameternamen für den Aufrufschritt (z. B query . vs queries).

Überprüfung - tools/call:

  • Kein Top-Level-Feld error. Wenn vorhanden, prüfen Sie error.code. Standard-MCP-Fehlercodes finden Sie in der MCP-Spezifikation:
    • -32006 → OAuth-Zustimmung erforderlich (URL extrahieren aus error.message).
    • Andere Codes → serverseitiger Fehler.
  • result.content[] enthält Einträge mit "type": "text" - dies ist die Toolausgabe.
  • Bei AI Search: result.structuredContent.documents[] auf Blockmetadaten prüfen (title, url, id, score).
  • Überprüfen Sie result.content[].resource._meta bei der Dateisuche auf Blockmetadaten (title, file_id, document_chunk_id, score).
  • Für die Websuche überprüfen Sie result.content[].resource._meta.annotations[] auf URL-Zitate (type, url, title, start_index, end_index).
  • Überprüfen Sie für Fabric IQ result.structuredContent.documents[] auf Zitatblöcke. Jedes Dokument enthält title und url Felder, die auf das Fabric Element (Ontology, Data Agent oder Power BI Semantikmodell) zeigen, mit dem die Antwort geerdet wird.
  • Achten Sie auf "ServerError" in Textinhalten – das Tool wurde ausgeführt, ist jedoch auf einen internen Fehler gestoßen.

Toolspezifische tools/call Argumentbeispiele:

Tooltyp Argumente
KI-Suche {"query": "search text"}
Dateisuche {"queries": ["search text"]}
Codedolmetscher {"code": "print(2 ** 100)"}
Websuche {"search_query": "weather in seattle"}
A2A {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
Fabric IQ Variiert je nach verfügbaren Tool – in der Regel {"query": "..."} für Abfragetools
Arbeit IQ {"message": {"parts": [{"type": "text", "text": "Hello"}]}}
MCP {"query": "what is agent service"}

Schritt 4: Integrieren der Toolbox in Ihren Agent

LangGraph

Sehen Sie sich das vollständige Beispiel für die vollständige Implementierung an.

.env Datei:

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 (Schlüsselmuster):

from langchain_azure_ai.tools import AzureAIProjectToolbox

toolbox = AzureAIProjectToolbox(toolbox_name=TOOLBOX_NAME)
tools = await toolbox.get_tools()

Wichtig

Klasse langchain_azure_ai.tools.AzureAIProjectToolbox erfordert langchain-azure-ai[tools]>1.2.3.

Microsoft Agent Framework

Verwenden Sie MCPStreamableHTTPTool aus dem Agent Framework SDK, um direkt eine Verbindung zum MCP-Endpunkt der Toolbox herzustellen.

.env Datei:

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 (Schlüsselmuster):

# 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),
    timeout=120.0,
)

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

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

Sehen Sie sich das vollständige Beispiel für die vollständige Implementierung an.

Copilot SDK

Verwenden Sie das GitHub Copilot SDK, um einen auf Toolbox basierenden Agenten zu erstellen, der die Werkzeugaufrufe von Copilot mit dem MCP-Endpunkt der Foundry-Toolbox verbindet.

Hinweis

Das Copilot SDK lehnt Toolnamen ab, die Punkte enthalten. Die Brücke ersetzt . automatisch durch _ in Toolnamen. Beispielsweise myserver.get_info wird myserver_get_info.

.env Datei:

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 (Schlüsselmuster — MCP-Brücke):

# 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

Verwenden Sie ResponsesServer aus dem Agent Framework SDK mit einem benutzerdefinierten ToolboxMcpClient, um Tools der Toolbox über den MCP-Endpunkt zu ermitteln und aufzurufen.

Umgebungsvariablen:

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 (Schlüsselmuster):

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 umschließt direkte JSON-RPC Aufrufe an den MCP-Endpunkt. ToolboxHandler verbindet LLM-Toolaufrufe mithilfe einer standardmäßigen Toolaufrufschleife wieder mit dem MCP-Client. Die vollständige Implementierung beider Klassen finden Sie im vollständigen Beispiel.

Hinweis

Integrationsbeispiele für diesen Schritt sind nur für Python und .NET verfügbar.

Hinweis

Integrationsbeispiele für diesen Schritt sind nur für Python und .NET verfügbar.

Verwenden Sie die Microsoft Foundry Toolkit-Erweiterung für Visual Studio Code, um das Grundgerüst für eine Beispielanwendung für einen gehosteten Agenten zu erstellen, die bereits mit Ihrer Toolbox verbunden ist.

  1. Wählen Sie das Foundry Toolkit in der Aktivitätsleiste aus.
  2. Erweitern Sie unter "Meine Ressourcen"Ihren Projektnamen>Tools.
  3. Suchen Sie auf der Registerkarte Toolboxes die Toolbox, die Sie verwenden möchten, und wählen Sie dann die Gerüstcodevorlage aus.
  4. Wählen Sie in der Befehlspalette einen Projektordner aus, wenn Sie dazu aufgefordert werden.
  5. Öffnen Sie das generierte README.md Element, und folgen Sie den Setup-, lokalen Ausführungs- und Bereitstellungsschritten für das Gerüst.

Das generierte Projekt beinhaltet den Einstiegspunkt des Hosted Agents, Bereitstellungsdateien und eine README.md-Datei mit den genauen Schritten für Einrichtung, Ausführung und Bereitstellung.

Wenn Sie eine Toolbox in ein vorhandenes gehostetes Agent-Projekt integrieren möchten, anstatt ein neues Beispiel zu generieren, verwenden Sie den kopierten Endpunkt aus Schritt 2 mit den Python- oder .NET-Mustern in diesem Abschnitt.

Übergeben Sie den Toolbox-Endpunkt an Ihren Agenten

Nachdem Sie die Toolbox in Schritt 1 erstellt haben, rufen Sie den MCP-Endpunkt mit azd ai toolbox show und übergeben diesen Endpunkt als Umgebungsvariable an Ihren Agentcode. Der Agent liest die Variable beim Start und verwendet sie zum Herstellen einer Verbindung mit der Toolbox.

  1. Rufen Sie den Toolbox-Endpunkt ab:

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

    Das Feld mcp_endpoint in der Antwort ist der Consumerendpunkt, der immer in den default_version der Toolbox aufgelöst wird.

  2. Legen Sie den Endpunkt als Umgebungsvariable fest, die Ihr Agent beim Start liest:

    # .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. Lesen Sie in Ihrem Agentcode TOOLBOX_ENDPOINT und verbinden Sie sich mit ihm über einen MCP-Client. Verwenden Sie die Python oder .NET Integrationsmuster weiter oben in diesem Abschnitt als Referenz für die Clienteinrichtung und das Entra-Token (https://ai.azure.com/.default Bereich).

Anforderungen an die Werkzeugfreigabe behandeln

Die Toolbox gibt ein _meta.tool_configuration-Objekt für jeden Tooleintrag zurück, der von tools/list zurückgegeben wird. Wenn für ein Tool require_approval auf "always" festgelegt ist, muss die Runtime des Agents Benutzer*innen über die ausstehende Aktion informieren und vor dem Aufrufen des Tools auf eine Bestätigung warten. Der MCP-Endpunkt blockiert nichttools/call die Durchsetzung liegt vollständig in der Verantwortung der Laufzeitumgebung des Agents.

Lesen require_approval von tools/list

Jeder Tooleintrag in einer tools/list Antwort enthält einen _meta von der Toolbox zurückgegebenen Block:

{
  "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 Wert Verhalten
"always" Der Agent muss den Benutzer vor jedem Aufruf zur Bestätigung auffordern.
"never" Der Agent kann das Tool frei aufrufen.

Implementieren des Genehmigungsgatings (LangGraph)

Führen Sie beim Start eine Abfrage tools/list aus, um eine Genehmigungszuordnung zu erstellen, und fügen Sie anschließend eine Einschränkung in die Systemmeldung für jedes Tool ein, das eine Genehmigung erfordert.

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")
    }

Ermitteln Sie nach dem Laden von Tools vom MCP-Client, welche Tools eine Genehmigung erfordern, und passen Sie die Systemaufforderung an:

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

Hinweis

  • Die Erkennung erfolgt beim Start. Die Freigabeprüfung wird einmal ausgeführt, wenn der Agent initialisiert wird. Es gibt keinen Mehraufwand pro Anruf.
  • Elegante Fallback-Lösung. Wenn keine Tools vorhanden sind require_approval: "always", ist die Systemaufforderung unverändert, und der Agent verhält sich wie zuvor.
  • require_approval wird vom Agent erzwungen. Der Toolbox-MCP-Proxy wird unabhängig von dieser Einstellung tools/call ausgeführt. Die Runtime des Agents muss das Gating des Aufrufs durchführen.

Konfigurieren von require_approval für ein Tool

Legen Sie require_approval fest, wenn Sie eine Toolbox-Version erstellen. Die MCP-Toolbeispiele in Schritt 1 zeigen sowohl "always" als auch "never" die Werte an. Sie können sie auch über das SDK festlegen:

from azure.ai.projects.models import MCPTool

# Set require_approval on an MCP tool
toolbox_version = project.toolboxes.create_toolbox_version(
    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",
  },
];

Verwenden Sie die Registerkarte Python, .NET, JavaScript, REST-API oder azd, um require_approval in Ihrer Toolboxdefinition zu konfigurieren. Der Workflow der Erweiterung „Microsoft Foundry Toolkit für Visual Studio Code“ in diesem Artikel konzentriert sich auf das Erstellen und Verwenden der Toolbox in 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

Schritt 5: Verwalten von Toolboxversionen

Hinweis

Sie können Toolboxversionen nur über das Python SDK, .NET SDK, JavaScript SDK und REST-API löschen. Die azd CLI unterstützt die Vorgänge Auflisten, Abrufen und Veröffentlichen (hochgestufte Standardversion).

Toolboxversionen sind unveränderliche Momentaufnahmen der Toolkonfiguration einer Toolbox. Jeder Aufruf des Create-Endpunkts erzeugt einen neuen ToolboxVersionObject. Das übergeordnete Element ToolboxObject hat ein default_version Feld, das steuert, welche Version der MCP-Endpunkt bereitstellt. Das Erstellen einer neuen Version bedeutet keine automatische Höherstufung – Sie entscheiden, wann Sie default_version aktualisieren. Mit diesem Prozess können Sie Änderungen stufen, eine neue Version unabhängig testen und für die Produktion in Ihrem eigenen Zeitplan bewerben.

Hinweis

Für die Azure Developer CLI erstellt jeder ändernde Vorgang, der auf die aktuelle Standardversion abzielt – azd ai toolbox connection add/remove und azd ai toolbox skill add/remove –, eine neue Toolbox-Version, die alle zuvor zugeordneten Verbindungen und Fähigkeiten übernimmt, wobei die angeforderte Änderung angewendet wird. Keiner dieser Befehle ändert default_version automatisch; führen Sie azd ai toolbox publish <toolbox-name> <version> aus, wenn Sie bereit sind, die neue Version zu aktivieren. Um eine ausstehende (nicht standardmäßige) Version zu prüfen, verwenden Sie azd ai toolbox show <name> --version <n>.

Objekt Schlüsselfelder Beschreibung
ToolboxObject id, namedefault_version Der Toolboxcontainer. default_version verweist auf die aktive Version.
ToolboxVersionObject id, , nameversion, description, created_at, , tools[]policies Eine unveränderliche Momentaufnahme der Werkzeugliste der Toolbox zu einem bestimmten Zeitpunkt. policies.rai_config.rai_policy_name Gibt die optionale Schutzschiene an, die auf diese Version angewendet wird.

Erstellen einer neuen Version

Jeder Erstellungsaufruf erzeugt eine neue Version. Falls die Toolbox noch nicht vorhanden ist, wird sie automatisch erstellt. Wenn Sie die erste Version einer neuen Toolbox erstellen, ist v1 die Standardversion so lange, bis Sie manuell auf eine andere Version aktualisieren.

# Create a new toolbox version
toolbox_version = project.toolboxes.create_toolbox_version(
    name="my-toolbox",
    description="Updated tools v2",
    tools=[...],
)
print(f"Created version: {toolbox_version.version}")
ToolboxVersion toolboxVersion = await toolboxClient.CreateToolboxVersionAsync(
    toolboxName: "<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}`);

Verwenden Sie die Registerkarte Python, .NET, JavaScript oder REST-API, um eine neue Toolboxversion zu erstellen. Der Workflow der Erweiterung Microsoft Foundry Toolkit für Visual Studio Code, der in diesem Artikel beschrieben wird, konzentriert sich auf das Erstellen einer Toolbox und das Generieren des Grundgerüsts für einen gehosteten Agenten, der sie verwendet.

Dieser Vorgang wird mit der Azure Developer CLI nicht unterstützt. Verwenden Sie zum Erstellen einer Toolboxversion die Registerkarte Python, .NET, REST-API oder JavaScript.

Die Antwort ist ein ToolboxVersionObject, das den neuen version Bezeichner enthält.

Versionen auflisten

# 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}`);
}

Verwenden Sie die Registerkarte Python, .NET, JavaScript oder REST-API, um Toolboxversionen aufzulisten.

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

Eine bestimmte Version abrufen

# 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}`);

Verwenden Sie die Registerkarte Python, .NET, JavaScript oder REST-API, um eine bestimmte Toolboxversion abzurufen.

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

Höherstufen einer Version auf Standard

Der MCP-Endpunkt dient immer dem default_version. Um zu wechseln, welche Version aktiv ist, aktualisieren Sie die Toolbox:

# 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 darf nicht leer sein. Ersetzen Sie sie durch eine neue Version.

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

Verwenden Sie die Registerkarte Python, .NET, JavaScript oder REST-API, um eine Toolboxversion als Standard festzulegen.

Toolboxversionen sind unveränderlich. Verwenden Sie publish, um eine vorhandene Version zur neuen Standardversion zu machen:

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

publish ist der einzige Weg, mit dem default_version über die CLI geändert wird; mutierende Verben (connection add/remove, skill add/remove) erstellen immer eine neue Version, ohne sie heraufzustufen.

Löschen einer Version

# 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>",
);

Verwenden Sie die Registerkarte Python, .NET, JavaScript oder REST-API, um eine Toolboxversion zu löschen.

Dieser Vorgang wird mit der Azure Developer CLI nicht unterstützt. Verwenden Sie zum Löschen einer Toolboxversion die Registerkarte Python, .NET, REST-API oder JavaScript.

Konfigurieren von Tools

Wählen Sie den Tooltyp und das Authentifizierungsmuster aus, das Ihrem Szenario entspricht. Wählen Sie die Registerkarte für Ihre bevorzugte SDK- oder Bereitstellungsmethode aus.

Die unten stehende Registerkarte azd jedes Tools zeigt deklaratives Toolbox-YAML. Um ohne Agentprojekt imperativ eine Toolbox zu erstellen, verwenden Sie den generischen vierstufigen azd ai toolbox create --from-fileWorkflow und wenden Sie die in den folgenden Abschnitten gezeigten toolbezogenen Daten an. Um eine Toolbox mit einem gehosteten Agenten bereitzustellen, modellieren Sie sie in azure.ai.toolbox als azure.yaml-Dienst und binden Sie den Agenten mit uses: oder toolboxes: daran an.

Mehrere Tooltypen

Eine einzelne Toolbox kann verschiedene Tooltypen bündeln. Im folgenden Beispiel werden Websuche, Azure KI-Suche und ein MCP-Server in einer Toolbox kombiniert:

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

Hinweis

Jeder Werkzeugtyp (web_search, azure_ai_search, code_interpreter, file_search) kann höchstens ohne Feld name angezeigt werden. Um mehrere Instanzen desselben Typs einzuschließen, legen Sie für jede Instanz eine eindeutige name Fest. Weitere Informationen finden Sie im nächsten Beispiel.

Einschränkungen für mehrere Tools

Sie können höchstens eine Instanz jedes integrierten Tooltyps ohne Feld name in einer Toolbox einschließen. Wenn Sie zwei Instanzen desselben Typs ohne ein name einschließen, gibt die API Folgendes zurück:

400 invalid_payload: Multiple tools without identifiers found...

Zwei Instanzen desselben Tooltyps

Verwenden Sie das name Feld, um mehrere Instanzen desselben Tooltyps in einer Toolbox einzuschließen. Jede benannte Instanz wird als separates Tool behandelt und muss einen eindeutigen Namen haben.

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

In den folgenden Abschnitten wird die Konfiguration der einzelnen Tooltypen detailliert angezeigt.

Modellkontextprotokoll (MCP)

Hinweis

Der Toolbox-MCP-Endpunkt unterstützt lang andauernde Vorgänge mithilfe von MCP-Aufgaben, die derzeit als Vorschau verfügbar sind. Um Tools mit langer Laufzeit zu verwenden, stellen Sie sicher, dass Ihr Agent-Framework MCP-Aufgaben unterstützt.

Schlüsselbasierte Authentifizierung:

{
  "description": "my-mcp-toolbox",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com",
      "project_connection_id": "my-mcp-connection"
    }
  ]
}

Keine Authentifizierung (öffentlicher MCP-Server):

{
  "description": "Public MCP server",
  "tools": [
    {
      "type": "mcp",
      "server_label": "myserver",
      "server_url": "https://your-mcp-server.example.com"
    }
  ]
}

OAuth oder identitätsbasierte Authentifizierung:

Erstellen Sie für OAuth (verwalteter Connector, benutzerdefinierte App-Registrierung), Agentidentität oder Benutzer-Entra-Tokenauthentifizierung zuerst die entsprechende Verbindung in Ihrem Foundry-Projekt, und verweisen Sie darauf mit 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>"
    }
  ]
}

Die Verbindung authType bestimmt den Authentifizierungsfluss. Unterstützte Verbindungsauthentifizierungstypen für MCP umfassen CustomKeys, OAuth2 (verwaltet oder benutzerdefiniert), AgenticIdentityTokenund UserEntraToken. Sehen Sie sich auf der Registerkarte azd Beispiele für Verbindungskonfigurationen für die einzelnen Authentifizierungstypen an.

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",
  },
];

Erstellen Sie eine Projektverbindung für Ihren MCP-Server mit dem Authentifizierungstyp, der Ihrem Szenario entspricht, und verweisen Sie dann aus einer minimalen Toolbox-YAML darauf.

Schritt 1. Erstellen der Verbindung

Hinweis

Exportieren Sie Ihren Projektendpunkt, und legen Sie ihn als aktives Projekt für die azd ai Befehle fest:

PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
azd ai project set $PROJECT_ENDPOINT

Wählen Sie die Authentifizierungsvariante aus, die Sie benötigen:

# No auth — public MCP server
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://learn.microsoft.com/api/mcp \
  --auth-type none

# Custom-keys header (for example, GitHub PAT)
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://api.githubcopilot.com/mcp/ \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer $GITHUB_PAT"

# OAuth — bring your own app registration
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://your-mcp-server.example.com \
  --auth-type oauth2 \
  --authorization-url https://auth.example.com/authorize \
  --token-url https://auth.example.com/token \
  --client-id <oauth-client-id> \
  --client-secret <oauth-client-secret> \
  --scopes "<scope1> <scope2>"

# User Entra token (managed user identity passthrough; for example, Microsoft Fabric)
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://api.fabric.microsoft.com/v1/mcp/fabricaihub/integrations/m365 \
  --auth-type user-entra-token \
  --audience https://analysis.windows.net/powerbi/api

# Project managed identity — the project's system-assigned MI
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://<resource>.cognitiveservices.azure.com/language/mcp \
  --auth-type project-managed-identity \
  --audience https://cognitiveservices.azure.com

# Agentic identity — the agent's per-project identity
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://<resource>.cognitiveservices.azure.com/language/mcp \
  --auth-type agentic-identity \
  --audience https://cognitiveservices.azure.com
--auth-type Zusätzliche Flags
none
custom-keys --custom-key "Header=Value" (wiederholbar)
oauth2 --authorization-url, --token-url, --client-id, --client-secret, , --scopes
user-entra-token --audience <entra-audience>
project-managed-identity --audience <entra-audience> (wahlweise)
agentic-identity --audience <entra-audience>

Weisen Sie bei identitätsbasierter Authentifizierung (user-entra-token, project-managed-identity, agentic-identity) dem entsprechenden Prinzipal die erforderliche RBAC-Rolle für die Zielressource zu, bevor Sie die Toolbox aufrufen.

Schritt 2. Definieren der Toolbox

# my-toolbox.yaml
description: MCP server tools
connections:
  - name: my-mcp-conn

Schritt 3: Erstellen der Toolbox

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Wichtig

Wenn ein Benutzer erstmals eine Toolbox mit einem OAuth-basierten MCP in einem Projekt aufruft, gibt der MCP-Endpunkt einen CONSENT_REQUIRED Fehler (Code -32006) mit einer Zustimmungs-URL zurück:

{
  "error": {
    "code": -32006,
    "message": "User consent is required. Please visit: https://..."
  }
}

Dieser Fehler wird erwartet. Öffnen Sie die Zustimmungs-URL in einem Browser, schließen Sie den OAuth-Autorisierungsfluss ab, und wiederholen Sie dann den Agentanruf. Nachfolgende Anrufe sind ohne erneute Aufforderung erfolgreich.

Wichtig

  • Die Websuche nutzt Grounding mit Bing-Suche und/oder Grounding mit benutzerdefinierter Bing-Suche, bei denen es sich um Erstanbieter-Verbrauchsdienste handelt, die durch diese Nutzungsbedingungen für das Grounding mit Bing und die Microsoft-Datenschutzbestimmungen geregelt werden.
  • Der Microsoft Datenschutz-Zusatz gilt nicht für Daten, die an Grounding mit Bing Search und Grounding mit Bing Custom Search gesendet werden. Wenn Sie Grounding mit Bing Search und Grounding mit der benutzerdefinierten Bing-Suche verwenden, erfolgen Datenübertragungen außerhalb von Vorschriften und geografischen Grenzen.
  • Die Verwendung von Grounding mit Bing Search und Grounding mit Bing Custom Search kann Kosten verursachen. Details finden Sie unter "Preise ".
  • Im Abschnitt Management finden Sie Informationen dazu, wie Azure Administratoren den Zugriff auf die Verwendung der Websuche verwalten können.

Verwenden Sie dieses Muster, um die Websuche hinzuzufügen. Für die Websuche mit Grounding mit Bing ist keine Projektverbindung erforderlich. Um ein Grounding mit benutzerdefinierter Bing Search-Instanz zu verwenden, fügen Sie ein web_search.custom_search_configuration Objekt hinzu, das auf Ihr Grounding mit bing Custom Search-Verbindung zeigt.

{
  "description": "Built-in web search",
  "tools": [
    {
      "type": "web_search",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>"
    }
  ]
}

Mit einer Verbindung mit „Grounding mit benutzerdefinierter Bing-Suche“:

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

Standard (Grounding mit Bing-Suche, keine Verbindung erforderlich):

# my-toolbox.yaml
description: Web search toolbox
tools:
  - type: web_search
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Verankerung mit Bing Custom Search:

# Step 1. Create the Bing Custom Search connection
azd ai connection create my-bing-custom \
  --kind GroundingWithCustomSearch \
  --target https://api.bing.microsoft.com/ \
  --auth-type api-key \
  --key "<bing-custom-search-key>"

--kind GroundingWithCustomSearch erfordert exakte PascalCase-Schreibweise.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Bing Custom Search toolbox
connections:
  - name: my-bing-custom
    instance_name: your-bing-custom-instance
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Hinweis

Wenn die Websuche Ergebnisse über MCP zurückgibt, handelt es sich bei der Antwort um ein resource Inhaltselement, das die synthetisierte Antwort mit Inline-Markdown-Quelllinks enthält. URL-Zitate befinden sich in content[].resource._meta.annotations[]. Zum Beispiel:

{
  "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
  }
}
{
  "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>",
        },
      ],
    },
  },
];
# Step 1. Create the Azure AI Search connection
azd ai connection create my-search \
  --kind cognitive-search \
  --target "https://<your-search>.search.windows.net/" \
  --auth-type api-key \
  --key "<aisearch-admin-key>"

cognitive-search Verbindungen akzeptieren auch --auth-type project-managed-identity (kein Schlüssel). Wenn Sie projektverwaltete Identität verwenden, weisen Sie die vom System zugewiesene verwaltete Identität des Projekts der Rolle "Suchindexdatenleser " im Suchdienst zu.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Azure AI Search toolbox
connections:
  - name: my-search
    index: your-index-name
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Konfigurieren von Toolparametern

Azure AI-Suche Tool-Parameter Erforderlich Notizen
project_connection_id Ja Die Ressourcen-ID der Projektverbindung mit Azure KI-Suche.
index_name Ja Der Name des Indexes in Ihrer Azure KI-Suche Ressource.
top_k Nein Der Standardwert ist 5.
query_type Nein Standardmäßig auf vector_semantic_hybrid. Unterstützte Werte: simple, vector, semantic, vector_simple_hybrid, vector_semantic_hybrid.
filter Nein Gilt für alle Abfragen, die der Agent an den Index sendet.

Die Suchergebnisse enthalten Blockmetadaten in result.structuredContent.documents[]. Jedes Dokument enthält title, url, idund score Felder, die Sie zum Generieren von Zitatdetails in Ihrer Anwendung verwenden können.

Codedolmetscher

Verwenden Sie dieses Muster, damit der Agent Python Code schreiben und ausführen kann. Für das Muster ist keine Projektverbindung oder zusätzliche Konfiguration erforderlich.

Um eine Datei hochzuladen, damit Code Interpreter sie über eine Toolbox verwenden kann, laden Sie die Datei über den Files-Endpunkt auf Ressourcenebene (POST {account_endpoint}/openai/v1/files) mit dem Header x-aml-project-id hoch. Im Gegensatz zum Prompt-Agent-Flow erhalten Dateien, die über den projektbezogenen Files-Endpunkt (/api/projects/{name}/openai/v1/files) hochgeladen werden, ein owner_id, das der Toolbox-Container nicht verifizieren kann, sodass tools/call mit einem Besitzüberprüfungsfehler fehlschlägt.

  1. Rufen Sie die Projekt-GUID aus Azure Resource Manager ab. Verwenden properties.amlWorkspace.internalId (gestricheltes UUID-Format), nichtproperties.internalId (keine Gedankenstriche – der Toolboxcontainer lehnt es ab):

    ARM_TOKEN=$(az account get-access-token --query accessToken -o tsv)
    PROJECT_GUID=$(curl -s -H "Authorization: Bearer $ARM_TOKEN" \
      "https://management.azure.com/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.CognitiveServices/accounts/{account}/projects/{project}?api-version=2025-06-01" \
      | jq -r '.properties.amlWorkspace.internalId')
    
  2. Laden Sie die Datei auf Kontoebene (Ressourcenebene) mit dem x-aml-project-id Header hoch:

    TOKEN=$(az account get-access-token --resource https://ai.azure.com/.default --query accessToken -o tsv)
    curl -X POST "https://{account}.services.ai.azure.com/openai/v1/files" \
      -H "Authorization: Bearer $TOKEN" \
      -H "x-aml-project-id: $PROJECT_GUID" \
      -F "purpose=assistants" \
      -F "file=@your-file.csv"
    

Die zurückgegebene Datei id ist der Wert, den Sie wie <FILE_ID> in der Toolkonfiguration angeben. Dateien werden in der Sandbox unter /mnt/data/{file-id}-{original-filename} eingehängt. Weitere Uploadbeispiele und sprachspezifische Beispiele finden Sie unter Code Interpreter .

Wichtig

Wenn Codedolmetscher über eine Toolbox in einem gehosteten Agent verwendet wird, wird die Benutzerisolation nicht unterstützt. Alle Benutzer im selben Projekt verwenden denselben Containerkontext.

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

Code Interpreter ist verbindungslos. Deklarieren Sie sie direkt unter tools:.

# my-toolbox.yaml
description: Code interpreter toolbox
tools:
  - type: code_interpreter
    container: { type: auto }
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Herunterladen von Ausgabedateien von Code Interpreter

Wenn Codedolmetscher Ausgabedateien (z. B. eine generierte CSV- oder Diagrammdatei) erzeugt, führen Sie die folgenden Schritte aus, um sie aufzulisten und herunterzuladen.

Schritt 1: Auflisten von Dateien mithilfe der Container-API

Extrahieren Sie das container_id aus content[]._meta.container_id in der tools/call-Antwort, und rufen Sie dann die Container Files API auf, um alle Dateien im Container aufzulisten.

GET {project_endpoint}/containers/{container_id}/files?api-version=v1
Authorization: Bearer {token}

Die Antwort gibt eine Liste von Dateien mit ihren Namen und IDs zurück.

Schritt 2: Herunterladen der Datei mithilfe der Datei-API

Verwenden Sie den von Schritt 1 zurückgegebenen Dateinamen, um die Datei über den Downloadendpunkt der Datei-API herunterzuladen.

Verwenden Sie dieses Muster, damit der Agent hochgeladene Dateien durchsuchen kann, die in einem Vektorspeicher gespeichert sind. Stellen Sie referenzierende vector_store_ids-Vektorspeicher bereit, die bereits in Ihrem Foundry-Projekt erstellt wurden.

Um eine Datei und einen Vektorspeicher zur Verwendung mit einer Toolbox zu erstellen, laden Sie die Datei am Files-Endpunkt auf Ressourcenebene mit dem Header x-aml-project-id hoch (dieselbe Anforderung wie beim Code Interpreter – im vorherigen Abschnitt erfahren Sie, wie Sie die Projekt-GUID aus properties.amlWorkspace.internalId abrufen):

  1. Laden Sie Ihre Datei hoch: POST {account_endpoint}/openai/v1/files mit purpose=assistants und Header x-aml-project-id: {project-guid}.
  2. Erstellen Sie einen Vektorspeicher: POST {account_endpoint}/openai/v1/vector_stores mit der zurückgegebenen Datei-ID und demselben x-aml-project-id Header.

Die resultierende Vektorspeicher-ID ist der Wert, den Sie angeben.<VECTOR_STORE_ID> Vollständige Beispiele für jede Sprache finden Sie in der Dateisuche .

Wichtig

Wenn die Dateisuche über eine Toolbox in einem gehosteten Agent verwendet wird, wird die Benutzerisolation nicht unterstützt. Alle Benutzer im selben Projekt teilen den Zugriff auf denselben Vektorspeicher.

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

Die Dateisuche ist ohne Verbindung, erfordert jedoch eine vorhandene Vektorspeicher-ID. Deklarieren Sie sie direkt unter tools:.

# my-toolbox.yaml
description: File search toolbox
tools:
  - type: file_search
    vector_store_ids:
      - vs_xxxxxxxxxxxx
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Hinweis

Wenn die Dateisuche Ergebnisse über MCP zurückgibt, werden Blockmetadaten als Markierungen in den Toolantwortinhalt 【index†filename†file_id【 eingebettet. Zum Beispiel:

{
  "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..."
        }
      }
    ]
  }
}

Der _meta-Block in jedem Ressourcenelement enthält title, file_id, document_chunk_id und Relevanz-score für den übereinstimmenden Block. Verwenden Sie diese Metadatenfelder in Ihrer Anwendung, um Zitatdetails oder Deep-Link zurück zur Quelldatei zu generieren.

OpenAPI

Verwenden Sie dieses Muster, um eine REST-API offenzulegen, die durch eine OpenAPI-Spezifikation beschrieben wird. Wählen Sie das auth.type, das dem Sicherheitsmodell Ihrer API entspricht.

Wichtig

Wenn verwaltete Identitätsauthentifizierung verwendet wird, müssen Sie die entsprechende RBAC-Rolle der verwalteten Identität Ihres Foundry-Projekts für den Zieldienst zuweisen. Weisen Sie der Zielressource in Azure beispielsweise "Reader" oder eine höhere Rolle zu. Ohne diese Zuweisung empfängt der Agent beim Aufrufen der API eine 401 Unauthorized Antwort. Vollständige Einrichtungsschritte finden Sie unter Authentifizieren mithilfe der verwalteten Identität.

Anonyme Authentifizierung:

{
  "description": "REST API via OpenAPI spec",
  "tools": [
    {
      "type": "openapi",
      "openapi": {
        "name": "my-api",
        "spec": { "<paste OpenAPI spec object here>" },
        "auth": {
          "type": "anonymous"
        }
      }
    }
  ]
}

Projekt-Authentifizierung:

Verwenden Sie dieses Muster, wenn für die API ein Schlüssel oder Token erforderlich ist, der in einer Foundry-Projektverbindung gespeichert ist.

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

Verwaltete Identitätsauthentifizierung:

Verwenden Sie dieses Muster, wenn sich die Ziel-API über Microsoft Entra ID authentifiziert. Die verwaltete Identität des Foundry-Projekts ruft die API im Namen des Agents auf. Stellen Sie sicher, dass die verwaltete Identität über die erforderliche RBAC-Rolle für den Zieldienst verfügt, bevor Sie dieses Muster verwenden.

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

OpenAPI-Tools betten die Spezifikation direkt unter tools: ein. Verbindungsbasierte Authentifizierung (connection_auth) verweist auf eine Projektverbindung. Anonyme OpenAPI-Tools benötigen keine Verbindung.

Schritt 1. (Optional) Erstellen der Authentifizierungsverbindung

Überspringen Sie diesen Schritt für anonyme OpenAPI-Tools.

# API-key auth (passed by the platform on every call)
azd ai connection create my-api-conn \
  --kind remote-tool \
  --target https://api.example.com \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer <token>"

OpenAPI-Tools akzeptieren auch --auth-type oauth2 Verbindungen. Den vollständigen Satz von azd ai connection create Flags finden Sie oben im MCP-Abschnitt.

Schritt 2. Definieren der Toolbox

Die OpenAPI-Spezifikation ist inline unter tools[].openapi.spec.

# my-toolbox.yaml
description: OpenAPI toolbox
tools:
  - type: openapi
    name: my-api
    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: my-api-conn

Ersetzen Sie den auth: Block für anonyme APIs durch:

      auth:
        type: anonymous
        security_scheme:
          type: anonymous

Schritt 3: Erstellen der Toolbox

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Agent-zu-Agent (A2A)

Verwenden Sie dieses Muster, um einen anderen Agent als Tool aufzurufen. Geben Sie die Basis-URL des Remote-Agents an, und geben Sie, falls die Authentifizierung erforderlich ist, eine Projektverbindung an.

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

Erstellen Sie eine remote-a2a Verbindung für den Remote-Agent, und verweisen Sie dann aus einer minimalen Toolbox-YAML darauf.

Schritt 1. Erstellen der Verbindung

Wählen Sie die Authentifizierungsvariante aus, die Sie benötigen:

# No auth
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type none

# Custom-keys header
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type custom-keys \
  --custom-key "Authorization=Bearer <token>"

# OAuth — bring your own app registration
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type oauth2 \
  --authorization-url https://auth.example.com/authorize \
  --token-url https://auth.example.com/token \
  --client-id <oauth-client-id> \
  --client-secret <oauth-client-secret> \
  --scopes "<scope1> <scope2>"

# User Entra token (managed user identity passthrough)
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type user-entra-token \
  --audience "<entra-audience>"

# Project managed identity
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type project-managed-identity \
  --audience "<entra-audience>"

# Agentic identity
azd ai connection create my-a2a-conn \
  --kind remote-a2a \
  --target https://your-remote-agent.azurecontainerapps.io \
  --auth-type agentic-identity \
  --audience "<entra-audience>"
--auth-type Zusätzliche Flags
none
custom-keys --custom-key "Header=Value" (wiederholbar)
oauth2 --authorization-url, --token-url, --client-id, --client-secret, , --scopes
user-entra-token --audience <entra-audience>
project-managed-identity --audience <entra-audience> (wahlweise)
agentic-identity --audience <entra-audience>

Schritt 2. Definieren der Toolbox

# my-toolbox.yaml
description: Agent-to-Agent toolbox
connections:
  - name: my-a2a-conn

Schritt 3: Erstellen der Toolbox

azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Fabric IQ

Verwenden Sie dieses Muster, um dem Agenten Zugriff auf Microsoft Fabric Daten – Ontologien, Datenagenten und Power BI semantischen Modellen – über Fabric IQ zu gewähren. Stellen Sie die Projektverbindung, die MCP-Server-URL und die Serverbezeichnung für das Ziel Fabric Element bereit.

{
  "description": "Fabric IQ for enterprise Fabric data access",
  "tools": [
    {
      "type": "fabric_iq_preview",
      "project_connection_id": "<CONNECTION_NAME>",
      "server_label": "<SERVER_LABEL>",
      "server_url": "<SERVER_URL>"
    }
  ]
}
tools = [
    {
        "type": "fabric_iq_preview",
        "project_connection_id": "<CONNECTION_NAME>",
        "server_label": "<SERVER_LABEL>",
        "server_url": "<SERVER_URL>",
    }
]

Fabric IQ wird als MCP-Endpunkt bedient. Erstellen Sie eine remote-tool Verbindung mit dem Fabric IQ-Server mit user-entra-token (empfohlen; die Identität des Anrufers wird an Fabric weitergeleitet), und verweisen Sie dann aus einer minimalen Toolbox-YAML darauf.

# Step 1. Create the Fabric IQ connection
azd ai connection create my-fabric-conn \
  --kind remote-tool \
  --target https://api.fabric.microsoft.com/v1/mcp/fabricaihub/integrations/m365 \
  --auth-type user-entra-token \
  --audience https://analysis.windows.net/powerbi/api

remote-tool Verbindungen akzeptieren auch --auth-type oauth2. Den vollständigen Flagsatz finden Sie oben im MCP-Abschnitt.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Fabric IQ (semantic model)
tools:
  - type: fabric_iq_preview
    project_connection_id: my-fabric-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Muster nach Fabric-Elementtyp finden Sie unter server_url.

Annotationssegmente werden in result.structuredContent.documents[] zurückgegeben. Jedes Dokument enthält title und url Felder, mit denen Sie Zitatdetails in Ihrer Anwendung generieren können.

Verwenden Sie dieses Muster, um das intentbasierte Toolrouting zu aktivieren. Wenn toolbox_search_preview sie in einer Toolbox enthalten ist, wählt die Plattform die relevantesten Tools für jede Anforderung aus, anstatt alle Tools gleichzeitig dem Modell zur Verfügung zu stellen. Es ist keine zusätzliche Konfiguration erforderlich.

{
  "description": "Toolbox with intent-based tool routing",
  "tools": [
    {
      "type": "toolbox_search_preview"
    }
  ]
}
tools = [
    {"type": "toolbox_search_preview"}
]

Tool Search ist verbindungslos. Deklarieren Sie sie direkt unter tools:.

# my-toolbox.yaml
description: Toolbox with intent-based tool routing
tools:
  - type: toolbox_search_preview
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Hinweis

toolbox_search_preview ist eine Konfigurationsdirektive, die die Toolsuche aktiviert. Sie wird nicht in tools/list Antworten angezeigt und zählt nicht zum Grenzwert für nicht benannte Tools pro Typ.

Wenn die Toolsuche aktiviert ist, fügt Foundry zwei Metatools zusammen mit Ihren Toolboxtools ein: tool_search und call_tool. Das call_tool Meta-Tool fungiert als Proxy, der es Agent-Frameworks ermöglicht, jedes erkannte Tool über einen einzigen deklarierten Einstiegspunkt anhand seines Namens aufzurufen. Dadurch werden Schemaüberprüfungsfehler vermieden, die auftreten, wenn ein Framework versucht, ein Tool aufzurufen, das nicht in der ursprünglichen tools/listDatei vorhanden war. Wenn Ihr Framework direkte Toolaufrufe ohne Schemavorüberprüfung unterstützt, können Sie auch ein ermitteltes Tool direkt nach der Suche aufrufen.tool_search

Wählen Sie im Foundry Toolkit für Visual Studio Code Toolsuche auf der Registerkarte Build a Custom Toolbox aus, wenn Sie eine Toolbox erstellen oder bearbeiten. Weitere Informationen finden Sie unter Aktivieren der Toolsuche in einer Toolbox.

Work IQ

Verwenden Sie dieses Muster, um dem Agent Zugriff auf den Microsoft 365 Arbeitskontext des Benutzers – E-Mail, Besprechungen, Dateien und Chats – über Work IQ zu gewähren. Stellen Sie eine Projektverbindung mit Ihrem Work IQ-Endpunkt bereit.

{
  "description": "Work IQ for Microsoft 365 data access",
  "tools": [
    {
      "type": "work_iq_preview",
      "project_connection_id": "<CONNECTION_NAME>"
    }
  ]
}
tools = [
    {
        "type": "work_iq_preview",
        "project_connection_id": "<CONNECTION_NAME>",
    }
]

Work IQ wird als A2A-Endpunkt bedient. Erstellen Sie eine remote-a2a-Verbindung zum Work IQ-Server mit oauth2, und verweisen Sie anschließend mit einem minimalen Toolbox-YAML darauf.

# Step 1. Create the Work IQ connection
azd ai connection create my-workiq-conn \
  --kind remote-a2a \
  --target https://agent365.svc.cloud.microsoft/agents/agents/workiq \
  --auth-type oauth2 \
  --authorization-url https://login.microsoftonline.com/common/oauth2/v2.0/authorize \
  --token-url https://login.microsoftonline.com/common/oauth2/v2.0/token \
  --client-id <oauth-client-id> \
  --client-secret <oauth-client-secret> \
  --scopes "<scope1> <scope2>"
# Step 2. Define the toolbox (my-toolbox.yaml)
description: Work IQ toolbox
tools:
  - type: work_iq_preview
    project_connection_id: my-workiq-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Browserautomatisierung

{
  "description": "Perform actions using a real web browser",
  "tools": [
    {
      "type": "browser_automation_preview",
      "name": "<OPTIONAL_TOOL_NAME>",
      "description": "<Optional description for the model>",
      "browser_automation_preview": {
        "connection": {
          "project_connection_id": "<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>"
        }
      }
    }
  ]
}
from azure.ai.projects.models import (
    BrowserAutomationPreviewTool,
    BrowserAutomationToolParameters,
    BrowserAutomationToolConnectionParameters,
)

tools = [
    BrowserAutomationPreviewTool(
        browser_automation_preview=BrowserAutomationToolParameters(
            connection=BrowserAutomationToolConnectionParameters(
                project_connection_id="<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>",
            )
        )
    )
]
ProjectsAgentTool tool = new BrowserAutomationPreviewTool(
    new BrowserAutomationToolOptions(
        new BrowserAutomationToolConnectionParameters("<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>")
    )
);
const tools = [
  {
    type: "browser_automation_preview",
    name: "<OPTIONAL_TOOL_NAME>",
    description: "<Optional description for the model>",
    browser_automation_preview: {
      connection: {
          project_connection_id: "<BROWSER_AUTOMATION_PROJECT_CONNECTION_ID>"
      }
    }
  },
];
# Step 1. Create the Playwright Workspace connection
azd ai connection create my-browser-conn \
  --kind PlaywrightWorkspace \
  --target wss://your-browser-endpoint.api.playwright.microsoft.com/playwrightworkspaces/browsers \
  --auth-type api-key \
  --key "<playwright-workspaces-access-token>"

--kind PlaywrightWorkspace erfordert exakte PascalCase-Schreibweise.

# Step 2. Define the toolbox (my-toolbox.yaml)
description: Browser Automation toolbox
tools:
  - type: browser_automation_preview
    project_connection_id: my-browser-conn
# Step 3. Create the toolbox
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml

Fehlerbehebung

Symptom Wahrscheinliche Ursache Behebung
tools/list gibt Nulltools für MCP- oder A2A-Tools zurück. Ungültige oder fehlende Verbindungsdaten für den Remote-MCP-Server oder des A2A-Agenten. Die Toolbox kann keine Toolmanifeste vom Remoteendpunkt ohne gültige Authentifizierung abrufen. Überprüfen Sie, ob project_connection_id in Ihrem Foundry-Projekt vorhanden ist und ob die Anmeldeinformationen korrekt sind. Versuchen Sie, eine direkte Verbindung mit dem MCP-Server herzustellen, um das Authentifizierungssetup zu testen. Überprüfen Sie bei Verwendung der verwalteten Identität (PMI, Agent-Identität oder MI) die richtigen RBAC-Rollenzuweisungen für den Aufrufer auf der Zielressource.
tools/list gibt Nulltools für OpenAPI-Tools zurück. Ungültige OpenAPI-Spezifikation. Die Toolbox erstellt das Toolmanifest aus der Spezifikation, was fehlschlägt, wenn die Spezifikation fehlerhaft ist. Überprüfen Sie den OpenAPI-Spezifikationsinhalt. Überprüfen Sie, ob sie openAPI 3.0 oder 3.1 entspricht und gültige paths, operationId Werte und Parameterschemas enthält. Überprüfen Sie bei Verwendung der verwalteten Identitätsauthentifizierung auch RBAC-Rollenzuweisungen für den Zieldienst.
tools/list gibt weniger Tools als erwartet zurück. Der allowed_tools Filter enthält falsche oder falsch geschriebene Toolnamen. Bei Toolnamen wird die Groß-/Kleinschreibung beachtet, und die Namen müssen der MCP-Spezifikation für Toolnamen entsprechen (keine Leerzeichen oder Sonderzeichen). Entfernen Sie allowed_tools vorübergehend und rufen Sie tools/list an, um die vollständige Toolliste abzurufen. Verwenden Sie die genauen Namen aus der Antwort, um Werte für allowed_tools.
tools/list gibt null Werkzeuge (andere Tooltypen) zurück. Toolbox nicht vollständig bereitgestellt oder Werkzeugtyp wird in dieser Region nicht unterstützt. Für integrierte Tools (Websuche, KI-Suche, Codedolmetscher, Dateisuche) werden Toolmanifeste serverseitig erstellt und erfordern keine Authentifizierung – wenn sie leer zurückgeben, wird die Toolboxversion möglicherweise noch nicht bereitgestellt. Warten Sie 10 Sekunden, und wiederholen Sie den Vorgang.
400 Multiple tools without identifiers Zwei unbenannte Tooltypen in einer Toolbox Behalten Sie höchstens ein unbenanntes Element bei; fügen Sie server_label zu allen MCP-Tools hinzu.
CONSENT_REQUIRED (Code -32006) OAuth-Verbindung erfordert Die Zustimmung des Benutzers Öffnen Sie die Zustimmungs-URL in einem Browser, schließen Sie den OAuth-Ablauf ab und wiederholen Sie dann den Vorgang.
401 bei MCP-Anrufen Abgelaufenes Token oder falscher Gültigkeitsbereich Verwenden Sie den Bereich https://ai.azure.com/.default , und aktualisieren Sie das Token.
Toolnamen, die nicht übereinstimmen MCP-Toolnamen werden mit dem Präfix versehen. server_label Format {server_label}.{tool_name} verwenden (z. B myserver.get_info. ).
500 unter send_ping() Der TOOLBOX-MCP-Server implementiert die MCP-Methode ping nicht. Rufen Sie nicht auf send_ping(). Wenn Ihr Framework sie automatisch aufruft (z. B. Microsoft Agent Frameworks MCPStreamableHTTPTool._ensure_connected()), deaktivieren Sie die Ping-Überprüfung, oder setzen Sie die Methode mit einem no-op außer Kraft.
500 unter prompts/list Der Foundry MCP-Server implementiert prompts/listnicht . Übergeben Sie load_prompts=False (oder ein Äquivalent) an den Konstruktor Ihres MCP-Clients.
500 mit Nicht-Streaming-tools/call Der Nicht-Streamingmodus (stream=False) wird für MCP-Endpunkte der Toolbox nicht unterstützt. Verwenden Sie immer stream=True beim Verwenden von Toolbox MCP Tools.
500 unter tools/list Vorübergehender Serverfehler Wiederholen Sie den Vorgang nach ein paar Sekunden.
Umgebungsvariablen, die zur Laufzeit überschrieben werden Die Plattform behält sich alle mit FOUNDRY_ vorangestellten Umgebungsvariablen vor und überschreibt möglicherweise stillschweigend benutzerdefinierte Werte. Benennen Sie benutzerdefinierte Umgebungsvariablen um, um das FOUNDRY_ Präfix zu vermeiden (z. B. anstelle TOOLBOX_MCP_ENDPOINT von FOUNDRY_TOOLBOX_ENDPOINT).

Schutzmechanismen konfigurieren

Wenden Sie eine benannte Guardrail-Richtlinie auf eine Toolboxversion an, um die verantwortungsvolle KI-Inhaltsfilterung auf Tooleingaben und -ausgaben zu erzwingen. Die Leitlinie wird auf der Toolboxebene ausgeführt, unabhängig von einem Inhaltsfilter auf Modellebene.

Auf eine Schutzschiene wird mit dem Richtliniennamen verwiesen, den Sie im Foundry-Portal unter Guardrails konfigurieren. Legen Sie policies.rai_config.rai_policy_name beim Erstellen einer Toolboxversion auf den Namen der Richtlinie fest.

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

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

toolbox_version = project.beta.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with guardrail",
    tools=[WebSearchTool()],
    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.CreateToolboxVersion(
    toolboxName: "my-toolbox",
    description: "Toolbox with guardrail",
    tools: [new WebSearchTool()],
    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.beta.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

Die Guardrail-Konfiguration ist in der VS Code-Erweiterung noch nicht verfügbar. Verwenden Sie die REST-API, das SDK oder azd, um Leitplanken zu konfigurieren.

Kompetenzen mit einer Toolbox verknüpfen

Fügen Sie Fähigkeiten an eine Toolboxversion an, um sie über den MCP-Endpunkt der Toolbox für Agents verfügbar zu machen. Jede Qualifikationsreferenz gibt den Qualifikationsnamen und eine optionale Version an. Lassen Sie version weg, um den default_version des Skills zu verwenden; heften Sie eine version-Zeichenfolge an, um eine unveränderliche Momentaufnahme zu verwenden.

Eine Toolboxversion kann Tools, Fähigkeiten oder beides enthalten. In den folgenden Beispielen wird eine Toolboxversion erstellt, die einen einzigen Qualifikationsverweis enthält. Wenn Sie einer Toolbox, die bereits Über Tools verfügt, Fähigkeiten hinzufügen möchten, fügen Sie dasselbe tools hinzu, das Sie in Schritt 1 zusammen mit dem skills Array verwendet haben.

Wichtig

Fähigkeiten, die an eine Toolbox angefügt sind, müssen im gleichen Foundry-Projekt vorhanden sein. Projektübergreifende Verweise werden nicht unterstützt.

Wenn ein Agent oder MCP-Client eine Verbindung mit dem Toolboxendpunkt herstellt, werden Fähigkeiten als MCP-Ressourcen verfügbar gemacht. Das MCP-Client- oder Agentframework muss das MCP Resources-Protokoll unterstützen, um Fähigkeiten zum automatischen Ermitteln und Laden zu unterstützen. Um zu überprüfen, ob Fähigkeiten auffindbar sind, rufen Sie resources/list den MCP-Endpunkt der Toolbox auf, und bestätigen Sie, dass Ihre Qualifikationsnamen in der Antwort angezeigt werden.

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

So heften Sie eine bestimmte Version an:

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

toolbox_version = project.beta.toolboxes.create_version(
    name="my-toolbox",
    description="Toolbox with a skill reference",
    tools=[],
    skills=[
        ToolboxSkillReference(name="greeting"),              # use default version
        # ToolboxSkillReference(name="greeting", version="v1"),  # pin to v1
    ],
)
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 = "v1" }

ToolboxVersion toolboxVersion = toolboxClient.CreateToolboxVersion(
    name: "my-toolbox",
    tools: [],
    skills: [skillRef],
    description: "Toolbox with a skill reference"
);
Console.WriteLine($"Created toolbox version: {toolboxVersion.Id}");
const toolboxVersion = await project.beta.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}`);

Die Azure Developer CLI unterstützt Skillverweise an zwei Stellen: deklarativ als skills:-Block auf oberster Ebene in der azd ai toolbox create --from-file-YAML-Datei und imperativ mit den azd ai toolbox skill add/list/remove-Verben. Jeder Verweis erfordert ein name (erforderlich) und ein optionales version (Zeichenfolge). Lassen Sie version aus, um der default_version des Skills zu folgen. Geben Sie eine Versionszeichenfolge an, um die Toolbox auf einen unveränderlichen Snapshot festzulegen.

Deklarieren von Fähigkeiten beim Erstellen der Toolbox

# 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

Hinzufügen, Auflisten und Entfernen von Fähigkeiten in einer vorhandenen Toolbox

# 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 zeigt nur die Standardversion an. Angeheftete Skills zeigen ihre Version, nicht angeheftete Skills hingegen zeigen (default). Um Skills in einer ausstehenden Version zu überprüfen, führen Sie azd ai toolbox show <toolbox> --version <n> --output json aus, und lesen Sie das Array skills.

Wichtig

skill add und skill remove erstellen jeweils eine neue Toolboxversion, die alle zuvor angefügten Verbindungen und Skills mit der angeforderten Änderung übernimmt. Sie machen die neue Version nicht zur Standardversion, sodass Änderungen für MCP-Clients erst sichtbar sind, wenn Sie azd ai toolbox publish <toolbox> <version> ausführen. Um die angeheftete Version einer bereits angefügten Fähigkeit zu ändern, z. B. ein Upgrade greeting von v1 auf v2, führen Sie drei Befehle in der reihenfolge aus: skill remove, publish die neue Version, dann skill add <name>@<new-version> (skill add blockiert Duplikate, wenn sie mit der aktuellen Standardversion überprüft werden).

Qualifikationsnamen müssen übereinstimmen ^[a-z0-9]([a-z0-9\-]*[a-z0-9])?$ (Kleinbuchstaben, Ziffern und Bindestriche; max. 64 Zeichen; kein führendes oder nachfolgendes Bindestrich). Eine nachfolgende @ in <name>@<version> (eine leere Version) wird abgelehnt.

Qualifikationsverweise können derzeit nicht über die VS Code-Erweiterung konfiguriert werden. Verwenden Sie die REST-API oder das SDK, um Fähigkeiten zu konfigurieren.

Überprüfen der Fähigkeitserkennung

Überprüfen Sie nach dem Anfügen von Fähigkeiten an eine Toolboxversion, ob sie über den MCP-Endpunkt der Toolbox mithilfe des MCP Python SDK auffindbar sind:

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

Fähigkeiten werden als MCP-Ressourcen mit URIs im Format skill://{name}angezeigt.

Fähigkeiten aus einem Agent nutzen (Microsoft Agent Framework, .NET)

Verwenden Sie in .NET AgentSkillsProviderBuilder().UseMcpSkills(mcpClient) aus dem Microsoft Agent Framework SDK, um MCP-basierte Fähigkeiten von einem Toolboxendpunkt zu ermitteln und sie als AIContextProviders auf dem Agent einzubringen. Der Agent lädt dann zur Laufzeit die Anweisungen der einzelnen Skills, wenn das Modell entscheidet, dass sie relevant sind. Im folgenden Program.cs wird der Agent mit der Hostebene „Antworten“ (AddFoundryResponses und MapFoundryResponses) gehostet.

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

Das vollständige Beispiel, einschließlich Projektdateien und Bereitstellungsschritte, finden Sie im Beispiel "Skills in Toolbox".

Unterstützung für virtuelle Netzwerke

Wenn Ihr Foundry-Projekt Netzwerkisolation (private Verknüpfung) verwendet, werden nicht alle Toolboxtooltypen unterstützt. Die folgende Tabelle zeigt den Supportstatus für jeden Tooltyp und die Art und Weise, wie Datenverkehr in einer netzwerkisolten Umgebung fließt.

Tooltyp VNet-Unterstützung Verkehrsfluss
MCP ✅ Unterstützt Über Ihr VNet-Subnetz
Azure KI-Suche ✅ Unterstützt Über den privaten Endpunkt
Codedolmetscher ✅ Unterstützt Microsoft Backbone-Netzwerk
Websuche ✅ Unterstützt Öffentlicher Endpunkt
OpenAPI ✅ Unterstützt Hängt von der Konfiguration des Ziel-API-Netzwerks ab
Dateisuche ❌ Nicht unterstützt Noch nicht verfügbar
Agent-zu-Agent (A2A) ✅ Unterstützt Über den privaten Endpunkt
Fabric IQ ❌ Nicht unterstützt Noch nicht verfügbar
Work IQ ❌ Nicht unterstützt Noch nicht verfügbar
Browserautomatisierung ❌ Nicht unterstützt Noch nicht verfügbar

Anweisungen zur vollständigen Netzwerkisolation, einschließlich der VNet-Einfügung für den Agentclient, die DNS-Konfiguration und die Anforderungen für private Endpunkte, finden Sie unter Configure-Netzwerkisolation für Microsoft Foundry.

Regions- und Modellkompatibilität

Die Verfügbarkeit der Toolbox hängt von zwei Faktoren ab, die über die Projektregion hinausgehen:

  • Region: Einige Tooltypen sind in jeder Region, die den Agentdienst unterstützt, nicht verfügbar. Beispielsweise unterstützt eine Region, die den Toolboxendpunkt unterstützt, möglicherweise nicht alle integrierten Tooltypen.

Stellen Sie vor der Bereitstellung einer Toolbox sicher, dass Ihre Zielregion die tooltypen unterstützt, die Sie verwenden möchten. Die vollständigen Kompatibilitätstabellen finden Sie unter Toolunterstützung nach Region und Modell.