Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
V tomto kurzu se dozvíte, jak zpřístupnit funkce aplikace ASP.NET Core prostřednictvím protokolu MCP (Model Context Protocol), přidat ho jako nástroj do GitHub Copilotu a pracovat s aplikací pomocí přirozeného jazyka v režimu agenta Copilot Chat.
Pokud už vaše webová aplikace obsahuje užitečné funkce, jako jsou nákupy, rezervace hotelů nebo správa dat, je snadné tyto funkce zpřístupnit pro:
- Každá aplikace, která podporuje integraci MCP, jako je režim agenta chatu GitHub Copilot v editoru Visual Studio Code nebo GitHub Codespaces.
- Vlastní agent, který přistupuje ke vzdáleným nástrojům pomocí klienta MCP.
Přidáním serveru MCP do webové aplikace povolíte agentovi pochopit a používat funkce vaší aplikace, když reaguje na výzvy uživatele. To znamená, že cokoli může vaše aplikace dělat, agent může také provádět.
- Přidejte server MCP do webové aplikace.
- Otestujte server MCP místně v režimu agenta chatu GitHub Copilot.
- Nasaďte server MCP do služby Azure App Service a připojte se k němu v chatu GitHub Copilot.
Požadavky
V tomto kurzu se předpokládá, že pracujete s ukázkou použitou v kurzu: Nasadíte aplikaci ASP.NET Core a Azure SQL Database do služby Azure App Service.
Alespoň otevřete ukázkovou aplikaci v GitHub Codespaces a nasaďte aplikaci spuštěním azd up.
Přidání serveru MCP do webové aplikace
V terminálu codespace přidejte balíček NuGet
ModelContextProtocol.AspNetCoredo projektu:dotnet add package ModelContextProtocol.AspNetCore --prereleaseVytvořte složku McpServer a vytvořte v ní TodosMcpTool.cs s následujícím kódem.
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."; } } }Výše uvedený kód zpřístupňuje nástroje pro server MCP pomocí následujících specifických atributů:
-
[McpServerToolType]: OznačíTodosMcpTooltřídu jako typ nástroje serveru MCP. Signalizuje architekturu MCP, že tato třída obsahuje metody, které by měly být vystaveny jako volatelné nástroje. -
[McpServerTool]: Označuje metodu jako volatelnou akci pro server MCP. -
[Description]: Ty poskytují popisy pro metody a parametry čitelné pro člověka. Pomáhá volajícímu agentu pochopit, jak používat akce a jejich parametry.
Tento kód duplikuje funkčnost existujícího
TodosControllerkódu, což je zbytečné, ale kvůli jednoduchosti ho zachováte. Osvědčeným postupem je přesunout logiku aplikace do třídy služby a pak volat metody služby zTodosControlleri zTodosMcpTool.-
V Program.cs zaregistrujte serverovou službu MCP a službu CORS.
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(); }); });Pokud používáte streamovatelné HTTP se serverem MCP, musíte povolit sdílení prostředků mezi zdroji (CORS), pokud ho chcete otestovat pomocí nástrojů klientského prohlížeče nebo GitHub Copilotu (v editoru Visual Studio Code i v GitHub Codespaces).
V Program.cs povolte middleware MCP a CORS.
app.MapMcp("/api/mcp"); app.UseCors();Tento kód nastaví koncový bod serveru MCP na
<url>/api/mcp.
Místní testování serveru MCP
V terminálu codespace spusťte aplikaci pomocí
dotnet runpříkazu .Vyberte Otevřít v prohlížeči a přidejte úkol.
Nechejte
dotnet runběžet. Váš server MCP teď běžíhttp://localhost:5093/api/mcp.Zpátky v codespace otevřete Copilot Chat a pak v poli výzvy vyberte režim agenta .
Vyberte tlačítko Nástroje a pak v rozevíracím seznamu vyberte Přidat další nástroje.
Vyberte Přidat server MCP.
Vyberte HTTP (HTTP nebo Server-Sent události).
V Zadejte adresu URL serveru zadejte http://localhost:5093/api/mcp.
Do pole Zadejte ID serveru zadejte todos-mcp nebo libovolný název, který se vám líbí.
Vyberte Nastavení pracovního prostoru.
V novém okně chatu Copilot zadejte něco jako "Ukaž mi úkoly."
GitHub Copilot ve výchozím nastavení zobrazí potvrzení zabezpečení při vyvolání serveru MCP. Zvolte Pokračovat.
Teď byste měli vidět odpověď, která značí, že volání nástroje MCP proběhlo úspěšně.
Nasazení serveru MCP do služby App Service
Zpátky v terminálu codespace nasaďte změny potvrzením změn (metoda GitHub Actions) nebo spuštěním
azd up(metoda Azure Developer CLI).Ve výstupu AZD vyhledejte adresu URL vaší aplikace. Adresa URL vypadá takto ve výstupu AZD:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <app-url>
Po
azd updokončení otevřete soubor .vscode/mcp.json. Změňte adresu URL na<app-url>/api/mcp.Nad upravenou konfigurací serveru MCP vyberte Spustit.
Spusťte nové okno GitHub Copilot Chatu. V agentu Copilot byste měli být schopni zobrazovat, vytvářet, aktualizovat a odstraňovat úlohy.
Osvědčené postupy zabezpečení
Když je server MCP volán agentem využívajícím velké jazykové modely (LLM), mějte na paměti útoky injekce promptu. Zvažte následující osvědčené postupy zabezpečení:
- Ověřování a autorizace: Zabezpečte server MCP pomocí ověřování Microsoft Entra, abyste zajistili, že k vašim nástrojům mají přístup jenom autorizovaní uživatelé nebo agenti. Podrobné pokyny najdete v tématu Volání protokolu Zabezpečeného modelového kontextu do služby Azure App Service ze sady Visual Studio Code s ověřováním Microsoft Entra.
- Ověřování vstupu a sanitizace: Ukázkový kód v tomto kurzu vynechá ověřování vstupu a sanitizaci pro jednoduchost a srozumitelnost. V produkčních scénářích vždy implementujte správnou validaci a sanitizaci, abyste ochránili svou aplikaci. Informace o ASP.NET Core najdete v tématu Ověření modelu v ASP.NET Core.
- HTTPS: Ukázka spoléhá na službu Azure App Service, která ve výchozím nastavení vynucuje HTTPS a poskytuje bezplatné certifikáty TLS/SSL k šifrování přenášených dat.
- Princip nejnižších oprávnění: Zpřístupněte pouze potřebné nástroje a data potřebná pro váš případ použití. Vyhněte se zveřejnění citlivých operací, pokud to není nutné.
- Omezování rychlosti a omezování: Použití služby API Management nebo vlastního middlewaru k prevenci zneužití a útoků na dostupnost služby.
- Protokolování a monitorování: Přístup k protokolům a využití koncových bodů MCP pro auditování a detekci anomálií Monitorování podezřelých aktivit
- Konfigurace CORS: Omezte požadavky mezi zdroji na důvěryhodné domény, pokud je váš server MCP přístupný z prohlížečů. Další informace najdete v tématu Povolení CORS.
- Pravidelné aktualizace: Udržujte závislosti aktuální a zmírněte tak známá ohrožení zabezpečení.