Verbinden von Agents mit Modellkontextprotokollservern

Verbinden Sie Ihre Foundry-Agents mithilfe des MCP-Tools (Model Context Protocol) mit den MCP-Servern . Diese Verbindung erweitert die Agent-Funktionen mit externen Tools und Datenquellen. Durch die Verbindung mit Remote-MCP-Serverendpunkten kann das Foundry-Modell Ihres Agents auf Tools zugreifen, die von Entwicklern und Organisationen gehostet werden, die MCP-kompatible Clients wie Foundry Agent Service verwenden können.

MCP ist ein offener Standard, der definiert, wie Anwendungen Tools und Kontextdaten für große Sprachmodelle (LLMs) bereitstellen. Sie ermöglicht eine konsistente, skalierbare Integration externer Tools in Modellworkflows.

Tipp

Erwägen Sie das Hinzufügen dieses Tools mithilfe einer Toolbox. Mithilfe einer Toolbox können Sie das Tool über Agents und Laufzeiten hinweg wiederverwenden sowie die Verwaltung von Anmeldeinformationen, versionsverwaltung und Richtlinienerzwingung über einen verwalteten MCP-Endpunkt zentralisieren. Sehen Sie sich die Schnellstartanleitung der Toolbox an.

In diesem Artikel erfahren Sie, wie Sie:

  • Fügen Sie einen MCP-Remoteserver als Tool hinzu.
  • Authentifizieren sie sich bei einem MCP-Server mithilfe einer Projektverbindung.
  • Überprüfen und genehmigen Sie MCP-Toolaufrufe.
  • Fehlerbehebung bei häufigen MCP-Integrationsproblemen.

Wenn Sie einen Codierungs-Agent wie GitHub Copilot verwenden, kann die Microsoft Foundry Skill bei der Konfiguration von MCP-Toolverbindungen, Authentifizierung, Genehmigungsverhalten und Problembehandlungsschritten helfen.

Voraussetzungen

Bevor Sie beginnen, stellen Sie sicher, dass Sie folgendes haben:

  • Ein Azure-Abonnement mit einem aktiven Microsoft Foundry-Projekt.

  • Die Rolle Foundry User im Foundry-Projekt zum Erstellen und Testen von Agenten. Wenn Sie eine Projektverbindung für die MCP-Authentifizierung erstellen, benötigen Sie auch die Rolle Foundry Project Manager auf diesem Projekt.

    Important

    Die Foundry-RBAC-Rollen wurden kürzlich umbenannt. Foundry User, Foundry Owner, Foundry Account Owner und Foundry Project Manager wurden zuvor Azure KI-Benutzer, Azure KI-Besitzer, Azure KI-Kontobesitzer und Azure AI Project Manager benannt. Möglicherweise werden die vorherigen Namen an einigen Stellen weiterhin angezeigt, während der Umbenennungsrollout ausgeführt wird. Die Rollen-IDs und Kernberechtigungen bleiben durch die Umbenennung unverändert.

  • Das neueste SDK-Paket für Ihre Sprache. Das .NET SDK ist derzeit als Vorschauversion verfügbar. Details zur Installation finden Sie in der Schnellstartanleitung.

  • für die Authentifizierung konfigurierte Azure-Anmeldeinformationen (z. B. DefaultAzureCredential).

  • Zugriff auf einen Remote-MCP-Serverendpunkt (z. B. MCP-Server von GitHub bei https://api.githubcopilot.com/mcp).

Auswählen einer Aufgabe

Aufgabe Path
Verbinden eines Agents und Bestätigen des ersten erfolgreichen Toolanrufs Folgen Sie der Verbindungs-, Genehmigungs-, Überprüfungs- und Bereinigungsroute.
Hinzufügen von Anmeldeinformationen oder identitätsbasiertem Zugriff Sekundär:Authentifizierung konfigurieren.
Herstellen einer Verbindung mit einem privaten MCP-Endpunkt Sekundär:Öffentliche und private Endpunktanforderungen überprüfen.
Ausführen eines langen Vorgangs im Hintergrundmodus Sekundär:Lang andauernde Vorgänge konfigurieren.
Grundlegendes zum Streaming- und Timeoutverhalten Sekundär:Überprüfen Sie die bekannten Einschränkungen.
Konfigurieren von Serveroptionen oder Hosten eines lokalen Servers Sekundär:Die MCP-Verbindung einrichten oder einen lokalen MCP-Server hosten.

Konzeptionelle Informationen zur Funktionsweise der MCP-Integration finden Sie unter "Funktionsweise".

Verwendungsunterstützung

Die folgende Tabelle zeigt die SDK- und Setup-Unterstützung für MCP-Verbindungen.

Microsoft Foundry-Unterstützung Python SDK C# SDK JavaScript SDK Java SDK REST-API Grundlegendes Agent-Setup Standard-Agenten-Einrichtung
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Öffentliche und private MCP-Serverendpunkte

Der Agentdienst unterstützt sowohl öffentliche als auch private MCP-Serverendpunkte:

  • Öffentliche Endpunkte: Stellen Sie eine Verbindung mit jedem öffentlich zugänglichen Remote-MCP-Server her. Diese Option funktioniert sowohl mit Basic-Agent-Setups als auch mit Standard-Agent-Setups.
  • Private Endpunkte: Stellen Sie eine Verbindung mit MCP-Servern her, die nicht für das öffentliche Internet verfügbar gemacht werden. Private MCP erfordert ein privates Netzwerksetup und ein dediziertes MCP-Subnetz in Ihrem virtuellen Netzwerk.

Stellen Sie für private MCP-Server Ihren MCP-Server auf Azure Container Apps mit einem ausschließlich internen Zugriffspunkt in einem dedizierten MCP-Subnetz bereit, das an Microsoft.App/environments delegiert ist. Verwenden Sie zunächst die Einrichtungsvorlage "19-private-network-agents-tools-setup ", die die erforderliche Netzwerkinfrastruktur einschließlich des MCP-Subnetz- oder 11-private-network-basic-Projekts enthält, wenn Sie ihre eigenen Ressourcen nicht mitbringen möchten.

Ausführliche Informationen zur Toolunterstützung in netzwerkisolten Umgebungen finden Sie unter Agenttools mit Netzwerkisolation.

Verwenden von Foundry Toolboxes als MCP-Endpunkte

Foundry Toolboxes ermöglichen es Ihnen, mehrere Tools – z. B. Websuche, Codedolmetscher, Dateisuche, Azure KI-Suche, MCP-Server, OpenAPI-Tools und Agent-zu-Agent-Verbindungen – in einem einzigen MCP-kompatiblen Endpunkt zu bündeln. Anstatt jedes Tool separat für jeden Agent zu konfigurieren, erstellen Sie eine Toolbox in Foundry, und verweisen Sie Ihren Agent mithilfe der Standardkonfiguration mcp des Tools (server_url und server_label) auf den Toolbox-Endpunkt.

Da der Toolbox-Endpunkt MCP-kompatibel ist, kann jede Laufzeit, die einen MCP-Server nutzen kann, auch eine Toolbox nutzen. Diese Kompatibilität umfasst den Foundry Agent Service, Microsoft Agent Framework, LangGraph, GitHub Copilot SDK und andere MCP-fähige Clients. Sie können Tools in der Toolbox hinzufügen, entfernen oder neu konfigurieren, ohne den Agentcode zu ändern.

Schritte zum Einrichten finden Sie unter Erstellen und Verwenden einer Foundry Toolbox.

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.

Toolbox MCP-Authentifizierung und -Konfiguration

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

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=******"

# 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

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.

Authentifizierung

Sekundärer Pfad: Konfigurieren Sie die Authentifizierung nach der First-Success-Route, wenn Ihr MCP-Server Anmeldeinformationen oder identitätsbasierten Zugriff erfordert.

Viele MCP-Server erfordern eine Authentifizierung.

Verwenden Sie im Foundry Agent Service eine Projektverbindung zum Speichern von Authentifizierungsdetails, z. B. API-Schlüssel oder Bearertoken, anstelle von hartcodierenden Anmeldeinformationen in Ihrer App.

Informationen zu unterstützten Authentifizierungsoptionen, einschließlich schlüsselbasierter, Microsoft Entra Identitäten und OAuth-Identitätsdurchlauf, finden Sie unter MCP-Serverauthentifizierung.

Hinweis

Setzen Sie die ID der Projektverbindung auf project_connection_id.

Tipp

Wenn Sie den Azure DevOps MCP-Server (Vorschau) über die Add Tools Katalog hinzufügen, authentifizieren Sie sich während des Verbindungsschritts der Organisation bei Azure DevOps und speichern die Authentifizierung als Projektverbindung. Verwenden Sie das Prinzip des geringstmöglichen Privilegs und überprüfen Sie die Berechtigungen, wenn Sie eine Verbindung mit der Organisation herstellen.

Wenn Sie einen MCP-Endpunkt der Foundry Toolbox verwenden, verwaltet die Toolbox die Authentifizierung zentral. Die Toolbox übernimmt zur Laufzeit die Einfügung von Zugangsdaten, die Token-Erneuerung und die Durchsetzung von Richtlinien für alle Tools im Bundle. Agents authentifizieren sich beim Toolboxendpunkt selbst mithilfe von Anmeldeinformationen von Microsoft Entra, z. B. DefaultAzureCredential, und einzelne Toolanmeldeinformationen müssen nicht von jedem Agenten übergeben werden. Informationen zur Konfiguration der Toolboxauthentifizierung finden Sie unter Toolboxvoraussetzungen.

Überlegungen zur Verwendung von nicht-Microsoft-Diensten und -Servern

Sie unterliegen den Bedingungen zwischen Ihnen und dem Dienstanbieter, wenn Sie verbundene nicht Microsoft-Dienste verwenden. Wenn Sie eine Verbindung mit einem Nicht-Microsoft-Dienst herstellen, übergeben Sie einige Ihrer Daten, z. B. Aufforderungsinhalte, an den Dienst ohne Microsoft oder Ihre Anwendung möglicherweise Daten vom Dienst ohne Microsoft. Sie sind für die Verwendung von nicht Microsoft-Dienste und Daten sowie für alle Gebühren verantwortlich, die dieser Nutzung zugeordnet sind.

Drittanbieter erstellen, nicht Microsoft, die Remote-MCP-Server, die Sie mit dem in diesem Artikel beschriebenen MCP-Tool verwenden möchten. Microsoft testet oder überprüft diese Server nicht. Microsoft hat keine Verantwortung für Sie oder andere Personen in Bezug auf Ihre Nutzung von Remote-MCP-Servern.

Überprüfen Und verfolgen Sie sorgfältig, welche MCP-Server Sie dem Foundry Agent Service hinzufügen. Verlassen Sie sich auf Server, die von vertrauenswürdigen Dienstanbietern selbst und nicht von Proxys gehostet werden.

Mit dem MCP-Tool können Sie benutzerdefinierte Header wie Authentifizierungsschlüssel oder Schemas übergeben, die ein MCP-Remoteserver möglicherweise benötigt. Überprüfen Sie alle Daten, die Sie für Remote-MCP-Server freigeben, und protokollieren Sie die Daten zu Überwachungszwecken. Seien Sie sich der Praktiken bewusst, die nicht von Microsoft stammen, bezüglich der Aufbewahrung und des Speicherorts von Daten.

Hinweis

Foundry Toolboxes unterscheiden sich von MCP-Servern von Drittanbietern. Toolboxen sind organisationsgesteuerte Ressourcen, die Sie innerhalb Ihres Microsoft Foundry-Projekts erstellen und verwalten. Beim Zusammenstellen von Toolboxinhalten sind Sie jedoch weiterhin für die Toolauswahl, die Datenverarbeitung und die Compliance verantwortlich.

Bewährte Methoden

Allgemeine Anleitungen zur Toolverwendung finden Sie unter Best Practices für die Verwendung von Tools in Microsoft Foundry Agent Service.

Wenn Sie MCP-Server verwenden, befolgen Sie die folgenden Methoden:

  • Verwenden Sie eine zulässige Liste von Tools mithilfe von allowed_tools.
  • Behandeln Sie Toolbeschreibungen, Anmerkungen und Ergebnisse von Remote-MCP-Servern als nicht vertrauenswürdige Eingaben. Sie können Anweisungen für indirekte Prompt-Injection enthalten.
  • Erfordern Sie eine Genehmigung für Vorgänge mit hohem Risiko, insbesondere Tools zum Schreiben von Daten oder Ändern von Ressourcen.
  • Überprüfen Sie den angeforderten Toolnamen und die angeforderten Argumente, bevor Sie dies genehmigen.
  • Überprüfen Sie allowed_tools, Freigabeeinstellungen und Verbindungsberechtigungen, wenn sich der Serverbetreiber, die bereitgestellten Tools oder das Verhalten ändern.
  • Protokollieren von Genehmigungen und Toolaufrufen zur Überwachung und Problembehandlung.

Tipp

Wenn Sie den Azure DevOps MCP-Server über den Add Tools-Katalog hinzufügen, wird die Toolauswahlkonfiguration dem in diesem Artikel beschriebenen verhalten allowed_tools zugeordnet. Das Auswählen einer Teilmenge von Tools in der Katalogbenutzeroberfläche entspricht der Angabe einer allowed_tools Liste im Code.

Pfad zum ersten Erfolg: verbinden, bestätigen, überprüfen und aufräumen

Verwenden Sie das Prompt-Agent-Beispiel für Ihre ausgewählte Sprache. Wenn das Beispiel Registerkarten vom Typ Agent enthält, wählen Sie Prompt Agents aus. Diese Route konzentriert sich auf die erste Ausführung auf eine Aufgabe: Verbinden Sie einen MCP-Server, rufen Sie ein Tool auf, und prüfen Sie das Ergebnis.

  1. Verbinden: Konfigurieren Sie das MCP-Tool mit require_approval set to always, und fügen Sie es an den Agent an.
  2. Genehmigen: Führen Sie das Beispiel aus, überprüfen Sie den angeforderten Server, das Tool und die Argumente, und genehmigen Sie nur den erwarteten Aufruf.
  3. Überprüfen Sie Folgendes: Vergewissern Sie sich, dass die endgültige Antwort Informationen enthält, die vom MCP-Tool zurückgegeben werden, wie in der erwarteten Ausgabe dargestellt.
  4. Bereinigen: Führen Sie den Bereinigungsvorgang des Beispiels aus. Die Prompt-Agent-Beispiele löschen die Version des Agents, und das TypeScript-Beispiel löscht auch seine Konversation.

Erstellen eines Agents in Python mit dem MCP-Tool

Verwenden Sie das folgende Codebeispiel, um einen Agent zu erstellen und die Funktion aufzurufen. Das .NET SDK ist derzeit als Vorschauversion verfügbar. Details finden Sie in der Schnellstartanleitung .

Das folgende Beispiel zeigt, wie Sie den GitHub MCP-Server einer Toolbox hinzufügen und die Toolbox an einen Agent anfügen. Wählen Sie Prompt Agents aus, um das AZURE AI Projects SDK zum Erstellen eines serverseitigen Eingabeaufforderungs-Agents oder Hosted Agents zu verwenden, um das Agent Framework FoundryChatClient zum Erstellen eines ephemeralen, in-Process-Agents zu verwenden.

Prompt-Agenten

import json
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import PromptAgentDefinition, MCPTool
from openai.types.responses.response_input_param import McpApprovalResponse, ResponseInputParam

# Format: "https://resource_name.ai.azure.com/api/projects/project_name"
PROJECT_ENDPOINT = "your_project_endpoint"
MCP_CONNECTION_NAME = "my-mcp-connection"

# Create clients to call Foundry API
project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

# [START tool_declaration]
tool = MCPTool(
    server_label="api-specs",
    server_url="https://api.githubcopilot.com/mcp",
    require_approval="always",
    project_connection_id=MCP_CONNECTION_NAME,
)
# [END tool_declaration]

# Create a prompt agent with MCP tool capabilities
agent = project.agents.create_version(
    agent_name="MyAgent7",
    definition=PromptAgentDefinition(
        model="gpt-5-mini",
        instructions="Use MCP tools as needed",
        tools=[tool],
    ),
)
print(f"Agent created (id: {agent.id}, name: {agent.name}, version: {agent.version})")

# Create a conversation to maintain context across multiple interactions
conversation = openai.conversations.create()
print(f"Created conversation (id: {conversation.id})")

# Send initial request that will trigger the MCP tool
response = openai.responses.create(
    conversation=conversation.id,
    input="What is my username in my GitHub profile?",
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)

# Process any MCP approval requests that were generated
input_list: ResponseInputParam = []
for item in response.output:
    if item.type == "mcp_approval_request" and item.id:
        print("MCP approval requested")
        print(f"  Server: {item.server_label}")
        print(f"  Tool: {getattr(item, 'name', '<unknown>')}")
        print(
            f"  Arguments: {json.dumps(getattr(item, 'arguments', None), indent=2, default=str)}"
        )

        # Approve only after you review the tool call.
        # In production, implement your own approval UX and policy.
        should_approve = (
            input("Approve this MCP tool call? (y/N): ").strip().lower() == "y"
        )
        input_list.append(
            McpApprovalResponse(
                type="mcp_approval_response",
                approve=should_approve,
                approval_request_id=item.id,
            )
        )

# Send the approval response back to continue the agent's work
response = openai.responses.create(
    input=input_list,
    previous_response_id=response.id,
    extra_body={"agent_reference": {"name": agent.name, "type": "agent_reference"}},
)

print(f"Response: {response.output_text}")

# Clean up resources by deleting the agent version
project.agents.delete_version(agent_name=agent.name, agent_version=agent.version)
print("Agent deleted")

Erwartete Ausgabe

Das folgende Beispiel zeigt das erwartete Ergebnis, wenn Sie das Beispiel ausführen.

Agent created (id: <agent-id>, name: MyAgent7, version: 1)
Created conversation (id: <conversation-id>)
Response: Your GitHub username is "example-username".
Agent deleted

Gehostete Agents

Dieses Beispiel verwendet FoundryChatClient aus dem Microsoft Agent Framework, erstellt eine Toolbox, die den GitHub MCP-Server enthält, und bindet dann den Endpunkt der Toolbox mit FoundryToolbox an Ihren gehosteten Agent an. Installieren Sie die Pakete mit pip install agent-framework-foundry, legen Sie die FOUNDRY_PROJECT_ENDPOINT Variablen und FOUNDRY_MODEL Umgebungsvariablen fest, und melden Sie sich mit az login.

import asyncio

from agent_framework import Agent
from agent_framework.foundry import FoundryChatClient, FoundryToolbox
from azure.ai.projects import AIProjectClient
from azure.ai.projects.models import MCPToolboxTool
from azure.identity import AzureCliCredential

PROJECT_ENDPOINT = "https://<account>.services.ai.azure.com/api/projects/<project>"
MCP_CONNECTION_NAME = "my-mcp-connection"


async def main() -> None:
    credential = AzureCliCredential()

    # 1. Add the GitHub MCP server to a toolbox.
    project = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)
    server_tool = MCPToolboxTool(
        server_label="api-specs",
        server_url="https://api.githubcopilot.com/mcp",
        require_approval="always",
        project_connection_id=MCP_CONNECTION_NAME,
    )
    toolbox = project.toolboxes.create_version(
        name="mcp-server-toolbox",
        description="Toolbox with the GitHub MCP server",
        tools=[server_tool],
    )

    # 2. The toolbox exposes an MCP-compatible endpoint.
    TOOLBOX_MCP_URL = (
        f"{PROJECT_ENDPOINT}/toolboxes/{toolbox.name}"
        f"/versions/{toolbox.version}/mcp?api-version=v1"
    )

    # 3. Attach the toolbox to the hosted agent as an MCP tool.
,
        timeout=120.0,
    )

    toolbox_tool = FoundryToolbox(credential, url=TOOLBOX_MCP_URL)

agent = Agent(
        client=FoundryChatClient(credential=credential),
        instructions="You are a helpful assistant that uses your MCP tool "
        "to help with Microsoft documentation questions.",
        tools=[toolbox_tool],
    )

    result = await agent.run("What is Microsoft Agent Framework?")
    print(f"Agent: {result.text}")

if __name__ == "__main__":
    asyncio.run(main())

Erwartete Ausgabe

Der Agent ruft den Microsoft Learn MCP-Server über den Toolboxendpunkt auf und gibt Dokumentationstext zurück:

Agent: Microsoft Agent Framework is an open-source framework for building, orchestrating, and deploying AI agents ...

Die vollständigen Toolboxmuster für gehostete Agent finden Sie unter Verwenden einer Toolbox mit einem gehosteten Agent.


Erstellen eines Agents mit MCP-Tool

Das folgende Beispiel zeigt, wie Sie einer Toolbox einen Remote-MCP-Server hinzufügen und die Toolbox an einen Agent anfügen. Wählen Sie Prompt Agents aus, um das AZURE AI Projects SDK zum Erstellen eines serverseitigen Eingabeaufforderungs-Agents oder Hosted Agents zu verwenden, um das Microsoft Agent Framework zum Erstellen eines ephemeren, in-Process-Agents zu verwenden.

Prompt-Agenten

Im Beispiel werden synchrone Methoden zum Erstellen eines Agents verwendet. Für asynchrone Methoden sehen Sie den Beispielcode im Azure SDK für .NET-Repository auf GitHub.

using System;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";

// Create project client to call Foundry API
AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

// Create Agent with the `MCPTool`. Note that in this scenario 
// GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval is used,
// which means that any calls to the MCP server must be approved.
DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
    Instructions = "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
    Tools = { ResponseTool.CreateMcpTool(
        serverLabel: "api-specs",
        serverUri: new Uri("https://gitmcp.io/Azure/azure-rest-api-specs"),
        toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
    )) }
};
AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "myAgent",
    options: new(agentDefinition));

// If the tool approval is required, the response item is
// of `McpToolCallApprovalRequestItem` type and contains all
// the information about tool call. This example checks that
// the server label is "api-specs" and approves the tool call.
// All other calls are denied because they should not occur for
// the current configuration.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);

CreateResponseOptions nextResponseOptions = new([ResponseItem.CreateUserMessageItem("Please summarize the Azure REST API specifications README")]);
ResponseResult latestResponse = null;

while (nextResponseOptions is not null)
{
    latestResponse = responseClient.CreateResponse(nextResponseOptions);
    nextResponseOptions = null;

    foreach (ResponseItem responseItem in latestResponse.OutputItems)
    {
        if (responseItem is McpToolCallApprovalRequestItem mcpToolCall)
        {
            nextResponseOptions = new CreateResponseOptions()
            {
                PreviousResponseId = latestResponse.Id,
            };
            if (string.Equals(mcpToolCall.ServerLabel, "api-specs"))
            {
                Console.WriteLine($"Approval requested for {mcpToolCall.ServerLabel} (tool: {mcpToolCall.ToolName})");
                Console.Write("Approve this MCP tool call? (y/N): ");
                bool approved = string.Equals(Console.ReadLine(), "y", StringComparison.OrdinalIgnoreCase);
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: approved));
            }
            else
            {
                Console.WriteLine($"Rejecting unknown call {mcpToolCall.ServerLabel}...");
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: false));
            }
        }
    }
}

// Output the final response from the agent.
Console.WriteLine(latestResponse.GetOutputText());

// Clean up resources by deleting the agent version.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);

Erwartete Ausgabe

Das folgende Beispiel zeigt das erwartete Ergebnis, wenn Sie das Beispiel ausführen.

Approval requested for api-specs...
Response: The Azure REST API specifications repository contains the OpenAPI specifications for Azure services. It is
organized by service and includes guidelines for contributing new specifications. The repository is intended for use by developers building tools and services that interact with Azure APIs.

Gehostete Agents

In diesem Beispiel wird die MCP-Server-Toolbox mit dem AZURE AI Projects SDK erstellt. Anschließend wird die integration von Microsoft Agent Framework AddFoundryToolboxes verwendet, um die Toolboxtools für Ihren gehosteten Agent verfügbar zu machen. Legen Sie die Umgebungsvariablen AZURE_AI_PROJECT_ENDPOINT, AZURE_OPENAI_ENDPOINT und AZURE_AI_MODEL_DEPLOYMENT_NAME fest, und melden Sie sich mit az login an.

using Azure.AI.AgentServer.Responses;
using Azure.AI.AgentServer.Responses.Models;
using Azure.AI.OpenAI;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Foundry.Hosting;
using Microsoft.Extensions.DependencyInjection;
using OpenAI.Chat;

string projectEndpoint = Environment.GetEnvironmentVariable("AZURE_AI_PROJECT_ENDPOINT")
    ?? "https://<account>.services.ai.azure.com/api/projects/<project>";
string openAiEndpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
    ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
string deploymentName = Environment.GetEnvironmentVariable("AZURE_AI_MODEL_DEPLOYMENT_NAME") ?? "gpt-5-mini";

DefaultAzureCredential credential = new();

// 1. Create the MCP server tool and add it to a toolbox.
AIProjectClient projectClient = new(endpoint: new Uri(projectEndpoint), tokenProvider: credential);
McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "api-specs",
    serverUri: new Uri("https://gitmcp.io/Azure/azure-rest-api-specs"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));

ToolboxVersion toolboxVersion = projectClient.AgentAdministrationClient
    .GetAgentToolboxes().CreateToolboxVersion(
        toolboxName: "mcp-server-toolbox",
        tools: [ProjectsAgentTool.AsProjectTool(mcpTool)],
        description: "Toolbox with the GitHub MCP server");

// Create the hosted agent and register the toolbox integration.
AIAgent agent = projectClient.AsAIAgent(
    model: deploymentName,
    instructions: "You are a helpful assistant with access to the toolbox tools.",
    name: "hosted-toolbox-agent");

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

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

Erwartete Ausgabe

Wenn der gehostete Agent aufgerufen wird, fragt der gehostete Agent den Microsoft Learn MCP-Server über den Toolbox-Endpunkt für Dokumentationsausschnitte und Antworten ab:

User: How does one create an Azure storage account using the az CLI?

Agent: To create an Azure storage account using the az CLI, run: `az storage account create --name <name> --resource-group <rg> --location <region> --sku Standard_LRS` ...

Eine verwaltete .NET Agent Framework-Integration finden Sie unter Verwenden einer Toolbox mit einem gehosteten Agent.


Erstellen eines Agents mithilfe des MCP-Tools mit der Projektverbindungsauthentifizierung

In diesem Beispiel erfahren Sie, wie Sie sich innerhalb einer Toolbox beim GitHub MCP-Server authentifizieren und dann den MCP-Endpunkt der Toolbox an einen Agent anfügen. Im Beispiel werden synchrone Methoden zum Erstellen der Toolbox und des Agents verwendet. Für asynchrone Methoden sehen Sie den Beispielcode im Azure SDK für .NET-Repository auf GitHub.

Einrichten der Projektverbindung

Vor dem Ausführen des Beispiels:

  1. Melden Sie sich bei Ihrem GitHub Profil an.
  2. Wählen Sie das Profilbild in der oberen rechten Ecke aus.
  3. Wählen Sie "Einstellungen" aus.
  4. Wählen Sie im linken Bereich Entwicklereinstellungen und persönliche Zugriffstoken (klassisch) aus>.
  5. Wählen Sie oben " Neues Token generieren" aus, geben Sie Ihr Kennwort ein, und erstellen Sie ein Token, das öffentliche Repositorys lesen kann.
    • Wichtig: Speichern Sie das Token, oder lassen Sie die Seite geöffnet, sobald die Seite geschlossen wurde, kann das Token nicht mehr angezeigt werden.
  6. Öffnen Sie im Azure-Portal Microsoft Foundry.
  7. Wählen Sie "Verwalten" in der oberen rechten Navigationsleiste aus, wählen Sie Project Details aus, und wählen Sie dann die Registerkarte "Verbundene Ressourcen" aus.
  8. Erstellen Sie eine neue Verbindung mit dem Typ "Benutzerdefinierte Schlüssel" .
  9. Benennen Sie es, und fügen Sie ein Schlüsselwertpaar hinzu.
  10. Legen Sie den Schlüsselnamen auf Authorization fest und der Wert sollte die Form von Bearer your_github_token haben.

Codebeispiel zum Erstellen des Agents

using System;
using Azure.AI.Projects;
using Azure.AI.Extensions.OpenAI;
using Azure.Identity;

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
var projectEndpoint = "your_project_endpoint";
var mcpConnectionName = "my-mcp-connection";

// Create project client to call Foundry API
AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

// 1. Add the GitHub MCP server to a toolbox. Using a toolbox is the recommended
//    way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
AgentToolboxes toolboxClient = projectClient.AgentAdministrationClient.GetAgentToolboxes();

McpTool mcpTool = ResponseTool.CreateMcpTool(
    serverLabel: "api-specs",
    serverUri: new Uri("https://api.githubcopilot.com/mcp"),
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));
mcpTool.ProjectConnectionId = mcpConnectionName;

ToolboxVersion toolboxVersion = toolboxClient.CreateToolboxVersion(
    toolboxName: "mcp-server-toolbox",
    tools: [ProjectsAgentTool.AsProjectTool(mcpTool)],
    description: "Toolbox with the GitHub MCP server");

// 2. The toolbox exposes an MCP-compatible endpoint.
var toolboxMcpUrl = new Uri(
    $"{projectEndpoint}/toolboxes/{toolboxVersion.Name}" +
    $"/versions/{toolboxVersion.Version}/mcp?api-version=v1");

// 3. Create a remote-tool project connection that points at the toolbox endpoint.
//    Use a user Entra token so the caller's identity is passed through
//    (audience https://ai.azure.com). Create the connection once, for example
//    with the Azure Developer CLI:
//
//    azd ai connection create mcp-server-toolbox-conn \
//      --kind remote-tool \
//      --target "<toolboxMcpUrl>" \
//      --auth-type user-entra-token \
//      --audience https://ai.azure.com
var toolboxConnectionName = "mcp-server-toolbox-conn";

// 4. Attach the toolbox to a prompt agent as an MCP tool. Note that in this scenario
//    GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval is used, which means that
//    any calls to the toolbox MCP endpoint must be approved.
McpTool toolboxTool = ResponseTool.CreateMcpTool(
    serverLabel: "toolbox",
    serverUri: toolboxMcpUrl,
    toolCallApprovalPolicy: new McpToolCallApprovalPolicy(
        GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval));
toolboxTool.ProjectConnectionId = toolboxConnectionName;

DeclarativeAgentDefinition agentDefinition = new(model: "gpt-5-mini")
{
    Instructions = "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
    Tools = { toolboxTool }
};
AgentVersion agentVersion = projectClient.AgentAdministrationClient.CreateAgentVersion(
    agentName: "myAgent",
    options: new(agentDefinition));

// If the tool approval is required, the response item is
// of McpToolCallApprovalRequestItem type and contains all
// the information about tool call. This example checks that
// the server label is "toolbox" and approves the tool call.
// All other calls are denied because they shouldn't happen given
// the current configuration.
ProjectResponsesClient responseClient = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentVersion.Name);

CreateResponseOptions nextResponseOptions = new([ResponseItem.CreateUserMessageItem("What is my username in my GitHub profile?")]);
ResponseResult latestResponse = null;

while (nextResponseOptions is not null)
{
    latestResponse = responseClient.CreateResponse(nextResponseOptions);
    nextResponseOptions = null;

    foreach (ResponseItem responseItem in latestResponse.OutputItems)
    {
        if (responseItem is McpToolCallApprovalRequestItem mcpToolCall)
        {
            nextResponseOptions = new()
            {
                PreviousResponseId = latestResponse.Id,
            };
            if (string.Equals(mcpToolCall.ServerLabel, "toolbox"))
            {
                Console.WriteLine($"Approval requested for {mcpToolCall.ServerLabel} (tool: {mcpToolCall.ToolName})");
                Console.Write("Approve this MCP tool call? (y/N): ");
                bool approved = string.Equals(Console.ReadLine(), "y", StringComparison.OrdinalIgnoreCase);
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: approved));
            }
            else
            {
                Console.WriteLine($"Rejecting unknown call {mcpToolCall.ServerLabel}...");
                nextResponseOptions.InputItems.Add(ResponseItem.CreateMcpApprovalResponseItem(approvalRequestId: mcpToolCall.Id, approved: false));
            }
        }
    }
}

// Output the final response from the agent.
Console.WriteLine(latestResponse.GetOutputText());

// Clean up resources by deleting the agent version.
projectClient.AgentAdministrationClient.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);

Erwartete Ausgabe

Das folgende Beispiel zeigt das erwartete Ergebnis, wenn Sie das Beispiel ausführen.

Approval requested for toolbox...
Response: Your GitHub username is "example-username".

Erstellen eines Agents in TypeScript mit dem MCP-Tool

Im folgenden TypeScript-Beispiel wird veranschaulicht, wie Sie einer Toolbox einen MCP-Server hinzufügen, die Toolbox an einen Agent anfügen, Anforderungen senden, die MCP-Genehmigungsworkflows auslösen, Genehmigungsanforderungen behandeln und Ressourcen bereinigen. Für eine JavaScript-Version sehen Sie im Beispielcode im Azure SDK für das JavaScript-Repository auf GitHub nach.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
import OpenAI from "openai";
import * as readline from "readline";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";

export async function main(): Promise<void> {
  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  console.log("Creating agent with MCP tool...");

  // 1. Add the Azure REST API specifications MCP server to a toolbox. Using a toolbox is
  //    the recommended way to give agents tools. See /azure/foundry/agents/concepts/toolbox-overview
  const toolbox = await project.toolboxes.createVersion(
    "mcp-server-toolbox",
    [
      {
        type: "mcp",
        server_label: "api-specs",
        server_url: "https://gitmcp.io/Azure/azure-rest-api-specs",
        require_approval: "always",
      },
    ],
    { description: "Toolbox with the Azure REST API specifications MCP server" },
  );

  // 2. The toolbox exposes an MCP-compatible endpoint.
  const toolboxMcpUrl =
    `${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
    `/versions/${toolbox.version}/mcp?api-version=v1`;

  // 3. Create a remote-tool project connection that points at the toolbox endpoint.
  //    Use a user Entra token so the caller's identity is passed through
  //    (audience https://ai.azure.com). Create the connection once, for example
  //    with the Azure Developer CLI:
  //
  //    azd ai connection create mcp-server-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionName = "mcp-server-toolbox-conn";

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  // The toolbox tool requires approval for each operation to ensure user control over external requests.
  const agent = await project.agents.createVersion("agent-mcp", {
    kind: "prompt",
    model: "gpt-5-mini",
    instructions:
      "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "always",
        project_connection_id: toolboxConnectionName,
      },
    ],
  });
  console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);

  // Create a conversation thread to maintain context across multiple interactions
  console.log("\nCreating conversation...");
  const conversation = await openai.conversations.create();
  console.log(`Created conversation (id: ${conversation.id})`);

  // Send initial request that will trigger the MCP tool to access Azure REST API specs
  // This will generate an approval request since requireApproval="always"
  console.log("\nSending request that will trigger MCP approval...");
  const response = await openai.responses.create(
    {
      conversation: conversation.id,
      input: "Please summarize the Azure REST API specifications Readme",
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  // Process any MCP approval requests that were generated
  // When requireApproval="always", the agent will request permission before accessing external resources
  const inputList: OpenAI.Responses.ResponseInputItem.McpApprovalResponse[] = [];

  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
  const ask = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));
  for (const item of response.output) {
    if (item.type === "mcp_approval_request") {
      if (item.server_label === "toolbox" && item.id) {
        console.log(`\nReceived MCP approval request (id: ${item.id})`);
        console.log(`  Server: ${item.server_label}`);
        console.log(`  Tool: ${item.name}`);

        // Approve only after you review the tool call.
        // In production, implement your own approval UX and policy.
        const answer = (await ask("Approve this MCP tool call? (y/N): ")).trim().toLowerCase();
        const approve = answer === "y";
        inputList.push({
          type: "mcp_approval_response",
          approval_request_id: item.id,
          approve,
        });
      }
    }
  }

  rl.close();

  console.log(`\nProcessing ${inputList.length} approval request(s)`);
  console.log("Final input:");
  console.log(JSON.stringify(inputList, null, 2));

  // Send the approval response back to continue the agent's work
  // This allows the MCP tool to access the GitHub repository and complete the original request
  console.log("\nSending approval response...");
  const finalResponse = await openai.responses.create(
    {
      input: inputList,
      previous_response_id: response.id,
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  console.log(`\nResponse: ${finalResponse.output_text}`);

  // Clean up resources by deleting the agent version and conversation
  // This prevents accumulation of unused resources in your project
  console.log("\nCleaning up resources...");
  await openai.conversations.delete(conversation.id);
  console.log("Conversation deleted");

  await project.agents.deleteVersion(agent.name, agent.version);
  console.log("Agent deleted");

  console.log("\nMCP sample completed!");
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Erwartete Ausgabe

Das folgende Beispiel zeigt das erwartete Ergebnis, wenn Sie das Beispiel ausführen.

Creating agent with MCP tool...
Agent created (id: <agent-id>, name: agent-mcp, version: 1)

Creating conversation...
Created conversation (id: <conversation-id>)

Sending request that will trigger MCP approval...

Received MCP approval request (id: <approval-request-id>)
  Server: api-specs
  Tool: get-readme

Processing 1 approval request(s)
Final input:
[
  {
    "type": "mcp_approval_response",
    "approval_request_id": "<approval-request-id>",
    "approve": true
  }
]

Sending approval response...

Response: The Azure REST API specifications repository contains the OpenAPI specifications for Azure services. It is organized by service and includes guidelines for contributing new specifications. The repository is intended for use by developers building tools and services that interact with Azure APIs.

Cleaning up resources...
Conversation deleted
Agent deleted

MCP sample completed!

Erstellen eines Agents mithilfe des MCP-Tools mit der Projektverbindungsauthentifizierung

Im folgenden TypeScript-Beispiel wird veranschaulicht, wie Sie einer Toolbox einen authentifizierten MCP-Server hinzufügen, den MCP-Endpunkt der Toolbox an einen Agent anfügen, Anforderungen senden, die MCP-Genehmigungsworkflows auslösen, Genehmigungsanforderungen behandeln und Ressourcen bereinigen. Für eine JavaScript-Version sehen Sie im Beispielcode im Azure SDK für das JavaScript-Repository auf GitHub nach.

import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";
import OpenAI from "openai";
import * as readline from "readline";

// Format: "https://resource_name.ai.azure.com/api/projects/project_name"
const PROJECT_ENDPOINT = "your_project_endpoint";
const MCP_CONNECTION_NAME = "my-mcp-connection";

export async function main(): Promise<void> {
  // Create clients to call Foundry API
  const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
  const openai = project.getOpenAIClient();

  console.log("Creating agent with MCP tool using project connection...");

  // 1. Add the GitHub MCP server to a toolbox with project connection authentication.
  // The project connection should have Authorization header configured with "Bearer <GitHub PAT token>"
  // Token can be created at https://github.com/settings/personal-access-tokens/new
  const toolbox = await project.toolboxes.createVersion(
    "mcp-server-toolbox",
    [
      {
        type: "mcp",
        server_label: "api-specs",
        server_url: "https://api.githubcopilot.com/mcp",
        require_approval: "always",
        project_connection_id: MCP_CONNECTION_NAME,
      },
    ],
    { description: "Toolbox with the GitHub MCP server" },
  );

  // 2. The toolbox exposes an MCP-compatible endpoint.
  const toolboxMcpUrl =
    `${PROJECT_ENDPOINT}/toolboxes/${toolbox.name}` +
    `/versions/${toolbox.version}/mcp?api-version=v1`;

  // 3. Create a remote-tool project connection that points at the toolbox endpoint.
  //    Use a user Entra token so the caller's identity is passed through
  //    (audience https://ai.azure.com). Create the connection once, for example
  //    with the Azure Developer CLI:
  //
  //    azd ai connection create mcp-server-toolbox-conn \
  //      --kind remote-tool \
  //      --target "<toolboxMcpUrl>" \
  //      --auth-type user-entra-token \
  //      --audience https://ai.azure.com
  const toolboxConnectionName = "mcp-server-toolbox-conn";

  // 4. Attach the toolbox to a prompt agent as an MCP tool.
  const agent = await project.agents.createVersion("agent-mcp-connection-auth", {
    kind: "prompt",
    model: "gpt-5-mini",
    instructions: "Use MCP tools as needed",
    tools: [
      {
        type: "mcp",
        server_label: "toolbox",
        server_url: toolboxMcpUrl,
        require_approval: "always",
        project_connection_id: toolboxConnectionName,
      },
    ],
  });
  console.log(`Agent created (id: ${agent.id}, name: ${agent.name}, version: ${agent.version})`);

  // Create a conversation thread to maintain context across multiple interactions
  console.log("\nCreating conversation...");
  const conversation = await openai.conversations.create();
  console.log(`Created conversation (id: ${conversation.id})`);

  // Send initial request that will trigger the MCP tool
  console.log("\nSending request that will trigger MCP approval...");
  const response = await openai.responses.create(
    {
      conversation: conversation.id,
      input: "What is my username in my GitHub profile?",
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  // Process any MCP approval requests that were generated
  const inputList: OpenAI.Responses.ResponseInputItem.McpApprovalResponse[] = [];

  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
  const ask = (q: string) => new Promise<string>((resolve) => rl.question(q, resolve));
  for (const item of response.output) {
    if (item.type === "mcp_approval_request") {
      if (item.server_label === "toolbox" && item.id) {
        console.log(`\nReceived MCP approval request (id: ${item.id})`);
        console.log(`  Server: ${item.server_label}`);
        console.log(`  Tool: ${item.name}`);

        // Approve only after you review the tool call.
        // In production, implement your own approval UX and policy.
        const answer = (await ask("Approve this MCP tool call? (y/N): ")).trim().toLowerCase();
        const approve = answer === "y";
        inputList.push({
          type: "mcp_approval_response",
          approval_request_id: item.id,
          approve,
        });
      }
    }
  }

  rl.close();

  console.log(`\nProcessing ${inputList.length} approval request(s)`);
  console.log("Final input:");
  console.log(JSON.stringify(inputList, null, 2));

  // Send the approval response back to continue the agent's work
  // This allows the MCP tool to access the GitHub repository and complete the original request
  console.log("\nSending approval response...");
  const finalResponse = await openai.responses.create(
    {
      input: inputList,
      previous_response_id: response.id,
    },
    {
      body: { agent_reference: { name: agent.name, type: "agent_reference" } },
    },
  );

  console.log(`\nResponse: ${finalResponse.output_text}`);

  // Clean up resources by deleting the agent version and conversation
  // This prevents accumulation of unused resources in your project
  console.log("\nCleaning up resources...");
  await openai.conversations.delete(conversation.id);
  console.log("Conversation deleted");

  await project.agents.deleteVersion(agent.name, agent.version);
  console.log("Agent deleted");

  console.log("\nMCP with project connection sample completed!");
}

main().catch((err) => {
  console.error("The sample encountered an error:", err);
});

Erwartete Ausgabe

Das folgende Beispiel zeigt das erwartete Ergebnis, wenn Sie das Beispiel ausführen.

Creating agent with MCP tool using project connection...
Agent created (id: <agent-id>, name: agent-mcp-connection-auth, version: 1)
Creating conversation...
Created conversation (id: <conversation-id>)
Sending request that will trigger MCP approval...
Received MCP approval request (id: <approval-request-id>)
  Server: toolbox
  Tool: get-github-username
Processing 1 approval request(s)
Final input:
[
  {
    "type": "mcp_approval_response",
    "approval_request_id": "<approval-request-id>",
    "approve": true
  }
]
Sending approval response...
Response: Your GitHub username is "example-username".
Cleaning up resources...
Conversation deleted
Agent deleted
MCP with project connection sample completed!

Verwenden von MCP-Tools in einem Java Agent

Tipp

Die meisten Agents verwenden eine Toolbox , um das Dateisuchtool hinzuzufügen und die Toolbox als MCP-Tool an Ihren Agent anzufügen. *Wenn Sie das Java SDK verwenden, ist noch keine API zum Erstellen von Toolboxen verfügbar. Erstellen Sie eine Toolbox mithilfe der Python, REST-API, C#, TypeScript oder des Foundry-Portals, und verweisen Sie dann von Ihrem Java-Agent als McpToolMCP-Endpunkt darauf.

Fügen Sie die Abhängigkeit zu Ihrem pom.xml hinzu:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents</artifactId>
    <version>2.2.0</version>
</dependency>

Erstellen eines Agents mit MCP-Tool

import com.azure.ai.agents.AgentsClient;
import com.azure.ai.agents.AgentsClientBuilder;
import com.azure.ai.agents.ResponsesClient;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AgentVersionDetails;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.ai.agents.models.McpTool;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

import java.util.Collections;

public class McpToolExample {
    public static void main(String[] args) {
        // Format: "https://resource_name.ai.azure.com/api/projects/project_name"
        String projectEndpoint = "your_project_endpoint";
        // Create the toolbox out-of-band by using Python, REST, the Foundry portal, C#, or TypeScript.
        String toolboxMcpUrl = projectEndpoint + "/toolboxes/mcp-server-toolbox/versions/1/mcp?api-version=v1";
        String toolboxConnectionName = "mcp-server-toolbox-conn";

        AgentsClientBuilder builder = new AgentsClientBuilder()
            .credential(new DefaultAzureCredentialBuilder().build())
            .endpoint(projectEndpoint);

        AgentsClient agentsClient = builder.buildAgentsClient();
        ResponsesClient responsesClient = builder.buildResponsesClient();

        // Attach the toolbox MCP endpoint with server label, URL, connection, and approval mode.
        McpTool mcpTool = new McpTool("toolbox")
            .setServerUrl(toolboxMcpUrl)
            .setProjectConnectionId(toolboxConnectionName)
            .setRequireApproval("always");

        // Create agent with MCP tool
        PromptAgentDefinition agentDefinition = new PromptAgentDefinition("gpt-5-mini")
            .setInstructions("You are a helpful assistant that can use MCP tools.")
            .setTools(Collections.singletonList(mcpTool));

        AgentVersionDetails agent = agentsClient.createAgentVersion("mcp-agent", agentDefinition);
        System.out.printf("Agent created: %s (version %s)%n", agent.getName(), agent.getVersion());

        // Create a response
        AgentReference agentReference = new AgentReference(agent.getName())
            .setVersion(agent.getVersion());

        Response response = responsesClient.createAzureResponse(
            new AzureCreateResponseOptions().setAgentReference(agentReference),
            ResponseCreateParams.builder()
                .input("Summarize the Azure REST API specifications"));

        System.out.println("Response: " + response.output());

        // Clean up
        agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
    }
}

Erwartete Ausgabe

Agent created: mcp-agent (version 1)
Response: [ResponseOutputItem containing MCP tool results ...]

Verwenden des MCP-Tools mit der REST-API

Die folgenden Beispiele zeigen, wie Sie einen Agent mit dem MCP-Tool erstellen und mithilfe der Antwort-API aufrufen. Wenn die Antwort ein Ausgabeelement enthält, bei dem type auf mcp_approval_request festgelegt ist, senden Sie eine Folgeanforderung, die ein mcp_approval_response-Element enthält.

Voraussetzungen

Legen Sie diese Umgebungsvariablen fest:

  • FOUNDRY_PROJECT_ENDPOINT: Ihre Projektendpunkt-URL.
  • FOUNDRY_MODEL_DEPLOYMENT_NAME: Der Name Ihrer Modellimplementierung.
  • AGENT_TOKEN: Ein Bearer-Token für Foundry.
  • MCP_PROJECT_CONNECTION_NAME (optional): Ihr MCP-Projektverbindungsname.

Zugriffstoken abrufen:

export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)

Wenn der MCP-Server in der Toolbox keine Authentifizierung erfordert, lassen Sie project_connection_id in der Tool-Definition der Toolbox weg. Das MCP-Tool des Agents verwendet für die Remote-Tool-Verbindung zum Toolbox-Endpunkt weiterhin project_connection_id.

Hinweis

Verwenden Sie für die REST-API den Projektverbindungsnamen für das Remote-Tool, den Sie für den Toolbox-Endpunkt erstellen, als project_connection_id im MCP-Tool des Agents.

Tipp

Ausführliche Informationen zum MCP-Toolschema und zu Genehmigungselementen finden Sie in der Referenz zur Microsoft Foundry REST API.

1. Erstellen einer Toolbox mit dem MCP-Server

Die empfohlene Methode zum Hinzufügen eines MCP-Servers erfolgt über eine Toolbox, und fügen Sie die Toolbox dann als MCP-Tool an Ihren Agent an. Sehen Sie sich an, was eine Toolbox ist?

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "description": "Toolbox with the Azure REST API specifications MCP server",
    "tools": [
      {
        "type": "mcp",
        "server_label": "api-specs",
        "server_url": "https://gitmcp.io/Azure/azure-rest-api-specs",
        "require_approval": "never"
      }
    ]
  }'

Die Toolbox stellt unter $FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1 einen MCP-kompatiblen Endpunkt bereit, wobei <version> die vom vorherigen Aufruf zurückgegebene Version ist.

2. Erstellen Sie eine Verbindung mit einem Remotetool zur Toolbox

Erstellen Sie eine Remotetoolprojektverbindung, die auf den Toolboxendpunkt verweist. Verwenden Sie ein Benutzer-Entra-Token, damit die Identität des Anrufers (Zielgruppe https://ai.azure.com) übergeben wird:

azd ai connection create mcp-server-toolbox-conn \
  --kind remote-tool \
  --target "$FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1" \
  --auth-type user-entra-token \
  --audience https://ai.azure.com

3. Erstellen eines MCP-Agents

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/agents?api-version=v1" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "name": "<AGENT_NAME>-mcp",
    "description": "MCP agent",
    "definition": {
      "kind": "prompt",
      "model": "'$FOUNDRY_MODEL_DEPLOYMENT_NAME'",
      "instructions": "You are a helpful agent that can use MCP tools to assist users. Use the available MCP tools to answer questions and perform tasks.",
      "tools": [
        {
          "type": "mcp",
          "server_label": "toolbox",
          "server_url": "'$FOUNDRY_PROJECT_ENDPOINT'/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1",
          "require_approval": "always",
          "project_connection_id": "mcp-server-toolbox-conn"
        }
      ]
    }
  }'

Um einen authentifizierten MCP-Server innerhalb der Toolbox zu verwenden, fügen Sie "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" der Toolboxtooldefinition hinzu. Ändern Sie server_url in den authentifizierten Serverendpunkt (z. B. https://api.githubcopilot.com/mcp).

4. Erstellen einer Antwort

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "agent": {"type": "agent_reference", "name": "<AGENT_NAME>-mcp"},
    "input": "Please summarize the Azure REST API specifications Readme"
  }'

Wenn die Antwort ein Ausgabeelement enthält, bei dem type auf mcp_approval_request festgelegt ist, kopieren Sie das Genehmigungsanforderungselement id als APPROVAL_REQUEST_ID. Kopieren Sie auch die Antwort id der obersten Ebene als PREVIOUS_RESPONSE_ID.

5. Senden einer Genehmigungsantwort

Wenn das MCP-Tool eine Genehmigung erfordert, senden Sie eine Nachverfolgungsanforderung:

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "previous_response_id": "'$PREVIOUS_RESPONSE_ID'",
    "input": [
      {
        "type": "mcp_approval_response",
        "approval_request_id": "'$APPROVAL_REQUEST_ID'",
        "approve": true
      }
    ]
  }'

6. Bereinigen von Ressourcen

Löschen Sie den Agent:

curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/<AGENT_NAME>-mcp?api-version=v1" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Funktionsweise

Sie müssen einen MCP-Remoteserver (einen vorhandenen MCP-Serverendpunkt) in den Foundry Agent Service bringen. Sie können mehrere MCP-Remoteserver mitbringen, indem Sie sie als Tools hinzufügen. Für jedes Tool müssen Sie einen eindeutigen server_label Wert innerhalb desselben Agents und einen server_url Wert bereitstellen, der auf den Remote-MCP-Server verweist. Überprüfen Sie unbedingt sorgfältig, welche MCP-Server Sie dem Foundry Agent Service hinzufügen.

Zusätzlich zur Verbindung mit beliebigen entfernten MCP-Servern mithilfe der URL können einige MCP-Server direkt über den "Add Tools"-Katalog von Foundry hinzugefügt werden. Beispielsweise ist Azure DevOps MCP-Server (Vorschau) als Katalogeintrag verfügbar. Katalogeinträge vereinfachen die Verbindungseinrichtung und richten sich an die gleichen Genehmigungs- und Überwachungsmechanismen, die in diesem Artikel dokumentiert sind.

Weitere Informationen zur Verwendung von MCP finden Sie unter:

Einrichten der MCP-Verbindung

Sekundärer Pfad – erweiterte Vorgänge: Verwenden Sie diesen Verweis nach der Route für den ersten Erfolg, um Tools einzuschränken, das Genehmigungsverhalten zu ändern oder eine Projektverbindung hinzuzufügen.

In den folgenden Schritten wird beschrieben, wie Sie eine Verbindung mit einem REMOTE-MCP-Server vom Foundry Agent Service herstellen:

  1. Suchen Sie den MCP-Remoteserver, mit dem Sie eine Verbindung herstellen möchten, z. B. den GitHub MCP-Server. Erstellen oder aktualisieren Sie einen Foundry-Agent mit einem mcp Tool, indem Sie die folgenden Informationen verwenden:
    1. server_url: Die URL des MCP-Servers, z. B. https://api.githubcopilot.com/mcp/.
    2. server_label: Ein eindeutiger Bezeichner dieses MCP-Servers für den Agenten, z. B. github.
    3. allowed_tools: Eine optionale Liste der Tools, auf die dieser Agent zugreifen und verwenden kann. Wenn Sie diesen Wert nicht angeben, enthält der Standardwert alle Tools auf dem MCP-Server.
    4. require_approval: Legen Sie optional fest, ob eine Genehmigung erforderlich ist. Der Standardwert ist always. Unterstützte Werte sind:
      • always: Ein Entwickler muss eine Genehmigung für jeden Anruf bereitstellen. Wenn Sie keinen Wert angeben, ist dies der Standardwert.
      • never: Es ist keine Genehmigung erforderlich.
      • {"never":[<tool_name_1>, <tool_name_2>]}: Sie stellen eine Liste der Tools bereit, die keine Genehmigung erfordern.
      • {"always":[<tool_name_1>, <tool_name_2>]}: Sie stellen eine Liste der Tools bereit, die eine Genehmigung erfordern.
  2. project_connection_id: Die Projektverbindungs-ID, die die Authentifizierung und andere Verbindungsdetails für den MCP-Server speichert.
  3. Wenn das Modell versucht, ein Tool in Ihrem MCP-Server mit erforderlicher Genehmigung aufzurufen, erhalten Sie einen Antwortausgabeelementtyp wie mcp_approval_request. Im Antwortausgabeelement erhalten Sie weitere Details dazu, welches Tool auf dem MCP-Server aufgerufen wird und welche Argumente übergeben werden sollen. Überprüfen Sie das Tool und die Argumente, damit Sie eine fundierte Entscheidung zur Genehmigung treffen können.
  4. Übermitteln Sie Ihre Genehmigung an den Agenten, indem Sie previous_response_id verwenden und approve auf true setzen.

Herstellen einer Verbindung mit Azure DevOps MCP-Server

Azure DevOps MCP Server (Vorschau) ist als Katalogeintrag in Foundry verfügbar. So fügen Sie es hinzu:

  1. Wechseln Sie im Foundry-Portal zu Ihrem Projekt.
  2. Wählen Sie Tools>Catalog aus, und suchen Sie nach "Azure DevOps".
  3. Wählen Sie Azure DevOps MCP Server (Vorschau) aus, und wählen Sie Create aus.
  4. Geben Sie Ihren Azure DevOps Organisationsnamen ein, und wählen Sie Verbinden aus.
  5. Wählen Sie aus, welche Azure DevOps Tools für Ihren Agent verfügbar gemacht werden sollen. Sie können eine Teilmenge von Tools auswählen, um genau zu steuern, auf was der Agent zugreifen kann.

Diese katalogbasierte Einrichtung erstellt das MCP-Tool für die Verwendung durch Agents, ohne dass Codeänderungen erforderlich sind. Sie können das Konnektivitäts- und Toolverhalten in der Testumgebung des Foundry-Chats überprüfen, bevor Sie das Tool in Produktionscode integrieren.

Tipp

Toolbox-Versionierung: Foundry Toolboxes unterstützen die Versionierung, sodass Sie eine neue Version erstellen können, ohne dass sich dies auf Produktions-Agents auswirkt. Verwenden Sie den Consumerendpunkt ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) für Produktions-Agents – er bietet immer die hochgestufte Standardversion. Verwenden Sie den versionsspezifischen Endpunkt ({project_endpoint}/toolboxes/{name}/versions/{version}/mcp?api-version=v1), um vor der Werbung zu testen. Stellen Sie sicher, dass server_label eindeutig für jeden Agenten bleibt, auch wenn Sie Toolbox-Versionen wechseln. Weitere Informationen finden Sie unter Festlegen einer Version als Standard.

Lang andauernde Vorgänge (Vorschau)

Sekundärer Pfad – Hintergrundmodus: Verwenden Sie diesen Modus nur, wenn ein MCP-Vorgang nicht innerhalb des synchronen Standardtimeouts abgeschlossen werden kann.

Einige MCP-Server machen Tools verfügbar, die länger als das synchrone Standardtimeout benötigen, um ein Ergebnis zurückzugeben. Um diese Vorgänge zu unterstützen, führen Sie den Agent im Hintergrundmodus aus. Der Hintergrundmodus führt die Antwort asynchron aus, sodass der MCP-Toolaufruf fortgesetzt werden kann, ohne eine geöffnete Verbindung zu halten, und Sie rufen den Antwortstatus ab, bis er abgeschlossen ist. Mit diesem Ansatz können MCP-Toolaufrufe den in Bekannte Einschränkungen beschriebenen 100-Sekunden-Timeout für Nicht-Streaming überschreiten.

Hinweis

Länger laufende MCP-Vorgänge sind als Vorschau verfügbar. Vorschaufunktionen werden ohne Service-Level-Vereinbarung bereitgestellt und sind für Produktionsworkloads nicht empfohlen. Verhalten und unterstützte Modelle können sich ändern.

Anforderungen für den MCP-Server

Die Agentlaufzeit basiert auf dem MCP-Server, um den Vorgang asynchron auszuführen und den Fortschritt zu melden. Der Server muss:

  • Implementieren Sie die Aufgabenfunktion des Modellkontextprotokolls , damit ein Toolaufruf einen Aufgabenverweis zurückgeben kann, anstatt zu blockieren, bis die Arbeit abgeschlossen ist.
  • Geben Sie in den Metadaten des Toolergebnisses eine zugehörige Aufgabenkennung zurück (das Feld io.modelcontextprotocol/related-task mit einem taskId), wenn ein lang andauernder Vorgang gestartet wird.
  • Stellen Sie eine Möglichkeit für die Laufzeit bereit, den Vorgangsstatus abzufragen und das Endergebnis nach Abschluss der Aufgabe abzurufen.
  • Sie können als Remote-MCP-Endpunkt erreichbar sein, genauso wie jedes andere MCP-Tool. Lokale MCP-Server müssen selbst gehostet werden, um einen Remoteendpunkt bereitzustellen. Siehe Hosten eines lokalen MCP-Servers.

Wenn die Agentlaufzeit ein Tool aufruft, das einen lang andauernden Vorgang startet, gibt der Server den Aufgabenverweis zurück, und die Laufzeit behält die Antwort im Hintergrund bei. Die Laufzeit gibt sofort eine Antwort mit id und einem status von queued zurück und ruft das Ergebnis ab, wenn die Aufgabe abgeschlossen ist. Sie fragen die Antwort id ab, bis status den Wert completed annimmt, und lesen dann die endgültige Ausgabe.

Der Hintergrundmodus für lang andauernde MCP-Vorgänge funktioniert mit jedem Modell, das den Hintergrundmodus unterstützt, wie etwa gpt-5.4 oder gpt-5.5.

Wenn Ihr Agent ein Modell verwendet, das den Hintergrundmodus nicht unterstützt, werden MCP-Toolaufrufe synchron ausgeführt und unterliegen dem Timeout von 100 Sekunden.

Aktivieren des Hintergrundmodus im Microsoft Foundry-Portal

Sie können den Hintergrundmodus für einen Agent im Microsoft Findry Portal-Playground aktivieren, ohne Code zu schreiben:

  1. Öffnen Sie Ihren Agent, und wählen Sie die Registerkarte " Playground " aus.

  2. Wählen Sie in der Modellliste ein Modell aus, das den Hintergrundmodus unterstützt, z. B. gpt-5.4 oder gpt-5.5.

  3. Wählen Sie das Parametersymbol neben dem Modell aus, und aktivieren Sie den Hintergrundmodus.

  4. Fügen Sie unter "Tools" ein Tool hinzu, dessen MCP-Server MCP-Aufgaben unterstützt, z. B. einen Fabric Daten-Agent, der über das Fabric IQ-Tool hinzugefügt wurde. Schritte finden Sie unter Connect agents to Microsoft Fabric with Fabric IQ.

  5. Senden sie eine Nachricht. Der Agent startet eine Hintergrundausführung und zeigt deren Fortschritt an, während der lang andauernde Toolaufruf abgeschlossen wird. Nach Abschluss der Ausführung wird die Antwort im Chat angezeigt.

Ausführen des Hintergrundmodus mit Code

Die folgenden Beispiele rufen einen Agent auf, der bereits mit einem MCP-Tool konfiguriert ist, setzen background auf true und fragen regelmäßig ab, bis die Antwort abgeschlossen ist. Ersetzen Sie die Platzhalterwerte durch Ihre eigenen Werte.

from time import sleep
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient

PROJECT_ENDPOINT = "your_project_endpoint"
AGENT_NAME = "your_mcp_agent_name"

project = AIProjectClient(
    endpoint=PROJECT_ENDPOINT,
    credential=DefaultAzureCredential(),
)
openai = project.get_openai_client()

# Start a background response. It returns immediately with status "queued".
response = openai.responses.create(
    extra_body={
        "agent_reference": {
            "name": AGENT_NAME,
            "type": "agent_reference",
        }
    },
    input="Run the long-running task and summarize the result.",
    background=True,
)

# Poll the response ID until the MCP tool call completes.
while response.status in ("queued", "in_progress"):
    sleep(5)
    response = openai.responses.retrieve(response.id)

print(response.output_text)
using Azure.Identity;
using Azure.AI.Projects;

var projectEndpoint = "your_project_endpoint";
var agentName = "your_mcp_agent_name";

AIProjectClient projectClient = new(
    endpoint: new Uri(projectEndpoint),
    tokenProvider: new DefaultAzureCredential());

ProjectResponsesClient responsesClient
    = projectClient.ProjectOpenAIClient.GetProjectResponsesClientForAgent(agentName);

// Start a background response. It returns immediately with status "queued".
ResponseResult response = await responsesClient.CreateResponseAsync(
    new CreateResponseOptions
    {
        InputItems = { ResponseItem.CreateUserMessageItem(
            "Run the long-running task and summarize the result.") },
        Background = true,
    });

// Poll the response ID until the MCP tool call completes.
while (response.Status is "queued" or "in_progress")
{
    await Task.Delay(5000);
    response = await responsesClient.RetrieveResponseAsync(response.Id);
}
Console.WriteLine(response.GetOutputText());
import { DefaultAzureCredential } from "@azure/identity";
import { AIProjectClient } from "@azure/ai-projects";

const PROJECT_ENDPOINT = "your_project_endpoint";
const AGENT_NAME = "your_mcp_agent_name";

const project = new AIProjectClient(PROJECT_ENDPOINT, new DefaultAzureCredential());
const openai = project.getOpenAIClient();

// Start a background response. It returns immediately with status "queued".
let response = await openai.responses.create(
  {
    input: "Run the long-running task and summarize the result.",
    background: true,
  },
  { body: { agent_reference: { name: AGENT_NAME, type: "agent_reference" } } },
);

// Poll the response ID until the MCP tool call completes.
while (response.status === "queued" || response.status === "in_progress") {
  await new Promise((r) => setTimeout(r, 5000));
  response = await openai.responses.retrieve(response.id);
}
console.log(response.output_text);
import com.azure.ai.agents.*;
import com.azure.ai.agents.models.AgentReference;
import com.azure.ai.agents.models.AzureCreateResponseOptions;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.openai.models.responses.Response;
import com.openai.models.responses.ResponseCreateParams;

String projectEndpoint = "your_project_endpoint";
String agentName = "your_mcp_agent_name";

AgentsClientBuilder builder = new AgentsClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint(projectEndpoint);
ResponsesClient responsesClient = builder.buildResponsesClient();

AgentReference agentRef = new AgentReference(agentName);

// Start a background response. It returns immediately with status "queued".
Response response = responsesClient.createAzureResponse(
    new AzureCreateResponseOptions()
        .setAgentReference(agentRef)
        .setBackground(true),
    ResponseCreateParams.builder()
        .input("Run the long-running task and summarize the result."));

// Poll the response ID until the MCP tool call completes.
while (response.status().equals("queued") || response.status().equals("in_progress")) {
    Thread.sleep(5000);
    response = responsesClient.getAzureResponse(response.id());
}
System.out.println(response.output());

Erstellen Sie eine Hintergrundantwort. Die Anfrage gibt sofort eine Antwort id und ein status von queued zurück:

curl -X POST "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses" \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $AGENT_TOKEN" \
  -d '{
    "agent": {"type": "agent_reference", "name": "<AGENT_NAME>-mcp"},
    "input": "Run the long-running task and summarize the result.",
    "background": true
  }'

Kopieren Sie die Antwort id aus dem Ergebnis und fragen Sie sie dann ab, bis statuscompleted ist:

curl "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses/$RESPONSE_ID" \
  -H "Authorization: Bearer $AGENT_TOKEN"

Wenn status auf completed gesetzt ist, enthält das output-Array das Ergebnis des MCP-Toolaufrufs und die abschließende Assistentennachricht.

Bekannte Einschränkungen

Sekundärpfad – Streamingverhalten: Prüfen Sie diese Grenzwerte nach der First-Success-Route, wenn Ihr Client Antworten streamt oder sich Ihr MCP-Aufruf dem synchronen Timeout nähert.

  • Nicht-Streaming-MCP-Tool-Timeout: Nicht-Streaming-MCP-Tool-Anrufe haben ein Timeout von 100 Sekunden. Wenn ihr MCP-Server länger als 100 Sekunden dauert, um zu antworten, schlägt der Anruf fehl. Um Timeouts zu vermeiden, stellen Sie sicher, dass Ihr MCP-Server innerhalb dieses Grenzwerts reagiert. Wenn Ihr Anwendungsfall längere Verarbeitungszeiten erfordert, führen Sie den Agent im Hintergrundmodus mit einem unterstützten Modell aus, optimieren Sie die serverseitige Logik, oder unterbrechen Sie den Vorgang in kleinere Schritte.
  • Private MCP erfordert Standard-Agent-Setup: Private MCP-Serverkonnektivität ist nur mit Standard-Agent-Setup mit privatem Netzwerk (BYO VNet) verfügbar. Das Grundlegende Agent-Setup unterstützt keine privaten MCP-Endpunkte.
  • Private MCP-Hosting: Azure Container Apps für ein dediziertes MCP-Subnetz ist die getestete Konfiguration für private MCP-Server. Funktions-Apps oder App-Dienste als privater MCP-Serverhost funktionieren möglicherweise, werden aber nicht intern überprüft.

Häufige Fragen und Fehler

Die folgenden häufig auftretenden Probleme können auftreten, wenn Sie MCP-Tools mit dem Foundry Agent Service verwenden:

  • "Ungültiges Toolschema":

    Dieser Fehler tritt in der Regel auf, wenn Ihre MCP-Serverdefinition anyOf oder allOf enthält oder wenn ein Parameter mehrere Typen von Werten akzeptiert. Aktualisieren Sie die MCP-Serverdefinition, und versuchen Sie es erneut.

  • "Nicht autorisiert" oder "Verboten" vom MCP-Server:

    Bestätigen Sie, dass der MCP-Server Ihre Authentifizierungsmethode unterstützt, und überprüfen Sie die anmeldeinformationen, die in Ihrer Projektverbindung gespeichert sind. Verwenden Sie für GitHub Token mit den geringsten Rechten, und wechseln Sie sie regelmäßig aus.

  • Das Modell ruft ihr MCP-Tool niemals auf:

    Bestätigen Sie, dass Ihre Agent-Anweisungen die Verwendung von Tools fördern, und überprüfen Sie die server_label, server_url und allowed_tools Werte. Wenn Sie allowed_tools festlegen, stellen Sie sicher, dass der Toolname dem entspricht, was der MCP-Server bereitstellt.

  • Der Agent setzt nach der Genehmigung nie fort.

    Bestätigen Sie, dass Sie eine Folgeanforderung senden, bei der previous_response_id auf die ursprüngliche Antwort-ID gesetzt ist, und dass Sie die Element-ID der Genehmigungsanforderung als approval_request_id verwenden.

Hosten eines lokalen MCP-Servers

Die Laufzeit des Agentendienstes akzeptiert nur einen Remote-MCP-Serverendpunkt. Wenn Sie Tools von einem lokalen MCP-Server hinzufügen möchten, müssen Sie sie auf Azure Container Apps oder Azure Functions selbst hosten, um einen REMOTE-MCP-Serverendpunkt abzurufen.

Der Remoteendpunkt kann entweder ein öffentlicher Endpunkt oder ein privater Endpunkt innerhalb Ihres VNet sein. Für private MCP-Server stellen Sie Ihre Container App mit ausschließlich internem Ingress (--internal-only true) in einem dedizierten MCP-Subnetz bereit. Details zum Einrichten finden Sie unter öffentlichen und privaten MCP-Serverendpunkten .

Berücksichtigen Sie die folgenden Faktoren beim Hosten lokaler MCP-Server in der Cloud:

Setup des lokalen MCP-Servers Hosting bei Azure Container Apps Hosting mit Azure Functions
Transport HTTP POST/GET-Endpunkte erforderlich. HTTP streamfähig erforderlich.
Codeänderungen Containerneubau erforderlich. Azure Functions-spezifische Konfigurationsdateien, die im Stammverzeichnis erforderlich sind.
Authentifizierung Benutzerdefinierte Authentifizierungsimplementierung erforderlich. Nur schlüsselbasiert. OAuth benötigt API-Verwaltung.
Sprache Jede Sprache, die in Linux-Containern ausgeführt wird (Python, Node.js, .NET, TypeScript, Go). nur Python, Node.js, Java, .NET.
Containeranforderungen Nur Linux (linux/amd64). Keine privilegierten Container. Containerisierte Server werden nicht unterstützt.
Abhängigkeiten Alle Abhängigkeiten müssen sich im Containerimage befinden. Abhängigkeiten auf Betriebssystemebene (z. B. Playwright) werden nicht unterstützt.
Staat Nur zustandslos. Nur zustandslos.
UVX/NPX Unterstützt. Nicht unterstützt. npx Startbefehle werden nicht unterstützt.