Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Neste tutorial, você aprenderá a expor a funcionalidade de um aplicativo ASP.NET Core por meio do Protocolo de Contexto de Modelo (MCP), adicioná-lo como uma ferramenta ao GitHub Copilot e interagir com seu aplicativo usando linguagem natural no modo de agente de Chat copilot.
Se seu aplicativo Web já tiver recursos úteis, como compras, reservas de hotéis ou gerenciamento de dados, é fácil disponibilizar esses recursos para:
- Qualquer aplicativo que dê suporte à integração do MCP, como o modo de agente do GitHub Copilot Chat no Visual Studio Code ou no GitHub Codespaces.
- Um agente personalizado que acessa ferramentas remotas usando um cliente MCP.
Ao adicionar um servidor MCP ao seu aplicativo Web, você permite que um agente entenda e use os recursos do aplicativo quando ele responder aos prompts do usuário. Isso significa que tudo o que seu aplicativo pode fazer, o agente também pode fazer.
- Adicione um servidor MCP ao seu aplicativo Web.
- Teste o servidor MCP localmente no modo de agente do GitHub Copilot Chat.
- Implante o servidor MCP no Serviço de Aplicativo do Azure e conecte-se a ele no GitHub Copilot Chat.
Pré-requisitos
Este tutorial pressupõe que você esteja trabalhando com o exemplo usado no Tutorial: Implantar um aplicativo ASP.NET Core e do Banco de Dados SQL do Azure no Serviço de Aplicativo do Azure.
No mínimo, abra o aplicativo de exemplo nos Codespaces do GitHub e implante o aplicativo executando azd up.
Adicionar o servidor MCP ao seu aplicativo Web
No terminal do codespace, adicione o pacote NuGet
ModelContextProtocol.AspNetCoreao seu projeto:dotnet add package ModelContextProtocol.AspNetCore --prereleaseCrie uma pasta McpServer e crie uma TodosMcpTool.cs nela com o código a seguir.
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."; } } }O código acima disponibiliza ferramentas para o servidor MCP usando os seguintes atributos específicos:
-
[McpServerToolType]: marca aTodosMcpToolclasse como um tipo de ferramenta de servidor MCP. Ele sinaliza para a estrutura MCP que essa classe contém métodos que devem ser expostos como ferramentas que podem ser chamadas. -
[McpServerTool]: marca um método como uma ação que pode ser chamada para o servidor MCP. -
[Description]: elas fornecem descrições legíveis por humanos para métodos e parâmetros. Ele ajuda o agente de chamada a entender como usar as ações e seus parâmetros.
Esse código está duplicando a funcionalidade do existente
TodosController, o que é desnecessário, mas você o manterá para simplificar. Uma prática recomendada seria mover a lógica do aplicativo para uma classe de serviço e, em seguida, chamar os métodos de serviço tanto deTodosControllerquanto deTodosMcpTool.-
Em Program.cs, registre o serviço de servidor MCP e o serviço 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(); }); });Ao usar HTTP transmitivel com o servidor MCP, você precisará habilitar o CORS (Compartilhamento de Recursos entre Origens) se quiser testá-lo com as ferramentas do navegador cliente ou o GitHub Copilot (no Visual Studio Code e no GitHub Codespaces).
Em Program.cs, habilite o middleware MCP e CORS.
app.MapMcp("/api/mcp"); app.UseCors();Esse código define o ponto de extremidade do servidor MCP como
<url>/api/mcp.
Testar o servidor MCP localmente
No terminal do codespace, execute o aplicativo com
dotnet run.Selecione Abrir no Navegador e, em seguida, adicione uma tarefa.
Deixe
dotnet runem execução. Seu servidor MCP está em execução emhttp://localhost:5093/api/mcpagora.De volta ao codespace, abra o Copilot Chat e, em seguida, selecione o modo Agente na caixa de prompt.
Selecione o botão Ferramentas e, em seguida, selecione Adicionar Mais Ferramentas... na lista suspensa.
Selecione Adicionar Servidor MCP.
Selecione HTTP (HTTP ou Eventos Server-Sent).
Na URL do Servidor Enter, digite http://localhost:5093/api/mcp.
No Enter Server ID, digite todos-mcp ou qualquer nome que você quiser.
Selecione Configurações do Workspace.
Em uma nova janela do Copilot Chat, digite algo como "Mostre-me as tarefas pendentes".
Por padrão, o GitHub Copilot mostra uma confirmação de segurança quando você invoca um servidor MCP. Selecione Continuar.
Agora você deve ver uma resposta que indica que a chamada à ferramenta MCP foi bem-sucedida.
Implantar o servidor MCP no Serviço de Aplicativo
De volta ao terminal do codespace, implante suas alterações confirmando suas alterações (método GitHub Actions) ou execute
azd up(método da CLI do Desenvolvedor do Azure).Na saída do AZD, localize a URL do seu aplicativo. O URL fica assim na saída do AZD:
Deploying services (azd deploy) (✓) Done: Deploying service web - Endpoint: <app-url>
Após o término de
azd up, abra .vscode/mcp.json. Altere a URL para<app-url>/api/mcp.Acima da configuração do servidor MCP modificado, selecione Iniciar.
Inicie uma nova janela do GitHub Copilot Chat. Você deve ser capaz de exibir, criar, atualizar e excluir tarefas no agente copilot.
Melhores práticas de segurança
Quando o servidor MCP for chamado por um agente alimentado por LLM (grandes modelos de linguagem), esteja ciente dos ataques de injeção de prompt. Considere as seguintes práticas recomendadas de segurança:
- Autenticação e autorização: proteja seu servidor MCP com a autenticação do Microsoft Entra para garantir que somente usuários ou agentes autorizados possam acessar suas ferramentas. Confira Chamadas do Protocolo de Contexto de Modelo Seguro para Serviço de Aplicativo do Azure a partir do Visual Studio Code com autenticação do Microsoft Entra para um guia passo a passo.
- Validação e sanitização de entrada: o código de exemplo neste tutorial omite a validação e a sanitização de entrada para simplicidade e clareza. Em cenários de produção, sempre implemente a validação e a sanitização adequadas para proteger seu aplicativo. Para ASP.NET Core, consulte a validação de modelo no ASP.NET Core.
- HTTPS: O exemplo depende do Serviço de Aplicativo do Azure, que impõe HTTPS por padrão e fornece certificados TLS/SSL gratuitos para criptografar dados em trânsito.
- Princípio de Privilégio Mínimo: exponha apenas as ferramentas e os dados necessários para seu caso de uso. Evite expor operações confidenciais, a menos que seja necessário.
- Limitação de taxa e limitação: use o Gerenciamento de API ou middleware personalizado para evitar ataques de abuso e negação de serviço.
- Registro em log e monitoramento: acesso de log e uso de pontos de extremidade MCP para auditoria e detecção de anomalias. Monitore atividades suspeitas.
- Configuração do CORS: restrinja solicitações entre origens a domínios confiáveis se o servidor MCP for acessado de navegadores. Para obter mais informações, consulte Habilitar CORS.
- Atualizações regulares: mantenha suas dependências atualizadas para atenuar vulnerabilidades conhecidas.
Mais recursos
Integrar a IA aos aplicativos do Serviço de Aplicativo do Azure