Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Подключите ваших агентов Foundry к серверам Протокола контекста модели (MCP) с помощью средства MCP. Это подключение расширяет возможности агента с внешними инструментами и источниками данных. Подключаясь к удаленным конечным точкам сервера MCP, модель Foundry агента может получить доступ к средствам, размещенным разработчиками и организациями, которые могут использовать клиенты, совместимые с MCP, такие как Служба агента Foundry.
MCP — это открытый стандарт, определяющий, как приложения предоставляют средства и контекстные данные для больших языковых моделей (LLM). Она обеспечивает согласованную масштабируемую интеграцию внешних инструментов с рабочими процессами модели.
В этой статье описано, как:
- Добавьте удаленный сервер MCP в качестве средства.
- Проверка подлинности на сервере MCP с помощью подключения к проекту.
- Проверка и утверждение вызовов инструментов MCP.
- Устранение распространенных проблем интеграции MCP.
Концептуальные сведения о том, как работает интеграция MCP, см. в статье о том, как она работает.
Поддержка использования
В следующей таблице показана поддержка пакета SDK и настройки подключений MCP.
| поддержка Microsoft Foundry | пакет SDK Python | C# SDK | JavaScript SDK | пакет SDK Java | REST API | Базовая настройка агента | Настройка стандартного агента |
|---|---|---|---|---|---|---|---|
| ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Необходимые условия
Прежде чем начать, убедитесь, что у вас есть:
- Подписка Azure с активным проектом Microsoft Foundry.
- Azure управление доступом на основе ролей (RBAC): роль участника или владельца проекта Foundry.
- Последний пакет SDK для вашего языка. Пакет SDK .NET в настоящее время находится в предварительной версии. Дополнительные сведения об установке см. в кратком руководстве.
- Azure учетные данные, настроенные для проверки подлинности (например,
DefaultAzureCredential). - Доступ к удаленной конечной точке сервера MCP (например, на сервере MCP GitHub в
https://api.githubcopilot.com/mcp).
Общедоступные и частные конечные точки сервера MCP
Служба агента поддерживает как общедоступные, так и частные конечные точки сервера MCP:
- Общедоступные конечные точки: подключение к любому общедоступному удаленному серверу MCP. Этот параметр работает с настройками агента "Базовый" и "Стандартный".
- Частные конечные точки: подключены к серверам MCP, которые не подключены к общедоступному интернету. Для частной MCP требуется настройка стандартного агента с частными сетями и выделенной подсетью MCP в виртуальной сети.
Для частных серверов MCP разверните сервер MCP на Контейнеры приложений Azure с только внутренним вхождением во внутренне выделенной подсети MCP, делегированной Microsoft.App/environments. Чтобы приступить к работе, используйте шаблон 19-hybrid-private-resources-agent-setup , который подготавливает необходимую сетевую инфраструктуру, включая подсеть MCP.
Дополнительные сведения о поддержке средств в изолированных от сети средах см. в разделе "Средства агента" с сетевой изоляцией.
Использование наборов инструментов Foundry в качестве конечных точек MCP
Панели элементов Foundry (предварительная версия) позволяют объединить несколько средств, таких как веб-поиск, интерпретатор кода, поиск файлов, Поиск с использованием ИИ Azure, серверы MCP, средства OpenAPI и подключения агента к агенту — в одну конечную точку, совместимую с MCP. Вместо настройки каждого средства отдельно для каждого агента создайте панель элементов в Foundry и наведите агент на конечную точку панели элементов с помощью стандартной mcp конфигурации инструментов (server_url и server_label).
Так как конечная точка панели элементов совместима с MCP, любая среда выполнения, которая может использовать сервер MCP, также может использовать панель элементов. Эта совместимость включает службу агента Foundry, платформу агента Microsoft, LangGraph, пакет SDK GitHub Copilot и другие клиенты с поддержкой MCP. Вы можете добавлять, удалять или перенастраивать средства на панели элементов, не изменяя код агента.
Инструкции по настройке см. в разделе "Создание и использование панели элементов Foundry".
Проверки подлинности
Для многих серверов MCP требуется проверка подлинности.
В службе агента Foundry используйте подключение проекта для хранения сведений о проверке подлинности, таких как ключи API или токены, вместо того чтобы жестко прописывать учетные данные в вашем приложении.
Чтобы узнать о поддерживаемых параметрах аутентификации, включая основанные на ключах, удостоверения Microsoft Entra и передачу удостоверения OAuth, см. в статье MCP server authentication.
Примечание
Установите project_connection_id в качестве идентификатора вашего подключения к проекту.
Совет
При добавлении Azure DevOps MCP Server (предварительная версия) через каталог Add Tools вы выполняете проверку подлинности на Azure DevOps во время этапа подключения организации и сохраняете проверку подлинности в качестве подключения к проекту. Используйте минимальные привилегии доступа и просмотрите области при подключении организации.
При использовании конечной точки MCP набора инструментов Foundry, он централизованно управляет проверкой подлинности. Инструментарий обрабатывает инъекцию учетных данных, обновление токена и применение политик во время выполнения для всех средств в пакете. Агенты проходят аутентификацию в конечной точке панели инструментов с помощью учетных данных Microsoft Entra, таких как DefaultAzureCredential, а отдельные учетные данные средства не нужно передавать каждым агентом. Для настройки аутентификации панели инструментов см. раздел Предварительные требования к панели инструментов.
Рекомендации по использованию не относящихся к Microsoft сервисов и серверов
Вы подчиняетесь условиям соглашения между вами и поставщиком услуг при использовании подключённых услуг, не связанных с Microsoft. При подключении к службе, отличной от Microsoft, вы передаете некоторые данные, такие как содержимое запроса, в службу, не Microsoft, или приложение может получать данные из службы, отличной от Microsoft. Вы несете ответственность за использование услуг, не относящихся к Microsoft, и данных, а также за все связанные с этим расходы.
Сторонние компании, а не Microsoft, создают удаленные серверы MCP, которые вы выбираете использовать с помощью инструмента MCP, описанного в этой статье. Microsoft не тестирует или не проверяет эти серверы. Microsoft не несет ответственности за вас или других пользователей в отношении использования любых удаленных серверов MCP.
Внимательно просмотрите и отслеживайте, какие серверы MCP добавляются в службу агента Foundry. Полагаться на серверы, размещенные доверенными поставщиками услуг, а не прокси-серверы.
Средство MCP позволяет передавать пользовательские заголовки, такие как ключи проверки подлинности или схемы, которые может потребоваться удаленному серверу MCP. Просмотрите все данные, к которым вы предоставляете общий доступ с удаленными серверами MCP, и зайдите в журнал данных для целей аудита. Помните о методах хранения и расположения данных, отличных от Microsoft.
Примечание
Инструментарии Foundry отличаются от сторонних серверов MCP. Панели элементов — это управляемые организацией ресурсы, которые вы создаете и управляете в проекте Microsoft Foundry. Однако вы по-прежнему отвечаете за выбор инструментов, обработку данных и соответствие требованиям при проверке содержимого панели элементов.
Лучшие практики
Общие рекомендации по использованию инструментов см. в статье Best practices for using tools in Microsoft Foundry Agent Service.
При использовании серверов MCP следуйте приведенным ниже рекомендациям.
- Используйте список разрешений инструментов с помощью
allowed_tools. - Требуется утверждение для операций с высоким риском, особенно средства записи данных или изменения ресурсов.
- Перед утверждением просмотрите запрошенное название и аргументы средства.
- Журналирование утверждений и вызовы инструментов для аудита и устранения неполадок.
Совет
При добавлении сервера MCP Azure DevOps через каталог Add Tools конфигурация выбора средства сопоставляется с поведением allowed_tools, описанным в этой статье. Выбор подмножества инструментов в пользовательском интерфейсе каталога эквивалентен указанию allowed_tools списка в коде.
Создание агента в Python с помощью средства MCP
Используйте следующий пример кода, чтобы создать агент и вызвать функцию. Пакет SDK .NET в настоящее время находится в предварительной версии. Дополнительные сведения см. в кратком руководстве .
В следующем примере показано, как использовать сервер MCP GitHub в качестве средства для агента.
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")
Ожидаемые выходные данные
В следующем примере показаны ожидаемые выходные данные при запуске примера:
Agent created (id: <agent-id>, name: MyAgent7, version: 1)
Created conversation (id: <conversation-id>)
Response: Your GitHub username is "example-username".
Agent deleted
Создание агента с помощью средства MCP
В следующем примере показано, как использовать сервер MCP GitHub в качестве средства для агента. В примере используются синхронные методы для создания агента. Для асинхронных методов см. пример кода в репозитории Azure SDK для .NET на 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);
Ожидаемые выходные данные
В следующем примере показаны ожидаемые выходные данные при запуске примера:
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.
Создание агента с помощью средства MCP с проверкой подлинности подключения к проекту
В этом примере вы узнаете, как пройти проверку подлинности на сервере MCP GitHub и использовать его в качестве инструмента для агента. В примере используются синхронные методы для создания агента. Для асинхронных методов см. пример кода в репозитории Azure SDK для .NET на GitHub.
Настройка подключения проекта
Перед выполнением примера:
- Войдите в свой профиль GitHub.
- Выберите рисунок профиля в правом верхнем углу.
- Выберите параметры.
- На левой панели выберите "Параметры разработчика" и "Личные маркеры > доступа" (классическая модель).
- В верхней части выберите "Создать новый маркер", введите пароль и создайте маркер, который может читать общедоступные репозитории.
- Важно: Сохраните маркер или оставьте страницу открытой, так как после закрытия страницы не удается снова отображать маркер.
- На портале Azure откройте Microsoft Foundry.
- На левой панели выберите центр управления и выберите "Подключенные ресурсы".
- Создайте новое подключение типа пользовательских ключей .
- Назовите это и добавьте пару ключ-значение.
- Задайте имя
Authorizationключа и значение должно иметь формуBearer your_github_token.
Пример кода для создания агента
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);
Ожидаемые выходные данные
В следующем примере показаны ожидаемые выходные данные при запуске примера:
Approval requested for api-specs...
Response: Your GitHub username is "example-username".
Создание агента в TypeScript с помощью средства MCP
В следующем примере TypeScript показано, как создать агент с возможностями средства MCP, отправлять запросы, которые активируют рабочие процессы утверждения MCP, обрабатывают запросы на утверждение и очищают ресурсы. Для версии JavaScript смотрите пример кода sample в репозитории Azure SDK для JavaScript на 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);
});
Ожидаемые выходные данные
В следующем примере показаны ожидаемые выходные данные при запуске примера:
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!
Создание агента с помощью средства MCP с проверкой подлинности подключения к проекту
В следующем примере TypeScript показано, как создать агент с возможностями средства MCP с помощью проверки подлинности подключения к проекту, отправлять запросы, которые активируют рабочие процессы утверждения MCP, обрабатывают запросы на утверждение и очищают ресурсы. Для версии JavaScript смотрите пример кода sample в репозитории Azure SDK для JavaScript на 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);
});
Ожидаемые выходные данные
В следующем примере показаны ожидаемые выходные данные при запуске примера:
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!
Использование средств MCP в агенте Java
Добавьте зависимость в вашу pom.xml:
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-ai-agents</artifactId>
<version>2.0.0</version>
</dependency>
Создание агента с помощью средства 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());
}
}
Ожидаемые выходные данные
Agent created: mcp-agent (version 1)
Response: [ResponseOutputItem containing MCP tool results ...]
Использование средства MCP с REST API
В следующих примерах показано, как создать агент с помощью средства MCP и вызвать его с помощью API ответов. Если ответ содержит выходной элемент с заданным значением typemcp_approval_request, отправьте следующий запрос, который включает элемент mcp_approval_response.
Необходимые условия
Задайте следующие переменные среды:
-
FOUNDRY_PROJECT_ENDPOINT: URL-адрес конечной точки проекта. -
FOUNDRY_MODEL_DEPLOYMENT_NAME: название развертывания модели. -
AGENT_TOKEN: токен доступа для Foundry. -
MCP_PROJECT_CONNECTION_NAME(необязательно): имя подключения проекта MCP.
Получение токена доступа:
export AGENT_TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
Если сервер MCP не требует проверки подлинности, опустите project_connection_id из тела запроса.
Примечание
Для REST API необходимо сначала получить идентификатор подключения из имени подключения с помощью API подключений, а затем передать идентификатор в конфигурацию средства MCP.
Совет
Дополнительные сведения о схеме и утверждениях средств MCP см. в статье OpenAI.MCPTool и типы элементов утверждения MCP в справочнике REST.
1. Создание агента 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"
}
]
}
}'
Чтобы использовать аутентифицированный сервер MCP с подключением к проекту, добавьте "project_connection_id": "'$MCP_PROJECT_CONNECTION_NAME'" в определение инструмента и измените server_url на конечную точку аутентифицированного сервера (например, https://api.githubcopilot.com/mcp).
2. Создание ответа
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"
}'
Если ответ содержит выходной элемент с type, установленным в mcp_approval_request, скопируйте элемент id запроса на утверждение как APPROVAL_REQUEST_ID. Кроме того, скопируйте ответ id верхнего уровня как PREVIOUS_RESPONSE_ID.
3. Отправка ответа на утверждение
Если для средства MCP требуется утверждение, отправьте следующий запрос:
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. Очистка ресурсов
Удалите агент:
curl -X DELETE "$FOUNDRY_PROJECT_ENDPOINT/agents/<AGENT_NAME>-mcp?api-version=v1" \
-H "Authorization: Bearer $AGENT_TOKEN"
Принцип работы
Необходимо перенести удаленный сервер MCP (существующую конечную точку сервера MCP) в службу агента Foundry. Вы можете добавить несколько удаленных серверов MCP, добавив их в качестве инструментов. Для каждого средства необходимо указать уникальное server_label значение в одном агенте и server_url значение, указывающее на удаленный сервер MCP. Внимательно проверьте, какие серверы MCP добавляются в службу агента Foundry.
Кроме того, помимо подключения произвольных удаленных серверов MCP по URL-адресу, некоторые серверы MCP можно добавлять непосредственно из каталога Foundry Средства добавления. Например, Azure DevOps MCP Server (предварительная версия) доступен как элемент каталога. Записи каталога упрощают настройку подключения и соответствуют тем же механизмам утверждения и аудита, описанным в этой статье.
Дополнительные сведения об использовании MCP см. в следующей статье:
- Рекомендации по обеспечению безопасности на веб-сайте протокола контекста модели.
- Понимание и смягчение рисков безопасности в реализациях MCP в блоге Microsoft Security Community.
Настройка подключения MCP
Ниже описано, как подключиться к удаленному серверу MCP из службы агента Foundry:
- Найдите удаленный сервер MCP, к которому требуется подключиться, например сервер GitHub MCP. Создайте или обновите агента Foundry с помощью средства
mcp, используя следующие сведения:-
server_url: URL-адрес сервера MCP, напримерhttps://api.githubcopilot.com/mcp/. -
server_label: уникальный идентификатор этого сервера MCP для агента, напримерgithub. -
allowed_tools: необязательный список инструментов, к которым этот агент может обращаться и использовать. Если это значение не указано, значение по умолчанию включает все средства на сервере MCP. -
require_approval: при необходимости определите, требуется ли утверждение. Значение по умолчанию —always. Поддерживаемые значения:-
always: разработчику необходимо предоставить утверждение для каждого вызова. Если вы не предоставляете значение, это значение по умолчанию. -
never: утверждение не требуется. -
{"never":[<tool_name_1>, <tool_name_2>]}: вы предоставляете список инструментов, которые не требуют утверждения. -
{"always":[<tool_name_1>, <tool_name_2>]}: вы предоставляете список инструментов, требующих утверждения.
-
-
-
project_connection_id: идентификатор подключения проекта, который хранит проверку подлинности и другие сведения о подключении для сервера MCP. - Если модель пытается вызвать средство на сервере MCP с обязательным утверждением, вы получите тип выходного элемента ответа как
mcp_approval_request. В выходном элементе ответа вы можете получить дополнительные сведения о том, какой инструмент вызывается на сервере MCP и какие аргументы передаются. Просмотрите инструмент и аргументы, чтобы вы могли принять обоснованное решение для утверждения. - Отправьте утверждение агенту с помощью
previous_response_idи установитеapproveнаtrue.
Подключиться к серверу MCP в Azure DevOps
Azure DevOps MCP Server (предварительная версия) доступен в виде записи каталога в Foundry. Чтобы добавить его, выполните приведенные далее действия.
- На портале Foundry перейдите к проекту.
- Выберите Add Tools>Catalog и найдите "Azure DevOps".
- Выберите Azure DevOps MCP Server (предварительная версия) и выберите Create.
- Введите имя организации Azure DevOps и выберите Connect.
- Выберите, какие инструменты Azure DevOps следует предоставить вашему агенту. Вы можете выбрать подмножество инструментов, чтобы точно контролировать, к чему агент может получить доступ.
Эта настройка на основе каталога создает средство MCP для использования агентами без внесения изменений в код. Вы можете проверить поведение подключения и инструментов в интерфейсе тестирования чата Foundry перед интеграцией средства в рабочий код.
Совет
Управление версиями элементов: Foundry Toolboxes поддерживает управление версиями, поэтому вы можете итерировать новую версию без влияния на рабочие агенты. Используйте конечную точку потребителя ({project_endpoint}/toolboxes/{name}/mcp?api-version=v1) для производственных агентов — она всегда обслуживает продвигаемую версию по умолчанию. До продвижения используйте специфическую для версии конечную точку ({project_endpoint}/toolboxes/{name}/versions/{version}/mcp?api-version=v1) для тестирования. Сохраняйте server_label уникальным для каждого агента, даже при смене версий Toolbox. Дополнительные сведения см. в статье "Повышение уровня версии по умолчанию".
Известные ограничения
- Время ожидания вызова инструмента MCP без потоковой передачи: вызовы инструмента MCP без потоковой передачи имеют время ожидания в 100 секунд. Если сервер MCP отвечает более чем за 100 секунд, вызов не удается. Чтобы избежать времени ожидания, убедитесь, что сервер MCP отвечает в пределах этого ограничения. Если для вашего варианта использования требуется более длительное время обработки, рассмотрите возможность оптимизации логики на стороне сервера или прерывания операции на небольших шагах.
- Для частного MCP требуется стандартная настройка агента: подключение к частному серверу MCP доступно только в стандартной настройке агента с частной сетью (виртуальная сеть BYO). Базовая настройка агента не поддерживает частные конечные точки MCP.
- Частный хостинг MCP: Контейнеры приложений Azure в выделенной подсети MCP является тестируемой конфигурацией для частных серверов MCP. Функциональные приложения или службы приложений в качестве частного сервера MCP могут работать, но внутренне не проверяются.
Распространенные вопросы и ошибки
При использовании средств MCP со службой агента Foundry могут возникать следующие распространенные проблемы:
"Недопустимая схема инструментов":
Эта ошибка обычно возникает, если определение сервера MCP включает
anyOfилиallOf, или если параметр принимает несколько типов значений. Обновите определение сервера MCP и повторите попытку."Несанкционированный" или "Запрещено" с сервера MCP:
Убедитесь, что сервер MCP поддерживает метод проверки подлинности и проверьте учетные данные, хранящиеся в подключении проекта. Для GitHub используйте токены с минимальными привилегиями и регулярно обновляйте их.
Модель никогда не вызывает средство MCP:
Убедитесь, что инструкции агента должны поощрять использование инструментов и убедитесь в правильности
server_label,server_url, иallowed_toolsзначений. Если заданоallowed_tools, убедитесь, что имя средства соответствует тому, что предоставляет сервер MCP.Агент не выполняет никаких действий после утверждения.
Убедитесь, что вы отправляете запрос на последующие действия с
previous_response_idзаданным идентификатором исходного ответа и используете идентификатор элемента запроса утверждения какapproval_request_id.
Размещение локального сервера MCP
Среда выполнения службы агента принимает только удаленную конечную точку сервера MCP. Если вы хотите добавить средства с локального сервера MCP, необходимо самостоятельно разместить его на Контейнеры приложений Azure или Функции Azure для получения удаленной конечной точки сервера MCP.
Удаленная конечная точка может быть общедоступной конечной точкой или частной конечной точкой в виртуальной сети. Для частных серверов MCP разверните приложение-контейнер с только внутренним входом (--internal-only true) на выделенной подсети MCP. Дополнительные сведения о настройке см. в общедоступных и частных конечных точках сервера MCP .
При размещении локальных серверов MCP в облаке следует учитывать следующие факторы:
| Настройка локального сервера MCP | Размещение в Контейнеры приложений Azure | Хостинг в Функции Azure |
|---|---|---|
| Транспорта | Требуются HTTP POST/GET эндпоинты. | Требуется возможность потоковой передачи HTTP. |
| Изменения кода | Требуется перестроение контейнера. | Файлы конфигурации, специфичные для Функции Azure, необходимые в корневом каталоге. |
| Проверки подлинности | Требуется реализация пользовательской проверки подлинности. | Только по ключу. OAuth требует управления API. |
| Язык | Любой язык, который выполняется в контейнерах Linux (Python, Node.js, .NET, TypeScript, Go). | Только Python, Node.js, Java, .NET. |
| Требования к контейнерам | Только Linux (linux/amd64). Нет привилегированных контейнеров. | Контейнерные серверы не поддерживаются. |
| Зависимости | Все зависимости должны присутствовать в контейнерном образе. | Зависимости на уровне ОС (например, Playwright) не поддерживаются. |
| Состояние | Только в режиме без сохранения состояния. | Только в режиме без сохранения состояния. |
| UVX/NPX | Поддерживается. | Не поддерживается.
npx Команды запуска не поддерживаются. |
Связанное содержимое
- Начните работать с агентами с помощью кода
- Проверка подлинности сервера MCP
- Создание и регистрация сервера протокола контекста модели (MCP)
- Настройка частной сети для службы агента Foundry
- Настройка приватного канала для Foundry
- Справочник по REST средства MCP
- Рекомендации по безопасности для MCP
- Понимание и устранение рисков безопасности в реализации MCP