Aracılığıyla paylaş


Öğretici: .NET MCP sunucusunu Azure Container Apps'e dağıtma

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

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.

  1. Yeni bir ASP.NET Core Web API projesi oluşturun:

    dotnet new web -n TasksMcpServer
    cd TasksMcpServer
    
  2. MCP sunucusu NuGet paketini ekleyin:

    dotnet add package ModelContextProtocol.AspNetCore --prerelease
    
  3. Program.cs iç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 /health uç 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.

  1. Bellek içi veri deposu için adlı TaskStore.cs bir 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, TaskItem beş özelliğe sahip veri modelini tanımlar. TaskStore sı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.

  2. MCP araç tanımlarıyla adlı TasksMcpTools.cs bir 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.

  1. Uygulamayı çalıştırın:

    dotnet run
    

    Sunucu http://localhost:5000 üzerinde başlar (veya konsol çıkışında gösterilen bağlantı noktasında). MCP uç noktası konumundadır http://localhost:5000/mcp.

  2. VS Code'ı açın, ardından Copilot Sohbet'i açın ve Aracı modu'nu seçin.

  3. Araçlar düğmesini ve ardından Daha Fazla Araç Ekle... öğesini seçin.>MCP Sunucusu ekleyin.

  4. HTTP (HTTP veya Server-Sent Olayları) öğesini seçin.

  5. Sunucu URL'sini girin: http://localhost:5000/mcp

  6. Bir sunucu kimliği girin: tasks-mcp

  7. Çalışma Alanı Ayarları'nı seçin.

  8. Yeni bir Copilot Sohbet isteminde şunu yazın: "Bana tüm görevleri göster"

  9. 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.

  1. Proje kökünde bir Dockerfile oluş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_URLS değişkeni, uygulamayı 8080 numaralı bağlantı noktasında dinleyecek şekilde yapılandırıyor.

  2. 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-server
    

    Sağ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.

  1. Ortam değişkenlerini ayarlama:

    RESOURCE_GROUP="mcp-tutorial-rg"
    LOCATION="eastus"
    ENVIRONMENT_NAME="mcp-env"
    APP_NAME="tasks-mcp-server"
    
  2. Kaynak grubu oluşturma:

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Container Apps ortamı oluşturun:

    az containerapp env create \
        --name $ENVIRONMENT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    
  4. Kapsayıcı uygulamasını dağıtma:

    az containerapp up \
        --name $APP_NAME \
        --resource-group $RESOURCE_GROUP \
        --environment $ENVIRONMENT_NAME \
        --source . \
        --ingress external \
        --target-port 8080
    
  5. CORS'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.

  6. 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.

  1. 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.

  2. VS Code'da Aracı modunda Copilot Sohbet'i açın.

  3. 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.

  4. 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