Condividi tramite


Introduzione all'uso del server MCP di Azure con .NET

Il server MCP di Azure usa il protocollo MCP (Model Context Protocol) per standardizzare le integrazioni tra app di intelligenza artificiale e strumenti esterni e origini dati, consentendo ai sistemi di intelligenza artificiale di eseguire operazioni con riconoscimento del contesto delle risorse di Azure.

In questo articolo si apprenderà come completare le attività seguenti:

  • Installare ed eseguire l'autenticazione nel server MCP di Azure
  • Connettersi al server MCP di Azure usando un client .NET personalizzato
  • Eseguire richieste di test delle operazioni del server MCP di Azure e gestire le risorse di Azure

Prerequisiti

Annotazioni

Le risorse di Azure a cui si intende accedere con il server MCP di Azure devono già esistere all'interno della sottoscrizione di Azure. Inoltre, l'account utente deve avere i ruoli e le autorizzazioni di controllo degli accessi in base al ruolo necessari assegnati per tali risorse.

Accesso per lo sviluppo locale

Il server MCP di Azure offre un'esperienza di autenticazione senza problemi usando l'autenticazione basata su token tramite Microsoft Entra ID. Internamente, il server MCP di Azure usa DefaultAzureCredential la libreria di identità di Azure per autenticare gli utenti.

È necessario accedere a uno degli strumenti supportati in DefaultAzureCredential locale con l'account Azure per usare il server MCP di Azure. Accedere usando una finestra del terminale, ad esempio il terminale di Visual Studio Code:

Dopo aver eseguito l'accesso a uno degli strumenti precedenti, Il server MCP di Azure può individuare automaticamente le credenziali e usarle per autenticare ed eseguire operazioni sui servizi di Azure.

Annotazioni

È anche possibile accedere ad Azure tramite Visual Studio. Il server MCP di Azure è in grado di eseguire solo operazioni che l'utente connesso dispone delle autorizzazioni da eseguire.

Creare l'app host .NET

Completare i passaggi seguenti per creare un'app console .NET. L'app si connette a un modello di intelligenza artificiale e funge da host per un client MCP che si connette a un server MCP di Azure.

Creare il progetto

  1. Aprire un terminale in una cartella vuota in cui si vuole creare il progetto.

  2. Eseguire il comando seguente per creare una nuova applicazione console .NET:

    dotnet new console -n MCPHostApp
    
  3. Passare alla cartella del progetto appena creata:

    cd MCPHostApp
    
  4. Aprire la cartella del progetto nell'editor preferito, ad esempio Visual Studio Code:

    code .
    

Aggiungere le dipendenze

  1. Nel terminale eseguire i comandi seguenti per aggiungere i pacchetti NuGet necessari:

    dotnet add package Azure.AI.OpenAI --prerelease
    dotnet add package Azure.Identity
    dotnet add package Microsoft.Extensions.AI --prerelease
    dotnet add package Microsoft.Extensions.AI.OpenAI --prerelease
    dotnet add package ModelContextProtocol --prerelease
    
  2. Verificare che i pacchetti siano stati aggiunti controllando il MCPHostApp.csproj file.

  3. Eseguire il comando seguente per compilare il progetto e assicurarsi che tutto sia configurato correttamente:

    dotnet build
    

Aggiungere il codice dell'app

Sostituire il contenuto di Program.cs con il codice seguente:

using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;

// Create an IChatClient
IChatClient client =
    new ChatClientBuilder(
        new AzureOpenAIClient(new Uri("<your-azure-openai-endpoint>"), 
        new DefaultAzureCredential())
        .GetChatClient("gpt-4o").AsIChatClient())
    .UseFunctionInvocation()
    .Build();

// Create the MCP client
var mcpClient = await McpClient.CreateAsync(
    new StdioClientTransport(new()
    {
        Command = "npx",
        Arguments = ["-y", "@azure/mcp@latest", "server", "start"],
        Name = "Azure MCP",
    }));

// Get all available tools from the MCP server
Console.WriteLine("Available tools:");
var tools = await mcpClient.ListToolsAsync();
foreach (var tool in tools)
{
    Console.WriteLine($"{tool}");
}
Console.WriteLine();

// Conversational loop that can utilize the tools
List<ChatMessage> messages = [];
while (true)
{
    Console.Write("Prompt: ");
    messages.Add(new(ChatRole.User, Console.ReadLine()));

    List<ChatResponseUpdate> updates = [];
    await foreach (var update in client
        .GetStreamingResponseAsync(messages, new() { Tools = [.. tools] }))
    {
        Console.Write(update);
        updates.Add(update);
    }
    Console.WriteLine();

    messages.AddMessages(updates);
}

Il codice precedente esegue le attività seguenti:

  • Inizializza un'astrazione IChatClient utilizzando le Microsoft.Extensions.AI librerie.
  • Crea un client MCP per interagire con il server MCP di Azure usando un trasporto di I/O standard. Il comando fornito npx e gli argomenti corrispondenti scaricano e avviano il server MCP di Azure.
  • Recupera e visualizza un elenco di strumenti disponibili dal server MCP, che è una funzione MCP standard.
  • Implementa un ciclo di conversazione che elabora le richieste degli utenti e usa gli strumenti per le risposte.

Eseguire e testare l'app

Completare i passaggi seguenti per testare l'app host .NET:

  1. In una finestra del terminale aperta alla radice del progetto eseguire il comando seguente per avviare l'app:

    dotnet run
    
  2. Dopo l'esecuzione dell'app, immettere il prompt di test seguente:

    List all of the resource groups in my subscription
    

    L'output per il prompt precedente dovrebbe essere simile al testo seguente:

    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. Esplorare e testare le operazioni MCP di Azure usando altre richieste pertinenti, ad esempio:

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

Passaggi successivi