Compartir vía


Integración de una aplicación de App Service como un servidor MCP para GitHub Copilot Chat (Spring Boot)

En este tutorial, aprenderá a exponer la funcionalidad de una aplicación web de Spring Boot a través del Protocolo de contexto de modelo (MCP), agregarla como una herramienta a GitHub Copilot e interactuar con la aplicación mediante lenguaje natural en el modo del agente de chat de Copilot.

Captura de pantalla que muestra gitHub Copilot que llama al servidor Todos MCP hospedado en Azure App Service.

Si la aplicación web ya tiene características útiles, como compras, reservas de hoteles o administración de datos, es fácil hacer que esas funcionalidades estén disponibles para:

Al agregar un servidor MCP a la aplicación web, se habilita un agente para comprender y usar las funcionalidades de la aplicación cuando responde a las solicitudes del usuario. Esto significa que cualquier cosa que pueda hacer la aplicación, el agente también puede hacerlo.

  • Agregue un servidor MCP a la aplicación web.
  • Pruebe el servidor MCP localmente en el modo del agente de Chat de Copilot de GitHub.
  • Implemente el servidor MCP en Azure App Service y conéctese a él en GitHub Copilot Chat.

Prerequisites

En este tutorial se da por supuesto que está trabajando con el ejemplo usado en Tutorial: Compilación de una aplicación web de Java Spring Boot con Azure App Service en Linux y Azure Cosmos DB.

Como mínimo, abra la aplicación de ejemplo en GitHub Codespaces e implemente la aplicación ejecutando azd up.

Adición de un servidor MCP a la aplicación web

  1. En el espacio de código, abra pom.xml y agregue el spring-ai-starter-mcp-server-webmvc paquete al proyecto:

    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Abra src/main/java/com/microsoft/azure/appservice/examples/springbootmongodb/TodoApplication.java. Para simplificar el escenario, agregará aquí todo el código del servidor MCP.

  3. Al final de TodoApplication.java, agregue la siguiente clase.

    @Service
    class TodoListToolService {
        private final TodoItemRepository todoItemRepository;
    
        public TodoListToolService(TodoItemRepository todoItemRepository) {
            this.todoItemRepository = todoItemRepository;
        }
    
        @Tool(description = "Get a todo item by its id")
        public Optional<TodoItem> getTodoItem(String id) {
            return todoItemRepository.findById(id);
        }
    
        @Tool(description = "Get all todo items")
        public List<TodoItem> getAllTodoItems() {
            return todoItemRepository.findAll();
        }
    
        @Tool(description = "Add a new todo item")
        public String addNewTodoItem(String description, String owner) {
            TodoItem item = new TodoItem(UUID.randomUUID().toString(), description, owner);
            todoItemRepository.save(item);
            return "Todo item created";
        }
    
        @Tool(description = "Update an existing todo item")
        public String updateTodoItem(String id, String description, String owner, boolean finished) {
            if (!todoItemRepository.existsById(id)) {
                return "Todo item not found";
            }
            TodoItem item = new TodoItem(id, description, owner);
            item.setFinish(finished);
            todoItemRepository.save(item);
            return "Todo item updated";
        }
    
        @Tool(description = "Delete a todo item by its id")
        public String deleteTodoItem(String id) {
            if (!todoItemRepository.existsById(id)) {
                return "Todo item not found";
            }
            todoItemRepository.deleteById(id);
            return "Todo item deleted";
        }
    }
    

    El código anterior hace que las herramientas estén disponibles para Spring AI mediante los siguientes atributos específicos:

    • @Service: marca TodoListToolService como un servicio administrado por Spring.
    • @Tool: marca un método como una herramienta invocable en Spring AI.
    • description: proporcionan descripciones legibles para cada herramienta. Ayuda al agente de llamada a comprender cómo usar la herramienta.

    Este código duplica la funcionalidad de src/main/java/com/microsoft/azure/appservice/examples/springbootmongodb/controller/TodoListController.java, que no es necesario, pero lo mantendrá por motivos de simplicidad. Un procedimiento recomendado sería mover la lógica de la aplicación a una clase de servicio y, a continuación, llamar a los métodos de servicio desde TodoListController y desde TodoListToolService.

  4. En TodoApplication.java, agregue el método siguiente a la TodoApplication clase .

    @Bean
    public ToolCallbackProvider todoTools(TodoListToolService todoListToolService) {
        return MethodToolCallbackProvider.builder().toolObjects(todoListToolService).build();
    }
    

    Este método proporciona las funcionalidades en TodoListToolService como callbacks para Spring AI. De forma predeterminada, la configuración automática del servidor MCP en el paquete spring-ai-starter-mcp-server-webmvc conecta automáticamente estas llamadas de retorno de herramientas. Además, de forma predeterminada, el punto de conexión del servidor MCP es <base-url>/sse.

  5. En la parte superior de TodoApplication.java, agregue las siguientes importaciones.

    import java.util.List;
    import java.util.Optional;
    import java.util.UUID;
    
    import org.springframework.ai.tool.ToolCallbackProvider;
    import org.springframework.ai.tool.annotation.Tool;
    import org.springframework.ai.tool.method.MethodToolCallbackProvider;
    import org.springframework.context.annotation.Bean;
    import org.springframework.stereotype.Service;
    
    import com.microsoft.azure.appservice.examples.springbootmongodb.dao.TodoItemRepository;
    import com.microsoft.azure.appservice.examples.springbootmongodb.model.TodoItem;
    

Probar el servidor MCP localmente

  1. En el terminal de codespace, ejecute la aplicación con mvn spring-boot:run.

  2. Seleccione Abrir en el explorador y agregue una tarea.

    Deje Spring Boot en ejecución. El punto de conexión del servidor MCP se está ejecutando ahora en http://localhost:8080/sse.

  3. De nuevo en el espacio de código, abre Copilot Chat y, a continuación, selecciona Modo de agente en el cuadro de entrada.

  4. Seleccione el botón Herramientas y, a continuación, seleccione Agregar más herramientas... en la lista desplegable.

    Captura de pantalla que muestra cómo agregar un servidor MCP en el modo del agente de Chat de Copilot de GitHub.

  5. Seleccione Agregar servidor MCP.

  6. Seleccione HTTP (HTTP o eventos Server-Sent).

  7. En Escriba dirección URL del servidor, escriba http://localhost:8080/sse.

  8. En Escriba id. de servidor, escriba todos-mcp o cualquier nombre que desee.

  9. Seleccione Configuración del área de trabajo.

  10. En una nueva ventana de Chat de Copilot, escriba algo como "Muéstrame las tareas."

  11. De forma predeterminada, GitHub Copilot muestra una confirmación de seguridad al invocar un servidor MCP. Selecciona Continuar.

    Captura de pantalla que muestra el mensaje de seguridad predeterminado de una invocación de MCP en El chat de GitHub Copilot.

    Ahora debería ver una respuesta que indica que la llamada a la herramienta MCP es correcta.

    Captura de pantalla que muestra la respuesta de la llamada a la herramienta MCP en la ventana Chat de GitHub Copilot.

Implementación del servidor MCP en App Service

  1. De nuevo en el terminal de codespace, implemente los cambios confirmando los cambios (método Acciones de GitHub) o ejecute azd up (método de la CLI para desarrolladores de Azure).

  2. En la salida de AZD, busque la dirección URL de la aplicación. La dirección URL tiene este aspecto en la salida de AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <app-url>
     
  3. Una vez que azd up finalice, abre .vscode/mcp.json. Cambie la dirección URL a <app-url>/sse.

  4. Encima de la configuración modificada del servidor MCP, seleccione Iniciar.

    Captura de pantalla que muestra cómo iniciar manualmente un servidor MCP desde el archivo mcp.json local.

  5. Inicie una nueva ventana de Chat de GitHub Copilot. Debería poder ver, crear, actualizar y eliminar tareas en el agente de Copilot.

Procedimientos recomendados de seguridad

Cuando un agente con tecnología de modelos de lenguaje de gran escala (LLM) llama al servidor MCP, tenga en cuenta los ataques de inyección de instrucciones. Tenga en cuenta los siguientes procedimientos recomendados de seguridad:

  • Autenticación y autorización: proteja el servidor MCP con la autenticación de Microsoft Entra para asegurarse de que solo los usuarios o agentes autorizados puedan acceder a sus herramientas. Consulte Secure Model Context Protocol calls to Azure App Service from Visual Studio Code with Microsoft Entra authentication (Protocolo de contexto de modelo seguro de llamadas a Azure App Service desde Visual Studio Code con autenticación de Microsoft Entra ) para obtener una guía paso a paso.
  • Validación y saneamiento de entrada: el código de ejemplo de este tutorial omite la validación y la limpieza de entrada para simplificar y claridad. En escenarios de producción, implemente siempre la validación y la sanación adecuadas para proteger la aplicación. Para Spring, vea Spring: Validación de la entrada del formulario.
  • HTTPS: El ejemplo se basa en Azure App Service, que aplica HTTPS de forma predeterminada y proporciona certificados TLS/SSL gratuitos para cifrar los datos en tránsito.
  • Principio de privilegios mínimos: exponga solo las herramientas y los datos necesarios para su caso de uso. Evite exponer operaciones confidenciales a menos que sea necesario.
  • Limitación de velocidad y limitación: use API Management o middleware personalizado para evitar ataques por denegación de servicio y abuso.
  • Registro y supervisión: registro de acceso y uso de puntos de conexión de MCP para la auditoría y la detección de anomalías. Supervisar la actividad sospechosa.
  • Configuración de CORS: restrinja las solicitudes entre orígenes a dominios de confianza si se accede al servidor MCP desde exploradores. Para obtener más información, vea Habilitar CORS.
  • Actualizaciones periódicas: mantenga actualizadas las dependencias para mitigar las vulnerabilidades conocidas.

Más recursos