Łączenie agentów z serwerami protokołu kontekstu modelu

Połącz agentów foundry z serwerami protokołu MCP (Model Context Protocol) przy użyciu narzędzia MCP. To połączenie rozszerza możliwości agenta za pomocą zewnętrznych narzędzi i źródeł danych. Łącząc się ze zdalnymi punktami końcowymi serwera MCP, model Foundry agenta może uzyskiwać dostęp do narzędzi hostowanych przez deweloperów i organizacje, których mogą używać klienci zgodni z programem MCP, tacy jak Usługa Agenta Foundry.

MCP to otwarty standard, który definiuje sposób, w jaki aplikacje zapewniają narzędzia i dane kontekstowe do dużych modeli językowych (LLMs). Umożliwia spójną, skalowalną integrację narzędzi zewnętrznych z przepływami pracy modelu.

Wskazówka

Rozważ dodanie tego narzędzia za pomocą przybornika. Korzystając z przybornika, można ponownie wykorzystywać narzędzie w różnych agentach i środowiskach uruchomieniowych, a także scentralizować zarządzanie poświadczeniami, wersjonowanie i egzekwowanie zasad za pośrednictwem zarządzanego punktu końcowego MCP. Zobacz szybki start przybornika.

Z tego artykułu dowiesz się, jak wykonywać następujące działania:

  • Dodaj zdalny serwer MCP jako narzędzie.
  • Uwierzytelnij się na serwerze MCP za pomocą połączenia do projektu.
  • Przejrzyj i zatwierdź wywołania narzędzi MCP.
  • Rozwiązywanie typowych problemów z integracją z programem MCP.

Jeśli używasz agenta kodowania, takiego jak GitHub Copilot, umiejętności Microsoft Foundry mogą pomóc w konfigurowaniu połączeń narzędzi MCP, uwierzytelniania, zachowania zatwierdzania i rozwiązywania problemów.

Wymagania wstępne

Przed rozpoczęciem upewnij się, że masz następujące elementy:

  • Subskrypcja Azure z aktywnym projektem Microsoft Foundry.

  • Rola Użytkownika usługi Foundry w projekcie Foundry do tworzenia i testowania agentów. Jeśli utworzysz połączenie projektu do uwierzytelniania MCP, musisz również mieć w tym projekcie rolę Foundry Project Manager.

    Important

    Niedawno zmieniono nazwy ról RBAC w usłudze Foundry. Użytkownik Foundry, właściciel Foundry, właściciel konta Foundry i menedżer projektu Foundry były wcześniej nazywane odpowiednio użytkownikiem Azure AI, właścicielem Azure AI, właścicielem konta Azure AI i menedżerem projektu Azure AI. Poprzednie nazwy mogą być nadal widoczne w niektórych miejscach, podczas gdy zmiana nazwy jest wdrażana. Identyfikatory ról i uprawnienia podstawowe są niezmienione przez zmianę nazwy.

  • Najnowszy pakiet zestawu SDK dla twojego języka. Zestaw SDK .NET jest obecnie w wersji zapoznawczej. Aby uzyskać szczegółowe informacje o instalacji, zobacz przewodnik Szybki start.

  • Azure poświadczenia skonfigurowane do procesu uwierzytelniania (np. DefaultAzureCredential).

  • Dostęp do zdalnego punktu końcowego serwera MCP (na przykład serwera MCP GitHub w https://api.githubcopilot.com/mcp).

Wybieranie zadania

Zadanie Path
Połącz agenta i potwierdź pierwsze udane wywołanie narzędzia Postępuj zgodnie z trasą nawiązywania połączenia, zatwierdzania, weryfikowania i czyszczenia.
Dodawanie poświadczeń lub dostępu opartego na tożsamościach Pomocnicza:Konfigurowanie uwierzytelniania.
Nawiązywanie połączenia z prywatnym punktem końcowym MCP Drugorzędne:Przejrzyj wymagania dotyczące publicznych i prywatnych punktów końcowych.
Uruchom długotrwałą operację w tle Pomocnicza:Konfigurowanie długotrwałych operacji.
Zrozum działanie przesyłania strumieniowego i limitu czasu Dodatkowe:Przejrzyj znane ograniczenia.
Konfigurowanie opcji serwera lub hostowanie serwera lokalnego Pomocnicza:skonfiguruj połączenie MCP lub hostuj lokalny serwer MCP.

Aby uzyskać szczegółowe informacje na temat sposobu działania integracji z programem MCP, zobacz Jak to działa.

Wsparcie użytkowania

W poniższej tabeli przedstawiono zestaw SDK i obsługę konfiguracji połączeń MCP.

Obsługa Microsoft Foundry zestaw SDK Python Zestaw SDK języka C# Zestaw SDK dla języka JavaScript zestaw SDK Java interfejs API REST Konfiguracja agenta podstawowego Konfiguracja agenta standardowego
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Publiczne i prywatne punkty końcowe serwera MCP

Usługa agenta obsługuje zarówno publiczne, jak i prywatne punkty końcowe serwera MCP:

  • Publiczne punkty końcowe: połącz się z dowolnym publicznie dostępnym zdalnym serwerem MCP. Ta opcja działa zarówno z konfiguracjami agenta podstawowego, jak i standardowego.
  • Prywatne punkty końcowe: połącz się z serwerami MCP, które nie są uwidocznione w publicznym Internecie. Prywatna sieć MCP wymaga konfiguracji sieci prywatnej i dedykowanej podsieci MCP w sieci wirtualnej.

W przypadku prywatnych serwerów MCP wdróż serwer MCP na Azure Container Apps przy użyciu ruchu przychodzącego tylko wewnętrznego w dedykowanej podsieci MCP delegowanej do Microsoft.App/environments. Aby rozpocząć, użyj szablonu 19-private-network-agents-tools-setup, który wdraża wymaganą infrastrukturę sieciową, w tym podsieć MCP, lub szablonu 11-private-network-basic-project, jeśli nie chcesz używać własnych zasobów.

Aby uzyskać szczegółowe informacje na temat obsługi narzędzi w środowiskach izolowanych przez sieć, zobacz Narzędzia agenta z izolacją sieci.

Używanie narzędzi Foundry jako punktów końcowych MCP

Foundry Toolboxes pozwalają łączyć wiele narzędzi — takich jak wyszukiwanie w Internecie, interpreter kodu, wyszukiwanie plików, Wyszukiwanie AI platformy Azure, serwery MCP, narzędzia OpenAPI oraz połączenia Agent-to-Agent — w ramach jednego punktu końcowego zgodnego z MCP. Zamiast konfigurować każde narzędzie oddzielnie na każdym agencie, utwórz przybornik w narzędziu Foundry i wskaż agentowi punkt końcowy przybornika przy użyciu standardowej mcp konfiguracji narzędzia (server_url i server_label).

Ponieważ punkt końcowy Toolbox jest zgodny z MCP, każde środowisko uruchomieniowe, które może obsługiwać serwer MCP, może również obsługiwać Toolbox. Ta zgodność obejmuje usługę agenta Foundry, Microsoft Agent Framework, LangGraph, zestaw SDK GitHub Copilot oraz innych klientów obsługujących MCP. Narzędzia można dodawać, usuwać lub ponownie konfigurować w przyborniku bez zmieniania kodu agenta.

Aby uzyskać instrukcje konfiguracji, zapoznaj się z Tworzeniem i używaniem zestawu narzędzi Foundry.

Punkt końcowy MCP zestawu narzędzi obsługuje długotrwałe operacje za pomocą zadań MCP, które są obecnie dostępne w wersji zapoznawczej. Aby korzystać z narzędzi działających długotrwale, upewnij się, że środowisko uruchomieniowe agenta obsługuje zadania MCP.

Uwierzytelnianie i konfiguracja zestawu narzędzi MCP

Utwórz połączenie projektu dla serwera MCP z typem uwierzytelniania zgodnym ze scenariuszem, a następnie odwołuj się do niego z minimalnego przybornika YAML.

Krok nr 1. Tworzenie połączenia

Wyeksportuj punkt końcowy projektu i ustaw go jako aktywny projekt dla azd ai poleceń:

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

Wybierz potrzebny wariant uwierzytelniania:

# 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 — Foundry-managed app
azd ai connection create my-mcp-conn \
  --kind remote-tool \
  --target https://api.githubcopilot.com/mcp \
  --auth-type oauth2 \
  --connector-name foundrygithubmcp

# 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 Dodatkowe flagi
none
custom-keys --custom-key "Header=Value" (można powtórzyć)
oauth2 --connector-namew przypadku aplikacji OAuth zarządzanej przez rozwiązanie Foundry lub --authorization-url, --token-url, --client-secret--client-idi --scopes dla własnej rejestracji aplikacji
user-entra-token --audience <entra-audience>
project-managed-identity --audience <entra-audience> (opcjonalny)
agentic-identity --audience <entra-audience>

Tylko następujące serwery MCP obsługują aplikację OAuth zarządzaną przez usługę Foundry. Przekaż odpowiednią wartość do --connector-name.

Serwer MCP Nazwa łącznika
Azure Databricks Genie foundrydatabricksmcp
GitHub foundrygithubmcp
Serwer MCP Infobip WhatsApp foundryinfobipmcp
Serwer Infobip RCS MCP foundryinfobiprcsmcp
Serwer MCP programu Infobip SMS foundryinfobipsmsmcp
Dane i analiza LSEG foundrylsegmcp
Morningstar MCP Server foundrymorningstarmcp
Neon foundryneonmcp
Pipedream foundrypipedreammcp
Vercel foundryvercelmcp

W przypadku innych serwerów MCP z obsługą protokołu OAuth podaj własną rejestrację aplikacji.

W przypadku uwierzytelniania opartego na tożsamości (user-entra-token, project-managed-identity, agentic-identity) przed wywołaniem zestawu narzędzi przypisz odpowiedniej tożsamości wymaganą rolę RBAC dla zasobu docelowego.

Krok nr 2. Zdefiniuj zestaw narzędzi

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

Krok nr 3. Utwórz zestaw narzędzi

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

Podczas pierwszego wywołania przybornika z użyciem MCP opartego na OAuth w projekcie, punkt końcowy MCP zwraca błąd CONSENT_REQUIRED (kod -32006) wraz z adresem URL zgody.

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

Ten błąd jest oczekiwany. Otwórz adres URL zgody w przeglądarce, ukończ przepływ autoryzacji OAuth, a następnie ponownie spróbuj wywołać agenta. Kolejne wywołania kończą się powodzeniem bez ponownego monitowania.

Uwierzytelniania

Ścieżka pomocnicza: Skonfiguruj uwierzytelnianie po pierwszej trasie powodzenia, gdy serwer MCP wymaga poświadczeń lub dostępu opartego na tożsamości.

Wiele serwerów MCP wymaga uwierzytelniania.

W usłudze agenta Foundry użyj połączenia projektu, aby przechowywać szczegóły uwierzytelniania, takie jak klucze interfejsu API lub tokeny uwierzytelniające, zamiast trwale kodować poświadczenia w aplikacji.

Aby dowiedzieć się więcej na temat obsługiwanych opcji uwierzytelniania, w tym tożsamości opartych na kluczach, tożsamości Microsoft Entra i przekazywania tożsamości OAuth, zobacz Uwierzytelnianie serwera MCP.

Uwaga

Ustaw project_connection_id wartość identyfikatora połączenia projektu.

Wskazówka

Po dodaniu serwera Azure DevOps MCP za pomocą katalogu Dodaj narzędzia uwierzytelniasz się w Azure DevOps podczas kroku połączenia organizacji i przechowujesz uwierzytelnianie jako połączenie projektu. Użyj dostępu z najmniejszymi uprawnieniami i przejrzyj zakresy podczas nawiązywania połączenia z organizacją.

W przypadku korzystania z punktu końcowego MCP przybornika Foundry, przybornik centralnie zarządza uwierzytelnianiem. Przybornik obsługuje wstrzykiwanie poświadczeń, odświeżanie tokenu oraz wymuszanie polityk podczas działania dla wszystkich narzędzi w pakiecie. Agenci uwierzytelniają się w punkcie końcowym przybornika przy użyciu poświadczeń Microsoft Entra, takich jak DefaultAzureCredential, a poszczególne poświadczenia narzędzia nie muszą być przekazywane przez każdego agenta. Aby skonfigurować uwierzytelnianie przybornika, zobacz Wymagania wstępne przybornika.

Rozważania dotyczące korzystania z usług i serwerów innych niż Microsoft.

Użytkownik podlega warunkom umowy pomiędzy Użytkownikiem a dostawcą usług w przypadku korzystania z połączonych usług niezwiązanych z Microsoft. Po nawiązaniu połączenia z usługą inną niż Microsoft przekażesz niektóre dane, takie jak zawartość monitu, do usługi innej niż Microsoft lub aplikacja może odbierać dane z usługi innej niż Microsoft. Użytkownik odpowiada za korzystanie z usług i danych innych niż Microsoft oraz wszelkie opłaty związane z tym korzystaniem.

Inne firmy, a nie Microsoft, tworzą zdalne serwery MCP, których chcesz użyć z narzędziem MCP opisanym w tym artykule. Microsoft nie testuje ani nie weryfikuje tych serwerów. Microsoft nie ponosi odpowiedzialności wobec ciebie ani innych osób w związku z korzystaniem z jakichkolwiek zdalnych serwerów MCP.

Uważnie przejrzyj i śledź serwery MCP dodane do usługi Agenta Foundry. Polegaj na serwerach hostowanych przez zaufanych dostawców usług zamiast serwerów proxy.

Narzędzie MCP umożliwia przekazywanie niestandardowych nagłówków, takich jak klucze uwierzytelniania lub schematy, których może potrzebować zdalny serwer MCP. Przejrzyj wszystkie dane udostępniane zdalnym serwerom MCP i zarejestruj dane na potrzeby inspekcji. Należy pamiętać o rozwiązaniach innych niż Microsoft dotyczących przechowywania i lokalizacji danych.

Uwaga

Przyborniki Foundry różnią się od serwerów MCP innych firm. Zasoby określane jako "Przyborniki" są zarządzane przez organizację i tworzysz oraz zarządzasz nimi w swoim projekcie Microsoft Foundry. Jednak nadal odpowiadasz za wybór narzędzi, obsługę danych i przestrzeganie zgodności podczas zarządzania zawartością "Toolbox".

Najlepsze rozwiązania

Aby uzyskać ogólne wskazówki dotyczące użycia narzędzi, zobacz Najlepsze praktyki w korzystaniu z narzędzi w usłudze Microsoft Foundry Agent Service.

W przypadku korzystania z serwerów MCP należy postępować zgodnie z następującymi rozwiązaniami:

  • Użyj listy dozwolonych narzędzi przy użyciu polecenia allowed_tools.
  • Traktuj opisy narzędzi, adnotacje i wyniki ze zdalnych serwerów MCP jako niezaufanych danych wejściowych. Mogą zawierać instrukcje iniekcji monitu pośredniego.
  • Wymagaj zatwierdzenia operacji wysokiego ryzyka, zwłaszcza narzędzi, które zapisują dane lub zmieniają zasoby.
  • Przed zatwierdzeniem przejrzyj żądaną nazwę i argumenty narzędzia.
  • Przejrzyj allowed_tools, ustawienia zatwierdzania i uprawnienia połączeń, gdy zmieni się operator serwera, udostępniane narzędzia lub zachowanie.
  • Rejestr zatwierdzeń i wywołania narzędzi dla audytu i rozwiązywania problemów.

Wskazówka

Po dodaniu serwera Azure DevOps MCP za pomocą katalogu Dodaj narzędzia, konfiguracja wyboru narzędzi jest mapowana na zachowanie opisane w tym artykule. Wybranie podzbioru narzędzi w interfejsie użytkownika katalogu jest równoważne z określeniem listy allowed_tools w kodzie.

Trasa pierwszego powodzenia: łączenie, zatwierdzanie, weryfikowanie i czyszczenie

Użyj przykładu prompt-agent dla wybranego języka. Gdy przykład zawiera karty agentów, wybierz opcję Prompt Agents. Ta trasa utrzymuje pierwszy przebieg skoncentrowany na jednym zadaniu: połącz jeden serwer MCP, wywołaj jedno narzędzie i sprawdź wynik.

  1. Połącz: Skonfiguruj narzędzie MCP z parametrem require_approval ustawionym na always i podłącz je do agenta.
  2. Zatwierdź: Uruchom przykład, przejrzyj żądany serwer, narzędzie i argumenty i zatwierdź tylko oczekiwane wywołanie.
  3. Sprawdź: Upewnij się, że ostateczna odpowiedź zawiera informacje zwrócone przez narzędzie MCP, jak pokazano w oczekiwanych danych wyjściowych.
  4. Czyszczenie: Uruchom operację czyszczenia przykładu. Przykłady prompt-agent usuwają wersję agenta, a przykład TypeScript usuwa również jego konwersację.

Tworzenie agenta w Python za pomocą narzędzia MCP

Użyj poniższego przykładu kodu, aby utworzyć agenta i wywołać funkcję. Zestaw SDK .NET jest obecnie w wersji zapoznawczej. Aby uzyskać szczegółowe informacje, zobacz przewodnik Szybki start .

W poniższym przykładzie pokazano, jak dodać serwer GitHub MCP do przybornika i dołączyć przybornik do agenta. Wybierz Prompt Agents, aby użyć zestawu SDK Azure AI Projects do utworzenia agenta promptów po stronie serwera, lub Hosted Agents, aby użyć struktury Agent Framework FoundryChatClient do zbudowania efemerycznego agenta działającego w procesie.

Pobudzaj agentów

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

Oczekiwane dane wyjściowe

W poniższym przykładzie pokazano oczekiwane dane wyjściowe po uruchomieniu przykładu:

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

Hostowani agenci

Ten przykład używa elementu FoundryChatClient z Microsoft Agent Framework, tworzy zestaw narzędzi zawierający serwer GitHub MCP, a następnie dołącza punkt końcowy zestawu narzędzi do hostowanego agenta za pomocą FoundryToolbox. Zainstaluj pakiety za pomocą polecenia pip install agent-framework-foundry, ustaw zmienne środowiskowe FOUNDRY_PROJECT_ENDPOINT i FOUNDRY_MODEL, a następnie zaloguj się za pomocą 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())

Oczekiwane dane wyjściowe

Agent wywołuje serwer Microsoft Learn MCP za pośrednictwem punktu końcowego zestawu narzędzi, a następnie zwraca tekst oparty na dokumentacji:

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

Pełny zestaw wzorców zestawu narzędzi z agentem hostowanym znajduje się w artykule Korzystanie z zestawu narzędzi z agentem hostowanym.


Tworzenie agenta za pomocą narzędzia MCP

W poniższym przykładzie pokazano, jak dodać zdalny serwer MCP do przybornika i dołączyć przybornik do agenta. Wybierz Prompt Agents, aby za pomocą zestawu SDK Azure AI Projects utworzyć po stronie serwera agenta opartego na monicie, lub Hosted Agents, aby za pomocą Microsoft Agent Framework utworzyć tymczasowego agenta działającego w procesie.

Pobudzaj agentów

W przykładzie użyto metod synchronicznych do utworzenia agenta. Aby uzyskać metody asynchroniczne, zobacz kod sample w repozytorium Azure SDK dla .NET w 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);

Oczekiwane dane wyjściowe

W poniższym przykładzie pokazano oczekiwane dane wyjściowe po uruchomieniu przykładu:

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.

Hostowani agenci

Ten przykład tworzy przybornik serwera MCP przy użyciu zestawu Azure AI Projects SDK, a następnie używa integracji Microsoft Agent Framework AddFoundryToolboxes, aby udostępnić narzędzia przybornika hostowanemu agentowi. Ustaw zmienne środowiskowe AZURE_AI_PROJECT_ENDPOINT, AZURE_OPENAI_ENDPOINT i AZURE_AI_MODEL_DEPLOYMENT_NAME, a następnie zaloguj się za pomocą az login.

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

Oczekiwane dane wyjściowe

Po wywołaniu hostowany agent wysyła zapytanie do serwera Microsoft Learn MCP za pośrednictwem punktu końcowego zestawu narzędzi, aby uzyskać fragmenty dokumentacji i odpowiedzi:

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` ...

Informacje o utrzymywanej integracji platformy .NET Agent Framework znajdziesz w artykule Korzystanie z przybornika z hostowanym agentem.


Tworzenie agenta przy użyciu narzędzia MCP z uwierzytelnianiem połączenia projektu

W tym przykładzie dowiesz się, jak uwierzytelniać się na serwerze GitHub MCP wewnątrz przybornika, a następnie dołączyć punkt końcowy MCP przybornika do agenta. W przykładzie użyto metod synchronicznych do utworzenia przybornika i agenta. Aby uzyskać metody asynchroniczne, zobacz kod sample w repozytorium Azure SDK dla .NET w GitHub.

Konfigurowanie połączenia projektu

Przed uruchomieniem przykładu:

  1. Zaloguj się do profilu GitHub.
  2. Wybierz obraz profilu w prawym górnym rogu.
  3. Wybierz pozycję Ustawienia.
  4. W panelu po lewej stronie wybierz pozycję Ustawienia dewelopera i Osobiste tokeny dostępu Tokeny > (wersja klasyczna).
  5. W górnej części wybierz pozycję Generuj nowy token, wprowadź hasło i utwórz token, który może odczytywać repozytoria publiczne.
    • Ważne: Zapisz token lub pozostaw stronę otwartą tak, jak po zamknięciu strony nie można wyświetlić tokenu ponownie.
  6. W portalu Azure otwórz Microsoft Foundry.
  7. Wybierz pozycję Zarządzaj w prawym górnym obszarze nawigacji, wybierz pozycję Szczegóły projektu, a następnie wybierz kartę Połączone zasoby.
  8. Utwórz nowe połączenie typu Klucze niestandardowe.
  9. Nadaj mu nazwę i dodaj parę wartości klucza.
  10. Ustaw nazwę klucza na Authorization , a wartość powinna mieć postać Bearer your_github_token.

Przykładowy kod umożliwiający utworzenie agenta

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

Oczekiwane dane wyjściowe

W poniższym przykładzie pokazano oczekiwane dane wyjściowe po uruchomieniu przykładu:

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

Tworzenie agenta w języku TypeScript za pomocą narzędzia MCP

W poniższym przykładzie języka TypeScript pokazano, jak dodać serwer MCP do przybornika, dołączyć przybornik do agenta, wysłać żądania wyzwalające przepływy pracy zatwierdzania MCP, obsługiwać żądania zatwierdzenia i czyścić zasoby. Aby uzyskać wersję języka JavaScript, zobacz kod sample w repozytorium Azure SDK dla języka JavaScript w GitHub.

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

Oczekiwane dane wyjściowe

W poniższym przykładzie pokazano oczekiwane dane wyjściowe po uruchomieniu przykładu:

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!

Tworzenie agenta przy użyciu narzędzia MCP z uwierzytelnianiem połączenia projektu

W poniższym przykładzie języka TypeScript pokazano, jak dodać uwierzytelniony serwer MCP do przybornika, dołączyć punkt końcowy MCP przybornika do agenta, wysłać żądania wyzwalające przepływy pracy zatwierdzania MCP, obsługiwać żądania zatwierdzenia i czyścić zasoby. Aby uzyskać wersję języka JavaScript, zobacz kod sample w repozytorium Azure SDK dla języka JavaScript w GitHub.

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

Oczekiwane dane wyjściowe

W poniższym przykładzie pokazano oczekiwane dane wyjściowe po uruchomieniu przykładu:

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!

Korzystanie z narzędzi MCP w agencie Java

Wskazówka

Większość agentów używa zestawu narzędzi, aby dodać narzędzie do wyszukiwania plików i dołączyć zestaw narzędzi do agenta jako narzędzie MCP. *Jeśli używasz Java SDK, interfejs API do tworzenia zestawów narzędzi nie jest jeszcze dostępny. Utwórz zestaw narzędzi w języku Python, za pomocą interfejsu API REST, w języku C#, TypeScript lub w portalu Foundry, a następnie odwołuj się do jego punktu końcowego MCP z poziomu agenta Java jako McpTool.

Dodaj zależność do elementu pom.xml:

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

Tworzenie agenta za pomocą narzędzia MCP

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

Oczekiwane dane wyjściowe

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

Używanie narzędzia MCP z interfejsem API REST

W poniższych przykładach pokazano, jak utworzyć agenta za pomocą narzędzia MCP i wywołać go przy użyciu interfejsu API odpowiedzi. Jeśli odpowiedź zawiera element wyjściowy z type ustawionym na mcp_approval_request, wyślij żądanie uzupełniające zawierające element mcp_approval_response.

Wymagania wstępne

Ustaw następujące zmienne środowiskowe:

  • FOUNDRY_PROJECT_ENDPOINT: adres URL punktu końcowego projektu.
  • FOUNDRY_MODEL_DEPLOYMENT_NAME: Nazwa wdrożenia modelu.
  • AGENT_TOKEN: token elementu nośnego dla rozwiązania Foundry.
  • MCP_PROJECT_CONNECTION_NAME (opcjonalnie): Nazwa połączenia projektu MCP.

Uzyskiwanie tokenu dostępu:

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

Jeśli serwer MCP w przyborniku nie wymaga uwierzytelniania, pomiń project_connection_id w definicji narzędzia przybornika. Narzędzie MCP agenta nadal używa project_connection_id do połączenia z narzędziem zdalnym do punktu końcowego zestawu narzędzi.

Uwaga

W przypadku interfejsu REST API użyj w narzędziu MCP agenta nazwy połączenia projektu remote-tool utworzonej dla punktu końcowego toolbox jako project_connection_id.

Wskazówka

Aby uzyskać szczegółowe informacje na temat schematu i elementów zatwierdzania narzędzia MCP, zobacz dokumentację interfejsu API REST usługi Microsoft Foundry.

1. Utwórz zestaw narzędzi za pomocą serwera MCP

Zalecanym sposobem dodania serwera MCP jest użycie przybornika, a następnie dołączenie przybornika do agenta jako narzędzia MCP. Zobacz Czym jest zestaw narzędzi?

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

Zestaw narzędzi udostępnia punkt końcowy zgodny z MCP pod adresem $FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1, gdzie <version> oznacza wersję zwróconą przez poprzednie wywołanie.

2. Utwórz połączenie ze zdalnym narzędziem w przyborniku

Utwórz połączenie projektu remote-tool skierowane do punktu końcowego toolbox. Użyj tokenu użytkownika Entra, aby tożsamość wywołującego została przekazana (grupa odbiorców https://ai.azure.com):

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. Tworzenie agenta MCP

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

Aby użyć uwierzytelnionego serwera MCP w ramach przybornika, dodaj element "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" do definicji narzędzia w przyborniku. Zmień server_url na uwierzytelniony punkt końcowy serwera (na przykład https://api.githubcopilot.com/mcp).

4. Tworzenie odpowiedzi

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

Jeśli odpowiedź zawiera element wyjściowy z ustawioną type wartością mcp_approval_request, skopiuj element id żądania zatwierdzenia jako APPROVAL_REQUEST_ID. Skopiuj również odpowiedź id najwyższego poziomu jako PREVIOUS_RESPONSE_ID.

5. Wyślij odpowiedź na zatwierdzenie

Jeśli narzędzie MCP wymaga zatwierdzenia, wyślij żądanie kontynuacji:

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. Czyszczenie zasobów

Usuń agenta:

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

Jak to działa

Należy dodać zdalny serwer MCP (istniejący punkt końcowy serwera MCP) do usługi agenta Foundry. Możesz przenieść wiele zdalnych serwerów MCP, dodając je jako narzędzia. Dla każdego narzędzia należy podać unikatową server_label wartość w obrębie tego samego agenta i server_url wartość, która wskazuje na zdalny serwer MCP. Pamiętaj dokładnie sprawdzić, które serwery MCP dodajesz do Foundry Agent Service.

Oprócz łączenia się z dowolnymi zdalnymi serwerami MCP za pomocą adresu URL można także dodać niektóre serwery MCP bezpośrednio z katalogu Foundry Add Tools. Na przykład pozycja Azure DevOps MCP Server jest dostępna w katalogu. Azure DevOps hostuje zdalny punkt końcowy MCP i uwidacznia go za pośrednictwem przesyłanego strumieniowo protokołu HTTP, więc nie instalujesz ani nie hostujesz serwera podczas dodawania go z katalogu foundry. Wpisy wykazu upraszczają konfigurację połączenia i są zgodne z tymi samymi mechanizmami zatwierdzania i inspekcji opisanymi w tym artykule.

Aby uzyskać więcej informacji na temat korzystania z programu MCP, zobacz:

Konfigurowanie połączenia MCP

Ścieżka dodatkowa — operacje zaawansowane: Skorzystaj z tego przewodnika po przejściu ścieżki pierwszego sukcesu, aby ograniczyć narzędzia, zmienić sposób zatwierdzania lub dodać połączenie z projektem.

W poniższych krokach opisano sposób nawiązywania połączenia z zdalnym serwerem MCP z poziomu usługi agenta foundry:

  1. Znajdź zdalny serwer MCP, z którym chcesz nawiązać połączenie, na przykład serwer GitHub MCP. Utwórz lub zaktualizuj agenta Foundry przy użyciu narzędzia mcp, korzystając z następujących informacji:
    1. server_url: adres URL serwera MCP, taki jak https://api.githubcopilot.com/mcp/.
    2. server_label: unikatowy identyfikator tego serwera MCP dla agenta, na przykład github.
    3. allowed_tools: opcjonalna lista narzędzi, do których ten agent może uzyskiwać dostęp i używać. Jeśli nie podasz tej wartości, wartość domyślna zawiera wszystkie narzędzia na serwerze MCP.
    4. require_approval: Opcjonalnie określ, czy wymagane jest zatwierdzenie. Wartość domyślna to always. Obsługiwane wartości to:
      • always: Deweloper musi udzielić zatwierdzenia dla każdego żądania. Jeśli nie podasz wartości, jest to wartość domyślna.
      • never: Nie jest wymagane zatwierdzenie.
      • {"never":[<tool_name_1>, <tool_name_2>]}: Udostępniasz listę narzędzi, które nie wymagają zatwierdzenia.
      • {"always":[<tool_name_1>, <tool_name_2>]}: Udostępniasz listę narzędzi, które wymagają zatwierdzenia.
  2. project_connection_id: identyfikator połączenia projektu, który przechowuje uwierzytelnianie i inne szczegóły połączenia dla serwera MCP.
  3. Jeśli model próbuje wywołać narzędzie na serwerze MCP z wymaganym zatwierdzeniem, otrzymasz odpowiedź, której typ elementu wyjściowego to mcp_approval_request. W elemencie danych wyjściowych odpowiedzi można uzyskać więcej szczegółów na temat wywoływanego narzędzia na serwerze MCP i przekazywanych argumentów. Przejrzyj narzędzie i argumenty, aby można było podjąć świadomą decyzję o zatwierdzeniu.
  4. Prześlij zatwierdzenie do agenta przy użyciu polecenia previous_response_id i ustawieniu approve na true.

Nawiązywanie połączenia z serwerem Azure DevOps MCP

Serwer MCP usługi Azure DevOps jest dostępny w Foundry jako pozycja katalogowa.

Important

Zdalny serwer Azure DevOps MCP uwierzytelnia się za pomocą Microsoft Entra ID. Organizacja Azure DevOps musi być powiązana z tenantem Microsoft Entra. Organizacje korzystające wyłącznie z kont Microsoft (MSA) nie są obsługiwane.

Aby dodać serwer:

  1. W portalu Foundry przejdź do projektu.
  2. Wybierz Dodaj Narzędzia>Katalog i wyszukaj "Azure DevOps".
  3. Wybierz Azure DevOps serwer MCP i wybierz pozycję Utwórz.
  4. Wprowadź nazwę organizacji Azure DevOps i wybierz pozycję Połączenie.
  5. Wybierz narzędzia Azure DevOps do udostępnienia agentowi. Możesz wybrać podzbiór narzędzi, aby kontrolować dokładnie, do czego może uzyskiwać dostęp agent.

Ta konfiguracja oparta na wykazie tworzy narzędzie MCP do użytku przez agentów bez konieczności wprowadzania zmian w kodzie. Przed zintegrowaniem narzędzia z kodem produkcyjnym można zweryfikować łączność i zachowanie narzędzia w środowisku testowania czatu rozwiązania Foundry.

Wskazówka

Wersjonowanie przybornika: Przyborniki Foundry obsługują wersjonowanie, dzięki czemu można pracować nad nowymi wersjami bez wpływu na agentów produkcyjnych. Użyj punktu końcowego odbiorcy ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) dla agentów produkcyjnych — zawsze obsługuje promowaną wersję domyślną. Użyj punktu końcowego specyficznego dla wersji ({project_endpoint}/toolboxes/{name}/versions/{version}/mcp?api-version=v1), aby przetestować go przed promocją. Zachowaj server_label unikalność dla każdego agenta, nawet podczas przełączania wersji Przybornika. Aby uzyskać szczegółowe informacje, zobacz Podwyższanie poziomu wersji do domyślnej.

Długotrwałe operacje (wersja zapoznawcza)

Ścieżka pomocnicza — tryb tła: Użyj tego trybu tylko wtedy, gdy operacja MCP nie może zakończyć się w ramach standardowego limitu czasu synchronicznego.

Niektóre serwery MCP uwidaczniają narzędzia, które zajmują więcej niż standardowy synchroniczny limit czasu zwracania wyniku. Aby obsługiwać te operacje, uruchom agenta w trybie w tle. Tryb działania w tle uruchamia przetwarzanie odpowiedzi asynchronicznie, dzięki czemu wywołanie narzędzia MCP może działać dalej bez utrzymywania otwartego połączenia, a Ty sprawdzasz status odpowiedzi aż do jej zakończenia. To podejście pozwala wywołaniom narzędzi MCP przekraczać 100-sekundowy limit czasu dla odpowiedzi bez strumieniowania opisany w sekcji Znane ograniczenia.

Uwaga

Długotrwałe operacje MCP są dostępne w wersji zapoznawczej. Funkcje w wersji zapoznawczej są udostępniane bez umowy dotyczącej poziomu usług i nie są zalecane w przypadku obciążeń produkcyjnych. Zachowanie i obsługiwane modele mogą ulec zmianie.

Wymagania dotyczące serwera MCP

Środowisko uruchomieniowe agenta opiera się na serwerze MCP, aby uruchomić operację asynchronicznie i zgłaszać postęp. Serwer musi:

  • Zaimplementuj obsługę zadań w protokole Model Context Protocol, tak aby wywołanie narzędzia mogło zwracać referencję do zadania zamiast blokować działanie do czasu zakończenia pracy.
  • Zwróć powiązany identyfikator zadania w metadanych wyniku narzędzia (pole io.modelcontextprotocol/related-task z wartością taskId), gdy rozpoczyna ono operację długotrwałą.
  • Uwidacznia sposób sondowania stanu zadania przez środowisko uruchomieniowe i pobierania wyniku końcowego po zakończeniu zadania.
  • Bądź dostępny jako zdalny punkt końcowy MCP, podobnie jak każde inne narzędzie MCP. Lokalne serwery MCP muszą być hostowane samodzielnie, aby zapewnić zdalny punkt końcowy. Zobacz Hostowanie lokalnego serwera MCP.

Gdy środowisko uruchomieniowe agenta wywołuje narzędzie, które uruchamia długotrwałą operację, serwer zwraca odwołanie do zadania, a środowisko uruchomieniowe zachowuje odpowiedź w tle. Środowisko uruchomieniowe rozpoczyna przetwarzanie odpowiedzi, natychmiast zwraca odpowiedź id oraz status o wartości queued, a wynik pobiera po zakończeniu zadania. Odpytujesz odpowiedź id, aż status przyjmie wartość completed, a następnie odczytujesz ostateczne dane wyjściowe.

Tryb w tle dla długotrwałych operacji MCP działa z dowolnym modelem, który obsługuje tryb w tle, taki jak gpt-5.4 lub gpt-5.5.

Jeśli agent używa modelu, który nie obsługuje trybu działania w tle, wywołania narzędzia MCP są wykonywane synchronicznie i podlegają limitowi czasu wynoszącemu 100 sekund.

Włączanie trybu tła w portalu Microsoft Foundry

W środowisku testowym portalu Microsoft Foundry możesz włączyć tryb tła dla agenta bez pisania kodu:

  1. Otwórz swojego agenta i wybierz kartę Playground.

  2. Na liście Model wybierz model, który obsługuje tryb w tle, na przykład gpt-5.4 lub gpt-5.5.

  3. Wybierz ikonę parametrów obok modelu i włącz tryb w tle.

  4. W obszarze Narzędzia dodaj narzędzie, którego serwer MCP obsługuje zadania MCP, takie jak agent danych Fabric dodany za pośrednictwem narzędzia Fabric IQ. Instrukcje znajdziesz w artykule Łączenie agentów z usługą Microsoft Fabric za pomocą Fabric IQ.

  5. Wyślij wiadomość. Agent uruchamia działanie w tle i wyświetla jego postęp, podczas gdy długotrwałe wywołanie narzędzia jest wykonywane. Po zakończeniu przebiegu odpowiedź zostanie wyświetlona na czacie.

Uruchamianie trybu tła przy użyciu kodu

W poniższych przykładach wywołaj agenta, który jest już skonfigurowany za pomocą narzędzia MCP, ustawiony background na true, i sonduj, aż odpowiedź zakończy się. Zastąp wartości zastępcze własnymi.

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

Utwórz odpowiedź w tle. Żądanie natychmiast zwraca odpowiedź id i status o wartości queued:

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
  }'

Skopiuj odpowiedź id z wyniku, a następnie sonduj ją aż do status wartości completed:

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

Gdy status ma wartość completed, tablica output zawiera wynik wywołania narzędzia MCP i końcową wiadomość asystenta.

Znane ograniczenia

Ścieżka pomocnicza — zachowanie przesyłania strumieniowego: Przejrzyj te limity po pierwszej trasie powodzenia, jeśli klient przesyła strumienie odpowiedzi lub wywołanie MCP zbliża się do synchronicznego limitu czasu.

  • Limit czasu wywołania narzędzia MCP dla nieprzesyłania strumieniowego: Wywołania narzędzi MCP bez przesyłania strumieniowego mają limit czasu 100 sekund. Jeśli serwer MCP odpowiada dłużej niż 100 sekund, wywołanie nie powiedzie się. Aby uniknąć przekroczenia limitu czasu, upewnij się, że serwer MCP odpowiada w ramach tego limitu. Jeśli przypadek użycia wymaga dłuższych czasów przetwarzania, uruchom agenta w trybie w tle z obsługiwanym modelem, zoptymalizuj logikę po stronie serwera lub przerwij operację na mniejsze kroki.
  • Prywatny MCP wymaga standardowej konfiguracji agenta: Prywatna łączność z serwerem MCP jest dostępna tylko w przypadku standardowej konfiguracji agenta z siecią prywatną (BYO VNet). Konfiguracja agenta podstawowego nie obsługuje prywatnych punktów końcowych MCP.
  • Private hosting MCP: Azure Container Apps w dedykowanej podsieci MCP jest przetestowaną konfiguracją dla prywatnych serwerów MCP. Aplikacje funkcjonalne lub usługi App Services jako host prywatnego serwera MCP mogą działać, ale nie są testowane wewnętrznie.

Typowe pytania i błędy

Następujące typowe problemy mogą wystąpić podczas korzystania z narzędzi MCP z Foundry Agent Service:

  • "Nieprawidłowy schemat narzędzia":

    Ten błąd zwykle występuje, jeśli definicja serwera MCP zawiera anyOf lub allOf, lub jeśli parametr akceptuje wiele typów wartości. Zaktualizuj definicję serwera MCP i spróbuj ponownie.

  • "Brak autoryzacji" lub "Zabronione" z serwera MCP:

    Upewnij się, że serwer MCP obsługuje metodę uwierzytelniania i sprawdź poświadczenia przechowywane w połączeniu projektu. W przypadku GitHub używaj tokenów z najmniejszymi uprawnieniami i regularnie je obracaj. W przypadku serwera MCP dla Azure DevOps sprawdź, czy organizacja jest powiązana z dzierżawą Microsoft Entra i czy możesz ukończyć proces łączenia organizacji w Foundry. Organizacje korzystające z autonomicznych kont Microsoft nie są obsługiwane.

  • Model nigdy nie wywołuje narzędzia MCP:

    Upewnij się, że instrukcje agenta zachęcają do korzystania z narzędzi, a także zweryfikuj wartości server_label, server_url i allowed_tools. Jeśli ustawisz wartość allowed_tools, upewnij się, że nazwa narzędzia jest zgodna z tym, co uwidacznia serwer MCP.

  • Agent nigdy nie kontynuuje działania po zatwierdzeniu.

    Potwierdź, że wysyłasz żądanie przypominające z previous_response_id ustawionym na oryginalny identyfikator odpowiedzi i że używasz identyfikatora elementu żądania zatwierdzenia jako approval_request_id.

Hostowanie lokalnego serwera MCP

Środowisko uruchomieniowe usługi agenta akceptuje tylko zdalny punkt końcowy serwera MCP. Jeśli chcesz dodać narzędzia z lokalnego serwera MCP, musisz go samodzielnie hostować na Azure Container Apps lub Azure Functions aby uzyskać zdalny punkt końcowy serwera MCP.

Zdalny punkt końcowy może być publicznym punktem końcowym lub prywatnym punktem końcowym w sieci wirtualnej. W przypadku prywatnych serwerów MCP wdróż aplikację kontenera z użyciem ingresu wyłącznie wewnętrznego (--internal-only true) w dedykowanej podsieci MCP. Aby uzyskać szczegółowe informacje na temat konfiguracji, zobacz Publiczne i prywatne punkty końcowe serwera MCP .

Podczas hostowania lokalnych serwerów MCP w chmurze należy wziąć pod uwagę następujące czynniki:

Konfiguracja lokalnego serwera MCP Hosting w ramach Azure Container Apps Hosting w ramach Azure Functions
Transport Wymagane punkty końcowe HTTP POST/GET. Wymagana jest możliwość strumieniowania HTTP.
Zmiany kodu Wymagana jest ponowna odbudowa kontenera. Pliki konfiguracyjne specyficzne dla Azure Functions są wymagane w katalogu głównym.
Uwierzytelniania Wymagana jest implementacja uwierzytelniania niestandardowego. Tylko oparte na kluczach. Protokół OAuth wymaga usługi API Management.
Język Dowolny język uruchamiany w kontenerach systemu Linux (Python, Node.js, .NET, TypeScript, Go). Python, Node.js, Java, .NET tylko.
Wymagania dotyczące kontenera Linux (tylko linux/amd64). Brak uprzywilejowanych kontenerów. Serwery konteneryzowane nie są obsługiwane.
Zależności Wszystkie zależności muszą znajdować się w obrazie kontenera. Zależności na poziomie systemu operacyjnego (takie jak Playwright) nie są obsługiwane.
Państwa Tylko bezstanowe. Tylko bezstanowe.
UVX/NPX Obsługiwane. Nieobsługiwane. npx polecenia uruchamiania nie są obsługiwane.