Mengintegrasikan aplikasi App Service sebagai McP Server untuk GitHub Copilot Chat (Spring Boot)

Dalam tutorial ini, Anda akan mempelajari cara mengekspos fungsionalitas aplikasi web Spring Boot melalui Model Context Protocol (MCP), menambahkannya sebagai alat ke GitHub Copilot, dan berinteraksi dengan aplikasi Anda menggunakan bahasa alami dalam mode agen Obrolan Copilot.

Cuplikan layar memperlihatkan GitHub Copilot memanggil server Todos MCP yang dihosting di Azure App Service.

Jika aplikasi web Anda sudah memiliki fitur yang berguna, seperti belanja, pemesanan hotel, atau manajemen data, mudah untuk membuat kemampuan tersebut tersedia untuk:

  • Aplikasi apa pun yang mendukung integrasi MCP, seperti mode agen GitHub Copilot Chat di Visual Studio Code atau di GitHub Codespaces.
  • Agen kustom yang mengakses alat jarak jauh dengan menggunakan klien MCP.

Dengan menambahkan server MCP ke aplikasi web, Anda memungkinkan agen untuk memahami dan menggunakan kemampuan aplikasi saat merespons permintaan pengguna. Ini berarti apa pun yang dapat dilakukan aplikasi Anda, agen juga dapat melakukannya.

  • Tambahkan server MCP ke aplikasi web Anda.
  • Uji server MCP secara lokal dalam mode agen GitHub Copilot Chat.
  • Sebarkan server MCP ke Azure App Service dan sambungkan di GitHub Copilot Chat.

Prerequisites

Tutorial ini mengasumsikan Anda bekerja dengan sampel yang digunakan dalam Tutorial: Membangun aplikasi web Java Spring Boot dengan Azure App Service di Linux dan Azure Cosmos DB.

Minimal, buka aplikasi sampel di GitHub Codespaces dan sebarkan aplikasi dengan menjalankan azd up.

Menambahkan server MCP ke aplikasi web Anda

  1. Di codespace, buka pom.xml dan tambahkan spring-ai-starter-mcp-server-webmvc paket ke proyek Anda:

    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
        <version>1.0.0</version>
    </dependency>
    
  2. Buka src/main/java/com/microsoft/azure/appservice/examples/springbootmongodb/TodoApplication.java. Untuk kesederhanaan skenario, Anda akan menambahkan semua kode server MCP Anda di sini.

  3. Di akhir TodoApplication.java, tambahkan kelas berikut.

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

    Kode di atas membuat alat tersedia untuk Spring AI dengan menggunakan atribut tertentu berikut:

    • @Service: Menandai TodoListToolService sebagai layanan yang dikelola Spring.
    • @Tool: Menandai metode sebagai alat yang dapat dipanggil di Spring AI.
    • description: Ini memberikan deskripsi yang dapat dibaca manusia untuk setiap alat. Ini membantu agen panggilan untuk memahami cara menggunakan alat ini.

    Kode ini menduplikasi fungsionalitas src/main/java/com/microsoft/azure/appservice/examples/springbootmongodb/controller/TodoListController.java yang ada, yang tidak perlu, tetapi Anda akan menyimpannya untuk kesederhanaan. Salah satu praktik terbaik adalah memindahkan logika aplikasi ke kelas layanan, lalu memanggil metode layanan tersebut baik dari TodoListController maupun TodoListToolService.

  4. Di TodoApplication.java, tambahkan metode berikut ke TodoApplication kelas .

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

    Metode ini menyediakan alat di TodoListToolService sebagai panggilan balik untuk Spring AI. Secara default, konfigurasi otomatis McP Server dalam spring-ai-starter-mcp-server-webmvc paket secara otomatis menghubungkan panggilan balik alat ini. Selain itu, secara default, titik akhir McP Server adalah <base-url>/sse.

  5. Di bagian atas TodoApplication.java, tambahkan impor berikut.

    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;
    

Menguji server MCP secara lokal

  1. Di terminal codespace, jalankan aplikasi dengan mvn spring-boot:run.

  2. Pilih Buka di Browser, lalu tambahkan tugas.

    Biarkan Spring Boot berjalan. Endpoint server MCP Anda sedang aktif di http://localhost:8080/sse sekarang.

  3. Kembali ke codespace, buka Obrolan Copilot, lalu pilih Mode agen di kotak perintah.

  4. Pilih tombol Alat , lalu pilih Tambahkan Alat Lainnya... di menu dropdown.

    Cuplikan layar memperlihatkan cara menambahkan server MCP dalam mode agen GitHub Copilot Chat.

  5. Pilih Tambahkan Server MCP.

  6. Pilih HTTP (HTTP atau Event Server-Sent).

  7. Di Masukkan URL Server, ketik http://localhost:8080/sse.

  8. Di Masukkan ID Server, ketik todos-mcp atau nama apa pun yang Anda suka.

  9. Pilih Pengaturan Ruang Kerja.

  10. Di dalam jendela Obrolan Copilot baru, ketik sesuatu seperti "Tunjukkan daftar tugas."

  11. Secara default, GitHub Copilot menunjukkan konfirmasi keamanan saat Anda memanggil server MCP. Pilih Lanjutkan.

    Cuplikan layar memperlihatkan pesan keamanan default dari pemanggilan MCP di GitHub Copilot Chat.

    Anda sekarang akan melihat respons yang menunjukkan bahwa panggilan alat MCP berhasil.

    Cuplikan layar memperlihatkan bahwa respons dari panggilan alat MCP di jendela GitHub Copilot Chat.

Menyebarkan server MCP Anda ke App Service

  1. Kembali ke terminal codespace, sebarkan perubahan Anda dengan menerapkan perubahan Anda (metode GitHub Actions) atau jalankan azd up (metode Azure Developer CLI).

  2. Di output AZD, temukan URL aplikasi Anda. URL tampak seperti ini dalam keluaran AZD:

     Deploying services (azd deploy)
    
       (✓) Done: Deploying service web
       - Endpoint: <app-url>
     
  3. Setelah azd up selesai, buka .vscode/mcp.json. Ubah URL menjadi <app-url>/sse.

  4. Di atas konfigurasi server MCP Anda yang dimodifikasi, pilih Mulai.

    Cuplikan layar memperlihatkan cara memulai server MCP secara manual dari file mcp.json lokal.

  5. Mulai jendela baru GitHub Copilot Chat. Anda harus dapat melihat, membuat, memperbarui, dan menghapus tugas di agen Copilot.

Praktik terbaik keamanan

Ketika server MCP Anda dipanggil oleh agen yang didukung oleh model bahasa besar (LLM), waspadai serangan injeksi yang cepat . Pertimbangkan praktik terbaik keamanan berikut:

  • Autentikasi dan Otorisasi: Amankan server MCP Anda dengan autentikasi Microsoft Entra untuk memastikan hanya pengguna atau agen yang berwenang yang dapat mengakses alat Anda. Lihat Panggilan Secure Model Context Protocol ke Azure App Service dari Visual Studio Code dengan autentikasi Microsoft Entra untuk panduan langkah demi langkah.
  • Validasi dan Sanitasi Input: Contoh kode dalam tutorial ini menghilangkan validasi input dan sanitasi untuk kesederhanaan dan kejelasan. Dalam skenario produksi, selalu terapkan validasi dan sanitasi yang tepat untuk melindungi aplikasi Anda. Untuk Spring, lihat Spring: Memvalidasi Input Formulir.
  • HTTPS: Sampel bergantung pada Azure App Service, yang memberlakukan HTTPS secara default dan menyediakan sertifikat TLS/SSL gratis untuk mengenkripsi data saat transit.
  • Prinsip Hak Istimewa Terkecil: Hanya mengekspos alat dan data yang diperlukan untuk kasus penggunaan Anda. Hindari mengekspos operasi sensitif kecuali diperlukan.
  • Pembatasan dan Pembatasan Laju: Gunakan API Management atau middleware kustom untuk mencegah penyalahgunaan dan penolakan serangan layanan.
  • Pengelogan dan Pemantauan: Akses log dan penggunaan titik akhir MCP untuk audit dan deteksi anomali. Pantau aktivitas yang mencurigakan.
  • Konfigurasi CORS: Membatasi permintaan lintas asal ke domain tepercaya jika server MCP Anda diakses dari browser. Untuk informasi selengkapnya, lihat Mengaktifkan CORS.
  • Pembaruan Reguler: Selalu perbarui dependensi Anda untuk memitigasi kerentanan yang diketahui.

Sumber daya lainnya