Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Conecte los agentes de Foundry a los servidores del Protocolo de contexto de modelo (MCP) mediante la herramienta MCP. Esto amplía las funcionalidades del agente con herramientas externas y orígenes de datos. Al conectarse a puntos de conexión remotos del servidor MCP, los agentes pueden acceder a herramientas hospedadas por desarrolladores y organizaciones que pueden usar clientes compatibles con MCP, como foundry Agent Service.
MCP es un estándar abierto que define cómo las aplicaciones proporcionan herramientas y datos contextuales a modelos de lenguaje grandes (LLM). Permite una integración coherente y escalable de herramientas externas en flujos de trabajo de modelo.
En este artículo aprenderá a:
- Agregue un servidor MCP remoto como herramienta.
- Autentíquese en un servidor MCP mediante una conexión de proyecto.
- Revise y apruebe las llamadas a la herramienta MCP.
- Solución de problemas comunes de integración de MCP.
Para obtener detalles conceptuales sobre cómo funciona la integración de MCP, consulte Funcionamiento.
Soporte de uso
En la tabla siguiente se muestra la compatibilidad con el SDK y la configuración de las conexiones MCP. ✔️ (GA) indica disponibilidad general, ✔️ (versión preliminar) indica la versión preliminar pública y un guion (-) indica que la característica no está disponible.
| Soporte técnico de Microsoft Foundry | SDK de Python | SDK DE C# | SDK de JavaScript | SDK de Java | REST API | Instalación básica del agente | Configuración del agente estándar |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ (GA) | ✔️ (Versión preliminar) | ✔️ (GA) | ✔️ (Versión preliminar) | ✔️ (GA) | ✔️ | ✔️ |
Prerrequisitos
Antes de comenzar, asegúrese de que tiene:
- Una suscripción Azure con un proyecto activo de Microsoft Foundry.
- Control de Acceso Basado en Rol (RBAC) de Azure: el rol de Colaborador o Propietario en el proyecto Foundry.
- El paquete del SDK más reciente para el idioma. Los SDK de .NET y Java están actualmente en versión preliminar. Consulte el inicio rápido para obtener más información sobre la instalación.
- Azure credenciales configuradas para la autenticación (como
DefaultAzureCredential). - Acceso a un punto de conexión remoto del servidor MCP (por ejemplo, el servidor MCP de GitHub en
https://api.githubcopilot.com/mcp).
Autenticación
Muchos servidores MCP requieren autenticación.
En Foundry Agent Service, use una conexión de proyecto para almacenar los detalles de autenticación (por ejemplo, claves de API o tokens de portador) en lugar de credenciales de codificación rígida en la aplicación.
Para obtener información sobre las opciones de autenticación admitidas (autenticación basada en claves, identidades de Microsoft Entra y paso directo de identidad de OAuth), consulte MCP server authentication.
Nota:
Establezca en el identificador de la conexión del proyecto.
Consideraciones para usar servidores y servicios que no son de Microsoft
Está sujeto a los términos entre usted y el proveedor de servicios cuando usa servicios que no son de Microsoft conectados. Cuando se conecta a un servicio que no es de Microsoft, pasa algunos de los datos (como el contenido del mensaje) al servicio que no es de Microsoft o la aplicación puede recibir datos del servicio que no es de Microsoft. Usted es responsable del uso de datos y servicios que no son de Microsoft, junto con los cargos asociados a ese uso.
Terceros, no Microsoft, crean los servidores MCP remotos que decide usar con la herramienta MCP que se describe en este artículo. Microsoft no prueba ni comprueba estos servidores. Microsoft no tiene ninguna responsabilidad para usted u otros usuarios en relación con el uso de cualquier servidor MCP remoto.
Revise detenidamente y haga seguimiento a los servidores MCP que agregue al Servicio de Agente Foundry. Confíe en servidores hospedados por proveedores de servicios de confianza en lugar de servidores proxy.
La herramienta MCP permite pasar encabezados personalizados, como claves de autenticación o esquemas, que podría necesitar un servidor MCP remoto. Revise todos los datos que comparta con servidores MCP remotos y registre los datos con fines de auditoría. Tenga en cuenta las prácticas que no son de Microsoft para la retención y la ubicación de los datos.
procedimientos recomendados
Para obtener instrucciones generales sobre el uso de herramientas, consulte Procedimientos recomendados para usar herramientas en el servicio Microsoft Foundry Agent.
Al usar servidores MCP, siga estos procedimientos:
- Se prefiere una lista de herramientas permitidas mediante .
- Requerir aprobación para operaciones de alto riesgo (especialmente herramientas que escriben datos o cambian recursos).
- Revise los argumentos y el nombre de la herramienta solicitados antes de aprobar.
- Registro de aprobaciones e invocaciones de herramientas para auditoría y resolución de problemas.
Creación de un agente en Python con la herramienta MCP
Use el ejemplo de código siguiente para crear un agente y llamar a la función . Los SDK de .NET y Java están actualmente en versión preliminar. Consulte el inicio rápido para obtener más información.
En el ejemplo siguiente se muestra cómo usar el servidor MCP de GitHub como herramienta para un 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")
Salida prevista
En el ejemplo siguiente se muestra la salida esperada al ejecutar el ejemplo:
Agent created (id: <agent-id>, name: MyAgent7, version: 1)
Created conversation (id: <conversation-id>)
Response: Your GitHub username is "example-username".
Agent deleted
Creación de un agente con la herramienta MCP
En el ejemplo siguiente se muestra cómo usar el servidor MCP de GitHub como herramienta para un agente. En el ejemplo se usan métodos sincrónicos para crear un agente. Para obtener métodos asincrónicos, consulte el código sample en el SDK de Azure para .NET repositorio en GitHub.
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.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.
PromptAgentDefinition 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.Agents.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.OpenAI.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.Agents.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
Salida prevista
En el ejemplo siguiente se muestra la salida esperada al ejecutar el ejemplo:
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.
Creación de un agente con la herramienta MCP mediante la autenticación de conexión de proyecto
En este ejemplo, aprenderá a autenticarse en el servidor MCP de GitHub y usarlo como herramienta para un agente. En el ejemplo se usan métodos sincrónicos para crear un agente. Para obtener métodos asincrónicos, consulte el código sample en el SDK de Azure para .NET repositorio en GitHub.
Configuración de la conexión del proyecto
Antes de ejecutar el ejemplo:
- Inicie sesión en el perfil de GitHub.
- Seleccione la imagen de perfil en la esquina superior derecha.
- Haga clic en Configuración.
- En el panel izquierdo, seleccione Configuración de desarrollador y Tokens de acceso personal (clásico) .
- En la parte superior, seleccione Generar nuevo token, escriba la contraseña y cree un token que pueda leer repositorios públicos.
- Importante: Guarde el token o mantenga abierta la página como una vez cerrada la página, el token no se puede volver a mostrar.
- En el portal de Azure, abra Microsoft Foundry.
- En el panel izquierdo, seleccione Centro de administración y, a continuación, seleccione Recursos conectados.
- Cree una nueva conexión del tipo de claves personalizadas .
- Asígnele el nombre y agregue un par de valores de clave.
- Establezca el nombre de clave en y el valor debe tener una forma de .
Ejemplo de código para crear el agente
using System;
using Azure.AI.Projects;
using Azure.AI.Projects.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;
PromptAgentDefinition 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.Agents.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.OpenAI.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.Agents.DeleteAgentVersion(agentName: agentVersion.Name, agentVersion: agentVersion.Version);
Salida prevista
En el ejemplo siguiente se muestra la salida esperada al ejecutar el ejemplo:
Approval requested for api-specs...
Response: Your GitHub username is "example-username".
Creación de un agente en TypeScript con la herramienta MCP
En el ejemplo de TypeScript siguiente se muestra cómo crear un agente con funcionalidades de herramientas de MCP, enviar solicitudes que desencadenan flujos de trabajo de aprobación de MCP, controlar solicitudes de aprobación y limpiar recursos. Para obtener una versión de JavaScript, consulte el código sample en el repositorio de SDK de Azure para JavaScript en 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);
});
Salida prevista
En el ejemplo siguiente se muestra la salida esperada al ejecutar el ejemplo:
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!
Creación de un agente con la herramienta MCP mediante la autenticación de conexión de proyecto
En el ejemplo de TypeScript siguiente se muestra cómo crear un agente con funcionalidades de herramientas de MCP mediante la autenticación de conexión de proyecto, enviar solicitudes que desencadenan flujos de trabajo de aprobación de MCP, controlar solicitudes de aprobación y limpiar recursos. Para obtener una versión de JavaScript, consulte el código sample en el repositorio de SDK de Azure para JavaScript en 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);
});
Salida prevista
En el ejemplo siguiente se muestra la salida esperada al ejecutar el ejemplo:
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!
Uso de herramientas de MCP en un agente de Java
Agregue la dependencia a :
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.0.0-beta.1</version>
</dependency>
Creación de un agente con la herramienta 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.McpTool;
import com.azure.ai.agents.models.PromptAgentDefinition;
import com.azure.core.util.BinaryData;
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(BinaryData.fromString("\"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.createWithAgent(
agentReference,
ResponseCreateParams.builder()
.input("Summarize the Azure REST API specifications"));
System.out.println("Response: " + response.output());
// Clean up
agentsClient.deleteAgentVersion(agent.getName(), agent.getVersion());
}
}
Salida prevista
Agent created: mcp-agent (version 1)
Response: [ResponseOutputItem containing MCP tool results ...]
Uso de la herramienta MCP con la API REST
En los ejemplos siguientes se muestra cómo crear un agente con la herramienta MCP y llamarlo mediante la API de respuestas. Si la respuesta incluye un elemento de salida con establecido en , envíe una solicitud de seguimiento que incluya un elemento .
Prerrequisitos
Establezca estas variables de entorno:
- : dirección URL del punto de conexión del proyecto.
- : nombre de implementación del modelo.
- : un token de portador para Foundry.
- (opcional): el nombre de la conexión del proyecto MCP.
Obtener un token de acceso:
export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
Si el servidor MCP no requiere autenticación, omita del cuerpo de la solicitud.
Nota:
En el caso de la API REST, primero debe recuperar el identificador de conexión del nombre de conexión mediante la API connections y, a continuación, pasar el identificador a la configuración de la herramienta MCP.
Sugerencia
Para obtener más información sobre el esquema de la herramienta MCP y los elementos de aprobación, consulte OpenAI.MCPTool y los tipos de elementos de aprobación de MCP en la referencia de REST.
1. Creación de un 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 un servidor MCP autenticado con una conexión de proyecto, agregue a la definición de la herramienta y cambie al punto de conexión de servidor autenticado (por ejemplo, ).
2. Crear una respuesta
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"
}'
Si la respuesta incluye un elemento de salida con establecido en , copie la solicitud de aprobación como . Copie también la respuesta de nivel superior como .
3. Enviar una respuesta de aprobación
Si la herramienta MCP requiere aprobación, envíe una solicitud de seguimiento:
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. Limpieza de recursos
Elimine el agente:
curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/<AGENT_NAME>-mcp?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
Cómo funciona
Debe llevar un servidor MCP remoto (un punto de conexión de servidor MCP existente) al servicio Foundry Agent. Puede traer varios servidores MCP remotos agregándolos como herramientas. Para cada herramienta, debe proporcionar un valor único dentro del mismo agente y un valor que apunte al servidor MCP remoto. Asegúrese de revisar cuidadosamente qué servidores MCP agrega al Servicio de Agente de Foundry.
Para obtener más información sobre el uso de MCP, consulte:
- Procedimientos recomendados de seguridad en el sitio web del Protocolo de contexto de modelo.
- Descripción y mitigación de los riesgos de seguridad en las implementaciones de MCP en el blog de la comunidad de seguridad de Microsoft.
Configuración de la conexión de MCP
En los pasos siguientes se describe cómo conectarse a un servidor MCP remoto desde foundry Agent Service:
- Busque el servidor MCP remoto al que desea conectarse, como el GitHub servidor MCP. Cree o actualice un agente Foundry con una herramienta usando la siguiente información:
- : la dirección URL del servidor MCP, como .
- : identificador único de este servidor MCP para el agente, como .
- : una lista opcional de herramientas a las que este agente puede acceder y usar. Si no proporciona este valor, el valor predeterminado incluye todas las herramientas del servidor MCP.
- : opcionalmente, determine si se requiere aprobación. El valor predeterminado es . Los valores admitidos son:
- : un desarrollador debe proporcionar aprobación para cada llamada. Si no proporciona un valor, este es el valor predeterminado.
- : no se requiere ninguna aprobación.
- : proporciona una lista de herramientas que no requieren aprobación.
- : proporciona una lista de herramientas que requieren aprobación.
- : identificador de conexión del proyecto que almacena la autenticación y otros detalles de conexión para el servidor MCP.
- Si el modelo intenta invocar una herramienta en el servidor MCP con la aprobación necesaria, obtendrá un tipo de elemento de salida de respuesta como . En el elemento de salida de respuesta, puede obtener más detalles sobre qué herramienta del servidor de MCP es llamada y qué argumentos se deben pasar. Revise la herramienta y los argumentos para que pueda tomar una decisión informada para su aprobación.
- Envíe la aprobación al agente mediante y establezca en .
Limitaciones conocidas
- Tiempo de espera de llamadas de la herramienta MCP "no streaming": las llamadas de la herramienta MCP que no son "streaming" tienen un tiempo de espera de 100 segundos. Si el servidor MCP tarda más de 100 segundos en responder, se produce un error en la llamada. Para evitar tiempos de espera, asegúrese de que el servidor MCP responde dentro de este límite. Si el caso de uso requiere tiempos de procesamiento más largos, considere la posibilidad de optimizar la lógica del lado servidor o dividir la operación en pasos más pequeños.
- El paso de identidad no se admite en Microsoft Teams: las herramientas de MCP que utilizan la transferencia de identidad de OAuth no funcionan cuando el agente se publica en Microsoft Teams. Los agentes publicados en Teams usan una identidad administrada de proyecto para la autenticación, que no es compatible con la transferencia de identidad (delegada).
Preguntas y errores comunes
A continuación se muestran los problemas comunes que pueden surgir al usar herramientas de MCP con el servicio del agente Foundry:
"Esquema de herramientas no válido":
Normalmente, un esquema de herramientas no válido se produce si tiene o en la definición del servidor MCP, o si un parámetro puede tomar varios tipos de valores. Actualice la definición del servidor MCP e inténtelo de nuevo.
"No autorizado" o "Prohibido" del servidor MCP:
Confirme que el servidor MCP admite el método de autenticación y compruebe las credenciales almacenadas en la conexión del proyecto. Para GitHub, use tokens con privilegios mínimos y rotarlos con regularidad.
El modelo nunca llama a la herramienta MCP:
Confirme que las instrucciones del agente fomentan el uso de las herramientas y verifique los valores de , y . Si establece , asegúrese de que el nombre de la herramienta coincide con lo que expone el servidor MCP.
El agente nunca continúa después de la aprobación:
Confirme que envía una solicitud de seguimiento con establecida en el identificador de respuesta original y que usa el identificador de elemento de solicitud de aprobación como .
Hospedaje de un servidor MCP local
El entorno de ejecución del servicio del agente solo acepta un punto de conexión remoto del servidor MCP. Si desea agregar herramientas desde un servidor MCP local, debe hospedarla automáticamente en Azure Container Apps o Azure Functions para obtener un punto de conexión de servidor MCP remoto. Tenga en cuenta los siguientes factores al hospedar servidores MCP locales en la nube:
| Configuración del servidor MCP local | Hospedaje en Azure Container Apps | Hospedaje en Azure Functions |
|---|---|---|
| Transporte | Se requieren puntos de conexión HTTP POST/GET. | Se requiere HTTP que se puede transmitir. |
| Cambios de código | Se requiere la recompilación del contenedor. | Archivos de configuración específicos de Azure Functions necesarios en el directorio raíz. |
| Autenticación | Se requiere la implementación de autenticación personalizada. | Basado exclusivamente en claves. OAuth necesita API Management. |
| Language | Cualquier lenguaje que se ejecute en contenedores de Linux (Python, Node.js, .NET, TypeScript, Go). | Solo Python, Node.js, Java, .NET. |
| Requisitos de contenedor | Linux (linux/amd64) únicamente. No hay contenedores con privilegios. | No se admiten servidores en contenedores. |
| Dependencias | Todas las dependencias deben estar en la imagen del contenedor. | No se admiten las dependencias de nivel de sistema operativo (como Playwright). |
| Estado | Solo sin estado. | Solo sin estado. |
| UVX/NPX | Supported. | No está soportado. comandos de inicio no admitidos. |
Contenido relacionado
- Introducción a los agentes mediante código
- Autenticación del servidor MCP
- Compilación y registro de un servidor de Protocolo de contexto de modelo (MCP)
- Referencia de REST de la herramienta MCP
- Procedimientos recomendados de seguridad para MCP
- Descripción y mitigación de los riesgos de seguridad en las implementaciones de MCP