Conectar agentes a servidores do Protocolo de Contexto de Modelo

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.

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.
  • Revise e aprove chamadas da ferramenta MCP.
  • Solucionar problemas comuns de integração do MCP.

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 JavaScript SDK SDK do Java API REST Configuração básica do agente Configuração do agente padrão
✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma assinatura Azure com um projeto ativo do Microsoft Foundry.
  • Azure RBAC (controle de acesso baseado em função): os papéis de Colaborador ou Proprietário no projeto Foundry.
  • 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).

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 Instalação do Agente Standard com 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-hybrid-private-resources-agent-setup, que provisiona a infraestrutura de rede necessária, incluindo a sub-rede MCP.

Para obter detalhes sobre o suporte à ferramenta em ambientes isolados de rede, consulte as ferramentas do Agente com isolamento de rede.

Usar caixas de ferramentas do Foundry como pontos de extremidade MCP

As Caixas de Ferramentas de Pesquisa (versão prévia) 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 a 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 endpoint da Caixa de Ferramentas é compatível com MCP, qualquer runtime que possa consumir um servidor MCP também pode consumir uma Caixa de Ferramentas. 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.

Autenticação

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.

Quando você usa um ponto de extremidade MCP da Caixa de Ferramentas do Foundry, a Caixa de Ferramentas gerencia centralmente a autenticação. A Caixa de Ferramentas lida com injeção de credencial, atualização de token e imposição de política em runtime para todas as ferramentas do pacote. Os agentes se autenticam no próprio ponto de extremidade da Caixa de Ferramentas usando credenciais de Microsoft Entra, como DefaultAzureCredential, e as credenciais das ferramentas individuais não precisam ser fornecidas por cada agente. 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.
  • 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.
  • Aprovações de log e chamadas de ferramenta 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.

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 usar o servidor MCP GitHub como uma ferramenta para um agente.

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

Criar um agente com a ferramenta MCP

O exemplo a seguir mostra como usar o servidor MCP GitHub como uma ferramenta para um agente. 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.

Criar um agente usando a ferramenta MCP com autenticação de conexão de projeto

Neste exemplo, você aprenderá a autenticar-se no servidor MCP GitHub e usá-lo como uma ferramenta para um agente. 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.

Configurar a conexão do projeto

Antes de executar o exemplo:

  1. Entre em seu perfil de GitHub.
  2. Selecione a imagem de perfil no canto superior direito.
  3. Selecione Configurações.
  4. No painel esquerdo, selecione Configurações do Desenvolvedor e Tokens de acesso pessoal > (clássico).
  5. 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.
  6. No portal do Azure, abra o Microsoft Foundry.
  7. No painel esquerdo, selecione o Centro de Gerenciamento e selecione Recursos conectados.
  8. Crie uma nova conexão do tipo de chaves personalizadas .
  9. Nomeie-o e adicione um par de valores de chave.
  10. Defina o nome Authorization da chave e o valor deve ter uma 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());

// Create an agent with the MCPTool. Note that, in this scenario,
// GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval is used.
// This means that any calls to the MCP server must be approved.
// The ProjectConnectionId property is then set on the McpTool
// so agent can authenticate with GitHub.
McpTool tool = ResponseTool.CreateMcpTool(
        serverLabel: "api-specs",
        serverUri: new Uri("https://api.githubcopilot.com/mcp"),
        toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval
    ));
tool.ProjectConnectionId = mcpConnectionName;
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 = { tool }
};
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 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, "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: Your GitHub username is "example-username".

Criar um agente no TypeScript com a ferramenta MCP

O exemplo typeScript a seguir demonstra como criar um agente com funcionalidades de ferramenta MCP, 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...");

  // Define MCP tool that connects to Azure REST API specifications GitHub repository
  // The 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: "api-specs",
        server_url: "https://gitmcp.io/Azure/azure-rest-api-specs",
        require_approval: "always",
      },
    ],
  });
  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: { 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 === "api-specs" && 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: { 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 criar um agente com recursos de ferramenta MCP usando a autenticação de conexão de projeto, 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...");

  // Define MCP tool that connects to GitHub Copilot API 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 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: "api-specs",
        server_url: "https://api.githubcopilot.com/mcp",
        require_approval: "always",
        project_connection_id: MCP_CONNECTION_NAME,
      },
    ],
  });
  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: { 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 === "api-specs" && 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: { 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: api-specs
  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

Adicione a dependência ao seu pom.xml:

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-ai-agents</artifactId>
    <version>2.0.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";
        String mcpConnectionName = "my-mcp-connection";

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

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

        // Create MCP tool with server label, URL, connection, and approval mode
        McpTool mcpTool = new McpTool("api-specs")
            .setServerUrl("https://gitmcp.io/Azure/azure-rest-api-specs")
            .setProjectConnectionId(mcpConnectionName)
            .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: O nome da 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 não exigir autenticação, omita project_connection_id do corpo da solicitação.

Nota

Para a API REST, primeiro você precisa recuperar a ID de conexão do nome da conexão usando a API de Conexões e, em seguida, passar a ID para a configuração da ferramenta MCP.

Dica

Para obter detalhes sobre os itens de aprovação e esquema da ferramenta MCP, consulte OpenAI.MCPTool e os tipos de item de aprovação MCP na referência REST.

1. 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": "api-specs",
          "server_url": "https://gitmcp.io/Azure/azure-rest-api-specs",
          "require_approval": "never"
        }
      ]
    }
  }'

Para usar um servidor MCP autenticado com uma conexão de projeto, adicione "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" à definição da ferramenta e altere server_url para o ponto de extremidade do servidor autenticado (por exemplo, https://api.githubcopilot.com/mcp).

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

3. 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
      }
    ]
  }'

4. Limpar 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 conectar um servidor MCP remoto (um ponto de extremidade de servidor MCP existente) ao Serviço do Agente do Foundry. 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:

Configurar a conexão MCP

As etapas a seguir descrevem como se conectar a um servidor MCP remoto do Serviço do Foundry Agent:

  1. 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 mcp ferramenta usando as seguintes informações:
    1. server_url: a URL do servidor MCP, como https://api.githubcopilot.com/mcp/.
    2. server_label: um identificador exclusivo deste servidor MCP para o agente, como github.
    3. 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.
    4. 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.
  2. 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.
  3. 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.
  4. Envie sua aprovação para o agente usando previous_response_id e definindo approve como true.

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:

  1. No portal do Foundry, acesse seu projeto.
  2. Selecione Add Tools>Catalog e pesquise "Azure DevOps".
  3. Selecione Azure DevOps SERVIDOR MCP (versão prévia) e selecione Create.
  4. Insira o nome da sua organização Azure DevOps e selecione Connect.
  5. 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.

Limitações conhecidas

  • 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, considere otimizar a lógica do lado do servidor ou dividir 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. Os Aplicativos de Funções ou os Serviços de Aplicativo como o 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 anyOf ou allOf, 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_url e allowed_tools. Se você definir allowed_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_id definido como o ID de resposta original e use o ID do item de solicitação de aprovação como approval_request_id.

Hospedar um servidor MCP local

O runtime do Serviço de Agente aceita apenas um ponto de extremidade remoto do servidor MCP. 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 Endpoints HTTP POST/GET necessários. HTTP transmissível necessário.
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.