Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här självstudien får du lära dig hur du exponerar en ASP.NET Core-appens funktioner via Model Context Protocol (MCP), lägger till den som ett verktyg i GitHub Copilot och interagerar med din app med naturligt språk i Copilot Chat-agentläge.
Om ditt webbprogram redan har användbara funktioner, till exempel shopping, hotellbokning eller datahantering, är det enkelt att göra dessa funktioner tillgängliga för:
- Alla program som stöder MCP-integrering, till exempel GitHub Copilot Chattagentläge i Visual Studio Code eller i GitHub Codespaces.
- En anpassad agent som använder fjärrverktyg med hjälp av en MCP-klient.
Genom att lägga till en MCP-server i webbappen gör du det möjligt för en agent att förstå och använda appens funktioner när den svarar på användarfrågor. Det innebär att allt din app kan göra kan agenten också göra.
- Lägg till en MCP-server i webbappen.
- Testa MCP-servern lokalt i GitHub Copilot Chat-agentläge.
- Distribuera MCP-servern till Azure App Service och anslut till den i GitHub Copilot Chat.
Förutsättningar
Den här självstudien förutsätter att du arbetar med exemplet som används i Självstudie: Distribuera en ASP.NET Core- och Azure SQL Database-app till Azure App Service.
Öppna minst exempelprogrammet i GitHub Codespaces och distribuera appen genom att köra azd up.
Lägga till MCP-server i webbappen
Lägg till NuGet-paketet
ModelContextProtocol.AspNetCorei projektet i codespace-terminalen:dotnet add package ModelContextProtocol.AspNetCore --prereleaseSkapa en McpServer-mapp och skapa en TodosMcpTool.cs i den med följande kod.
using DotNetCoreSqlDb.Data; using DotNetCoreSqlDb.Models; using Microsoft.EntityFrameworkCore; using System.ComponentModel; using ModelContextProtocol.Server; namespace DotNetCoreSqlDb.McpServer { [McpServerToolType] public class TodosMcpTool { private readonly MyDatabaseContext _db; public TodosMcpTool(MyDatabaseContext db) { _db = db; } [McpServerTool, Description("Creates a new todo with a description and creation date.")] public async Task<string> CreateTodoAsync( [Description("Description of the todo")] string description, [Description("Creation date of the todo")] DateTime createdDate) { var todo = new Todo { Description = description, CreatedDate = createdDate }; _db.Todo.Add(todo); await _db.SaveChangesAsync(); return $"Todo created: {todo.Description} (Id: {todo.ID})"; } [McpServerTool, Description("Reads all todos, or a single todo if an id is provided.")] public async Task<List<Todo>> ReadTodosAsync( [Description("Id of the todo to read (optional)")] string? id = null) { if (!string.IsNullOrWhiteSpace(id) && int.TryParse(id, out int todoId)) { var todo = await _db.Todo.FindAsync(todoId); if (todo == null) return new List<Todo>(); return new List<Todo> { todo }; } var todos = await _db.Todo.OrderBy(t => t.ID).ToListAsync(); return todos; } [McpServerTool, Description("Updates the specified todo fields by id.")] public async Task<string> UpdateTodoAsync( [Description("Id of the todo to update")] string id, [Description("New description (optional)")] string? description = null, [Description("New creation date (optional)")] DateTime? createdDate = null) { if (!int.TryParse(id, out int todoId)) return "Invalid todo id."; var todo = await _db.Todo.FindAsync(todoId); if (todo == null) return $"Todo with Id {todoId} not found."; if (!string.IsNullOrWhiteSpace(description)) todo.Description = description; if (createdDate.HasValue) todo.CreatedDate = createdDate.Value; await _db.SaveChangesAsync(); return $"Todo {todo.ID} updated."; } [McpServerTool, Description("Deletes a todo by id.")] public async Task<string> DeleteTodoAsync( [Description("Id of the todo to delete")] string id) { if (!int.TryParse(id, out int todoId)) return "Invalid todo id."; var todo = await _db.Todo.FindAsync(todoId); if (todo == null) return $"Todo with Id {todoId} not found."; _db.Todo.Remove(todo); await _db.SaveChangesAsync(); return $"Todo {todo.ID} deleted."; } } }Koden ovan gör verktyg tillgängliga för MCP-servern med hjälp av följande specifika attribut:
-
[McpServerToolType]: MarkerarTodosMcpToolklassen som en MCP-serververktygstyp. Den signalerar till MCP-ramverket att den här klassen innehåller metoder som ska exponeras som anropsbara verktyg. -
[McpServerTool]: Markerar en metod som en anropsbar åtgärd för MCP-servern. -
[Description]: Dessa ger läsbara beskrivningar för metoder och parametrar. Det hjälper anropande agenten att förstå hur man använder åtgärderna och deras parametrar.
Den här koden duplicerar funktionerna i den befintliga
TodosController, vilket är onödigt, men du behåller den för enkelhetens skull. Bästa praxis är att flytta applogik till en tjänstklass och sedan anropa tjänstmetoderna både frånTodosControlleroch frånTodosMcpTool.-
I Program.cs registrerar du MCP-servertjänsten och CORS-tjänsten.
builder.Services.AddMcpServer() .WithHttpTransport() // With streamable HTTP .WithToolsFromAssembly(); // Add all classes marked with [McpServerToolType] builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); });När du använder strömmande HTTP med MCP-servern måste du aktivera Resursdelning mellan ursprung (CORS) om du vill testa den med klientwebbläsareverktyg eller GitHub Copilot (både i Visual Studio Code och i GitHub Codespaces).
I Program.cs aktiverar du MCP- och CORS-mellanprogrammet.
app.MapMcp("/api/mcp"); app.UseCors();Den här koden anger MCP-serverslutpunkten till
<url>/api/mcp.
Testa MCP-servern lokalt
I kodområdesterminalen kör du programmet med
dotnet run.Välj Öppna i webbläsare och lägg sedan till en aktivitet.
Lämna
dotnet runigång. MCP-servern är igånghttp://localhost:5093/api/mcpnu.Gå tillbaka till kodområdet, öppna Copilot Chat och välj sedan Agentläge i promptrutan.
Välj knappen Verktyg och välj sedan Lägg till fler verktyg... i listrutan.
Välj Lägg till MCP-server.
Välj HTTP (HTTP eller Server-Sent-händelser).
I Ange server-URL skriver du http://localhost:5093/api/mcp.
I Ange server-ID skriver du todos-mcp eller vilket namn du vill.
Välj Inställningar för arbetsyta.
I ett nytt Copilot Chat-fönster skriver du något i stil med "Visa mig todos".
Som standard visar GitHub Copilot en säkerhetsbekräftelse när du anropar en MCP-server. Välj Fortsätt.
Nu bör du se ett svar som anger att MCP-verktygsanropet lyckas.
Distribuera MCP-servern till App Service
Tillbaka i kodområdesterminalen distribuerar du dina ändringar genom att genomföra dina ändringar (GitHub Actions-metod) eller köra
azd up(Azure Developer CLI-metod).Leta reda på appens URL i AZD-utdata. URL:en ser ut så här i AZD-utdata:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <app-url>
När du är klar med
azd upöppnar du .vscode/mcp.json. Ändra URL:en till<app-url>/api/mcp.Välj Starta ovanför den ändrade MCP-serverkonfigurationen.
Starta ett nytt GitHub Copilot Chat-fönster. Du bör kunna visa, skapa, uppdatera och ta bort uppgifter i Copilot-agenten.
Metodtips för säkerhet
När MCP-servern anropas av en agent som drivs av stora språkmodeller (LLM) bör du vara medveten om snabba inmatningsattacker . Överväg följande metodtips för säkerhet:
- Autentisering och auktorisering: Skydda MCP-servern med Microsoft Entra-autentisering för att säkerställa att endast behöriga användare eller agenter kan komma åt dina verktyg. En stegvis guide finns i Secure Model Context Protocol-anrop till Azure App Service från Visual Studio Code med Microsoft Entra-autentisering .
- Validering och sanering av indata: Exempelkoden i den här självstudien utelämnar validering och sanering av indata för enkelhetens skull och tydlighet. I produktionsscenarier implementerar du alltid korrekt validering och sanering för att skydda ditt program. För ASP.NET Core, se Modellverifiering i ASP.NET Core.
- HTTPS: Exemplet förlitar sig på Azure App Service, som framtvingar HTTPS som standard och tillhandahåller kostnadsfria TLS/SSL-certifikat för att kryptera data under överföring.
- Lägsta behörighetsprincip: Exponera endast nödvändiga verktyg och data som krävs för ditt användningsfall. Undvik att exponera känsliga operationer om det inte är nödvändigt.
- Hastighetsbegränsning och begränsning: Använd API Management eller anpassade mellanprogram för att förhindra missbruk och överbelastningsattacker.
- Loggning och övervakning: Loggåtkomst och användning av MCP-slutpunkter för granskning och avvikelseidentifiering. Övervaka misstänkt aktivitet.
- CORS-konfiguration: Begränsa mellanursprungsbegäranden till pålitliga domäner om din MCP-server nås från webbläsare. Mer information finns i Aktivera CORS.
- Regelbundna uppdateringar: Håll dina beroenden uppdaterade för att minimera kända sårbarheter.