Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu öğreticide, ASP.NET Core ve ModelContextProtocol.AspNetCore NuGet paketini kullanarak görev yönetimi araçlarını kullanıma sunan bir Model Bağlam Protokolü (MCP) sunucusu oluşturacaksınız. Sunucuyu Azure Container Apps'e dağıtır ve VS Code'da GitHub Copilot Sohbeti'nden bu sunucuya bağlanırsınız.
Bu eğitimde, siz:
- MCP araçlarını kullanıma sunan bir ASP.NET Core uygulaması oluşturma
- MCP sunucusunu GitHub Copilot ile yerel olarak test etme
- Uygulamayı kapsayıcıya alma ve Azure Container Apps'e dağıtma
- GitHub Copilot'ı dağıtılan MCP sunucusuna bağlama
Önkoşullar
- Aktif bir aboneliğe sahip bir Azure hesabı. Ücretsiz bir tane oluşturun.
- Azure CLI sürüm 2.62.0 veya üzeri.
- .NET 8 SDK veya üzeri.
- GitHub Copilot uzantısına sahip Visual Studio Code.
- Docker Desktop (isteğe bağlı - yalnızca kapsayıcıyı yerel olarak test etmek için gereklidir).
Uygulama iskelesini oluşturma
Bu bölümde yeni bir ASP.NET Core projesi oluşturacak ve bunu bir MCP sunucusu olarak yapılandıracaksınız.
Yeni bir ASP.NET Core Web API projesi oluşturun:
dotnet new web -n TasksMcpServer cd TasksMcpServerMCP sunucusu NuGet paketini ekleyin:
dotnet add package ModelContextProtocol.AspNetCore --prereleaseProgram.csiçeriğini aşağıdaki kodla değiştirin:var builder = WebApplication.CreateBuilder(args); builder.Services.AddMcpServer() .WithHttpTransport() .WithToolsFromAssembly(); builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod(); }); }); builder.Services.AddSingleton<TaskStore>(); var app = builder.Build(); app.UseCors(); app.MapGet("/health", () => Results.Ok("healthy")); app.MapMcp("/mcp"); app.Run();Önemli noktalar:
-
AddMcpServer().WithHttpTransport().WithToolsFromAssembly()MCP sunucusunu kaydeder ve ile[McpServerToolType]işaretlenmiş tüm sınıfları bulur. -
MapMcp("/mcp")akışı yapılabilir HTTP uç noktasını/mcpüzerinde konumlandırır. -
AddSingleton<TaskStore>()bir sonraki bölümde oluşturduğunuz bellek içi veri depoyu kaydeder. - Azure Container Apps sistem durumu yoklamaları için ayrı bir
/healthuç nokta eklersiniz. MCP uç noktaları, sistem durumu denetimleri olarak uygun olmayan JSON-RPC yanıtlar döndürür. - VS Code'daki GitHub Copilot, MCP sunucularına çıkış noktaları arası isteklerde bulunduğundan CORS'yi etkinleştirirsiniz.
-
MCP araçlarını tanımlama
Ardından, görev yönetimi veri depolarını ve bunu yapay zeka istemcilerine sunan MCP araçlarını tanımlayın.
Bellek içi veri deposu için adlı
TaskStore.csbir dosya oluşturun:namespace TasksMcpServer; public record TaskItem(int Id, string Title, string Description, bool IsComplete, DateTime CreatedAt); public class TaskStore { private readonly List<TaskItem> _tasks = new() { new(1, "Buy groceries", "Milk, eggs, bread", false, DateTime.UtcNow), new(2, "Write docs", "Draft the MCP tutorial", true, DateTime.UtcNow.AddDays(-1)), }; private int _nextId = 3; public List<TaskItem> GetAll() => _tasks.ToList(); public TaskItem? GetById(int id) => _tasks.FirstOrDefault(t => t.Id == id); public TaskItem Create(string title, string description) { var task = new TaskItem(_nextId++, title, description, false, DateTime.UtcNow); _tasks.Add(task); return task; } public TaskItem? ToggleComplete(int id) { var index = _tasks.FindIndex(t => t.Id == id); if (index < 0) return null; var old = _tasks[index]; var updated = old with { IsComplete = !old.IsComplete }; _tasks[index] = updated; return updated; } public bool Delete(int id) { var task = _tasks.FirstOrDefault(t => t.Id == id); if (task is null) return false; _tasks.Remove(task); return true; } }Kayıt,
TaskItembeş özelliğe sahip veri modelini tanımlar.TaskStoresınıfı, örnek verilerle önceden doldurulmuş bir bellek içi listeyi yönetir ve görevleri listelemek, bulmak, oluşturmak, geçiş yapmak ve silmek için yöntemler sağlar.MCP araç tanımlarıyla adlı
TasksMcpTools.csbir dosya oluşturun:using System.ComponentModel; using ModelContextProtocol.Server; namespace TasksMcpServer; [McpServerToolType] public class TasksMcpTools { private readonly TaskStore _store; public TasksMcpTools(TaskStore store) { _store = store; } [McpServerTool, Description("Lists all tasks with their ID, title, description, and completion status.")] public List<TaskItem> ListTasks() { return _store.GetAll(); } [McpServerTool, Description("Gets a single task by its ID.")] public TaskItem? GetTask( [Description("The numeric ID of the task to retrieve")] int id) { return _store.GetById(id); } [McpServerTool, Description("Creates a new task with the given title and description. Returns the created task.")] public TaskItem CreateTask( [Description("A short title for the task")] string title, [Description("A detailed description of what the task involves")] string description) { return _store.Create(title, description); } [McpServerTool, Description("Toggles a task's completion status between complete and incomplete.")] public string ToggleTaskComplete( [Description("The numeric ID of the task to toggle")] int id) { var task = _store.ToggleComplete(id); return task is not null ? $"Task {task.Id} is now {(task.IsComplete ? "complete" : "incomplete")}." : $"Task with ID {id} not found."; } [McpServerTool, Description("Deletes a task by its ID.")] public string DeleteTask( [Description("The numeric ID of the task to delete")] int id) { return _store.Delete(id) ? $"Task {id} deleted." : $"Task with ID {id} not found."; } }özniteliği sınıfını
[McpServerToolType]bir MCP araç sağlayıcısı olarak işaretler. Her[McpServerTool]yöntem çağrılabilen bir araç haline gelir. Yapay zeka modelinin her aracın amacını ve parametrelerini anlamasına yardımcı olmak için öznitelikleri kullanın[Description].
MCP sunucusunu yerel olarak test edin
Azure'a dağıtmadan önce MCP sunucusunun yerel olarak çalıştırıp GitHub Copilot'tan bağlanarak çalıştığını doğrulayın.
Uygulamayı çalıştırın:
dotnet runSunucu
http://localhost:5000üzerinde başlar (veya konsol çıkışında gösterilen bağlantı noktasında). MCP uç noktası konumundadırhttp://localhost:5000/mcp.VS Code'ı açın, ardından Copilot Sohbet'i açın ve Aracı modu'nu seçin.
Araçlar düğmesini ve ardından Daha Fazla Araç Ekle... öğesini seçin.>MCP Sunucusu ekleyin.
HTTP (HTTP veya Server-Sent Olayları) öğesini seçin.
Sunucu URL'sini girin:
http://localhost:5000/mcpBir sunucu kimliği girin:
tasks-mcpÇalışma Alanı Ayarları'nı seçin.
Yeni bir Copilot Sohbet isteminde şunu yazın: "Bana tüm görevleri göster"
GitHub Copilot, MCP aracını çağırmadan önce bir onay gösterir. Devamtuşuna basın.
Copilot'un bellek içi deponuzdan görev listesini döndürdiğini görmeniz gerekir.
Tavsiye
"PR'yi gözden geçirmek için bir görev oluştur", "Görev 1'i tamamlanmış olarak işaretle" veya "Görev 2'yi sil" gibi diğer istemleri deneyin.
Uygulamayı kapsayıcılı hale getirme
Uygulamayı Docker kapsayıcısı olarak paketleyerek Azure'a dağıtmadan önce yerel olarak test edebilirsiniz.
Proje kökünde bir
Dockerfileoluşturun:FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY *.csproj . RUN dotnet restore COPY . . RUN dotnet publish -c Release -o /app FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app COPY --from=build /app . ENV ASPNETCORE_URLS=http://+:8080 EXPOSE 8080 ENTRYPOINT ["dotnet", "TasksMcpServer.dll"]Çok aşamalı derleme, uygulamayı geri yüklemek, derlemek ve yayımlamak için SDK görüntüsünü kullanır, ardından yalnızca yayımlanan çıkışı daha küçük bir ASP.NET çalışma zamanı görüntüsüne kopyalar. Ortam
ASPNETCORE_URLSdeğişkeni, uygulamayı 8080 numaralı bağlantı noktasında dinleyecek şekilde yapılandırıyor.Kapsayıcının yerel olarak derlendiğini ve çalıştığını doğrulayın:
docker build -t tasks-mcp-server . docker run -p 8080:8080 tasks-mcp-serverSağlık uç noktasının yanıt verdiğini onaylayın:
curl http://localhost:8080/health
Azure Container Apps'a dağıtım
Uygulamayı kapsayıcıya aldıktan sonra Azure CLI kullanarak Azure Container Apps'e dağıtın. komutu az containerapp up kapsayıcı görüntüsünü bulutta oluşturur, bu nedenle bu adım için makinenizde Docker'a ihtiyacınız yoktur.
Ortam değişkenlerini ayarlama:
RESOURCE_GROUP="mcp-tutorial-rg" LOCATION="eastus" ENVIRONMENT_NAME="mcp-env" APP_NAME="tasks-mcp-server"Kaynak grubu oluşturma:
az group create --name $RESOURCE_GROUP --location $LOCATIONContainer Apps ortamı oluşturun:
az containerapp env create \ --name $ENVIRONMENT_NAME \ --resource-group $RESOURCE_GROUP \ --location $LOCATIONKapsayıcı uygulamasını dağıtma:
az containerapp up \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --environment $ENVIRONMENT_NAME \ --source . \ --ingress external \ --target-port 8080CORS'yi GitHub Copilot isteklerine izin verecek şekilde yapılandırın:
az containerapp ingress cors enable \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --allowed-origins "*" \ --allowed-methods "GET,POST,DELETE,OPTIONS" \ --allowed-headers "*"Uyarı
Üretim için joker karakter
*kaynaklarını belirli güvenilen kaynaklarla değiştirin. Yönergeler için bkz. Container Apps'te MCP sunucularının güvenliğini sağlama.Dağıtımı doğrulayın:
APP_URL=$(az containerapp show \ --name $APP_NAME \ --resource-group $RESOURCE_GROUP \ --query "properties.configuration.ingress.fqdn" -o tsv) curl https://$APP_URL/health
GitHub Copilot'ı dağıtılan sunucuya bağlama
MCP sunucusu Azure'da çalıştığına göre VS Code'u GitHub Copilot'ı dağıtılan uç noktaya bağlamak için yapılandırın.
Projenizde oluşturun veya güncelleştirin
.vscode/mcp.json:{ "servers": { "tasks-mcp-server": { "type": "http", "url": "https://<your-app-fqdn>/mcp" } } }<your-app-fqdn>değerini dağıtım çıktısından FQDN ile değiştirin.VS Code'da Aracı modunda Copilot Sohbet'i açın.
Sunucu otomatik olarak görünmüyorsa Araçlar düğmesini seçin ve listelendiğini doğrulayın
tasks-mcp-server. Gerekirse Başlat'ı seçin.Dağıtılan MCP sunucusunun yanıt verdiğini onaylamak için "Tüm görevlerimi listele" gibi bir istemle test edin.
Etkileşimli kullanım için ölçeklendirmeyi yapılandırma
Azure Container Apps, varsayılan olarak sıfır kopyaya ölçeklendirilebilir. Copilot gibi etkileşimli istemcilere hizmet veren MCP sunucuları için soğuk başlatmalar fark edilebilir gecikmelere neden olur. En az bir örneğin çalışmasını sağlamak için en düşük çoğaltma sayısını ayarlayın:
az containerapp update \
--name $APP_NAME \
--resource-group $RESOURCE_GROUP \
--min-replicas 1
Güvenlik konuları
Bu öğreticide basitlik için kimliği doğrulanmamış bir MCP sunucusu kullanılır. Üretimde bir MCP sunucusu çalıştırmadan önce aşağıdaki önerileri gözden geçirin. Büyük dil modelleri (LLM) tarafından desteklenen bir aracı MCP sunucunuzu aradığında, istem ekleme saldırılarına dikkat edin.
- Kimlik doğrulaması ve yetkilendirme: Microsoft Entra Id kullanarak MCP sunucunuzun güvenliğini sağlayın. Bkz . Container Apps'te MCP sunucularının güvenliğini sağlama.
- Giriş doğrulama: Araç parametrelerini her zaman doğrulayın. ASP.NET Core'da veri notasyonlarını veya FluentValidation'ı kullanın. Bkz. ASP.NET Core'da model doğrulama.
- HTTPS: Azure Container Apps, otomatik TLS sertifikaları ile varsayılan olarak HTTPS'nin zorunlu kılınmasını sağlar.
- En az ayrıcalık: Yalnızca kullanım örneğinizin gerektirdiği araçları kullanıma sunma. Onay olmadan yıkıcı işlemler gerçekleştiren araçlardan kaçının.
- CORS: İzin verilen çıkış noktalarını üretimdeki güvenilen etki alanlarıyla kısıtlayın.
- Günlük kaydı ve izleme: Denetim amaçlı MCP aracı çağrılarını günlüğe kaydetme. Azure İzleyici ve Log Analytics'i kullanın.
Kaynakları temizle
Bu uygulamayı kullanmaya devam etmek istemiyorsanız, bu öğreticide oluşturduğunuz tüm kaynakları kaldırmak için kaynak grubunu silin:
az group delete --resource-group $RESOURCE_GROUP --yes --no-wait
Sonraki adım
İlgili içerik
- Azure Container Apps'te MCP sunucularına genel bakış
- Container Apps'e bir MCP sunucusu dağıtma (Python)
- Container Apps'e bir MCP sunucusu dağıtma (Node.js)
- Container Apps'e BIR MCP sunucusu dağıtma (Java)
- Container Apps'te MCP sunucularında sorun giderme
- ModelContextProtocol.AspNetCore NuGet paketi
- MCP C# SDK'sı