Mengamankan Agen AI dengan Alat MCP Laravel

Memberikan akses agen AI ke aplikasi Anda melalui MCP ibarat memberikan kunci kepada seseorang. Jika Anda tidak menetapkan aturan, mereka mungkin membuka pintu yang salah.

Baru-baru ini saya membangun alat MCP untuk aplikasi Laravel multi-tenant. Saya memiliki satu tujuan: membiarkan agen mengoperasikan aplikasi tanpa membiarkannya melihat data orang lain.

Masalah dengan Alat MCP

Setiap alat MCP adalah sebuah endpoint. Agen memanggil sebuah alat, dan server Anda menjalankan kode. Dalam aplikasi multi-tenant, setiap alat harus menjawab dua pertanyaan:

  • Apakah Anda diizinkan melakukan ini?
  • Apakah Anda diizinkan melakukannya di organisasi spesifik ini?

Jika Anda melewatkan salah satunya, Anda membocorkan data.

Mengapa Multi-Tenancy Standar Gagal di Sini

Dalam aplikasi web normal, Anda memiliki sesi. Anda menggunakan global scope untuk memfilter data berdasarkan ID organisasi. Ini berhasil karena "organisasi saat ini" selalu ada di dalam sesi.

Alat MCP tidak menggunakan sesi. Mereka menggunakan token. Tidak ada middleware untuk mengatur konteks tenant. Jika Anda mengandalkan global scope yang mencari sesi, ia tidak akan menemukan apa pun. Hal ini mungkin kemudian mengembalikan setiap baris dalam database Anda. Itu adalah kebocoran data yang tidak disadari (silent data leak).

Solusinya: Pemfilteran Eksplisit

Jangan pernah mengandalkan ambient scope dengan autentikasi token. Lakukan pemfilteran secara eksplisit setiap saat.

Saya membuat satu trait untuk menangani hal ini:

trait ResolvesOrgEvents
{
    protected function resolveOrgEvent(Authenticatable $user, string $uuid): ?Event
    {
        if (empty($user->organization_id)) {
            return null;
        }

        return Event::query()
            ->withOrganization($user->organization_id)
            ->where('uuid', $uuid)
            ->first();
    }
}

Pendekatan ini mengikuti empat aturan:

  • Gunakan UUID: Jangan pernah gunakan ID auto-increment. Agen tidak boleh bisa menebak ID dengan mengubah angka.
  • Single Source of Truth: Filter organisasi berada di satu trait. Setiap alat menggunakannya.
  • Gunakan Kembali Izin (Reuse Permissions): Jangan membuat izin baru untuk agen. Gunakan string izin yang sama dengan yang digunakan aplikasi web Anda. Ini mencegah agen memiliki kekuatan lebih besar daripada pengguna manusia.
  • Tandai Efek Samping (Side Effects): Gunakan anotasi untuk menunjukkan apakah sebuah alat bersifat read-only atau write-enabled.

Menguji Batasan

Anda harus menguji jalur negatif (negative path). Jangan hanya menguji apakah alat tersebut berfungsi. Ujilah bahwa pengguna dari Organisasi A tidak dapat melihat data dari Organisasi B.

Jika agen mencoba mengakses UUID dari tenant lain, alat tersebut harus mengembalikan "not found". Alat tersebut tidak boleh memberi tahu agen bahwa data tersebut ada tetapi milik orang lain.

Perlakukan setiap alat AI sebagai endpoint yang tidak tepercaya. Disiplin adalah satu-satunya cara untuk menjaga data Anda tetap aman.

Source: https://dev.to/nasrulhazim/giving-an-ai-agent-the-keys-without-giving-it-the-building-rbac-org-scoped-mcp-tools-in-laravel-43oi