다음을 통해 공유


App Service 앱을 GitHub Copilot 채팅용 MCP 서버로 통합(Spring Boot)

이 자습서에서는 MCP(모델 컨텍스트 프로토콜)를 통해 Spring Boot 웹앱의 기능을 노출하고, GitHub Copilot에 도구로 추가하고, 코필로트 채팅 에이전트 모드에서 자연어를 사용하여 앱과 상호 작용하는 방법을 알아봅니다.

Azure App Service에서 호스트되는 Todos MCP 서버를 호출하는 GitHub Copilot를 보여 주는 스크린샷

웹 애플리케이션에 쇼핑, 호텔 예약 또는 데이터 관리와 같은 유용한 기능이 이미 있는 경우 다음과 같은 기능을 쉽게 사용할 수 있습니다.

웹앱에 MCP 서버를 추가하면 에이전트가 사용자 프롬프트에 응답할 때 앱의 기능을 이해하고 사용할 수 있습니다. 즉, 앱이 수행할 수 있는 모든 작업을 에이전트도 수행할 수 있습니다.

  • 웹앱에 MCP 서버를 추가합니다.
  • GitHub Copilot 채팅 에이전트 모드에서 로컬로 MCP 서버를 테스트합니다.
  • AZURE App Service에 MCP 서버를 배포하고 GitHub Copilot 채팅에서 연결합니다.

Prerequisites

이 자습서에서는 자습서: Linux 및 Azure Cosmos DB에서 Azure App Service를 사용하여 Java Spring Boot 웹앱 빌드에 사용된 샘플을 사용하고 있다고 가정합니다.

최소한 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 기능을 복제하지만 간단히 하기 위해 유지합니다. 서비스 클래스로 앱 논리를 이동한 다음, 서비스 메서드를 TodoListControllerTodoListToolService에서 호출하는 것이 최선의 방법입니다.

  4. TodoApplication.java 클래스에 다음 메서드를 추가합니다TodoApplication.

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

    이 메서드는 Spring AI에 TodoListToolService 대한 콜백으로 도구를 제공합니다. 기본적으로 패키지의 MCP 서버 자동 구성 spring-ai-starter-mcp-server-webmvc 은 이러한 도구 콜백을 자동으로 연결합니다. 또한 기본적으로 MCP 서버 엔드포인트는 .입니다 <base-url>/sse.

  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 채팅을 연 다음 프롬프트 상자에서 에이전트 모드를 선택합니다.

  4. 도구 단추를 선택한 다음, 드롭다운에서 추가 도구...를 선택합니다.

    GitHub Copilot 채팅 에이전트 모드에서 MCP 서버를 추가하는 방법을 보여 주는 스크린샷

  5. MCP 서버 추가를 선택합니다.

  6. HTTP(HTTP 또는 Server-Sent 이벤트)를 선택합니다.

  7. 서버 URL 입력란에 값을 입력합니다http://localhost:8080/sse.

  8. Enter Server IDtodos-mcp 또는 원하는 이름을 입력합니다.

  9. 작업 영역 설정을 선택합니다.

  10. 새 코파일럿 채팅 창에"할 일을 보여줘"와 같은 문장을 입력합니다.

  11. 기본적으로 GitHub Copilot는 MCP 서버를 호출할 때 보안 확인을 표시합니다. 를 선택합니다 계속.

    GitHub Copilot 채팅에서 MCP 호출의 기본 보안 메시지를 보여 주는 스크린샷

    이제 MCP 도구 호출이 성공했음을 나타내는 응답이 표시됩니다.

    GitHub Copilot 채팅 창에서 MCP 도구 호출의 응답을 보여 주는 스크린샷.

App Service에 MCP 서버 배포

  1. 코드스페이스 터미널로 돌아가서 변경 내용을 커밋하여(GitHub Actions 메서드) 또는 실행 azd up (Azure 개발자 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.json 파일에서 MCP 서버를 수동으로 시작하는 방법을 보여 주는 스크린샷

  5. 새 GitHub Copilot 채팅 창을 시작합니다. Copilot 에이전트에서 작업을 보고, 만들고, 업데이트하고, 삭제할 수 있어야 합니다.

보안 모범 사례

LLM(대규모 언어 모델)으로 구동되는 에이전트에서 MCP 서버를 호출하는 경우 프롬프트 삽입 공격에 유의해야 합니다. 다음 보안 모범 사례를 고려합니다.

  • 인증 및 권한 부여: Microsoft Entra 인증을 사용하여 MCP 서버를 보호하여 권한 있는 사용자 또는 에이전트만 도구에 액세스할 수 있도록 합니다. 단계별 가이드는 Microsoft Entra 인증을 사용하여 Visual Studio Code에서 Azure App Service에 대한 보안 모델 컨텍스트 프로토콜 호출 을 참조하세요.
  • 입력 유효성 검사 및 삭제: 이 자습서의 예제 코드는 단순성과 명확성을 위해 입력 유효성 검사 및 삭제를 생략합니다. 프로덕션 시나리오에서는 항상 적절한 유효성 검사 및 삭제를 구현하여 애플리케이션을 보호합니다. Spring의 경우 Spring: 양식 입력 유효성 검사를 참조하세요.
  • HTTPS: 이 샘플은 기본적으로 HTTPS를 적용하고 전송 중인 데이터를 암호화하는 무료 TLS/SSL 인증서를 제공하는 Azure App Service를 사용합니다.
  • 최소 권한 원칙: 사용 사례에 필요한 도구 및 데이터만 노출합니다. 필요한 경우가 아니면 중요한 작업을 노출하지 마세요.
  • 속도 제한 및 제한: API Management 또는 사용자 지정 미들웨어를 사용하여 남용 및 서비스 거부 공격을 방지합니다.
  • 로깅 및 모니터링: 감사 및 변칙 검색을 위한 MCP 엔드포인트의 로그 액세스 및 사용 의심스러운 활동을 모니터링합니다.
  • CORS 구성: MCP 서버가 브라우저에서 액세스되는 경우 원본 간 요청을 신뢰할 수 있는 도메인으로 제한합니다. 자세한 내용은 CORS 사용을 참조하세요.
  • 정기 업데이트: 알려진 취약성을 완화하기 위해 종속성을 최신 상태로 유지합니다.

추가 리소스