Sdílet prostřednictvím


Začínáme používat Azure MCP Server s Pythonem

Azure MCP Server používá protokol MCP (Model Context Protocol) ke standardizaci integrací mezi aplikacemi AI a externími nástroji a zdroji dat, což umožňuje systémům AI provádět operace, které o vašich prostředcích Azure vědí kontext.

V tomto článku se dozvíte, jak provést následující úlohy:

  • Instalace a ověření na serveru Azure MCP
  • Připojení k Azure MCP Serveru pomocí vlastního klienta Pythonu
  • Spuštění výzvy k otestování operací serveru Azure MCP a správy prostředků Azure

Požadavky

Poznámka:

Prostředky Azure, ke kterým chcete získat přístup pomocí Azure MCP Serveru, už musí existovat v rámci vašeho předplatného Azure. Kromě toho musí mít váš uživatelský účet přiřazené potřebné role a oprávnění RBAC pro tyto prostředky.

Přihlášení pro místní vývoj

Azure MCP Server poskytuje bezproblémové ověřování pomocí ověřování založeného na tokenech přes Microsoft Entra ID. Azure MCP Server interně používá DefaultAzureCredential k ověřování uživatelů z knihovny identit Azure .

Abyste mohli pracovat s Azure MCP Serverem DefaultAzureCredential , musíte se přihlásit k některému z nástrojů podporovaných místně pomocí účtu Azure. Přihlaste se pomocí okna terminálu, jako je terminál editoru Visual Studio Code:

az login

Po úspěšném přihlášení k některému z předchozích nástrojů může Azure MCP Server automaticky zjišťovat vaše přihlašovací údaje a používat je k ověřování a provádění operací se službami Azure.

Poznámka:

K Azure se můžete také přihlásit prostřednictvím sady Visual Studio. Azure MCP Server dokáže spouštět jenom operace, které má přihlášený uživatel oprávnění provádět.

Vytvoření aplikace v Pythonu

Provedením následujících kroků vytvořte aplikaci v Pythonu. Aplikace se připojí k modelu AI a funguje jako hostitel klienta MCP, který se připojuje k serveru Azure MCP.

Vytvoření projektu

  1. Ve zvoleném editoru otevřete prázdnou složku.

  2. Vytvořte nový soubor s názvem requirements.txt a přidejte následující závislosti knihovny:

    mcp
    azure-identity
    openai
    logging
    
  3. Ve stejné složce vytvořte nový soubor s názvem .env a přidejte následující proměnné prostředí:

    AZURE_OPENAI_ENDPOINT=<your-azure-openai-endpoint>
    AZURE_OPENAI_MODEL=<your-model-deployment-name>
    
  4. Vytvořte prázdný soubor s názvem main.py pro uložení kódu pro vaši aplikaci.

Vytvoření prostředí a instalace závislostí

  1. Otevřete terminál v nové složce a vytvořte pro aplikaci virtuální prostředí Pythonu:

    python -m venv venv
    
  2. Aktivujte virtuální prostředí:

    venv\Scripts\activate
    
  3. Nainstalujte závislosti z requirements.txt:

    pip install -r requirements.txt
    

Přidání kódu aplikace

Aktualizujte obsah Main.py následujícím kódem:

from azure.identity import DefaultAzureCredential, get_bearer_token_provider
from openai import AzureOpenAI
from mcp import ClientSession, StdioServerParameters, types
from mcp.client.stdio import stdio_client
import json, os, logging, asyncio
from dotenv import load_dotenv

# Setup logging and load environment variables
logger = logging.getLogger(__name__)
load_dotenv()

# Azure OpenAI configuration
AZURE_OPENAI_ENDPOINT = os.getenv("AZURE_OPENAI_ENDPOINT")
AZURE_OPENAI_MODEL = os.getenv("AZURE_OPENAI_MODEL", "gpt-4o")

# Initialize Azure credentials
token_provider = get_bearer_token_provider(
    DefaultAzureCredential(), "https://cognitiveservices.azure.com/.default"
)

async def run():
    # Initialize Azure OpenAI client
    client = AzureOpenAI(
            azure_endpoint=AZURE_OPENAI_ENDPOINT, 
            api_version="2024-04-01-preview", 
            azure_ad_token_provider=token_provider
        )

    # MCP client configurations
    server_params = StdioServerParameters(
        command="npx",
        args=["-y", "@azure/mcp@latest", "server", "start"],
        env=None
    )

    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            await session.initialize()

            # List available tools
            tools = await session.list_tools()
            for tool in tools.tools: print(tool.name)

            # Format tools for Azure OpenAI
            available_tools = [{
                "type": "function",
                "function": {
                    "name": tool.name,
                    "description": tool.description,
                    "parameters": tool.inputSchema
                }
            } for tool in tools.tools]

            # Start conversational loop
            messages = []
            while True:
                try:
                    user_input = input("\nPrompt: ")
                    messages.append({"role": "user", "content": user_input})

                    # First API call with tool configuration
                    response = client.chat.completions.create(
                        model = AZURE_OPENAI_MODEL,
                        messages = messages,
                        tools = available_tools)

                    # Process the model's response
                    response_message = response.choices[0].message
                    messages.append(response_message)

                    # Handle function calls
                    if response_message.tool_calls:
                        for tool_call in response_message.tool_calls:
                                function_args = json.loads(tool_call.function.arguments)
                                result = await session.call_tool(tool_call.function.name, function_args)

                                # Add the tool response to the messages
                                messages.append({
                                    "tool_call_id": tool_call.id,
                                    "role": "tool",
                                    "name": tool_call.function.name,
                                    "content": result.content,
                                })
                    else:
                        logger.info("No tool calls were made by the model")

                    # Get the final response from the model
                    final_response = client.chat.completions.create(
                        model = AZURE_OPENAI_MODEL,
                        messages = messages,
                        tools = available_tools)

                    for item in final_response.choices:
                        print(item.message.content)
                except Exception as e:
                    logger.error(f"Error in conversation loop: {e}")
                    print(f"An error occurred: {e}")

if __name__ == "__main__":
    import asyncio
    asyncio.run(run())

Předchozí kód provádí následující úlohy:

  • Nastaví protokolování a načte proměnné prostředí ze .env souboru.
  • Konfiguruje klienta Azure OpenAI pomocí azure-identity a openai knihoven.
  • Inicializuje klienta MCP pro interakci se serverem Azure MCP pomocí standardního přenosu vstupně-výstupních operací.
  • Načte a zobrazí seznam dostupných nástrojů ze serveru MCP.
  • Implementuje konverzační smyčku pro zpracování výzev uživatelů, využití nástrojů a zpracování volání nástrojů.

Spuštění a otestování aplikace

Provedením následujících kroků otestujte hostitelskou aplikaci .NET:

  1. V okně terminálu otevřete kořen projektu a spusťte aplikaci spuštěním následujícího příkazu:

    python main.py
    
  2. Po spuštění aplikace zadejte následující testovací výzvu:

    List all of the resource groups in my subscription
    

    Výstup předchozí výzvy by měl vypadat podobně jako v následujícím textu:

    The following resource groups are available for your subscription:
    
    1. **DefaultResourceGroup-EUS** (Location: `eastus`)
    2. **rg-testing** (Location: `centralus`)
    3. **rg-azd** (Location: `eastus2`)
    4. **msdocs-sample** (Location: `southcentralus`)
    14. **ai-testing** (Location: `eastus2`)
    
    Let me know if you need further details or actions related to any of these resource groups!
    
  3. Prozkoumejte a otestujte operace Azure MCP pomocí dalších relevantních výzev, například:

    List all of the storage accounts in my subscription
    Get the available tables in my storage accounts
    

Další kroky