이 자습서에서는 MCP(모델 컨텍스트 프로토콜)를 통해 ASP.NET Core 앱의 기능을 노출하고, GitHub Copilot에 도구로 추가하고, Copilot 채팅 에이전트 모드에서 자연어를 사용하여 앱과 상호 작용하는 방법을 알아봅니다.
웹 애플리케이션에 쇼핑, 호텔 예약 또는 데이터 관리와 같은 유용한 기능이 이미 있는 경우 다음과 같은 기능을 쉽게 사용할 수 있습니다.
- Visual Studio Code 또는 GitHub Codespaces의 GitHub Copilot 채팅 에이전트 모드와 같이 MCP 통합을 지원하는 모든 애플리케이션입니다.
- MCP 클라이언트를 사용하여 원격 도구에 액세스하는 사용자 지정 에이전트입니다.
웹앱에 MCP 서버를 추가하면 에이전트가 사용자 프롬프트에 응답할 때 앱의 기능을 이해하고 사용할 수 있습니다. 즉, 앱이 수행할 수 있는 모든 작업을 에이전트도 수행할 수 있습니다.
- 웹앱에 MCP 서버를 추가합니다.
- GitHub Copilot 채팅 에이전트 모드에서 로컬로 MCP 서버를 테스트합니다.
- AZURE App Service에 MCP 서버를 배포하고 GitHub Copilot 채팅에서 연결합니다.
필수 조건
이 자습서에서는 자습서 : ASP.NET Core 및 Azure SQL Database 앱을 Azure App Service에 배포하는 데 사용되는 샘플을 사용 중이라고 가정합니다.
최소한 GitHub Codespaces에서 샘플 애플리케이션 을 열고 실행 azd up하여 앱을 배포합니다.
웹앱에 MCP 서버 추가
코드스페이스 터미널에서 프로젝트에 NuGet
ModelContextProtocol.AspNetCore패키지를 추가합니다.dotnet add package ModelContextProtocol.AspNetCore --prereleaseMcpServer 폴더를 만들고 다음 코드를 사용하여 TodosMcpTool.cs 만듭니다.
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."; } } }위의 코드는 다음 특정 특성을 사용하여 MCP 서버에 도구를 사용할 수 있도록 합니다.
-
[McpServerToolType]: 클래스를TodosMcpToolMCP 서버 도구 형식으로 표시합니다. 이 클래스에는 호출 가능한 도구로 노출되어야 하는 메서드가 포함되어 있음을 MCP 프레임워크에 알릴 수 있습니다. -
[McpServerTool]: 메서드를 MCP 서버에 대한 호출 가능한 작업으로 표시합니다. -
[Description]: 메서드 및 매개 변수에 대해 사람이 읽을 수 있는 설명을 제공합니다. 호출 에이전트가 작업 및 해당 매개 변수를 사용하는 방법을 이해하는 데 도움이 됩니다.
이 코드는 필요하지 않은 기존
TodosController기능을 복제하지만 간결하게 유지합니다. 최고의 방법은 앱 논리를 서비스 클래스로 이동한 다음, 서비스 메서드를TodosController및TodosMcpTool둘 다에서 호출하는 것입니다.-
Program.cs MCP 서버 서비스 및 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(); }); });MCP 서버에서 스트리밍 가능한 HTTP를 사용하는 경우 클라이언트 브라우저 도구 또는 GitHub Copilot(Visual Studio Code 및 GitHub Codespaces 모두에서)를 사용하여 테스트하려는 경우 CORS(원본 간 리소스 공유)를 사용하도록 설정해야 합니다.
Program.cs MCP 및 CORS 미들웨어를 사용하도록 설정합니다.
app.MapMcp("/api/mcp"); app.UseCors();이 코드는 MCP 서버 엔드포인트를 .로
<url>/api/mcp설정합니다.
로컬에서 MCP 서버 테스트
코드스페이스 터미널에서 .를 사용하여 애플리케이션
dotnet run을 실행합니다.브라우저에서 열기를 선택한 다음 작업을 추가합니다.
dotnet run을(를) 실행 상태로 둡니다. MCP 서버가 현재 실행 중입니다http://localhost:5093/api/mcp.코드스페이스로 돌아가서 Copilot 채팅을 연 다음 프롬프트 상자에서 에이전트 모드를 선택합니다.
도구 단추를 선택한 다음, 드롭다운에서 추가 도구...를 선택합니다.
MCP 서버 추가를 선택합니다.
HTTP(HTTP 또는 Server-Sent 이벤트)를 선택합니다.
Enter Server URL 필드에 http://localhost:5093/api/mcp를 입력합니다.
Enter Server ID에 todos-mcp 또는 원하는 이름을 입력합니다.
작업 영역 설정을 선택합니다.
새 코파일럿 채팅 창에 "할 일 목록을 보여줘."와 같은 내용을 입력합니다.
기본적으로 GitHub Copilot는 MCP 서버를 호출할 때 보안 확인을 표시합니다. 를 선택합니다 계속.
이제 MCP 도구 호출이 성공했음을 나타내는 응답이 표시됩니다.
App Service에 MCP 서버 배포
코드스페이스 터미널로 돌아가서 변경 내용을 커밋하여(GitHub Actions 메서드) 또는 실행
azd up(Azure 개발자 CLI 메서드)을 배포합니다.AZD 출력에서 앱의 URL을 찾습니다. URL은 AZD 출력에서 다음과 같습니다.
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <app-url>
완료되면
azd up.vscode/mcp.json을 엽니다. URL을<app-url>/api/mcp(으)로 변경합니다.수정된 MCP 서버 구성 위에서 시작을 선택합니다.
새 GitHub Copilot 채팅 창을 시작합니다. Copilot 에이전트에서 작업을 보고, 만들고, 업데이트하고, 삭제할 수 있어야 합니다.
보안 모범 사례
LLM(대규모 언어 모델)으로 구동되는 에이전트에서 MCP 서버를 호출하는 경우 프롬프트 삽입 공격에 유의해야 합니다. 다음 보안 모범 사례를 고려합니다.
- 인증 및 권한 부여: Microsoft Entra 인증을 사용하여 MCP 서버를 보호하여 권한 있는 사용자 또는 에이전트만 도구에 액세스할 수 있도록 합니다. 단계별 가이드는 Microsoft Entra 인증을 사용하여 Visual Studio Code에서 Azure App Service에 대한 보안 모델 컨텍스트 프로토콜 호출 을 참조하세요.
- 입력 유효성 검사 및 삭제: 이 자습서의 예제 코드는 단순성과 명확성을 위해 입력 유효성 검사 및 삭제를 생략합니다. 프로덕션 시나리오에서는 항상 적절한 유효성 검사 및 삭제를 구현하여 애플리케이션을 보호합니다. ASP.NET Core의 경우 ASP.NET Core의 모델 유효성 검사를 참조하세요.
- HTTPS: 이 샘플은 기본적으로 HTTPS를 적용하고 전송 중인 데이터를 암호화하는 무료 TLS/SSL 인증서를 제공하는 Azure App Service를 사용합니다.
- 최소 권한 원칙: 사용 사례에 필요한 도구 및 데이터만 노출합니다. 필요한 경우가 아니면 중요한 작업을 노출하지 마세요.
- 속도 제한 및 제한: API Management 또는 사용자 지정 미들웨어를 사용하여 남용 및 서비스 거부 공격을 방지합니다.
- 로깅 및 모니터링: 감사 및 변칙 검색을 위한 MCP 엔드포인트의 로그 액세스 및 사용 의심스러운 활동을 모니터링합니다.
- CORS 구성: MCP 서버가 브라우저에서 액세스되는 경우 원본 간 요청을 신뢰할 수 있는 도메인으로 제한합니다. 자세한 내용은 CORS 사용을 참조하세요.
- 정기 업데이트: 알려진 취약성을 완화하기 위해 종속성을 최신 상태로 유지합니다.