Ligue agentes a servidores do Model Context Protocol

Ligue os seus agentes Foundry a servidores Model Context Protocol (MCP) usando a ferramenta MCP. Esta ligação estende as capacidades do agente com ferramentas e fontes de dados externas. Ao ligar-se a endpoints de servidores MCP remotos, o modelo Foundry do seu agente pode aceder a ferramentas alojadas por programadores e organizações que clientes compatíveis com MCP, como o Foundry Agent Service, podem utilizar.

O MCP é um padrão aberto que define como as aplicações fornecem ferramentas e dados contextuais a grandes modelos de linguagem (LLMs). Permite a integração consistente e escalável de ferramentas externas nos fluxos de trabalho dos modelos.

Dica

Considera adicionar esta ferramenta usando uma caixa de ferramentas. Ao utilizar uma caixa de ferramentas, pode reutilizar a ferramenta entre agentes e runtimes, bem como centralizar a gestão de credenciais, versionamento e aplicação de políticas através de um endpoint MCP gerido. Veja o guia de introdução rápida da caixa de ferramentas.

Neste artigo, aprende como:

  • Adiciona um servidor MCP remoto como ferramenta.
  • Autentica-te num servidor MCP usando uma ligação de projeto.
  • Revise e aprove chamadas de ferramentas MCP.
  • Resolver problemas comuns de integração com MCP.

Se usar um agente de programação como o GitHub Copilot, o Microsoft Foundry Skill pode ajudar a configurar ligações à ferramenta MCP, autenticação, comportamento de aprovação e passos de resolução de problemas.

Pré-requisitos

Antes de começar, certifique-se de que tem:

  • Uma subscrição do Azure com um projeto Microsoft Foundry ativo.

  • A função de Utilizador Foundry no projeto Foundry para criar e testar agentes. Se criares uma ligação ao projeto para autenticação MCP, também precisas da função Foundry Project Manager nesse projeto.

    Importante

    As funções RBAC do Foundry foram recentemente renomeadas. Foundry User, Foundry Owner, Foundry Account Owner e Foundry Project Manager foram anteriormente nomeados Azure AI User, Azure AI Owner, Azure AI Account Owner e Azure AI Project Manager. Poderá ainda ver os nomes anteriores em alguns locais enquanto esta alteração de nome está a ser implementada. Os IDs das funções e as permissões principais não são alterados por esta mudança de nome.

  • O pacote SDK mais recente para a tua língua. O SDK .NET está atualmente em fase de pré-visualização. Para detalhes da instalação, consulte o quickstart.

  • Azure credenciais configuradas para autenticação (como DefaultAzureCredential).

  • Acesso a um endpoint remoto de servidor MCP (como o servidor MCP da GitHub em https://api.githubcopilot.com/mcp).

Escolha uma tarefa

Task Path
Ligue um agente e confirme a primeira invocação da ferramenta efetuada com êxito Siga o processo de ligar, aprovar, verificar e limpar.
Adicionar credenciais ou acesso baseado em identidade Secundário:Configurar autenticação.
Liga-te a um endpoint MCP privado Secundário:Analisar os requisitos dos endpoints públicos e privados.
Executar uma operação longa em modo de segundo plano Secundário:Configurar operações de execução prolongada.
Compreenda o comportamento de streaming e do tempo limite Secundário:Revê as limitações conhecidas.
Configurar opções de servidor ou hospedar um servidor local Secundário:Configure a ligação MCP ou aloje um servidor MCP local.

Para detalhes conceptuais sobre como funciona a integração com MCP, veja Como funciona.

Suporte de utilização

A tabela seguinte mostra o suporte para SDK e configuração para ligações MCP.

Suporte ao Microsoft Foundry Python SDK C# SDK SDK de JavaScript SDK de Java API REST Configuração básica do agente Configuração padrão do agente
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Endpoints de servidores MCP públicos e privados

O Agent Service suporta endpoints de servidor MCP públicos e privados:

  • Endpoints públicos: Ligue-se a qualquer servidor MCP remoto acessível publicamente. Esta opção funciona tanto com configurações de agente Basic como Standard.
  • Endpoints privados: Ligue-se a servidores MCP que não estejam expostos à internet pública. O MCP privado requer configuração de rede privada e uma sub-rede MCP dedicada dentro da sua rede virtual.

Para servidores MCP privados, implemente o seu servidor MCP em Azure Container Apps com entrada interna apenas numa sub-rede MCP dedicada delegada a Microsoft.App/environments. Para começar, utilize o modelo 19-private-network-agents-tools-setup, que aprovisiona a infraestrutura de rede necessária, incluindo a sub-rede MCP, ou 11-private-network-basic-project, caso não pretenda utilizar os seus próprios recursos.

Para detalhes sobre o suporte de ferramentas em ambientes isolados em rede, veja Ferramentas de Agente com isolamento de rede.

Use as Toolboxes Foundry como pontos de extremidade MCP

O Foundry Toolboxes permite-lhe agrupar múltiplas ferramentas – como Web Search, Code Interpreter, File Search, Pesquisa de IA do Azure, servidores MCP, ferramentas OpenAPI e ligações Agente-a-Agente – num único endpoint compatível com MCP. Em vez de configurar cada ferramenta separadamente em cada agente, crie uma Toolbox no Foundry e aponte o seu agente para o endpoint da Toolbox usando a configuração padrão mcp da ferramenta (server_url e server_label).

Como o endpoint do Toolbox é compatível com MCP, qualquer runtime que possa consumir um servidor MCP também pode consumir um Toolbox. Esta compatibilidade inclui o Foundry Agent Service, Microsoft Agent Framework, LangGraph, GitHub Copilot SDK e outros clientes com MCP. Pode adicionar, remover ou reconfigurar ferramentas na Toolbox sem alterar o código do seu agente.

Para os passos de configuração, consulte Criar e usar uma Caixa de Ferramentas Foundry.

O endpoint MCP da toolbox suporta operações de longa duração através de tarefas MCP, que estão em pré-visualização. Para usar ferramentas de longa duração, certifique-se de que o seu harness de agente suporta tarefas MCP.

Autenticação e configuração do Toolbox MCP

Crie uma ligação de projeto para o seu servidor MCP com o tipo de autenticação que corresponda ao seu cenário e, em seguida, faça-lhe referência num ficheiro YAML mínimo da toolbox.

Passo 1. Criar a conexão

Exporte o endpoint do seu projeto e defina-o como 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 que precisa:

# 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 Bandeiras 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 o papel RBAC necessário no recurso alvo antes de chamar a caixa de ferramentas.

Passo 2. Defina a caixa de ferramentas

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

Passo 3. Cria a caixa de ferramentas

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

A primeira vez que um utilizador chama uma caixa de ferramentas com um MCP baseado em OAuth num projeto, o endpoint MCP devolve um CONSENT_REQUIRED erro (código -32006) com uma URL de consentimento:

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

Este erro é esperado. Abra o URL de consentimento num navegador, complete o fluxo de autorização OAuth e depois tente novamente a chamada ao agente. As chamadas subsequentes são bem-sucedidas sem necessidade de re-solicitação.

Autenticação

Caminho secundário: Configure a autenticação após a rota do primeiro sucesso quando o seu servidor MCP precisar de credenciais ou acesso baseado em identidade.

Muitos servidores MCP requerem autenticação.

No Foundry Agent Service, utilize uma ligação de projeto para armazenar detalhes de autenticação, como chaves API ou tokens bearer, em vez de codificar diretamente as credenciais na sua aplicação.

Para saber mais sobre as opções de autenticação suportadas, incluindo autenticação baseada em chaves, identidades Microsoft Entra e passagem de identidade OAuth, consulte Autenticação do servidor MCP.

Nota

Define project_connection_id para o ID da ligação ao teu projeto.

Dica

Quando adiciona o Azure DevOps MCP Server (pré-visualização) através do catálogo Add Tools, autentica-se a Azure DevOps durante a etapa de ligação à organização e armazena a autenticação como uma ligação ao projeto. Use o acesso com privilégios mínimos e rever os escopos ao conectar a organização.

Quando usa um endpoint MCP do Foundry Toolbox, o Toolbox gere centralizadamente a autenticação. A Toolbox gere a injeção de credenciais, atualização do token e aplicação de políticas em tempo de execução para todas as ferramentas do pacote. Os agentes autenticam-se no próprio endpoint Toolbox usando credenciais Microsoft Entra, como DefaultAzureCredential, e as credenciais individuais das ferramentas não precisam de ser passadas por cada agente. Para configuração de autenticação do Toolbox, veja os pré-requisitos do Toolbox.

Considerações para a utilização de serviços e servidores que não sejam da serviços Microsoft

Está sujeito aos termos entre você e o fornecedor de serviços quando utiliza serviços conectados que não são da Microsoft. Quando se liga a um serviço que não é da Microsoft, passa alguns dos seus dados, como conteúdo de prompts, para o serviço não Microsoft, ou a sua aplicação pode receber dados do serviço não Microsoft. És responsável pela utilização de serviços e dados que não sejam da serviços Microsoft, bem como por quaisquer encargos associados a esse uso.

Terceiros, e não a Microsoft, criam os servidores MCP remotos que decide usar com a ferramenta MCP descrita neste artigo. A Microsoft não testa nem verifica estes servidores. A Microsoft não tem qualquer responsabilidade para consigo ou para com outros relativamente à utilização de quaisquer servidores MCP remotos.

Revise cuidadosamente e acompanhe quais os servidores MCP que adiciona ao Foundry Agent Service. Confie em servidores alojados por fornecedores de serviços de confiança em vez de proxies.

A ferramenta MCP permite-lhe passar cabeçalhos personalizados, como chaves ou esquemas de autenticação, que um servidor MCP remoto possa precisar. Revise todos os dados que partilha com servidores MCP remotos e registre os dados para efeitos de auditoria. Esteja atento às práticas não Microsoft para retenção e localização de dados.

Nota

As Foundry Toolboxes são diferentes dos servidores MCP de terceiros. Os conjuntos de ferramentas são recursos governados pela organização, que são criados e geridos dentro do seu projeto Microsoft Foundry. No entanto, continua a ser responsável pela seleção de ferramentas, gestão de dados e conformidade ao selecionar o conteúdo do Toolbox.

Melhores práticas

Para orientações gerais sobre o uso de ferramentas, consulte Melhores práticas para usar ferramentas no Microsoft Foundry Agent Service.

Quando usar servidores MCP, siga estas práticas:

  • Use uma lista de ferramentas permitidas usando allowed_tools.
  • Trate descrições de ferramentas, anotações e resultados provenientes de servidores MCP remotos como entradas não confiáveis. Podem conter instruções indiretas de injeção rápida.
  • Exigir aprovação para operações de alto risco, especialmente ferramentas que escrevam dados ou alteram recursos.
  • Revê o nome da ferramenta solicitada e os argumentos antes de aprovares.
  • Reveja allowed_tools, as definições de aprovação e as permissões de ligação quando o operador do servidor, as ferramentas expostas ou o comportamento mudarem.
  • Registar aprovações e chamadas de ferramentas para auditoria e resolução de problemas.

Dica

Quando adiciona o Azure DevOps MCP Server através do catálogo Add Tools, a configuração da seleção de ferramentas corresponde ao comportamento allowed_tools descrito neste artigo. Selecionar um subconjunto de ferramentas na interface do catálogo equivale a especificar uma allowed_tools lista no código.

Caminho do primeiro sucesso: conectar, aprovar, verificar e limpar

Utilize o exemplo de prompt-agent para a língua selecionada. Se o exemplo tiver separadores do tipo "agente", selecione Prompt Agents. Esta rota mantém a primeira execução focada numa única tarefa: ligar um servidor MCP, invocar uma ferramenta e inspecionar o resultado.

  1. Conectar: Configure a ferramenta MCP com require_approval definido para always, e anexe-a ao agente.
  2. Aprovar: Executa o exemplo, revê o servidor, ferramenta e argumentos solicitados, e aprova apenas a chamada esperada.
  3. Verificar: Confirme que a resposta final contém informação devolvida pela ferramenta MCP, conforme mostrado no resultado esperado.
  4. Limpeza: Executa a operação de limpeza da amostra. Os exemplos de prompt-agent eliminam a versão do agente, e o exemplo TypeScript também apaga a sua conversa.

Crie um agente em Python com a ferramenta MCP

Use o seguinte exemplo de código para criar um agente e chamar a função. O SDK .NET está atualmente em fase de pré-visualização. Consulte o quickstart para mais detalhes.

O exemplo seguinte mostra como adicionar o servidor MCP do GitHub a uma caixa de ferramentas e ligar a caixa de ferramentas a um agente. Selecione Prompt Agents para usar o SDK Azure AI Projects para criar um agente de prompt do lado do servidor, ou Hosted Agents para usar o Agent Framework FoundryChatClient para construir um agente efémero em processo.

Agentes de comando

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

Produção esperada

O exemplo seguinte mostra a saída esperada quando executa a amostra:

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

Agentes alojados

Este exemplo utiliza FoundryChatClient do Microsoft Agent Framework, cria um conjunto de ferramentas que contém o servidor MCP do GitHub e, em seguida, anexa o endpoint do conjunto de ferramentas ao seu agente alojado com FoundryToolbox. Instale os pacotes com pip install agent-framework-foundry, defina as variáveis de ambiente FOUNDRY_PROJECT_ENDPOINT e FOUNDRY_MODEL e inicie sessão 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())

Produção esperada

O agente chama o servidor MCP do Microsoft Learn através do endpoint da caixa de ferramentas e devolve texto fundamentado na documentação:

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

Para os padrões completos de toolbox com agente hospedado, veja Usar uma caixa de ferramentas com um agente alojado.


Crie um agente com a ferramenta MCP

O exemplo seguinte mostra como adicionar um servidor MCP remoto a uma caixa de ferramentas e ligar a caixa de ferramentas a um agente. Selecione Prompt Agents para usar o SDK Azure AI Projects para criar um agente de prompt do lado do servidor, ou Hosted Agents para usar o Microsoft Agent Framework para construir um agente efémero em processo.

Agentes de comando

O exemplo utiliza métodos síncronos para criar um agente. Para métodos assíncronos, consulte o código exemplo 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);

Produção esperada

O exemplo seguinte mostra a saída esperada quando executa a amostra:

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 alojados

Este exemplo cria a caixa de ferramentas do servidor MCP com o SDK de Projetos de IA do Azure, e depois utiliza a integração com o Microsoft Agent Framework AddFoundryToolboxes para expor as ferramentas da caixa de ferramentas ao seu agente alojado. Defina as AZURE_AI_PROJECT_ENDPOINTvariáveis , AZURE_OPENAI_ENDPOINT, e AZURE_AI_MODEL_DEPLOYMENT_NAME de ambiente, 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();

Produção esperada

Quando invocado, o agente hospedado consulta o servidor MCP do Microsoft Learn através do endpoint toolbox para obter excertos 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 uma integração mantida com o .NET Agent Framework, veja Usar uma caixa de ferramentas com um agente alojado.


Crie um agente usando a ferramenta MCP com autenticação de ligação ao projeto

Neste exemplo, aprendes a autenticar no servidor MCP do GitHub dentro de uma toolbox, depois ligas o endpoint MCP toolbox a um agente. O exemplo utiliza métodos síncronos para criar a caixa de ferramentas e o agente. Para métodos assíncronos, consulte o código exemplo no SDK do Azure para .NET repositório no GitHub.

Estabelecer ligação ao projeto

Antes de analisar a amostra:

  1. Inicia sessão no teu perfil no GitHub.
  2. Selecione a foto de perfil no canto superior direito.
  3. Selecione Definições.
  4. No painel esquerdo, selecione Definições de Programador e Tokens de acesso pessoal > Tokens (clássicos).
  5. No topo, selecione Gerar novo token, introduza a sua palavra-passe e crie um token que possa ler repositórios públicos.
    • Importante: Guarde o token, ou mantenha a página aberta, pois uma vez fechada, o token não pode ser mostrado novamente.
  6. No portal do Azure, abra o Microsoft Foundry.
  7. Selecione Gerir no canto superior direito da navegação, selecione Detalhes do Project e depois selecione o separador Recursos Conectados.
  8. Criar uma nova ligação do tipo Chaves personalizadas .
  9. Atribui um nome e adiciona um par chave-valor.
  10. Defina o nome da chave para Authorization e o valor deve ter a forma de Bearer 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);

Produção esperada

O exemplo seguinte mostra a saída esperada quando executa a amostra:

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

Crie um agente em TypeScript com a ferramenta MCP

O exemplo seguinte de TypeScript demonstra como adicionar um servidor MCP a uma caixa de ferramentas, ligar a caixa de ferramentas a um agente, enviar pedidos que desencadeiam fluxos de trabalho de aprovação MCP, tratar pedidos de aprovação e limpar recursos. Para uma versão em JavaScript, consulte o código de exemplo no repositório SDK do Azure para 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);
});

Produção esperada

O exemplo seguinte mostra a saída esperada quando executa a amostra:

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!

Crie um agente usando a ferramenta MCP com autenticação de ligação ao projeto

O exemplo seguinte de TypeScript demonstra como adicionar um servidor MCP autenticado a uma caixa de ferramentas, ligar o endpoint MCP toolbox a um agente, enviar pedidos que desencadeiam fluxos de trabalho de aprovação MCP, gerir pedidos de aprovação e limpar recursos. Para uma versão em JavaScript, consulte o código de exemplo no repositório SDK do Azure para 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);
});

Produção esperada

O exemplo seguinte mostra a saída esperada quando executa a amostra:

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!

Use ferramentas MCP num agente Java

Dica

A maioria dos agentes usa uma caixa de ferramentas para adicionar a ferramenta de pesquisa de ficheiros e anexá-la ao seu agente como uma ferramenta MCP. *Se estiver a usar o SDK Java, ainda não existe uma API para criar toolboxs. Crie um conjunto de ferramentas utilizando Python, API REST, C#, TypeScript ou o portal Foundry e, em seguida, faça referência ao respetivo endpoint MCP no seu agente 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>

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

Produção esperada

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

Utilize a ferramenta de MCP com a API REST

Os exemplos seguintes mostram como criar um agente com a ferramenta MCP e chamá-lo usando a API Responses. Se a resposta incluir um item de saída com type definido para mcp_approval_request, envie um pedido de seguimento que inclua um mcp_approval_response item.

Pré-requisitos

Defina estas variáveis de ambiente:

  • FOUNDRY_PROJECT_ENDPOINT: URL do endpoint do seu projeto.
  • FOUNDRY_MODEL_DEPLOYMENT_NAME: O nome do seu modelo de implantação.
  • AGENT_TOKEN: Um token de autenticação para a Foundry.
  • MCP_PROJECT_CONNECTION_NAME (opcional): O nome da sua ligação ao 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 dentro da toolbox não exigir autenticação, omita project_connection_id da definição da ferramenta da toolbox. A ferramenta MCP do agente continua a usar project_connection_id para a ligação da ferramenta remota ao endpoint da caixa de ferramentas.

Nota

Para a API REST, use o nome da ligação do projeto remote-tool que criar para o endpoint toolbox na ferramenta MCP do agente, como sendo project_connection_id.

Dica

Para detalhes sobre o esquema da ferramenta MCP e os itens de aprovação, consulte a referência da API REST do Microsoft Foundry.

1. Criar uma caixa de ferramentas com o servidor MCP

A forma recomendada de adicionar um servidor MCP é através de uma caixa de ferramentas e depois ligar a caixa de ferramentas ao seu 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"
      }
    ]
  }'

A caixa de ferramentas expõe um endpoint compatível com MCP em $FOUNDRY_PROJECT_ENDPOINT/toolboxes/mcp-server-toolbox/versions/<version>/mcp?api-version=v1, onde <version> é a versão devolvida pela chamada anterior.

2. Criar uma ligação a uma ferramenta remota na caixa de ferramentas

Crie uma ligação remota a um projeto de ferramenta que aponte para o endpoint da caixa de ferramentas. Use um token Entra do utilizador para que a identidade do chamador seja transmitida (audiência 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 da caixa de ferramentas. Alterar 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 para mcp_approval_request, copie o item id do pedido de aprovação como APPROVAL_REQUEST_ID. Também copie a resposta do nível superior id como PREVIOUS_RESPONSE_ID.

5. Enviar uma resposta de aprovação

Se a ferramenta MCP exigir aprovação, envie um pedido de seguimento:

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

Eliminar o agente:

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

Como funciona

Precisa trazer um servidor MCP remoto (um endpoint existente do servidor MCP) para Foundry Agent Service. Podes trazer vários servidores MCP remotos adicionando-os como ferramentas. Para cada ferramenta, é necessário fornecer um valor único server_label dentro do mesmo agente e um server_url valor que aponte para o servidor MCP remoto. Certifique-se de rever cuidadosamente quais os servidores MCP que adiciona ao Foundry Agent Service.

Para além de ligar servidores MCP remotos arbitrários por URL, alguns servidores MCP podem ser adicionados diretamente a partir do catálogo Foundry Add Tools . Por exemplo, Azure DevOps MCP Server (pré-visualização) está disponível como entrada de catálogo. As entradas do catálogo simplificam a configuração da ligação e alinham-se com os mesmos mecanismos de aprovação e auditoria documentados neste artigo.

Para mais informações sobre a utilização do MCP, veja:

Configurar a ligação MCP

Caminho secundário - operações avançadas: Use esta referência após a rota do primeiro sucesso para restringir ferramentas, alterar o comportamento de aprovação ou adicionar uma ligação ao projeto.

Os passos seguintes descrevem como se ligar a um servidor MCP remoto a partir do Foundry Agent Service:

  1. Encontra o servidor MCP remoto ao qual queres ligar-te, como o servidor MCP do GitHub. Crie ou atualize um agente Foundry com uma mcp ferramenta utilizando a seguinte informação:
    1. server_url: A URL do servidor MCP, como https://api.githubcopilot.com/mcp/.
    2. server_label: Um identificador único deste servidor MCP para o agente, como github.
    3. allowed_tools: Uma lista opcional de ferramentas a que este agente pode aceder e utilizar. Se não fornecer esse valor, o valor padrão inclui todas as ferramentas no servidor MCP.
    4. require_approval: Opcionalmente, determinar se é necessária aprovação. O valor padrão é always. Os valores suportados são:
      • always: Um programador precisa de fornecer aprovação para cada chamada. Se não fornecer um valor, este é o padrão.
      • never: Não é necessária aprovação.
      • {"never":[<tool_name_1>, <tool_name_2>]}: Fornece uma lista de ferramentas que não precisam de aprovação.
      • {"always":[<tool_name_1>, <tool_name_2>]}: Fornece uma lista de ferramentas que requerem aprovação.
  2. project_connection_id: O ID de ligação do projeto que armazena autenticação e outros detalhes de ligação para o servidor MCP.
  3. Se o modelo tentar invocar uma ferramenta no seu servidor MCP com aprovação necessária, obtém um tipo de item de saída de resposta como mcp_approval_request. No item de saída da resposta, pode obter mais detalhes sobre qual ferramenta no servidor MCP é utilizada e os argumentos a serem passados. Reveja a ferramenta e os argumentos para que possa tomar uma decisão informada e obter aprovação.
  4. Submeta a sua aprovação ao agente usando previous_response_id e definindo approve para true.

Ligue ao servidor MCP do Azure DevOps

Azure DevOps MCP Server (pré-visualização) está disponível como entrada de catálogo no Foundry. Para acrescentar:

  1. No portal Foundry, aceda ao seu projeto.
  2. Selecione Adicionar Ferramentas>Catalog e procure por "Azure DevOps."
  3. Selecione Azure DevOps MCP Server (pré-visualização) e selecione Create.
  4. Introduza o nome da sua Azure DevOps organização e selecione Connect.
  5. Escolha quais as ferramentas Azure DevOps para expor ao seu agente. Pode selecionar um subconjunto de ferramentas para controlar exatamente o que o agente pode aceder.

Esta configuração baseada em catálogo cria a ferramenta MCP para uso por agentes sem necessidade de alterações de código. Pode validar a conectividade e o comportamento da ferramenta na experiência de testes de chat do Foundry antes de integrar a ferramenta no código de produção.

Dica

Versionamento de Ferramentas: As Foundry Toolboxes suportam versionamento, permitindo-lhe iterar numa nova versão sem afetar os agentes de produção. Use o endpoint do consumidor ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) para agentes de produção – serve sempre a 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. Manter server_label único por agente, mesmo ao mudar de versão do Toolbox. Para mais informações, consulte Promover uma versão para padrão.

Operações de longa duração (versão preliminar)

Caminho secundário - modo de fundo: Use este modo apenas quando uma operação MCP não conseguir ser concluída dentro do timeout síncrono padrão.

Alguns servidores MCP disponibilizam ferramentas que demoram mais do que o tempo limite síncrono padrão a devolver um resultado. Para suportar estas operações, execute o agente em modo de segundo plano. O modo em segundo plano executa a resposta de forma assíncrona, por isso a chamada à ferramenta MCP pode continuar sem manter uma ligação aberta, e consultas o estado da resposta até que esta seja concluída. Esta abordagem permite que as chamadas de ferramentas MCP ultrapassem o timeout de 100 segundos sem streaming descrito em Limitações conhecidas.

Nota

As operações de longa duração do MCP estão em antevisão. As funcionalidades de pré-visualização são fornecidas sem um acordo de nível de serviço, não sendo recomendadas para cargas de trabalho de produção. O comportamento e os modelos suportados podem mudar.

Requisitos para o servidor MCP

O tempo de execução do agente depende do servidor MCP para executar a operação de forma assíncrona e reportar o progresso. O servidor deve:

  • Implemente a capacidade de tarefas do Model Context Protocol para que uma invocação de ferramenta possa devolver uma referência de tarefa em vez de ficar bloqueada até o processamento estar concluído.
  • Devolva um identificador de tarefa relacionada nos metadados do resultado da ferramenta (o campo io.modelcontextprotocol/related-task com um taskId) quando a ferramenta inicia uma operação de longa duração.
  • Exponha uma forma de o runtime consultar o estado da tarefa e recuperar o resultado final após a conclusão da tarefa.
  • Ser acessível como um endpoint MCP remoto, tal como qualquer outra ferramenta MCP. Os servidores MCP locais devem ser auto-hospedados para fornecer um endpoint remoto. Veja : Hospedar um servidor MCP local.

Quando o runtime do agente chama uma ferramenta que inicia uma operação de longa duração, o servidor retorna a referência da tarefa e o runtime mantém a resposta em segundo plano. O runtime inicia a resposta, devolve imediatamente uma resposta id e um status de queued, e obtém o resultado quando a tarefa termina. Consultas a resposta id até status se tornar completed, e depois lês o resultado final.

O modo em segundo plano para operações MCP de longa duração funciona com qualquer modelo que suporte modo em segundo plano, como gpt-5.4 ou gpt-5.5.

Se o seu agente usar um modelo que não suporta o modo em segundo plano, as chamadas à ferramenta MCP executam-se de forma síncrona e estão sujeitas ao timeout de 100 segundos.

Ativar o modo em segundo plano no portal Microsoft Foundry

Pode ativar o modo em segundo plano para um agente no playground do portal Microsoft Foundry, sem precisar de escrever código:

  1. Abra o seu agente e selecione o separador Playground .

  2. Na lista de modelos , selecione um modelo que suporte modo em segundo plano, como gpt-5.4 ou gpt-5.5.

  3. Seleciona o ícone de parâmetros ao lado do modelo e ativa o modo Background.

  4. Em Ferramentas, adicione uma ferramenta cujo servidor MCP suporte tarefas MCP, como um agente de dados Fabric adicionado através da ferramenta Fabric IQ. Para obter os passos, consulte Ligar agentes ao Microsoft Fabric com o Fabric IQ.

  5. Envia uma mensagem. O agente inicia uma execução em segundo plano e mostra o seu progresso enquanto a chamada de ferramenta de longa duração termina. Quando a corrida termina, a resposta aparece no chat.

Executar o modo em segundo plano com código

Os exemplos seguintes invocam um agente que já está configurado com uma ferramenta MCP, define background para true, e faz polling até que a resposta seja concluída. Substitui os valores provisórios pelos teus 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());

Criar uma resposta em segundo plano. O pedido 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 consulte-a repetidamente até que status seja completed:

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

Quando status é completed, o output array contém o resultado da chamada da ferramenta MCP e a mensagem final do assistente.

Limitações conhecidas

Caminho secundário - comportamento de streaming: Reveja estes limites após a rota de primeiro sucesso, se o seu cliente processar respostas em streaming ou se a sua chamada MCP se aproximar do tempo limite síncrono.

  • Tempo de espera para chamadas de ferramenta MCP não streaming: Chamadas de ferramentas MCP não streaming têm um timeout de 100 segundos. Se o seu servidor MCP demorar mais de 100 segundos a responder, a chamada falha. Para evitar tempos de espera, certifique-se de que o seu servidor MCP responde dentro desse limite. Se o seu caso de uso exigir tempos de processamento mais longos, execute o agente em modo de segundo plano com um modelo suportado, otimize a lógica do lado do servidor ou divida a operação em passos mais pequenos.
  • O MCP privado requer Configuração de Agente Padrão: A conectividade do servidor MCP privado só está disponível com Configuração de Agente Padrão com rede privada (BYO VNet). A configuração básica de agentes não suporta endpoints privados MCP.
  • Alojamento MCP privado: Azure Container Apps numa sub-rede MCP dedicada é a configuração testada para servidores MCP privados. As Function Apps ou App Services como host privado do servidor MCP podem funcionar, mas não são validadas internamente.

Perguntas e erros comuns

Os seguintes problemas comuns podem ocorrer ao utilizar as ferramentas MCP com o Foundry Agent Service:

  • "Esquema de ferramenta inválido":

    Este erro normalmente ocorre se a definição do seu servidor MCP incluir anyOf ou allOf, ou se um parâmetro aceitar múltiplos tipos de valores. Atualiza a definição do teu servidor MCP e tenta novamente.

  • "Não autorizado" ou "Proibido" do servidor MCP:

    Confirme que o servidor MCP suporta o seu método de autenticação e verifique as credenciais armazenadas na sua ligação ao projeto. Para o GitHub, usa tokens de privilégio mínimo e roda-os regularmente.

  • O modelo nunca chama à sua ferramenta MCP:

    Confirme que as instruções do seu agente incentivam o uso da ferramenta, e verifique os valores de server_label, server_url, e allowed_tools. Se definires allowed_tools, certifica-te de que o nome da ferramenta corresponde ao que o servidor MCP expõe.

  • O agente nunca continua após a aprovação:

    Confirme que envie um pedido de seguimento com o previous_response_id definido como o ID original da resposta e utilize o ID do item do pedido de aprovação como approval_request_id.

Hospedar um servidor MCP local

O runtime do Agent Service só aceita um endpoint remoto de servidor MCP. Se quiseres adicionar ferramentas a partir de um servidor MCP local, precisas de o auto-hospedar em Azure Container Apps ou Funções do Azure para obter um endpoint remoto de servidor MCP.

O endpoint remoto pode ser um endpoint público ou privado dentro do seu VNet. Para servidores MCP privados, implemente a sua Container App com entrada interna apenas (--internal-only true) numa sub-rede MCP dedicada. Para obter detalhes de configuração, consulte endpoints de servidores MCP públicos e privados.

Considere os seguintes fatores ao alojar servidores MCP locais na cloud:

Configuração local do servidor MCP Alojamento em Azure Container Apps Hospedagem no Funções do Azure
Transportes É necessário endpoints HTTP POST/GET. É necessário ser compatível com streaming HTTP.
Alterações ao código Reconstrução do contentor necessária. Ficheiros de configuração específicos do Funções do Azure são necessários no diretório raiz.
Autenticação É necessária implementação de autenticação personalizada. Só com base em chaves. O OAuth precisa de Gestão de APIs.
Língua Qualquer linguagem que corra em contentores Linux (Python, Node.js, .NET, TypeScript, Go). Python, Node.js, Java, .NET só.
Requisitos de contentores Apenas Linux (linux/amd64). Sem contentores privilegiados. Servidores containerizados não são suportados.
Dependências Todas as dependências devem estar na imagem do conteiner. Dependências ao nível do sistema operativo (como Playwright) não são suportadas.
Estado Apenas apátrida. Apenas apátrida.
UVX/NPX Apoiado. Não suportado. npx Comandos de início não suportados.