次の方法で共有


App Service アプリを GitHub Copilot チャット用 MCP サーバーとして統合する (Spring Boot)

このチュートリアルでは、モデル コンテキスト プロトコル (MCP) を使用して Spring Boot Web アプリの機能を公開し、それをツールとして GitHub Copilot に追加し、Copilot Chat エージェント モードで自然言語を使用してアプリと対話する方法について説明します。

Azure App Service でホストされている Todos MCP サーバーを呼び出す GitHub Copilot を示すスクリーンショット。

Web アプリケーションにショッピング、ホテル予約、データ管理などの便利な機能が既にある場合は、これらの機能を次の目的で簡単に利用できます。

MCP サーバーを Web アプリに追加することで、エージェントがユーザー プロンプトに応答したときにアプリの機能を理解して使用できるようになります。 つまり、アプリでできることは何でも、エージェントでも実行できます。

  • MCP サーバーを Web アプリに追加します。
  • GitHub Copilot Chat エージェント モードで MCP サーバーをローカルでテストします。
  • MCP サーバーを Azure App Service にデプロイし、GitHub Copilot Chat でそれに接続します。

Prerequisites

このチュートリアルでは、「 チュートリアル: Azure App Service on Linux および Azure Cosmos DB を使用して Java Spring Boot Web アプリを構築する」で使用するサンプルを使用していることを前提としています。

少なくとも、GitHub Codespaces で サンプル アプリケーション を開き、 azd upを実行してアプリをデプロイします。

MCP サーバーを Web アプリに追加する

  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 のツールを提供します。 既定では、 spring-ai-starter-mcp-server-webmvc パッケージ内の MCP Server の自動構成によって、これらのツール コールバックが自動的にワイヤリングされます。 また、既定では、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. codespace ターミナルで、 mvn spring-boot:runを使用してアプリケーションを実行します。

  2. [ ブラウザーで開く] を選択し、タスクを追加します。

    Spring Boot は実行したままにします。 MCP サーバー エンドポイントは現在、 http://localhost:8080/sse で実行されています。

  3. コードスペースに戻り、Copilot Chat を開き、プロンプト ボックスで [エージェント モード] を選択します。

  4. [ ツール ] ボタンを選択し、ドロップダウンで [ その他のツールの追加 ]を選択します。

    GitHub Copilot チャット エージェント モードで MCP サーバーを追加する方法を示すスクリーンショット。

  5. [ MCP サーバーの追加] を選択します

  6. HTTP (HTTP または Server-Sent イベント) を選択します。

  7. [ サーバー URL の入力] に「 http://localhost:8080/sse」と入力します。

  8. [ サーバー ID の入力] に、 todos-mcp または任意の名前を入力します。

  9. [ ワークスペースの設定] を選択します

  10. 新しい Copilot チャット ウィンドウで、「やることリストを表示する」のように入力します。

  11. 既定では、MCP サーバーを呼び出すと、GitHub Copilot にセキュリティ確認が表示されます。 続行を選択します。

    GitHub Copilot Chat での MCP 呼び出しからの既定のセキュリティ メッセージを示すスクリーンショット。

    MCP ツールの呼び出しが成功したことを示す応答が表示されます。

    GitHub Copilot チャット ウィンドウの MCP ツール呼び出しからの応答を示すスクリーンショット。

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.json ファイルから MCP サーバーを手動で起動する方法を示すスクリーンショット。

  5. 新しい GitHub Copilot チャット ウィンドウを開始します。 Copilot エージェントでタスクを表示、作成、更新、および削除できる必要があります。

セキュリティのベスト プラクティス

MCP サーバーが大規模言語モデル (LLM) を使用するエージェントによって呼び出される場合は、 迅速なインジェクション 攻撃に注意してください。 次のセキュリティのベスト プラクティスを検討してください。

  • 認証と承認: 承認されたユーザーまたはエージェントのみがツールにアクセスできるように、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 を有効にする」を参照してください。
  • 定期的な更新: 既知の脆弱性を軽減するために、依存関係を最新の状態に保ちます。

その他のリソース