Поделиться через


Интеграция приложения Службы приложений в качестве сервера MCP для чата GitHub Copilot (Spring Boot)

В этом руководстве вы узнаете, как предоставить функциональные возможности веб-приложения Spring Boot через протокол MCP, добавить его в GitHub Copilot и взаимодействовать с приложением с помощью естественного языка в режиме агента Copilot Chat.

Снимок экрана: GitHub Copilot, вызывающий сервер Todos MCP, размещенный в службе приложений Azure.

Если веб-приложение уже имеет полезные функции, такие как покупки, бронирование отелей или управление данными, это легко сделать эти возможности доступными для:

Добавив сервер MCP в веб-приложение, вы можете агенту понять и использовать возможности приложения при реагировании на запросы пользователей. Это означает, что ваше приложение может сделать все, что может сделать агент.

  • Добавьте сервер MCP в веб-приложение.
  • Протестируйте сервер MCP локально в режиме агента чата GitHub Copilot.
  • Разверните сервер MCP в Службе приложений Azure и подключитесь к нему в GitHub Copilot Chat.

Prerequisites

В этом руководстве предполагается, что вы работаете с примером, используемым в руководстве. Создание веб-приложения Java Spring Boot с помощью Службы приложений Azure в Linux и Azure Cosmos DB.

По крайней мере, откройте образец приложения в GitHub Codespaces и разверните приложение, запустив команду azd up.

Добавление сервера MCP в веб-приложение

  1. В пространстве кода откройте pom.xml и добавьте spring-ai-starter-mcp-server-webmvc пакет в проект:

    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Откройте src/main/java/com/microsoft/azure/appservice/examples/springbootmongodb/TodoApplication.java. Для простоты сценария вы добавите весь код сервера MCP здесь.

  3. В конце TodoApplication.java добавьте следующий класс.

    @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";
        }
    }
    

    Приведенный выше код предоставляет средства для Spring AI с помощью следующих конкретных атрибутов:

    • @Service: помечает TodoListToolService как управляемый Spring сервис.
    • @Tool: помечает метод как вызываемое средство в Spring AI.
    • description: они предоставляют человеко-читаемые описания для каждого инструмента. Он помогает вызывающему агенту понять, как использовать средство.

    Этот код дублирует функциональные возможности существующего src/main/java/com/microsoft/azure/appservice/examples/springbootmongodb/controller/TodoListController.java, что необязательно, но вы оставите его для простоты. Рекомендуется переместить логику приложения в класс сервиса, а затем вызывать методы сервиса как из TodoListController, так и из TodoListToolService.

  4. В TodoApplication.java добавьте следующий метод в TodoApplication класс.

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

    Этот метод предоставляет средства в TodoListToolService, используемые как обратные вызовы для Spring AI. По умолчанию автоматическая настройка СЕРВЕРА MCP в spring-ai-starter-mcp-server-webmvc пакете автоматически выполняет передачу этих обратных вызовов средства. Кроме того, по умолчанию используется <base-url>/sseконечная точка СЕРВЕРА MCP.

  5. В верхней части TodoApplication.java добавьте следующие импорты.

    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;
    

Тестирование сервера MCP локально

  1. В терминале пространства кода запустите приложение, используя mvn spring-boot:run.

  2. Выберите "Открыть в браузере", а затем добавьте задачу.

    Оставьте Spring Boot запущенным. Сейчас конечная точка сервера MCP доступна http://localhost:8080/sse.

  3. Вернитесь в пространство кода, откройте Copilot Chat, а затем выберите режим агента в поле запроса.

  4. Нажмите кнопку "Сервис", а затем в раскрывающемся списке нажмите кнопку "Добавить другие инструменты".

    Снимок экрана: добавление сервера MCP в режиме агента чата GitHub Copilot.

  5. Выберите "Добавить СЕРВЕР MCP".

  6. Выберите HTTP (HTTP или Server-Sent события).

  7. Введите URL-адрес сервера, введите http://localhost:8080/sse.

  8. В Введите идентификатор сервера введите todos-mcp или любое имя по вашему выбору.

  9. Выберите параметры рабочей области.

  10. В новом окне чата Copilot введите примерно следующее "Покажи мне дела".

  11. По умолчанию GitHub Copilot показывает подтверждение безопасности при вызове сервера MCP. Нажмите Продолжить.

    Снимок экрана: сообщение о безопасности по умолчанию из вызова MCP в GitHub Copilot Chat.

    Теперь вы увидите ответ, указывающий на успешное выполнение вызова средства MCP.

    Снимок экрана: ответ от вызова средства MCP в окне чата GitHub Copilot.

Разверните ваш сервер MCP в App Service.

  1. Вернитесь в терминал codespace, зафиксируйте изменения (метод GitHub Actions) или запустите azd up (метод Azure Developer CLI).

  2. В выходных данных AZD найдите URL-адрес приложения. URL-адрес выглядит следующим образом в выходных данных AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <app-url>
     
  3. После завершения azd up, откройте .vscode/mcp.json. Изменить URL-адрес на <app-url>/sse.

  4. Над измененной конфигурацией сервера MCP нажмите кнопку "Пуск".

    Снимок экрана: запуск сервера MCP вручную из локального mcp.json файла.

  5. Запустите новое окно чата GitHub Copilot. Вы должны иметь возможность просматривать, создавать, обновлять и удалять задачи в агенте Copilot.

Рекомендации по обеспечению безопасности

Когда сервер MCP вызывается агентом, управляемым моделями большого языка (LLM), будьте внимательны к атакам типа внедрение команды. Рассмотрим следующие рекомендации по обеспечению безопасности:

  • Аутентификация и авторизация: Защита вашего сервера MCP с использованием аутентификации Microsoft Entra, чтобы обеспечить доступ только авторизованным пользователям или агентам. См. пошаговое руководство по вызовам протокола контекста безопасной модели в Службе приложений Azure из Visual Studio Code с проверкой подлинности Microsoft Entra.
  • Проверка и очистка входных данных. Пример кода в этом руководстве исключает проверку ввода и очистку для простоты и ясности. В рабочих сценариях всегда реализуйте правильную проверку и очистку для защиты приложения. Сведения о Spring см. в разделе Spring: Проверка входных данных формы.
  • HTTPS: В примере используется служба приложений Azure, которая по умолчанию применяет ПРОТОКОЛ HTTPS и предоставляет бесплатные СЕРТИФИКАТЫ TLS/SSL для шифрования данных во время передачи.
  • Принцип наименьшей привилегии: предоставление только необходимых средств и данных, необходимых для вашего варианта использования. Избегайте предоставления конфиденциальных операций, если это не необходимо.
  • Ограничение скорости и регулирование. Используйте управление API или пользовательское ПО промежуточного слоя для предотвращения злоупотреблений и атак типа "отказ в обслуживании".
  • Ведение журнала и мониторинг. Доступ к журналам и использование конечных точек MCP для аудита и обнаружения аномалий. Отслеживайте подозрительные действия.
  • Конфигурация CORS: ограничьте кросс-доменные запросы до доверенных доменов, если доступ к вашему серверу MCP осуществляется из браузеров. Дополнительные сведения см. в разделе "Включение CORS".
  • Регулярные обновления: обновляйте зависимости, чтобы устранить известные уязвимости.

Дополнительные ресурсы