Files
2026-07-13 13:31:35 +08:00

404 lines
17 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"id": "b8c57858",
"metadata": {},
"source": [
"# Azure AI Agents s podporou Model Context Protocol (MCP) - Python\n",
"\n",
"Tento notebook ukazuje, jak používat Azure AI Agents s nástroji Model Context Protocol (MCP) v Pythonu. Demonstruje, jak vytvořit inteligentního agenta, který může využívat externí MCP servery (například Microsoft Learn) pro rozšířené schopnosti pomocí autentizace bez klíče.\n"
]
},
{
"cell_type": "markdown",
"id": "2e6e4234",
"metadata": {},
"source": [
"## Instalace potřebných balíčků Pythonu\n",
"\n",
"Nejprve je nutné nainstalovat potřebné balíčky Pythonu:\n",
"- **azure-ai-projects**: Základní SDK pro Azure AI Projects\n",
"- **azure-ai-agents**: SDK pro Azure AI Agents pro vytváření a správu agentů\n",
"- **azure-identity**: Poskytuje bezklíčovou autentizaci pomocí DefaultAzureCredential\n",
"- **mcp**: Implementace Model Context Protocol pro Python\n"
]
},
{
"cell_type": "markdown",
"id": "6a2e9a05",
"metadata": {},
"source": [
"## Výhody autentizace bez klíčů\n",
"\n",
"Tento notebook demonstruje **autentizaci bez klíčů**, která přináší několik výhod:\n",
"- ✅ **Žádné API klíče k spravování** - Využívá autentizaci založenou na identitě Azure\n",
"- ✅ **Zvýšená bezpečnost** - Žádná tajemství uložená v kódu nebo konfiguračních souborech\n",
"- ✅ **Automatická rotace přihlašovacích údajů** - Azure se stará o správu životního cyklu přihlašovacích údajů\n",
"- ✅ **Řízení přístupu na základě rolí** - Používá Azure RBAC pro detailní nastavení oprávnění\n",
"- ✅ **Podpora více prostředí** - Funguje bez problémů jak v prostředí vývoje, tak v produkci\n",
"\n",
"`DefaultAzureCredential` automaticky vybírá nejlepší dostupný zdroj přihlašovacích údajů:\n",
"1. **Spravovaná identita** (při běhu v Azure)\n",
"2. Přihlašovací údaje z **Azure CLI** (během lokálního vývoje)\n",
"3. Přihlašovací údaje z **Visual Studio**\n",
"4. **Proměnné prostředí** (pokud jsou nastaveny)\n",
"5. Autentizace přes **interaktivní prohlížeč** (jako záložní možnost)\n"
]
},
{
"cell_type": "markdown",
"id": "43efa94d",
"metadata": {},
"source": [
"## Nastavení autentizace bez klíčů\n",
"\n",
"**Předpoklady pro autentizaci bez klíčů:**\n",
"\n",
"### Pro lokální vývoj:\n",
"```bash\n",
"# Install Azure CLI and login\n",
"az login\n",
"# Verify your identity\n",
"az account show\n",
"```\n",
"\n",
"### Pro prostředí Azure:\n",
"- Aktivujte **System-assigned Managed Identity** na vašem Azure zdroji\n",
"- Přiřaďte odpovídající **RBAC role** k této identitě:\n",
" - `Cognitive Services OpenAI User` pro přístup k Azure OpenAI\n",
" - `AI Developer` pro přístup k projektům Azure AI\n",
"\n",
"### Proměnné prostředí (volitelné):\n",
"```python\n",
"# These are automatically detected by DefaultAzureCredential\n",
"# AZURE_CLIENT_ID=<your-client-id>\n",
"# AZURE_CLIENT_SECRET=<your-client-secret>\n",
"# AZURE_TENANT_ID=<your-tenant-id>\n",
"```\n",
"\n",
"**Žádné API klíče ani připojovací řetězce nejsou potřeba!** 🔐\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "2e21387d",
"metadata": {},
"outputs": [],
"source": [
"! pip install azure-ai-projects -U\n",
"! pip install azure-ai-agents==1.1.0b4 -U\n",
"! pip install azure-identity -U\n",
"! pip install mcp==1.11.0 -U"
]
},
{
"cell_type": "markdown",
"id": "b31c8873",
"metadata": {},
"source": [
"## Importujte potřebné knihovny\n",
"\n",
"Importujte nezbytné Python moduly:\n",
"- **os, time**: Standardní Python knihovny pro proměnné prostředí a zpoždění\n",
"- **AIProjectClient**: Hlavní klient pro Azure AI Projects\n",
"- **DefaultAzureCredential**: Bezklíčová autentizace pro Azure služby\n",
"- **Třídy související s MCP**: Pro vytváření a správu MCP nástrojů a zpracování schválení\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "43667b32",
"metadata": {},
"outputs": [],
"source": [
"import os, time\n",
"from azure.ai.projects import AIProjectClient\n",
"from azure.identity import DefaultAzureCredential\n",
"from azure.ai.agents.models import McpTool, RequiredMcpToolCall, SubmitToolApprovalAction, ToolApproval\n"
]
},
{
"cell_type": "markdown",
"id": "721355e5",
"metadata": {},
"source": [
"## Nastavení konfigurace MCP serveru\n",
"\n",
"Nastavte konfiguraci MCP serveru pomocí proměnných prostředí s výchozími hodnotami:\n",
"- **MCP_SERVER_URL**: URL adresa MCP serveru (výchozí je Microsoft Learn API)\n",
"- **MCP_SERVER_LABEL**: Označení pro identifikaci MCP serveru (výchozí je \"mslearn\")\n",
"\n",
"Tento přístup umožňuje flexibilní konfiguraci napříč různými prostředími.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "189f3d55",
"metadata": {},
"outputs": [],
"source": [
"mcp_server_url = os.environ.get(\"MCP_SERVER_URL\", \"https://learn.microsoft.com/api/mcp\")\n",
"mcp_server_label = os.environ.get(\"MCP_SERVER_LABEL\", \"mslearn\")"
]
},
{
"cell_type": "markdown",
"id": "20612d9a",
"metadata": {},
"source": [
"## Vytvoření klienta Azure AI Project (Autentizace bez klíče)\n",
"\n",
"Inicializujte klienta Azure AI Project pomocí **autentizace bez klíče**:\n",
"- **endpoint**: URL koncového bodu projektu Azure AI Foundry\n",
"- **credential**: Používá `DefaultAzureCredential()` pro bezpečnou autentizaci bez klíče\n",
"- **Žádné API klíče nejsou potřeba**: Automaticky vyhledá a použije nejlepší dostupné přihlašovací údaje\n",
"\n",
"**Proces autentizace:**\n",
"1. Kontroluje Managed Identity (v prostředí Azure)\n",
"2. Přechází na přihlašovací údaje Azure CLI (pro lokální vývoj)\n",
"3. Používá další dostupné zdroje přihlašovacích údajů podle potřeby\n",
"\n",
"Tento přístup eliminuje potřebu spravovat API klíče nebo připojovací řetězce ve vašem kódu.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "36b1dbd8",
"metadata": {},
"outputs": [],
"source": [
"project_client = AIProjectClient(\n",
" endpoint=\"Your Azure AI Foundry Endpoint\",\n",
" credential=DefaultAzureCredential(),\n",
")"
]
},
{
"cell_type": "markdown",
"id": "cdb6ab8c",
"metadata": {},
"source": [
"## Vytvoření definice nástroje MCP\n",
"\n",
"Vytvořte nástroj MCP, který se připojuje k serveru Microsoft Learn MCP:\n",
"- **server_label**: Identifikátor pro server MCP\n",
"- **server_url**: URL endpoint serveru MCP\n",
"- **allowed_tools**: Volitelný seznam pro omezení, které nástroje mohou být použity (prázdný seznam umožňuje všechny nástroje)\n",
"\n",
"Tento nástroj umožní agentovi přístup k dokumentaci a zdrojům Microsoft Learn.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "51e7e136",
"metadata": {},
"outputs": [],
"source": [
"mcp_tool = McpTool(\n",
" server_label=mcp_server_label,\n",
" server_url=mcp_server_url,\n",
" allowed_tools=[], # Optional: specify allowed tools\n",
")\n"
]
},
{
"cell_type": "markdown",
"id": "6e894b0b",
"metadata": {},
"source": [
"## Vytvoření agenta a vedení konverzace (bez klíčů)\n",
"\n",
"Tato komplexní sekce ukazuje kompletní **workflow agenta bez klíčů**:\n",
"\n",
"1. **Vytvoření AI agenta**: Nastavte agenta s modelem GPT-4.1 nano a nástroji MCP\n",
"2. **Vytvoření vlákna**: Založte konverzační vlákno pro komunikaci\n",
"3. **Odeslání zprávy**: Zeptejte se agenta na rozdíly mezi Azure OpenAI a OpenAI\n",
"4. **Schvalování nástrojů**: Automaticky schvalujte volání nástrojů MCP, pokud je to potřeba\n",
"5. **Sledování průběhu**: Sledujte pokrok agenta a řešte případné požadované akce\n",
"6. **Zobrazení výsledků**: Zobrazte detaily konverzace a použití nástrojů\n",
"\n",
"**Funkce bez klíčů:**\n",
"- ✅ **Žádná pevně zakódovaná tajemství** - Veškeré ověřování je zajištěno identitou Azure\n",
"- ✅ **Bezpečné jako standard** - Používá řízení přístupu na základě rolí\n",
"- ✅ **Zjednodušené nasazení** - Není nutná správa přihlašovacích údajů\n",
"- ✅ **Přátelské k auditu** - Veškerý přístup je sledován prostřednictvím identity Azure\n",
"\n",
"Agent bude používat nástroje MCP k přístupu k Microsoft Learn zdrojům s plnou bezpečností a bez správy API klíčů.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "68c49af5",
"metadata": {},
"outputs": [],
"source": [
"with project_client:\n",
" agents_client = project_client.agents\n",
"\n",
" # Create a new agent with keyless authentication\n",
" # NOTE: To reuse existing agent, fetch it with get_agent(agent_id)\n",
" agent = agents_client.create_agent(\n",
" model=\"Your Azure OpenAI Model Deployment Name\",\n",
" name=\"my-mcp-agent\",\n",
" 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.\",\n",
" tools=mcp_tool.definitions,\n",
" )\n",
" print(f\"Created agent, ID: {agent.id}\")\n",
" print(f\"MCP Server: {mcp_tool.server_label} at {mcp_tool.server_url}\")\n",
"\n",
" # Create thread for communication\n",
" thread = agents_client.threads.create()\n",
" print(f\"Created thread, ID: {thread.id}\")\n",
"\n",
" # Create message to thread\n",
" message = agents_client.messages.create(\n",
" thread_id=thread.id,\n",
" role=\"user\",\n",
" content=\"What's difference between Azure OpenAI and OpenAI?\",\n",
" )\n",
" print(f\"Created message, ID: {message.id}\")\n",
"\n",
" # KEYLESS APPROACH: Handle tool approvals without hardcoded secrets\n",
" \n",
" # Option 1: Completely keyless (recommended for Azure identity-enabled MCP servers)\n",
" # run = agents_client.runs.create(thread_id=thread.id, agent_id=agent.id, tool_resources=mcp_tool.resources)\n",
" \n",
" # Option 2: With minimal headers (if MCP server requires specific headers)\n",
" # For demonstration purposes, using a placeholder header\n",
" mcp_tool.update_headers(\"SuperSecret\", \"123456\") # Replace with actual auth if needed\n",
" \n",
" # Set approval mode - uncomment next line to disable approval requirement completely\n",
" # mcp_tool.set_approval_mode(\"never\") # Fully automated, no approval needed\n",
" \n",
" run = agents_client.runs.create(thread_id=thread.id, agent_id=agent.id, tool_resources=mcp_tool.resources)\n",
" print(f\"Created run, ID: {run.id}\")\n",
"\n",
" while run.status in [\"queued\", \"in_progress\", \"requires_action\"]:\n",
" time.sleep(1)\n",
" run = agents_client.runs.get(thread_id=thread.id, run_id=run.id)\n",
"\n",
" if run.status == \"requires_action\" and isinstance(run.required_action, SubmitToolApprovalAction):\n",
" tool_calls = run.required_action.submit_tool_approval.tool_calls\n",
" if not tool_calls:\n",
" print(\"No tool calls provided - cancelling run\")\n",
" agents_client.runs.cancel(thread_id=thread.id, run_id=run.id)\n",
" break\n",
"\n",
" tool_approvals = []\n",
" for tool_call in tool_calls:\n",
" if isinstance(tool_call, RequiredMcpToolCall):\n",
" try:\n",
" print(f\"Approving tool call: {tool_call}\")\n",
" \n",
" # KEYLESS APPROVAL OPTIONS:\n",
" \n",
" # Option 1: No headers (fully keyless)\n",
" # tool_approvals.append(\n",
" # ToolApproval(\n",
" # tool_call_id=tool_call.id,\n",
" # approve=True,\n",
" # headers={} # No headers needed for keyless\n",
" # )\n",
" # )\n",
" \n",
" # Option 2: With headers (if MCP server requires them)\n",
" tool_approvals.append(\n",
" ToolApproval(\n",
" tool_call_id=tool_call.id,\n",
" approve=True,\n",
" headers=mcp_tool.headers, # Uses configured headers if needed\n",
" )\n",
" )\n",
" except Exception as e:\n",
" print(f\"Error approving tool_call {tool_call.id}: {e}\")\n",
"\n",
" print(f\"tool_approvals: {tool_approvals}\")\n",
" if tool_approvals:\n",
" agents_client.runs.submit_tool_outputs(\n",
" thread_id=thread.id, run_id=run.id, tool_approvals=tool_approvals\n",
" )\n",
"\n",
" print(f\"Current run status: {run.status}\")\n",
"\n",
" print(f\"Run completed with status: {run.status}\")\n",
" if run.status == \"failed\":\n",
" print(f\"Run failed: {run.last_error}\")\n",
"\n",
" # Display run steps and tool calls\n",
" run_steps = agents_client.run_steps.list(thread_id=thread.id, run_id=run.id)\n",
"\n",
" # Loop through each step\n",
" for step in run_steps:\n",
" print(f\"Step {step['id']} status: {step['status']}\")\n",
"\n",
" # Check if there are tool calls in the step details\n",
" step_details = step.get(\"step_details\", {})\n",
" tool_calls = step_details.get(\"tool_calls\", [])\n",
"\n",
" if tool_calls:\n",
" print(\" MCP Tool calls:\")\n",
" for call in tool_calls:\n",
" print(f\" Tool Call ID: {call.get('id')}\")\n",
" print(f\" Type: {call.get('type')}\")\n",
"\n",
" print() # add an extra newline between steps\n",
"\n",
" # Fetch and log all messages\n",
" messages = agents_client.messages.list(thread_id=thread.id)\n",
" print(\"\\nConversation:\")\n",
" print(\"-\" * 50)\n",
" for msg in messages:\n",
" if msg.text_messages:\n",
" last_text = msg.text_messages[-1]\n",
" print(f\"{msg.role.upper()}: {last_text.text.value}\")\n",
" print(\"-\" * 50)\n",
"\n",
" # Example of dynamic tool management (keyless)\n",
" print(f\"\\nDemonstrating keyless dynamic tool management:\")\n",
" print(f\"Current allowed tools: {mcp_tool.allowed_tools}\")\n",
" print(\"✅ All operations completed using keyless authentication!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby pro automatický překlad [Co-op Translator](https://github.com/Azure/co-op-translator). Ačkoli se snažíme o přesnost, mějte prosím na paměti, že automatické překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "demo",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.15"
},
"coopTranslator": {
"original_hash": "39a035fea0d10767dfcb0662bd3528fa",
"translation_date": "2025-08-26T21:39:58+00:00",
"source_file": "05-AdvancedTopics/mcp-foundry-agent-integration/mcp_support_python.ipynb",
"language_code": "cs"
}
},
"nbformat": 4,
"nbformat_minor": 5
}