Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Anslut dina Foundry-agenter till MCP-servrar (Model Context Protocol) med hjälp av MCP-verktyget. Den här anslutningen utökar agentfunktionerna med externa verktyg och datakällor. Genom att ansluta till fjärr-MCP-serverslutpunkter kan agentens Foundry-modell komma åt verktyg som hanteras av utvecklare och organisationer som MCP-kompatibla klienter som Foundry Agent Service kan använda.
MCP är en öppen standard som definierar hur program tillhandahåller verktyg och kontextuella data till stora språkmodeller (LLM). Det möjliggör konsekvent och skalbar integrering av externa verktyg i modellarbetsflöden.
Tips
Överväg att lägga till det här verktyget med hjälp av en verktygslåda. Med en verktygslåda kan du återanvända verktyget mellan agenter och körningsmiljöer samt centralisera hanteringen av autentiseringsuppgifter, versionshantering och policytillämpning via en hanterad MCP-slutpunkt. Se snabbstarten för verktygslådan.
I den här artikeln lär du dig att:
- Lägg till en fjärr-MCP-server som ett verktyg.
- Autentisera till en MCP-server med hjälp av en projektanslutning.
- Granska och godkänn MCP-verktygsanrop.
- Felsöka vanliga MCP-integreringsproblem.
Om du använder en kodningsagent som GitHub Copilot kan Microsoft Foundry Skill hjälpa dig att konfigurera MCP-verktygsanslutningar, autentisering, godkännandebeteende och felsökningssteg.
Förutsättningar
Kontrollera att du har:
En Azure prenumeration med ett aktivt Microsoft Foundry-projekt.
Foundry-användarrollen i Foundry-projektet för att skapa och testa agenter. Om du skapar en projektanslutning för MCP-autentisering behöver du också ha rollen Foundry Project Manager för det projektet.
Important
Foundrys RBAC-roller har nyligen namnändrats. Foundry User, Foundry Owner, Foundry Account Owner och Foundry Project Manager hette tidigare Azure AI-användare, Azure AI-ägare, Azure AI-kontoägare och Azure AI Project Manager. Du kanske fortfarande ser de tidigare namnen på vissa platser medan namnbytet distribueras. Roll-ID:na och kärnbehörigheterna ändras inte av namnbytet.
Det senaste SDK-paketet för ditt språk. .NET SDK är för närvarande i förhandsversion. Information om installation finns i snabbstarten.
Azure autentiseringsuppgifter som konfigurerats för autentisering (till exempel
DefaultAzureCredential).Åtkomst till en fjärr-MCP-servandpunkt (till exempel GitHubs MCP-server på
https://api.githubcopilot.com/mcp).
Välj en uppgift
| Task | Sökväg |
|---|---|
| Anslut en agent och bekräfta det första framgångsrika verktygsanropet | Följ flödet för anslutning, godkännande, verifiering och rensning. |
| Lägga till autentiseringsuppgifter eller identitetsbaserad åtkomst | Sekundär:Konfigurera autentisering. |
| Ansluta till en privat MCP-slutpunkt | Sekundärt:Granska krav för offentliga och privata slutpunkter. |
| Kör en lång åtgärd i bakgrundsläge | Sekundärt:Konfigurera långvariga operationer. |
| Förstå beteendet för streaming och tidsgränser | I andra hand:Granska de kända begränsningarna. |
| Konfigurera serveralternativ eller vara värd för en lokal server | Sekundär:Konfigurera MCP-anslutningen eller var värd för en lokal MCP-server. |
Konceptuell information om hur MCP-integrering fungerar finns i Så här fungerar det.
Användningsstöd
I följande tabell visas SDK och installationsstöd för MCP-anslutningar.
| stöd för Microsoft Foundry | Python SDK | C#-SDK | SDK för JavaScript | Java SDK | REST API | Grundläggande agentkonfiguration | Standardagentkonfiguration |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Offentliga och privata MCP-serverslutpunkter
Agent service stöder både offentliga och privata MCP-serverslutpunkter:
- Offentliga slutpunkter: Anslut till alla offentligt tillgängliga fjärr-MCP-servrar. Det här alternativet fungerar med både basic- och standardagentkonfigurationer.
- Privata slutpunkter: Anslut till MCP-servrar som inte exponeras för det offentliga Internet. Privat MCP kräver konfiguration av privata nätverk och ett dedikerat MCP-undernät i ditt virtuella nätverk.
För privata MCP-servrar distribuerar du din MCP-server på Azure Container Apps med endast intern åtkomst på ett dedikerat MCP-undernät som delegerats till Microsoft.App/environments. Kom igång genom att använda mallen 19-private-network-agents-tools-setup , som etablerar den nödvändiga nätverksinfrastrukturen, inklusive MCP-undernätet eller 11-private-network-basic-project om du inte vill ta med dina egna resurser.
Mer information om verktygsstöd i nätverksisolerade miljöer finns i Agentverktyg med nätverksisolering.
Använda Foundry Toolboxes som MCP-slutpunkter
Med Foundry Toolboxes kan du paketera flera verktyg – till exempel webbsökning, kodtolk, filsökning, Azure AI-sökning, MCP-servrar, OpenAPI-verktyg och agent-till-agent-anslutningar – till en enda MCP-kompatibel slutpunkt. I stället för att konfigurera varje verktyg separat på varje agent skapar du en verktygslåda i Foundry och pekar din agent till verktygslådans slutpunkt med hjälp av standardverktygskonfigurationen mcp (server_url och server_label).
Eftersom Toolbox-slutpunkten är MCP-kompatibel kan alla exekveringsmiljöer som kan använda en MCP-server också använda en Toolbox. Den här kompatibiliteten omfattar Foundry Agent Service, Microsoft Agent Framework, LangGraph, GitHub Copilot SDK och andra MCP-aktiverade klienter. Du kan lägga till, ta bort eller konfigurera om verktyg i verktygslådan utan att ändra agentkoden.
Installationssteg finns i Skapa och använda en Foundry Toolbox.
MCP-slutpunkten i verktygslådan har stöd för långvariga operationer genom MCP-uppgifter, som för närvarande är i förhandsversion. Om du vill använda långvariga verktyg kontrollerar du att agentens sele stöder MCP-uppgifter.
McP-autentisering och konfiguration i verktygslådan
Skapa en projektanslutning för MCP-servern med den autentiseringstyp som matchar ditt scenario och referera sedan till den från en minimal yaml-verktygslåda.
Steg 1. Skapa anslutningen
Exportera projektslutpunkten och ange den som det aktiva projektet för kommandona azd ai :
PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
azd ai project set $PROJECT_ENDPOINT
Välj den autentiseringsvariant som du behöver:
# 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 |
Ytterligare flaggor |
|---|---|
none |
— |
custom-keys |
--custom-key "Header=Value" (repeterbar) |
oauth2 |
--authorization-url, --token-url, --client-id, --client-secret, --scopes |
user-entra-token |
--audience <entra-audience> |
project-managed-identity |
--audience <entra-audience> (valfritt) |
agentic-identity |
--audience <entra-audience> |
För identitetsbaserad autentisering (user-entra-token, project-managed-identity, agentic-identity) tilldelar du motsvarande huvudnamn den RBAC-roll som krävs för målresursen innan du anropar verktygslådan.
Steg 2. Definiera verktygslådan
# my-toolbox.yaml
description: MCP server tools
connections:
- name: my-mcp-conn
Steg 3. Skapa verktygslådan
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Första gången en användare anropar en verktygslåda med en OAuth-baserad MCP i ett projekt returnerar MCP-slutpunkten ett CONSENT_REQUIRED fel (kod -32006) med en medgivande-URL:
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
Det här felet förväntas. Öppna medgivande-URL:en i en webbläsare, slutför OAuth-auktoriseringsflödet och försök sedan igen med agentanropet. Fortsatta anrop lyckas utan att begära ny inmatning.
Autentisering
Sekundär sökväg: Konfigurera autentisering efter den första lyckade vägen när MCP-servern kräver autentiseringsuppgifter eller identitetsbaserad åtkomst.
Många MCP-servrar kräver autentisering.
I Foundry Agent Service använder du en projektanslutning för att lagra autentiseringsinformation, till exempel API-nycklar eller ägartoken, i stället för hårdkodade autentiseringsuppgifter i din app.
Mer information om autentiseringsalternativ som stöds, inklusive nyckelbaserade, Microsoft Entra identiteter och OAuth-identitetsgenomströmning, finns i MCP-serverautentisering.
Observera
Ange project_connection_id till ID för projektanslutningen.
Tips
När du lägger till Azure DevOps MCP Server (förhandsversion) via katalogen Add Tools autentiserar du till Azure DevOps under organisationsanslutningssteget och lagrar autentiseringen som en projektanslutning. Använd åtkomst med lägsta behörighet och granska omfattningen när du ansluter organisationen.
När du använder en MCP-slutpunkt för Foundry Toolbox hanterar verktygslådan autentisering centralt. Verktygslådan hanterar inmatning av autentiseringsuppgifter, tokenuppdatering och principframtvingande vid körning för alla verktyg i paketet. Agenter autentiserar sig till själva toolbox-slutpunkten med hjälp av Microsoft Entra autentiseringsuppgifter, till exempel DefaultAzureCredential, och enskilda verktygsautentiseringsuppgifter behöver inte skickas av varje agent. Information om konfiguration av autentisering av verktygslåda finns i Krav för verktygslåda.
Överväganden vid användning av icke-Microsoft-tjänster och servrar
Du omfattas av villkoren mellan dig och tjänstleverantören när du använder anslutna icke-Microsoft-tjänster. När du ansluter till en tjänst som inte är Microsoft skickar du en del av dina data, till exempel fråga efter innehåll, till tjänsten som inte Microsoft, eller så kan ditt program ta emot data från tjänsten som inte Microsoft. Du ansvarar för din användning av icke-Microsoft-tjänster och data, tillsammans med eventuella avgifter som är associerade med den användningen.
Tredje part, inte Microsoft, skapar de fjärranslutna MCP-servrar som du bestämmer dig för att använda med MCP-verktyget som beskrivs i den här artikeln. Microsoft testar eller verifierar inte dessa servrar. Microsoft har inget ansvar för dig eller andra när det gäller din användning av fjärr-MCP-servrar.
Granska och spåra noggrant vilka MCP-servrar du lägger till i Foundry Agent Service. Förlita dig på servrar som hanteras av betrodda tjänstleverantörer själva i stället för proxyservrar.
Med MCP-verktyget kan du skicka anpassade huvuden, till exempel autentiseringsnycklar eller scheman, som en fjärr-MCP-server kan behöva. Granska alla data som du delar med fjärranslutna MCP-servrar och logga data i granskningssyfte. Var medveten om icke-Microsoft metoder för kvarhållning och lagring av data.
Observera
Foundry Toolboxes skiljer sig från MCP-servrar från tredje part. Verktygslådor är organisationsstyrda resurser som du skapar och hanterar i ditt Microsoft Foundry-projekt. Du ansvarar dock fortfarande för val av verktyg, datahantering och efterlevnad när du kurerar innehållet i verktygslådan.
Metodtips
Allmän vägledning om verktygsanvändning finns i Best practices for using tools in Microsoft Foundry Agent Service.
Följ dessa metoder när du använder MCP-servrar:
- Använd en lista över tillåtna verktyg med hjälp av
allowed_tools. - Behandla verktygsbeskrivningar, anteckningar och resultat från fjärranslutna MCP-servrar som ej betrodda indata. De kan innehålla indirekta promptinjektionsinstruktioner.
- Kräv godkännande för högriskåtgärder, särskilt verktyg som skriver data eller ändrar resurser.
- Granska det begärda verktygsnamnet och argumenten innan du godkänner.
- Granska
allowed_tools, godkännandeinställningar och anslutningsbehörigheter när serverns operatör, exponerade verktyg eller beteende ändras. - Logggodkännanden och verktygsanrop för granskning och felsökning.
Tips
När du lägger till Azure DevOps MCP-server via katalogen Lägg till verktyg mappar konfigurationen för val av verktyg till allowed_tools beteende som beskrivs i den här artikeln. Att välja en delmängd av verktygen i kataloggränssnittet motsvarar att ange en allowed_tools lista i kod.
Första lyckade vägen: ansluta, godkänna, verifiera och rensa
Använd exemplet prompt-agent för det valda språket. När exemplet har flikar av typen agent väljer du Promptagenter. Den här vägen håller den första körningen fokuserad på en uppgift: anslut en MCP-server, anropa ett verktyg och inspektera resultatet.
-
Anslut: Konfigurera MCP-verktyget med
require_approvalinställt påalwaysoch koppla det till agenten. - Godkänn: Kör exemplet, granska den begärda servern, verktyget och argumenten och godkänn endast det förväntade anropet.
- Verifiera: Bekräfta att det slutliga svaret innehåller information som returneras av MCP-verktyget, som visas i de förväntade utdata.
- Rensa: Kör exemplets rensningsåtgärd. Exempel på prompt-agent tar bort agentversionen och TypeScript-exemplet tar också bort konversationen.
Skapa en agent i Python med MCP-verktyget
Använd följande kodexempel för att skapa en agent och anropa funktionen. .NET SDK är för närvarande i förhandsversion. Mer information finns i snabbstarten .
I följande exempel visas hur du lägger till GitHub MCP-servern i en verktygslåda och kopplar verktygslådan till en agent. Välj Prompt Agents för att använda Azure AI Projects SDK för att skapa en agent på serversidan, eller Hosted Agents för att använda Agent Framework FoundryChatClient för att skapa en tillfällig, processbaserad agent.
Aktivera agenter
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")
Förväntade utdata
I följande exempel visas förväntade utdata när du kör exemplet:
Agent created (id: <agent-id>, name: MyAgent7, version: 1)
Created conversation (id: <conversation-id>)
Response: Your GitHub username is "example-username".
Agent deleted
Hostade agenter
Det här exemplet använder FoundryChatClient från Microsoft Agent Framework, skapar en verktygslåda som innehåller GitHub MCP-server och kopplar sedan verktygslådans slutpunkt till din värdbaserade agent med FoundryToolbox. Installera paketen med pip install agent-framework-foundry, ange FOUNDRY_PROJECT_ENDPOINT miljövariablerna och FOUNDRY_MODEL logga in med 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())
Förväntade utdata
Agenten anropar Microsoft Learn MCP-servern via verktygslådans slutpunkt och returnerar dokumentationsbaserad text:
Agent: Microsoft Agent Framework is an open-source framework for building, orchestrating, and deploying AI agents ...
Den fullständiga verktygslådan med värdbaserade agentmönster finns i Använda en verktygslåda med en värdbaserad agent.
Skapa en agent med MCP-verktyget
I följande exempel visas hur du lägger till en fjärr-MCP-server i en verktygslåda och kopplar verktygslådan till en agent. Välj Prompt Agents om du vill använda Azure AI Projects SDK för att skapa en agent på serversidan eller Hosted Agents för att använda Microsoft Agent Framework för att skapa en tillfällig agent i processen.
Aktivera agenter
I exemplet används synkrona metoder för att skapa en agent. För asynkrona metoder, se exempelkoden i Azure SDKs för .NET-repositoryt på 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);
Förväntade utdata
I följande exempel visas förväntade utdata när du kör exemplet:
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.
Hostade agenter
Det här exemplet skapar MCP-serververktygslådan med hjälp av Azure AI Projects SDK och använder sedan integreringen för Microsoft Agent Framework AddFoundryToolboxes för att exponera verktygen i verktygslådan för din hostade agent.
AZURE_AI_PROJECT_ENDPOINTAnge miljövariablerna , AZURE_OPENAI_ENDPOINToch AZURE_AI_MODEL_DEPLOYMENT_NAME och logga in med 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();
Förväntade utdata
När den värdbaserade agenten anropas frågar den Microsoft Learn MCP-servern via verktygslådans slutpunkt för dokumentationsfragment och svar:
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` ...
En underhållen .NET Agent Framework-integrering finns i Använda en verktygslåda med en värdbaserad agent.
Skapa en agent med hjälp av MCP-verktyget med projektanslutningsautentisering
I det här exemplet får du lära dig hur du autentiserar till GitHub MCP-servern i en verktygslåda och sedan kopplar mcp-slutpunkten för verktygslådan till en agent. I exemplet används synkrona metoder för att skapa verktygslådan och agenten. För asynkrona metoder, se exempelkoden i Azure SDKs för .NET-repositoryt på GitHub.
Konfigurera projektanslutning
Innan du kör exemplet:
- Logga in på din GitHub profil.
- Välj profilbilden i det övre högra hörnet.
- Välj Inställningar.
- I den vänstra panelen väljer du Utvecklarinställningar och Token för > personlig åtkomsttoken (klassisk).
- Längst upp väljer du Generera ny token, anger ditt lösenord och skapar en token som kan läsa offentliga lagringsplatser.
- Viktigt: Spara token eller håll sidan öppen eftersom token inte kan visas igen när sidan har stängts.
- Öppna Microsoft Foundry i Azure-portalen.
- Välj Hantera i det övre högra navigeringsfältet, välj Project information och välj sedan fliken Anslutna resurser.
- Skapa en ny anslutning av typen Anpassade nycklar .
- Ge det namnet och lägg till ett nyckelvärdepar.
- Ange nyckelnamnet till
Authorizationoch värdet ska ha en form avBearer your_github_token.
Kodexempel för att skapa agenten
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);
Förväntade utdata
I följande exempel visas förväntade utdata när du kör exemplet:
Approval requested for toolbox...
Response: Your GitHub username is "example-username".
Skapa en agent i TypeScript med MCP-verktyget
Följande TypeScript-exempel visar hur du lägger till en MCP-server i en verktygslåda, kopplar verktygslådan till en agent, skickar begäranden som utlöser arbetsflöden för MCP-godkännande, hanterar begäranden om godkännande och rensar resurser. En JavaScript-version finns i koden sample på lagringsplatsen Azure SDKs för JavaScript på 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);
});
Förväntade utdata
I följande exempel visas förväntade utdata när du kör exemplet:
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!
Skapa en agent med hjälp av MCP-verktyget med projektanslutningsautentisering
Följande TypeScript-exempel visar hur du lägger till en autentiserad MCP-server i en verktygslåda, kopplar mcp-slutpunkten för verktygslådan till en agent, skickar begäranden som utlöser ARBETSFLÖDEn för MCP-godkännande, hanterar begäranden om godkännande och rensar resurser. En JavaScript-version finns i koden sample på lagringsplatsen Azure SDKs för JavaScript på 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);
});
Förväntade utdata
I följande exempel visas förväntade utdata när du kör exemplet:
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!
Använda MCP-verktyg i en Java-agent
Tips
De flesta agenter använder en verktygslåda för att lägga till filsökningsverktyget och koppla verktygslådan till din agent som ett MCP-verktyg. *Om du använder Java SDK är ett API för att skapa verktygslådor ännu inte tillgängligt. Skapa en verktygslåda med hjälp av Python, REST API, C#, TypeScript eller Foundry-portalen och referera sedan till MCP-slutpunkten från din Java-agent som en McpTool.
Lägg till beroendet till din pom.xml.
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.2.0</version>
</dependency>
Skapa en agent med MCP-verktyget
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());
}
}
Förväntade utdata
Agent created: mcp-agent (version 1)
Response: [ResponseOutputItem containing MCP tool results ...]
Använda MCP-verktyget med REST-API:et
I följande exempel visas hur du skapar en agent med MCP-verktyget och anropar den med hjälp av svars-API:et. Om svaret innehåller ett utdataobjekt med type inställt på mcp_approval_requestskickar du en uppföljningsbegäran som innehåller ett mcp_approval_response objekt.
Förutsättningar
Ange följande miljövariabler:
-
FOUNDRY_PROJECT_ENDPOINT: Projektets slutpunkts-URL. -
FOUNDRY_MODEL_DEPLOYMENT_NAME: Namnet på modelldistributionen. -
AGENT_TOKEN: En bärare-token för Foundry. -
MCP_PROJECT_CONNECTION_NAME(valfritt): Namnet på MCP-projektanslutningen.
Hämta en åtkomsttoken:
export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
Om MCP-servern i verktygslådan inte kräver autentisering utelämnar project_connection_id du verktygslådans verktygsdefinition. Agentens MCP-verktyg använder project_connection_id fortfarande för fjärrverktygsanslutningen till verktygslådans slutpunkt.
Observera
För REST API använder du namnet på fjärrverktygets projektanslutning som du skapar för verktygslådans slutpunkt som project_connection_id på agentens MCP-verktyg.
Tips
Mer information om MCP-verktygsschemat och godkännandeobjekten finns i referensen Microsoft Foundry REST API.
1. Skapa en verktygslåda med MCP-servern
Det rekommenderade sättet att lägga till en MCP-server är via en verktygslåda och bifoga sedan verktygslådan till din agent som ett MCP-verktyg. Se Vad är en verktygslåda?
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"
}
]
}'
Verktygslådan tillhandahåller en MCP-kompatibel slutpunkt på $FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1, där <version> är den version som returnerades av föregående anrop.
2. Skapa en fjärrverktygsanslutning till verktygslådan
Skapa en fjärrverktygsprojektanslutning som pekar på verktygslådans slutpunkt. Använd en entra-token för användare så att anroparens identitet skickas via (målgrupp 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. Skapa en MCP-agent
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"
}
]
}
}'
Om du vill använda en autentiserad MCP-server i verktygslådan lägger du till "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" i verktygslådans verktygsdefinition. Ändra server_url till den autentiserade serverslutpunkten (till exempel https://api.githubcopilot.com/mcp).
4. Skapa ett svar
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"
}'
Om svaret innehåller ett utdataobjekt med type inställt på mcp_approval_requestkopierar du objektet id för godkännandebegäran som APPROVAL_REQUEST_ID. Kopiera även svaret id på den översta nivån som PREVIOUS_RESPONSE_ID.
5. Skicka ett godkännandesvar
Om MCP-verktyget kräver godkännande skickar du en uppföljningsbegäran:
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. Rensa resurser
Ta bort agenten:
curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/<AGENT_NAME>-mcp?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
Så här fungerar det
Du måste ta med en fjärr-MCP-server (en befintlig MCP-serverslutpunkt) till Foundry Agent Service. Du kan ta med flera fjärranslutna MCP-servrar genom att lägga till dem som verktyg. För varje verktyg måste du ange ett unikt server_label värde inom samma agent och ett server_url värde som pekar på den fjärranslutna MCP-servern. Se noga till att granska vilka MCP-servrar som du lägger till i Foundry Agent Service.
Förutom att ansluta godtyckliga fjärr-MCP-servrar via URL kan vissa MCP-servrar läggas till direkt från katalogen Foundry Add Tools . Till exempel är Azure DevOps MCP Server (förhandsversion) tillgänglig som en katalogpost. Katalogposter förenklar anslutningskonfigurationen och överensstämmer med samma mekanismer för godkännande och granskning som beskrivs i den här artikeln.
Mer information om hur du använder MCP finns i:
- Metodtips för säkerhet på webbplatsen för Model Context Protocol.
- Förstå och minska säkerhetsrisker i MCP-implementeringar i Microsoft Security Community Blog.
Konfigurera MCP-anslutningen
Sekundär sökväg – avancerade åtgärder: Använd den här referensen efter den första lyckade vägen för att begränsa verktyg, ändra godkännandebeteende eller lägga till en projektanslutning.
Följande steg beskriver hur du ansluter till en fjärransluten MCP-server från Foundry Agent Service:
- Hitta den fjärranslutna MCP-server som du vill ansluta till, till exempel GitHub MCP-server. Skapa eller uppdatera en Foundry-agent med ett
mcpverktyg med hjälp av följande information:-
server_url: URL:en för MCP-servern, till exempelhttps://api.githubcopilot.com/mcp/. -
server_label: En unik identifierare för den här MCP-servern för agenten, till exempelgithub. -
allowed_tools: En valfri lista över verktyg som agenten kan komma åt och använda. Om du inte anger det här värdet innehåller standardvärdet alla verktyg på MCP-servern. -
require_approval: Du kan också avgöra om godkännande krävs. Standardvärdet äralways. Värden som stöds är:-
always: En utvecklare måste ge godkännande för varje anrop. Om du inte anger något värde är det här standardvärdet. -
never: Inget godkännande krävs. -
{"never":[<tool_name_1>, <tool_name_2>]}: Du anger en lista över verktyg som inte kräver godkännande. -
{"always":[<tool_name_1>, <tool_name_2>]}: Du anger en lista över verktyg som kräver godkännande.
-
-
-
project_connection_id: Projektanslutnings-ID:t som lagrar autentisering och annan anslutningsinformation för MCP-servern. - Om modellen försöker anropa ett verktyg på MCP-servern med godkännande krävs får du en typ av svarsutdataobjekt som
mcp_approval_request. I svarsutdataobjektet kan du få mer information om vilket verktyg i MCP-servern som anropas och argument som ska skickas. Granska verktyget och argumenten så att du kan fatta ett välgrundat beslut för godkännande. - Skicka ditt godkännande till agenten med hjälp av
previous_response_idoch ställ inapprovetilltrue.
Ansluta till Azure DevOps MCP-server
Azure DevOps MCP Server (förhandsversion) är tillgänglig som en katalogpost i Foundry. Så här lägger du till den:
- Gå till projektet i Foundry-portalen.
- Välj Lägg till verktyg>Catalog och sök efter "Azure DevOps".
- Välj Azure DevOps MCP Server (förhandsversion) och välj Skapa.
- Ange ditt Azure DevOps organisationsnamn och välj Connect.
- Välj vilka Azure DevOps verktyg som ska exponeras för din agent. Du kan välja en delmängd av verktygen för att styra exakt vad agenten kan komma åt.
Den här katalogbaserade installationen skapar MCP-verktyget för användning av agenter utan att kräva kodändringar. Du kan verifiera anslutnings- och verktygsbeteendet i testmiljön för Foundry-chatten innan du integrerar verktyget i produktionskoden.
Tips
Versionshantering i verktygslådan: Foundry Toolboxes stöder versionshantering, så att du kan iterera på en ny version utan att påverka produktionsagenter. Använd konsumentslutpunkten ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) för produktionsagenter – den tillhandahåller alltid den släppta standardversionen. Använd den versionsspecifika slutpunkten ({project_endpoint}/toolboxes/{name}/versions/{version}/mcp?api-version=v1) för att testa innan du marknadsför. Behåll server_label unik per agent, även när du byter Toolbox-versioner. Mer information finns i Höja upp en version till standard.
Långvariga åtgärder (förhandsversion)
Sekundär sökväg – bakgrundsläge: Använd endast det här läget när en MCP-åtgärd inte kan slutföras inom den synkrona standardtimeouten.
Vissa MCP-servrar tillhandahåller verktyg som tar längre tid än den vanliga synkrona tidsgränsen för att returnera ett resultat. Kör agenten i bakgrundsläge för att stödja dessa åtgärder. Bakgrundsläget kör svaret asynkront, så MCP-verktygsanropet kan fortsätta utan att hålla en öppen anslutning och du söker efter svarsstatusen tills den har slutförts. Det här tillvägagångssättet gör att MCP-verktygsanrop kan överskrida den icke-strömmande tidsgränsen på 100 sekunder som beskrivs under Kända begränsningar.
Observera
Långvariga MCP-operationer är i förhandsversion. Förhandsversionsfunktioner tillhandahålls utan serviceavtal och rekommenderas inte för produktionsarbetsbelastningar. Beteende och modeller som stöds kan ändras.
Krav för MCP-servern
Agentkörningen förlitar sig på MCP-servern för att köra åtgärden asynkront och rapportera förloppet. Servern måste:
- Implementera stöd för Model Context Protocol-uppgifter så att ett verktygsanrop kan returnera en uppgiftsreferens i stället för att blockera tills arbetet har slutförts.
- Returnera en relaterad uppgiftsidentifierare i verktygets resultatmetadata (fältet
io.modelcontextprotocol/related-taskmed entaskId) när verktyget startar en långvarig åtgärd. - Tillhandahåll ett sätt för körmiljön att regelbundet kontrollera aktivitetens status och hämta det slutliga resultatet när aktiviteten har slutförts.
- Kan nås som en mcp-fjärrslutpunkt, samma som andra MCP-verktyg. Lokala MCP-servrar måste vara lokalt installerade för att tillhandahålla en fjärrslutpunkt. Se Hys en lokal MCP-server.
När agentens körmiljö anropar ett verktyg som startar en långvarig operation returnerar servern referensen till uppgiften och körmiljön behåller svaret i bakgrunden. Körmiljön påbörjar svaret, returnerar omedelbart ett svar id och ett status av queued, och hämtar resultatet när uppgiften är klar. Du pollar svaret id tills status blir completed, och läser sedan slutliga utdata.
Bakgrundsläge för långvariga MCP-åtgärder fungerar med alla modeller som stöder bakgrundsläge, till exempel gpt-5.4 eller gpt-5.5.
Om din agent använder en modell som inte stöder bakgrundsläge körs MCP-verktygsanrop synkront och omfattas av tidsgränsen på 100 sekunder.
Aktivera bakgrundsläge i Microsoft Foundry-portalen
Du kan aktivera bakgrundsläge för en agent i Microsoft Foundry-portalen, utan att skriva kod:
Öppna din agent och välj fliken Lekplats .
I listan Modell väljer du en modell som stöder bakgrundsläge, till exempel
gpt-5.4ellergpt-5.5.Välj parameterikonen bredvid modellen och aktivera Bakgrundsläge.
Under Verktyg lägger du till ett verktyg vars MCP-server stöder MCP-uppgifter, till exempel en Fabric dataagent som lagts till via Fabric IQ-verktyget. Anvisningar finns i Ansluta agenter till Microsoft Fabric med Fabric IQ.
Skicka ett meddelande. Agenten startar en bakgrundskörning och visar förloppet medan det tidskrävande verktygsanropet slutförs. När körningen är klar visas svaret i chatten.
Kör bakgrundsläge med kod
Följande exempel anropar en agent som redan är konfigurerad med ett MCP-verktyg, ställer in background på true och pollar tills svaret är klart. Ersätt platshållarvärdena med dina egna.
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());
Skapa ett bakgrundssvar. Begäran returneras omedelbart med ett svar id och en status av 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
}'
Kopiera svaret id från resultatet och fråga sedan av det tills status är completed:
curl "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses/$RESPONSE_ID" \
-H "Authorization: Bearer $AGENT_TOKEN"
När status är completedinnehåller matrisen output MCP-verktygets anropsresultat och det sista assistentmeddelandet.
Kända begränsningar
Sekundär sökväg – strömningsbeteende: Granska dessa gränser efter den första lyckade vägen om klienten strömmar svar eller mcp-anropet närmar sig den synkrona tidsgränsen.
- Timeout för icke-strömmande MCP-verktygsanrop: Icke-strömmande MCP-verktygsanrop har en tidsgräns på 100 sekunder. Om MCP-servern tar längre tid än 100 sekunder att svara misslyckas samtalet. För att undvika tidsgränser, se till att MCP-servern svarar inom den här gränsen. Om användningsfallet kräver längre bearbetningstider kör du agenten i bakgrundsläge med en modell som stöds, optimerar logiken på serversidan eller delar upp åtgärden i mindre steg.
- Privat MCP kräver standardagentkonfiguration: Privat MCP-serveranslutning är endast tillgänglig med standardagentkonfiguration med privat nätverk (BYO VNet). Grundläggande agentkonfiguration stöder inte privata MCP-slutpunkter.
- Private MCP-värdtjänst: Azure Container Apps på ett dedikerat MCP-undernät är den testade konfigurationen för privata MCP-servrar. Funktionsappar eller App Services som privat MCP-servervärd kan fungera men verifieras inte internt.
Vanliga frågor och fel
Följande vanliga problem kan uppstå när du använder MCP-verktyg med Foundry Agent Service:
"Ogiltigt verktygsschema":
Det här felet inträffar vanligtvis om MCP-serverdefinitionen innehåller
anyOfellerallOf, eller om en parameter accepterar flera typer av värden. Uppdatera MCP-serverdefinitionen och försök igen."Obehörig" eller "Förbjuden" från MCP-servern:
Bekräfta att MCP-servern stöder din autentiseringsmetod och verifiera de autentiseringsuppgifter som lagras i projektanslutningen. För GitHub använder du token med minsta möjliga behörighet och roterar dem regelbundet.
Modellen anropar aldrig mcp-verktyget:
Bekräfta att agentinstruktionerna uppmuntrar till användning av verktyg och verifierar
server_label,server_urlochallowed_toolsvärden. Om du angerallowed_toolskontrollerar du att verktygsnamnet matchar det som MCP-servern exponerar.Agenten fortsätter aldrig efter godkännande:
Bekräfta att du skickar en uppföljningsbegäran med
previous_response_idinställt på det ursprungliga svars-ID:t och att du använder objekt-ID för godkännandebegäran somapproval_request_id.
Värd för en lokal MCP-server
Agenttjänstens körning accepterar endast en fjärr-MCP-serverslutpunkt. Om du vill lägga till verktyg från en lokal MCP-server måste du ha den lokalt på Azure Container Apps eller Azure Functions för att få en fjärrslutpunkt för MCP-servern.
Fjärrslutpunkten kan vara antingen en offentlig slutpunkt eller en privat slutpunkt i ditt virtuella nätverk. För privata MCP-servrar distribuerar du containerappen med intern ingress (--internal-only true) i ett dedikerat MCP-undernät. Mer information finns i Offentliga och privata MCP-serverslutpunkter .
Tänk på följande faktorer när du är värd för lokala MCP-servrar i molnet:
| Lokal MCP-serverkonfiguration | Hosting på Azure Container Apps | Värdtjänster i Azure Functions |
|---|---|---|
| Transport | HTTP POST/GET-slutpunkter krävs. | HTTP-dataströmning krävs. |
| Kodändringar | Ombyggnad av containrar krävs. | Konfigurationsfiler som är specifika för Azure Functions och krävs i rotkatalogen. |
| Autentisering | Anpassad autentiseringsimplementering krävs. | Endast nyckelbaserad. OAuth behöver API Management. |
| Språk | Alla språk som körs i Linux-containrar (Python, Node.js, .NET, TypeScript, Go). | Python, Node.js, Java, endast .NET. |
| Containerkrav | Linux (linux/amd64) endast. Inga privilegierade containrar. | Containerbaserade servrar stöds inte. |
| Beroenden | Alla beroenden måste finnas i containeravbildningen. | Beroenden på OS-nivå (såsom Playwright) stöds inte. |
| Tillstånd | Tillståndslös endast. | Tillståndslös endast. |
| UVX/NPX | Stöds. | Stöds inte.
npx startkommandon stöds inte. |
Relaterat innehåll
- Kom igång med agenter med hjälp av kod
- MCP-serverautentisering
- Skapa och registrera en MCP-server (Model Context Protocol)
- Konfigurera privata nätverk för Foundry Agent Service
- Konfigurera privat länk för Foundry
- Microsoft FOUNDRY REST API-referens
- Metodtips för säkerhet för MCP
- Förstå och minimera säkerhetsrisker i MCP-implementeringar