Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Conecte seus agentes do Foundry aos servidores MCP (Model Context Protocol) usando a ferramenta MCP. Essa conexão estende os recursos do agente com ferramentas externas e fontes de dados. Conectando-se a pontos de extremidade remotos do servidor MCP, o modelo de Foundry do agente pode acessar ferramentas hospedadas por desenvolvedores e organizações que clientes compatíveis com MCP, como o Foundry Agent Service, podem usar.
O MCP é um padrão aberto que define como os aplicativos fornecem ferramentas e dados contextuais para LLMs (modelos de linguagem grande). Ele permite uma integração consistente e escalonável de ferramentas externas em fluxos de trabalho de modelo.
Dica
Considere adicionar essa ferramenta usando uma caixa de ferramentas. Usando uma caixa de ferramentas, você pode reutilizar a ferramenta entre agentes e runtimes, bem como centralizar o gerenciamento de credenciais, controle de versão e imposição de política por meio de um ponto de extremidade MCP gerenciado. Consulte o início rápido da caixa de ferramentas.
Neste artigo, você aprenderá a:
- Adicione um servidor MCP remoto como uma ferramenta.
- Autentique-se em um servidor MCP usando uma conexão de projeto.
- Examine e aprove chamadas de ferramentas MCP.
- Solucionar problemas comuns de integração do MCP.
Se você usar um agente de codificação como GitHub Copilot, o Microsoft Foundry Skill poderá ajudar a configurar conexões de ferramenta MCP, autenticação, comportamento de aprovação e etapas de solução de problemas.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma assinatura Azure com um projeto ativo do Microsoft Foundry.
A função Foundry User no projeto Foundry para criar e testar agentes. Se você criar uma conexão de projeto para autenticação MCP, também precisará da função Gerenciador de Projeto do Foundry nesse projeto.
Importante
As funções RBAC do Foundry foram renomeadas recentemente. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager eram anteriormente chamados de Usuário do Azure AI, Proprietário do Azure AI, Proprietário da conta do Azure AI e Gerente de Projeto do Azure AI. Você ainda pode ver os nomes anteriores em alguns lugares enquanto essa mudança de nome está sendo implementada. Os IDs das funções e as permissões principais não são alterados com a mudança de nome.
O pacote do SDK mais recente para seu idioma. O SDK do .NET está atualmente em versão prévia. Para obter detalhes da instalação, consulte o início rápido.
Azure credenciais configuradas para autenticação (como
DefaultAzureCredential).Acesso a um ponto de extremidade remoto do servidor MCP (como o servidor MCP do GitHub em
https://api.githubcopilot.com/mcp).
Escolher uma tarefa
| Tarefa | Path |
|---|---|
| Conectar um agente e confirmar a primeira chamada de ferramenta bem-sucedida | Siga a rota de conexão, aprovação, verificação e limpeza. |
| Adicionar credenciais ou acesso baseado em identidade | Secundário:Configurar a autenticação. |
| Conectar-se a um endpoint MCP privado | Secundário:Revise os requisitos de endpoints públicos e privados. |
| Executar uma operação longa no modo em segundo plano | Secundário:configurar operações de execução longa. |
| Entenda o comportamento de streaming e de tempo limite | Secundário:Revise as limitações conhecidas. |
| Configurar opções de servidor ou hospedar um servidor local | Secundário:configurar a conexão MCP ou hospedar um servidor MCP local. |
Para obter detalhes conceituais sobre como funciona a integração do MCP, confira Como ela funciona.
Suporte ao uso
A tabela a seguir mostra o SDK e o suporte de instalação para conexões MCP.
| Suporte ao Microsoft Foundry | SDK do Python | C# SDK | SDK para JavaScript | SDK do Java | API REST | Configuração básica do agente | Configuração do agente padrão |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Endereços de servidor MCP públicos e privados
O Agent Service suporta endpoints de servidor MCP públicos e privados.
- Pontos de extremidade públicos: conecte-se a qualquer servidor MCP remoto acessível publicamente. Essa opção funciona com configurações de agente Básico e Standard.
- Pontos de extremidade privados: Permitem a conexão a servidores MCP que não são expostos à internet pública. O MCP privado requer a configuração de rede privada e uma sub-rede MCP dedicada em sua rede virtual.
Para servidores MCP privados, implante seu servidor MCP em Aplicativos de Contêiner do Azure com entrada somente interna em uma sub-rede MCP dedicada delegada a Microsoft.App/environments. Para começar, use o modelo 19-private-network-agents-tools-setup, que provisiona a infraestrutura de rede necessária, incluindo a sub-rede MCP, ou 11-private-network-basic-project se você não quiser fornecer seus próprios recursos.
Para obter detalhes sobre o suporte à ferramenta em ambientes isolados de rede, consulte as ferramentas do Agente com isolamento de rede.
Use as Foundry Toolboxes como pontos de extremidade do MCP
As Caixas de Ferramentas de Pesquisa permitem que você agrupe várias ferramentas - como Pesquisa na Web, Interpretador de Código, Pesquisa de Arquivos, Pesquisa de IA do Azure , servidores MCP, ferramentas OpenAPI e conexões agente-agente - em um único ponto de extremidade compatível com MCP. Em vez de configurar cada ferramenta separadamente em cada agente, crie uma Caixa de Ferramentas na Foundry e aponte seu agente para o ponto de extremidade da Caixa de Ferramentas usando a configuração de ferramenta padrão mcp (server_url e server_label).
Como o ponto de extremidade do Toolbox é compatível com MCP, qualquer ambiente de execução que possa consumir um servidor MCP também pode consumir um Toolbox. Essa compatibilidade inclui o Foundry Agent Service, Microsoft Agent Framework, LangGraph, GitHub Copilot SDK e outros clientes habilitados para MCP. Você pode adicionar, remover ou reconfigurar ferramentas na Caixa de Ferramentas sem alterar o código do agente.
Para obter as etapas de instalação, consulte Criar e usar uma Caixa de Ferramentas do Foundry.
O endpoint MCP do toolbox oferece suporte a operações de longa duração por meio de tarefas MCP, um recurso em versão prévia. Para usar ferramentas de longa duração, a infraestrutura do agente deve ser compatível com tarefas MCP.
Autenticação e configuração do Toolbox MCP
Crie uma conexão de projeto para o seu servidor MCP com o tipo de autenticação que corresponde ao seu cenário e, em seguida, referencie-a em um YAML mínimo da caixa de ferramentas.
Etapa 1. Criar a conexão
Exporte o ponto de extremidade do projeto e defina-o como o projeto ativo para os azd ai comandos:
PROJECT_ENDPOINT="https://<account>.services.ai.azure.com/api/projects/<project>"
azd ai project set $PROJECT_ENDPOINT
Escolha a variante de autenticação necessária:
# 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 |
Sinalizadores adicionais |
|---|---|
none |
— |
custom-keys |
--custom-key "Header=Value" (repetível) |
oauth2 |
--authorization-url, --token-url, --client-id, , --client-secret--scopes |
user-entra-token |
--audience <entra-audience> |
project-managed-identity |
--audience <entra-audience> (opcional) |
agentic-identity |
--audience <entra-audience> |
Para autenticação baseada em identidade (user-entra-token, project-managed-identity, agentic-identity), atribua ao principal correspondente a função RBAC necessária no recurso de destino antes de chamar o toolbox.
Etapa 2. Definir a caixa de ferramentas
# my-toolbox.yaml
description: MCP server tools
connections:
- name: my-mcp-conn
Etapa 3. Criar a caixa de ferramentas
azd ai toolbox create my-toolbox --from-file my-toolbox.yaml
Na primeira vez que um usuário acessa uma ferramenta com um MCP baseado em OAuth em um projeto, o endpoint MCP retorna um erro CONSENT_REQUIRED (código -32006) com uma URL de consentimento:
{
"error": {
"code": -32006,
"message": "User consent is required. Please visit: https://..."
}
}
Esse erro é esperado. Abra a URL de consentimento em um navegador, conclua o fluxo de autorização OAuth e tente novamente a chamada do agente. As chamadas subsequentes são bem-sucedidas sem precisar de nova solicitação.
Autenticação
Caminho secundário: configure a autenticação após a rota de primeiro sucesso quando o seu servidor MCP exigir credenciais ou acesso baseado em identidade.
Muitos servidores MCP exigem autenticação.
No Serviço do Foundry Agent, use uma conexão de projeto para armazenar detalhes de autenticação, como chaves de API ou tokens de portador, em vez de credenciais de codificação rígida em seu aplicativo.
Para saber mais sobre as opções de autenticação com suporte, incluindo identidades baseadas em chave, identidades do Microsoft Entra e passagem de identidade do OAuth, consulte a autenticação do servidor MCP.
Nota
Defina project_connection_id como a ID da conexão do projeto.
Dica
Ao adicionar o servidor MCP Azure DevOps (versão prévia) por meio do catálogo Add Tools, você autentica para Azure DevOps durante a etapa de conexão da organização e armazena a autenticação como uma conexão de projeto. Use acesso de privilégio mínimo e revise os escopos ao conectar a organização.
Ao usar um ponto de extremidade MCP do Foundry Toolbox, o Toolbox gerencia a autenticação centralmente. O Toolbox lida com a injeção de credenciais, atualização de token e aplicação de políticas em tempo de execução para todas as ferramentas do pacote. Os agentes realizam a autenticação diretamente no ponto de extremidade do Toolbox usando credenciais do Microsoft Entra, como DefaultAzureCredential, e não é necessário que cada agente forneça credenciais individuais para cada ferramenta. Para a configuração de autenticação do Toolbox, consulte os pré-requisitos do Toolbox.
Considerações sobre o uso de serviços e servidores não Microsoft
Você está sujeito aos termos entre você e o provedor de serviços quando usa serviços não-Microsoft conectados. Ao se conectar a um serviço não Microsoft, você passa alguns de seus dados, como conteúdo de prompt, para o serviço não Microsoft ou seu aplicativo pode receber dados do serviço não Microsoft. Você é responsável pelo uso de serviços não Microsoft e dados, juntamente com quaisquer encargos associados a esse uso.
Terceiros, não Microsoft, criam os servidores MCP remotos que você decide usar com a ferramenta MCP descrita neste artigo. Microsoft não testa nem verifica esses servidores. Microsoft não tem nenhuma responsabilidade com você ou com outras pessoas em relação ao uso de servidores MCP remotos.
Examine e acompanhe cuidadosamente quais servidores MCP você adiciona ao Serviço do Foundry Agent. Conte com servidores hospedados por provedores de serviços confiáveis em vez de proxies.
A ferramenta MCP permite passar cabeçalhos personalizados, como chaves de autenticação ou esquemas, que um servidor MCP remoto pode precisar. Examine todos os dados que você compartilha com servidores MCP remotos e registre os dados para fins de auditoria. Esteja ciente das práticas não Microsoft para retenção e localização de dados.
Nota
As caixas de ferramentas Foundry são diferentes dos servidores MCP de terceiros. As caixas de ferramentas são recursos controlados pela organização que você cria e gerencia em seu projeto Microsoft Foundry. Ainda assim, você ainda é responsável pela seleção de ferramentas, tratamento de dados e conformidade na curadoria de conteúdo da Toolbox.
Práticas recomendadas
Para obter diretrizes gerais sobre o uso de ferramentas, consulte as melhores práticas para usar ferramentas no Microsoft Foundry Agent Service.
Ao usar servidores MCP, siga estas práticas:
- Use uma lista de permissões de ferramentas usando
allowed_tools. - Trate descrições de ferramentas, anotações e resultados de servidores MCP remotos como entrada não confiável. Eles podem conter instruções de injeção de prompt indireto.
- Exigir aprovação para operações de alto risco, especialmente ferramentas que gravam dados ou alteram recursos.
- Examine o nome e os argumentos da ferramenta solicitados antes de aprovar.
- Revise
allowed_tools, as configurações de aprovação e as permissões de conexão quando o operador, as ferramentas expostas ou o comportamento do servidor mudarem. - Registre aprovações e chamadas de ferramentas para auditoria e solução de problemas.
Dica
Quando você adiciona o servidor MCP Azure DevOps por meio do catálogo Add Tools, a configuração de seleção de ferramentas é mapeada para o comportamento allowed_tools descrito neste artigo. Selecionar um subconjunto de ferramentas na interface do usuário do catálogo equivale a especificar uma allowed_tools lista no código.
Rota para o primeiro sucesso: conectar, aprovar, verificar e limpar
Use o exemplo de prompt-agent para o idioma selecionado. Quando o exemplo tiver abas do tipo de agente, selecione Prompt Agents. Essa rota mantém a primeira execução focada em uma tarefa: conectar um servidor MCP, invocar uma ferramenta e inspecionar o resultado.
-
Conectar: Configure a ferramenta MCP com
require_approvaldefinido comoalwayse anexe-a ao agente. - Aprovar: Execute o exemplo, examine o servidor, a ferramenta e os argumentos solicitados e aprove apenas a chamada esperada.
- Verifique: Confirme se a resposta final contém informações retornadas pela ferramenta MCP, conforme mostrado na saída esperada.
- Limpeza: Execute a operação de limpeza da amostra. Os exemplos de prompt-agent excluem a versão do agente, e o exemplo em TypeScript também exclui sua conversa.
Criar um agente no Python com a ferramenta MCP
Use o exemplo de código a seguir para criar um agente e chamar a função. O SDK do .NET está atualmente em versão prévia. Confira o início rápido para obter detalhes.
O exemplo a seguir mostra como adicionar o servidor MCP GitHub a uma caixa de ferramentas e anexar a caixa de ferramentas a um agente. Selecione Prompt Agents para usar o SDK de Projetos de IA Azure para criar um agente de prompt do lado do servidor ou Hosted Agents para usar o Agent Framework FoundryChatClient para criar um agente efêmero em processo.
Agentes de prompt
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")
Saída esperada
O exemplo a seguir mostra a saída esperada quando você executa o exemplo:
Agent created (id: <agent-id>, name: MyAgent7, version: 1)
Created conversation (id: <conversation-id>)
Response: Your GitHub username is "example-username".
Agent deleted
Agentes hospedados
Este exemplo usa FoundryChatClient do Microsoft Agent Framework, cria uma caixa de ferramentas contendo o servidor MCP do GitHub e, em seguida, anexa o endpoint da caixa de ferramentas ao seu agente hospedado com FoundryToolbox. Instale os pacotes com pip install agent-framework-foundry, defina as variáveis de ambiente FOUNDRY_PROJECT_ENDPOINT e FOUNDRY_MODEL e faça login com 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())
Saída esperada
O agente chama o servidor MCP do Microsoft Learn por meio do endpoint da caixa de ferramentas e retorna texto fundamentado na documentação:
Agent: Microsoft Agent Framework is an open-source framework for building, orchestrating, and deploying AI agents ...
Para obter os padrões completos de agente hospedado da caixa de ferramentas, consulte Usar uma caixa de ferramentas com um agente hospedado.
Criar um agente com a ferramenta MCP
O exemplo a seguir mostra como adicionar um servidor MCP remoto a uma caixa de ferramentas e anexar a caixa de ferramentas a um agente. Selecione Prompt Agents para usar o SDK de Projetos de IA Azure para criar um agente de prompt do lado do servidor ou Hosted Agents para usar o Microsoft Agent Framework para criar um agente efêmero em processo.
Agentes de prompt
O exemplo usa métodos síncronos para criar um agente. Para obter métodos assíncronos, consulte o código sample no SDK do Azure para .NET repositório no 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);
Saída esperada
O exemplo a seguir mostra a saída esperada quando você executa o exemplo:
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.
Agentes hospedados
Este exemplo cria a caixa de ferramentas do servidor MCP com o SDK de projetos de IA do Azure e, em seguida, usa a integração do Microsoft Agent Framework AddFoundryToolboxes para expor as ferramentas da caixa de ferramentas ao agente hospedado. Defina as variáveis de ambiente AZURE_AI_PROJECT_ENDPOINT, AZURE_OPENAI_ENDPOINT e AZURE_AI_MODEL_DEPLOYMENT_NAME e faça login com 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();
Saída esperada
Ao ser invocado, o agente hospedado consulta o servidor MCP do Microsoft Learn por meio do endpoint Toolbox para obter trechos de documentação e respostas:
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` ...
Para obter uma integração mantida do .NET Agent Framework, consulte Usar uma caixa de ferramentas com um agente hospedado.
Criar um agente usando a ferramenta MCP com autenticação de conexão de projeto
Neste exemplo, você aprenderá a se autenticar no servidor MCP do GitHub em uma toolbox e, em seguida, conectar o endpoint MCP da toolbox a um agente. O exemplo usa métodos síncronos para criar a caixa de ferramentas e o agente. Para obter métodos assíncronos, consulte o código sample no SDK do Azure para .NET repositório no GitHub.
Configurar a conexão do projeto
Antes de executar o exemplo:
- Entre em seu perfil de GitHub.
- Selecione a imagem de perfil no canto superior direito.
- Selecione Configurações.
- No painel esquerdo, selecione Configurações do Desenvolvedor e Tokens de acesso pessoal > (clássico).
- Na parte superior, selecione Gerar novo token, insira sua senha e crie um token que possa ler repositórios públicos.
- Importante: Salve o token ou mantenha a página aberta quando a página for fechada, o token não poderá ser mostrado novamente.
- No portal do Azure, abra o Microsoft Foundry.
- Selecione Gerenciar na navegação superior direita, selecione Project detalhes e, em seguida, selecione a guia Recursos conectados.
- Crie uma nova conexão do tipo de chaves personalizadas .
- Nomeie-o e adicione um par de valores de chave.
- Defina o nome
Authorizationda chave e o valor deve ter uma forma deBearer your_github_token.
Exemplo de código para criar o agente
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);
Saída esperada
O exemplo a seguir mostra a saída esperada quando você executa o exemplo:
Approval requested for toolbox...
Response: Your GitHub username is "example-username".
Criar um agente no TypeScript com a ferramenta MCP
O exemplo de TypeScript a seguir demonstra como adicionar um servidor MCP a uma caixa de ferramentas, anexar a caixa de ferramentas a um agente, enviar solicitações que disparam fluxos de trabalho de aprovação mcp, lidar com solicitações de aprovação e limpar recursos. Para obter uma versão do JavaScript, consulte o código sample no SDK do Azure do repositório JavaScript no 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);
});
Saída esperada
O exemplo a seguir mostra a saída esperada quando você executa o exemplo:
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!
Criar um agente usando a ferramenta MCP com autenticação de conexão de projeto
O exemplo de TypeScript a seguir demonstra como adicionar um servidor MCP autenticado a uma caixa de ferramentas, anexar o ponto de extremidade MCP da caixa de ferramentas a um agente, enviar solicitações que disparam fluxos de trabalho de aprovação mcp, lidar com solicitações de aprovação e limpar recursos. Para obter uma versão do JavaScript, consulte o código sample no SDK do Azure do repositório JavaScript no 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);
});
Saída esperada
O exemplo a seguir mostra a saída esperada quando você executa o exemplo:
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!
Usar ferramentas MCP em um agente de Java
Dica
A maioria dos agentes usa uma caixa de ferramentas para adicionar a ferramenta de pesquisa de arquivos e anexar a caixa de ferramentas ao seu agente como uma ferramenta MCP. *Se você estiver usando o SDK do Java, uma API para criar caixas de ferramentas ainda não estará disponível. Crie uma caixa de ferramentas usando o Python, API REST, C#, TypeScript ou o portal do Foundry e, em seguida, referencie seu ponto de extremidade MCP de seu agente de Java como um McpTool.
Adicione a dependência ao seu pom.xml:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.2.0</version>
</dependency>
Criar um agente com a ferramenta 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());
}
}
Saída esperada
Agent created: mcp-agent (version 1)
Response: [ResponseOutputItem containing MCP tool results ...]
Usar a ferramenta MCP com a API REST
Os exemplos a seguir mostram como criar um agente com a ferramenta MCP e chamá-lo usando a API de Respostas. Se a resposta incluir um item de saída com type definido como mcp_approval_request, envie uma solicitação de acompanhamento que inclua um mcp_approval_response item.
Pré-requisitos
Defina estas variáveis de ambiente:
-
FOUNDRY_PROJECT_ENDPOINT: URL do endpoint do projeto. -
FOUNDRY_MODEL_DEPLOYMENT_NAME: Seu nome de implantação do modelo. -
AGENT_TOKEN: um token de portador para o Foundry. -
MCP_PROJECT_CONNECTION_NAME(opcional): o nome da conexão do projeto MCP.
Obtenha um token de acesso:
export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
Se o servidor MCP no toolbox não exigir autenticação, omita project_connection_id da definição da ferramenta no toolbox. A ferramenta MCP do agente ainda utiliza project_connection_id para a conexão de ferramenta remota ao endpoint da toolbox.
Nota
Para a API REST, use o nome de conexão do projeto da ferramenta remota que você criou para o endpoint da caixa de ferramentas como project_connection_id na ferramenta MCP do agente.
Dica
Para obter detalhes sobre os itens de aprovação e esquema da ferramenta MCP, consulte a referência da API REST do Microsoft Foundry.
1. Criar uma caixa de ferramentas com o servidor MCP
A maneira recomendada de adicionar um servidor MCP é por meio de uma caixa de ferramentas e anexar a caixa de ferramentas ao agente como uma ferramenta MCP. Veja o que é uma caixa de ferramentas?
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"
}
]
}'
O kit de ferramentas expõe um endpoint compatível com MCP em $FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1, em que <version> é a versão retornada pela chamada anterior.
2. Criar uma conexão de ferramenta remota com a caixa de ferramentas
Crie uma conexão de projeto de ferramenta remota que aponte para o endpoint da caixa de ferramentas. Use um token de usuário do Entra para que a identidade do chamador seja transmitida (público-alvo 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. Criar um agente 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"
}
]
}
}'
Para usar um servidor MCP autenticado dentro da caixa de ferramentas, adicione "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" à definição da ferramenta de caixa de ferramentas. Mude server_url para o endpoint do servidor autenticado (por exemplo, https://api.githubcopilot.com/mcp).
4. Criar uma resposta
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"
}'
Se a resposta incluir um item de saída com type definido como mcp_approval_request, copie o item id de solicitação de aprovação como APPROVAL_REQUEST_ID. Copie também a resposta id de nível superior como PREVIOUS_RESPONSE_ID.
5. Enviar uma resposta de aprovação
Se a ferramenta MCP exigir aprovação, envie uma solicitação de acompanhamento:
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. Limpar os recursos
Exclua o agente:
curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/<AGENT_NAME>-mcp?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
Como funciona
Você precisa trazer um servidor MCP remoto (um ponto de extremidade de servidor MCP existente) para o Serviço de Agentes da Fábrica. Você pode trazer vários servidores MCP remotos adicionando-os como ferramentas. Para cada ferramenta, você precisa fornecer um valor exclusivo server_label dentro do mesmo agente e um server_url valor que aponte para o servidor MCP remoto. Certifique-se de examinar cuidadosamente quais servidores MCP você adiciona ao Serviço do Agente do Foundry.
Além de conectar servidores MCP remotos arbitrários por URL, alguns servidores MCP podem ser adicionados diretamente do catálogo Adicionar Ferramentas do Foundry. Por exemplo, Azure DevOps MCP Server (versão prévia) está disponível como uma entrada de catálogo. As entradas de catálogo simplificam a configuração da conexão e se alinham aos mesmos mecanismos de aprovação e auditoria documentados neste artigo.
Para obter mais informações sobre como usar o MCP, consulte:
- Práticas recomendadas de segurança no site do Protocolo de Contexto de Modelo.
- Compreendendo e mitigando riscos de segurança em implementações do MCP no Blog da Comunidade de Segurança da Microsoft.
Configurar a conexão MCP
Caminho secundário – operações avançadas: Use essa referência após a rota de êxito para restringir ferramentas, alterar o comportamento de aprovação ou adicionar uma conexão de projeto.
As etapas a seguir descrevem como se conectar a um servidor MCP remoto do Serviço do Foundry Agent:
- Localize o servidor MCP remoto ao qual você deseja se conectar, como o servidor MCP GitHub. Crie ou atualize um agente do Foundry com uma
mcpferramenta usando as seguintes informações:-
server_url: a URL do servidor MCP, comohttps://api.githubcopilot.com/mcp/. -
server_label: um identificador exclusivo deste servidor MCP para o agente, comogithub. -
allowed_tools: uma lista opcional de ferramentas que este agente pode acessar e usar. Se você não fornecer esse valor, o valor padrão inclui todas as ferramentas no servidor MCP. -
require_approval: opcionalmente, determine se a aprovação é necessária. O valor padrão éalways. Os valores com suporte são:-
always: um desenvolvedor precisa fornecer aprovação para cada chamada. Se você não fornecer um valor, este será o padrão. -
never: nenhuma aprovação é necessária. -
{"never":[<tool_name_1>, <tool_name_2>]}: você fornece uma lista de ferramentas que não exigem aprovação. -
{"always":[<tool_name_1>, <tool_name_2>]}: você fornece uma lista de ferramentas que exigem aprovação.
-
-
-
project_connection_id: a ID de conexão do projeto que armazena a autenticação e outros detalhes de conexão para o servidor MCP. - Se o modelo tentar invocar uma ferramenta no servidor MCP com a aprovação necessária, você receberá um tipo de item de saída de resposta como
mcp_approval_request. No item de saída de resposta, você pode obter mais detalhes sobre qual ferramenta no servidor MCP é chamada e os argumentos a serem passados. Examine a ferramenta e os argumentos para que você possa tomar uma decisão informada para aprovação. - Envie sua aprovação para o agente usando
previous_response_ide definindoapprovecomotrue.
Conectar-se ao servidor MCP Azure DevOps
Azure DevOps Servidor MCP (versão prévia) está disponível como item de catálogo no Foundry. Para adicioná-lo:
- No portal do Foundry, acesse seu projeto.
- Selecione Add Tools>Catalog e pesquise "Azure DevOps".
- Selecione Azure DevOps SERVIDOR MCP (versão prévia) e selecione Create.
- Insira o nome da sua organização Azure DevOps e selecione Connect.
- Escolha quais ferramentas de Azure DevOps expor ao seu agente. Você pode selecionar um subconjunto de ferramentas para controlar exatamente o que o agente pode acessar.
Essa configuração baseada em catálogo cria a ferramenta MCP para uso por agentes sem a necessidade de alterações de código. Você pode validar a conectividade e o comportamento da ferramenta na experiência de teste de chat do Foundry antes de integrar a ferramenta ao código de produção.
Dica
Controle de versão da Toolbox: as Toolboxes do Foundry oferecem suporte ao controle de versão, permitindo que se itere sobre uma nova versão sem afetar os agentes de produção. Use o ponto de extremidade do consumidor ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) para agentes de produção – ele sempre atende à versão padrão promovida. Use o endpoint específico da versão ({project_endpoint}/toolboxes/{name}/versions/{version}/mcp?api-version=v1) para testar antes de promover. Mantenha server_label exclusivo por agente, mesmo ao alternar as versões da Toolbox. Para obter detalhes, consulte Promover uma versão para o padrão.
Operações de longa duração (prévia)
Caminho secundário – modo de plano de fundo: Use esse modo somente quando uma operação MCP não puder ser concluída dentro do tempo limite síncrono padrão.
Alguns servidores MCP expõem ferramentas que levam mais tempo do que o tempo limite síncrono padrão para retornar um resultado. Para dar suporte a essas operações, execute o agente no modo em segundo plano. O modo de plano de fundo executa a resposta de forma assíncrona, de modo que a chamada da ferramenta MCP pode continuar sem manter uma conexão aberta e você pesquisa o status da resposta até que ela seja concluída. Essa abordagem permite que as chamadas da ferramenta MCP excedam o tempo limite sem streaming de 100 segundos descrito em limitações conhecidas.
Nota
As operações do MCP de execução prolongada estão em versão prévia. Os recursos de pré-visualização são fornecidos sem um contrato de nível de serviço e não são recomendados para trabalhos em ambientes de produção. O comportamento e os modelos com suporte podem mudar.
Requisitos para o servidor MCP
O runtime do agente depende do servidor MCP para executar a operação de forma assíncrona e relatar o progresso. O servidor deve:
- Implemente a funcionalidade de tarefas do Protocolo de Contexto de Modelo para que uma chamada de ferramenta possa retornar uma referência de tarefa em vez de bloquear até que o trabalho seja concluído.
- Retorne um identificador de tarefa relacionado nos metadados do resultado da ferramenta (o campo
io.modelcontextprotocol/related-taskcom umataskId) quando ela iniciar uma operação de execução prolongada. - Exponha uma maneira para o runtime sondar o status da tarefa e recuperar o resultado final após a conclusão da tarefa.
- Esteja acessível como um endpoint MCP remoto, assim como qualquer outra ferramenta MCP. Os servidores MCP locais devem ser hospedados por conta própria para fornecer um endpoint remoto. Consulte Hospedar um servidor MCP local.
Quando o runtime do agente chama uma ferramenta que inicia uma operação de execução prolongada, o servidor retorna a referência de tarefa e o runtime mantém a resposta em segundo plano. O runtime inicia a resposta, retorna imediatamente com uma resposta id e um status de queued, e obtém o resultado quando a tarefa é concluída. Você sonda a resposta id até status se tornar completede, em seguida, lê a saída final.
O modo em segundo plano para operações MCP de execução prolongada funciona com qualquer modelo que dê suporte ao modo em segundo plano, como gpt-5.4 ou gpt-5.5.
Se o agente usa um modelo que não dá suporte ao modo em segundo plano, as chamadas da ferramenta MCP são executadas de forma síncrona e estão sujeitas ao tempo limite de 100 segundos.
Habilitar o modo em segundo plano no portal do Microsoft Foundry
Você pode ativar o modo em segundo plano para um agente no playground do portal do Microsoft Foundry, sem escrever código:
Abra o agente e selecione a guia Playground .
Na lista Modelo , selecione um modelo que dê suporte ao modo em segundo plano, como
gpt-5.4ougpt-5.5.Selecione o ícone de parâmetros ao lado do modelo e ative o modo Plano de Fundo.
Em Ferramentas, adicione uma ferramenta cujo servidor MCP oferece suporte a tarefas MCP, como um agente de dados do Fabric adicionado por meio da ferramenta Fabric IQ. Para ver as etapas, consulte Conectar agentes ao Microsoft Fabric com o Fabric IQ.
Envie uma mensagem. O agente inicia uma execução em segundo plano e exibe seu progresso enquanto a chamada da ferramenta de longa duração é concluída. Quando a execução for concluída, a resposta será exibida no chat.
Executar o modo em segundo plano com código
Os exemplos a seguir invocam um agente que já está configurado com uma ferramenta MCP, defina background como true e sonde-o até que a resposta seja concluída. Substitua os valores de placeholder pelos seus próprios.
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());
Crie uma resposta em segundo plano. A solicitação retorna imediatamente com uma resposta id e um status de 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
}'
Copie a resposta id do resultado e, em seguida, sonde-a até que status seja completed:
curl "$FOUNDRY_PROJECT_ENDPOINT/openai/v1/responses/$RESPONSE_ID" \
-H "Authorization: Bearer $AGENT_TOKEN"
Quando status é completed, a output matriz contém o resultado da chamada da ferramenta MCP e a mensagem do assistente final.
Limitações conhecidas
Caminho secundário – comportamento de streaming: revise esses limites após a rota de primeiro sucesso se o seu cliente transmitir respostas em fluxo (streaming) ou se a sua chamada MCP estiver próxima do tempo limite (timeout) síncrono.
- Tempo limite de chamada da ferramenta MCP sem streaming: chamadas de ferramenta MCP que não são streaming têm um tempo limite de 100 segundos. Se o servidor MCP levar mais de 100 segundos para responder, a chamada falhará. Para evitar tempos limite, verifique se o servidor MCP responde dentro desse limite. Se o caso de uso exigir tempos de processamento mais longos, execute o agente no modo em segundo plano com um modelo com suporte, otimize a lógica do lado do servidor ou divida a operação em etapas menores.
- O MCP privado requer a Instalação do Agente Padrão: a conectividade do servidor MCP privado só está disponível com a Instalação do Agente Standard com rede privada (VNet BYO). Configuração básica do agente não dá suporte a endpoints MCP privados.
- A hospedagem MCP privada: Aplicativos de Contêiner do Azure em uma sub-rede dedicada MCP é a configuração testada para servidores MCP privados. Aplicativos de função ou Serviços de aplicativo como host do servidor MCP privado podem funcionar, mas não são validados internamente.
Perguntas e erros comuns
Os seguintes problemas comuns podem ocorrer quando você usa ferramentas MCP com o Serviço do Foundry Agent:
"Esquema de ferramenta inválido":
Esse erro geralmente acontece se a definição do servidor MCP inclui
anyOfouallOf, ou se um parâmetro aceita vários tipos de valores. Atualize a definição do servidor MCP e tente novamente."Não autorizado" ou "proibido" do servidor MCP:
Confirme se o servidor MCP dá suporte ao método de autenticação e verifique as credenciais armazenadas na conexão do projeto. Para o GitHub, use tokens com privilégios mínimos e renove-os regularmente.
O modelo nunca invoca sua ferramenta MCP.
Confirme se as instruções do agente incentivam o uso da ferramenta e verifique os valores de
server_label,server_urleallowed_tools. Se você definirallowed_tools, verifique se o nome da ferramenta corresponde ao que o servidor MCP expõe.O agente nunca continua após a aprovação:
Confirme se você enviou uma solicitação de acompanhamento com
previous_response_iddefinido como o ID de resposta original e use o ID do item de solicitação de aprovação comoapproval_request_id.
Hospedar um servidor MCP local
O runtime do Serviço de Agente só aceita um ponto de extremidade de servidor MCP remoto. Se você quiser adicionar ferramentas de um servidor MCP local, precisará auto-hospedá-lo em Aplicativos de Contêiner do Azure ou Azure Functions para obter um endpoint remoto do servidor MCP.
O ponto de extremidade remoto pode ser um ponto de extremidade público ou um ponto de extremidade privado em sua VNet. Para servidores MCP privados, implante seu Aplicativo de Contêiner com entrada somente interna (--internal-only true) em uma sub-rede MCP dedicada. Consulte Pontos de extremidade de servidor MCP públicos e privados para obter detalhes de configuração.
Considere os seguintes fatores ao hospedar servidores MCP locais na nuvem:
| Configuração do servidor MCP local | Hospedagem no Aplicativos de Contêiner do Azure | Hospedagem no Azure Functions |
|---|---|---|
| Transporte | Pontos de extremidade HTTP POST/GET necessários. | É necessário HTTP que pode ser transmitido. |
| Alterações de código | Reconstrução de contêiner necessária. | Arquivos de configuração específicos do Azure Functions são necessários no diretório raiz. |
| Autenticação | Implementação de autenticação personalizada necessária. | Somente baseado em chave. O OAuth precisa do Gerenciamento de API. |
| Língua | Qualquer idioma executado em contêineres do Linux (Python, Node.js, .NET, TypeScript, Go). | Python, Node.js, Java, .NET somente. |
| Requisitos de contêiner | Somente Linux (linux/amd64). Nenhum contêiner privilegiado. | Não há suporte para servidores em contêineres. |
| Dependências | Todas as dependências devem estar na imagem do contêiner. | Não há suporte para dependências no nível do sistema operacional (como o Dramaturgo). |
| Estado | Somente sem estado. | Somente sem estado. |
| UVX/NPX | Suportado. | Não há suporte.
npx Comandos de início não são suportados. |
Conteúdo relacionado
- Comece a usar agentes com código
- Autenticação do servidor MCP
- Criar e registrar um servidor MCP (Model Context Protocol)
- Configurar a rede privada para o Serviço do Foundry Agent
- Configurar o link privado para o Foundry
- Referência da API REST do Microsoft Foundry
- Práticas recomendadas de segurança para MCP
- Noções básicas e atenuantes dos riscos de segurança nas implementações do MCP