Acest ghid arată cum să integrezi serverele Model Context Protocol (MCP) cu agenții Azure AI Foundry, oferind o orchestrare puternică a uneltelor și capabilități AI pentru mediul enterprise.
Model Context Protocol (MCP) este un standard deschis care permite aplicațiilor AI să se conecteze în mod securizat la surse externe de date și unelte. Integrat cu Azure AI Foundry, MCP permite agenților să acceseze și să interacționeze cu diverse servicii externe, API-uri și surse de date într-un mod standardizat.
Această integrare combină flexibilitatea ecosistemului de unelte MCP cu cadrul robust al agenților Azure AI Foundry, oferind soluții AI de nivel enterprise cu posibilități extinse de personalizare.
Note: Dacă dorești să folosești MCP în Azure AI Foundry Agent Service, în prezent sunt suportate doar următoarele regiuni: westus, westus2, uaenorth, southindia și switzerlandnorth
La finalul acestui ghid vei putea:
- Înțelege Model Context Protocol și beneficiile sale
- Configura servere MCP pentru utilizare cu agenții Azure AI Foundry
- Crea și configura agenți cu integrare MCP pentru unelte
- Implementa exemple practice folosind servere MCP reale
- Gestiona răspunsurile uneltelor și citările în conversațiile agenților
Înainte de a începe, asigură-te că ai:
- Un abonament Azure cu acces la AI Foundry
- Python 3.10+ sau .NET 8.0+
- Azure CLI instalat și configurat
- Permisiunile necesare pentru a crea resurse AI
Model Context Protocol este o metodă standardizată prin care aplicațiile AI se conectează la surse externe de date și unelte. Beneficiile cheie includ:
- Integrare standardizată: Interfață consistentă pentru diferite unelte și servicii
- Securitate: Mecanisme sigure de autentificare și autorizare
- Flexibilitate: Suport pentru diverse surse de date, API-uri și unelte personalizate
- Extensibilitate: Ușor de adăugat noi capabilități și integrări
Alege mediul de dezvoltare preferat:
Note Poți rula acest notebook
pip install azure-ai-projects -U
pip install azure-ai-agents==1.1.0b4 -U
pip install azure-identity -U
pip install mcp==1.11.0 -Uimport os, time
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from azure.ai.agents.models import McpTool, RequiredMcpToolCall, SubmitToolApprovalAction, ToolApprovalmcp_server_url = os.environ.get("MCP_SERVER_URL", "https://learn.microsoft.com/api/mcp")
mcp_server_label = os.environ.get("MCP_SERVER_LABEL", "mslearn")project_client = AIProjectClient(
endpoint="https://your-project-endpoint.services.ai.azure.com/api/projects/your-project",
credential=DefaultAzureCredential(),
)mcp_tool = McpTool(
server_label=mcp_server_label,
server_url=mcp_server_url,
allowed_tools=[], # Optional: specify allowed tools
)with project_client:
agents_client = project_client.agents
# Create a new agent with MCP tools
agent = agents_client.create_agent(
model="Your AOAI Model Deployment",
name="my-mcp-agent",
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=mcp_tool.definitions,
)
print(f"Created agent, ID: {agent.id}")
print(f"MCP Server: {mcp_tool.server_label} at {mcp_tool.server_url}")
# Create thread for communication
thread = agents_client.threads.create()
print(f"Created thread, ID: {thread.id}")
# Create message to thread
message = agents_client.messages.create(
thread_id=thread.id,
role="user",
content="What's difference between Azure OpenAI and OpenAI?",
)
print(f"Created message, ID: {message.id}")
# Handle tool approvals and run agent
mcp_tool.update_headers("SuperSecret", "123456")
run = agents_client.runs.create(thread_id=thread.id, agent_id=agent.id, tool_resources=mcp_tool.resources)
print(f"Created run, ID: {run.id}")
while run.status in ["queued", "in_progress", "requires_action"]:
time.sleep(1)
run = agents_client.runs.get(thread_id=thread.id, run_id=run.id)
if run.status == "requires_action" and isinstance(run.required_action, SubmitToolApprovalAction):
tool_calls = run.required_action.submit_tool_approval.tool_calls
if not tool_calls:
print("No tool calls provided - cancelling run")
agents_client.runs.cancel(thread_id=thread.id, run_id=run.id)
break
tool_approvals = []
for tool_call in tool_calls:
if isinstance(tool_call, RequiredMcpToolCall):
try:
print(f"Approving tool call: {tool_call}")
tool_approvals.append(
ToolApproval(
tool_call_id=tool_call.id,
approve=True,
headers=mcp_tool.headers,
)
)
except Exception as e:
print(f"Error approving tool_call {tool_call.id}: {e}")
if tool_approvals:
agents_client.runs.submit_tool_outputs(
thread_id=thread.id, run_id=run.id, tool_approvals=tool_approvals
)
print(f"Current run status: {run.status}")
print(f"Run completed with status: {run.status}")
# Display conversation
messages = agents_client.messages.list(thread_id=thread.id)
print("\nConversation:")
print("-" * 50)
for msg in messages:
if msg.text_messages:
last_text = msg.text_messages[-1]
print(f"{msg.role.upper()}: {last_text.text.value}")
print("-" * 50)Note Poți rula acest notebook
#r "nuget: Azure.AI.Agents.Persistent, 1.1.0-beta.4"
#r "nuget: Azure.Identity, 1.14.2"using Azure.AI.Agents.Persistent;
using Azure.Identity;var projectEndpoint = "https://your-project-endpoint.services.ai.azure.com/api/projects/your-project";
var modelDeploymentName = "Your AOAI Model Deployment";
var mcpServerUrl = "https://learn.microsoft.com/api/mcp";
var mcpServerLabel = "mslearn";
PersistentAgentsClient agentClient = new(projectEndpoint, new DefaultAzureCredential());MCPToolDefinition mcpTool = new(mcpServerLabel, mcpServerUrl);PersistentAgent agent = await agentClient.Administration.CreateAgentAsync(
model: modelDeploymentName,
name: "my-learn-agent",
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: [mcpTool]
);// Create thread and message
PersistentAgentThread thread = await agentClient.Threads.CreateThreadAsync();
PersistentThreadMessage message = await agentClient.Messages.CreateMessageAsync(
thread.Id,
MessageRole.User,
"What's difference between Azure OpenAI and OpenAI?");
// Configure tool resources with headers
MCPToolResource mcpToolResource = new(mcpServerLabel);
mcpToolResource.UpdateHeader("SuperSecret", "123456");
ToolResources toolResources = mcpToolResource.ToToolResources();
// Create and handle run
ThreadRun run = await agentClient.Runs.CreateRunAsync(thread, agent, toolResources);
while (run.Status == RunStatus.Queued || run.Status == RunStatus.InProgress || run.Status == RunStatus.RequiresAction)
{
await Task.Delay(TimeSpan.FromMilliseconds(1000));
run = await agentClient.Runs.GetRunAsync(thread.Id, run.Id);
if (run.Status == RunStatus.RequiresAction && run.RequiredAction is SubmitToolApprovalAction toolApprovalAction)
{
var toolApprovals = new List<ToolApproval>();
foreach (var toolCall in toolApprovalAction.SubmitToolApproval.ToolCalls)
{
if (toolCall is RequiredMcpToolCall mcpToolCall)
{
Console.WriteLine($"Approving MCP tool call: {mcpToolCall.Name}");
toolApprovals.Add(new ToolApproval(mcpToolCall.Id, approve: true)
{
Headers = { ["SuperSecret"] = "123456" }
});
}
}
if (toolApprovals.Count > 0)
{
run = await agentClient.Runs.SubmitToolOutputsToRunAsync(thread.Id, run.Id, toolApprovals: toolApprovals);
}
}
}
// Display messages
using Azure;
AsyncPageable<PersistentThreadMessage> messages = agentClient.Messages.GetMessagesAsync(
threadId: thread.Id,
order: ListSortOrder.Ascending
);
await foreach (PersistentThreadMessage threadMessage in messages)
{
Console.Write($"{threadMessage.CreatedAt:yyyy-MM-dd HH:mm:ss} - {threadMessage.Role,10}: ");
foreach (MessageContent contentItem in threadMessage.ContentItems)
{
if (contentItem is MessageTextContent textItem)
{
Console.Write(textItem.Text);
}
else if (contentItem is MessageImageFileContent imageFileItem)
{
Console.Write($"<image from ID: {imageFileItem.FileId}>");
}
Console.WriteLine();
}
}Când configurezi uneltele MCP pentru agentul tău, poți specifica mai mulți parametri importanți:
mcp_tool = McpTool(
server_label="unique_server_name", # Identifier for the MCP server
server_url="https://api.example.com/mcp", # MCP server endpoint
allowed_tools=[], # Optional: specify allowed tools
)MCPToolDefinition mcpTool = new(
"unique_server_name", // Server label
"https://api.example.com/mcp" // MCP server URL
);Ambele implementări suportă antete personalizate pentru autentificare:
mcp_tool.update_headers("SuperSecret", "123456")MCPToolResource mcpToolResource = new(mcpServerLabel);
mcpToolResource.UpdateHeader("SuperSecret", "123456");- Verifică dacă URL-ul serverului MCP este accesibil
- Verifică credențialele de autentificare
- Asigură-te că există conectivitate de rețea
- Revizuiește argumentele și formatul apelului uneltei
- Verifică cerințele specifice serverului
- Implementează o gestionare corectă a erorilor
- Optimizează frecvența apelurilor către unelte
- Folosește caching acolo unde este potrivit
- Monitorizează timpii de răspuns ai serverului
Pentru a-ți îmbunătăți integrarea MCP:
- Explorează servere MCP personalizate: Construiește propriile servere MCP pentru surse de date proprietare
- Implementează securitate avansată: Adaugă OAuth2 sau mecanisme personalizate de autentificare
- Monitorizare și analiză: Implementează logare și monitorizare pentru utilizarea uneltelor
- Scalează soluția: Ia în considerare echilibrarea încărcării și arhitecturi distribuite pentru serverele MCP
- Documentația Azure AI Foundry
- Exemple Model Context Protocol
- Prezentare generală Azure AI Foundry Agents
- Specificația MCP
Pentru suport suplimentar și întrebări:
- Consultă documentația Azure AI Foundry
- Verifică resursele comunității MCP
Declinare de responsabilitate:
Acest document a fost tradus folosind serviciul de traducere AI Co-op Translator. Deși ne străduim pentru acuratețe, vă rugăm să rețineți că traducerile automate pot conține erori sau inexactități. Documentul original în limba sa nativă trebuie considerat sursa autorizată. Pentru informații critice, se recomandă traducerea profesională realizată de un specialist uman. Nu ne asumăm răspunderea pentru eventualele neînțelegeri sau interpretări greșite rezultate din utilizarea acestei traduceri.