MCP OAuth: Why Authentication for AI Agents Is Hard

Server MCP lokal berjalan lewat stdio sebagai proses anak dari klien, di mesin Anda sendiri. Sistem operasi sudah menentukan siapa yang bisa menjalankannya, dan ia membaca rahasia dari environment variable. Karena tidak pernah terpapar ke jaringan, tidak ada pemanggil tak tepercaya yang perlu diotentikasi, sehingga spesifikasi MCP menyebut server stdio sebaiknya melewati alur OAuth sepenuhnya.
Dalam model otorisasi MCP, server MCP remote memegang peran OAuth sebagai resource server atau protected resource. Ia menerima permintaan yang membawa access token, memvalidasi bahwa token itu diterbitkan untuknya, lalu mengembalikan data. Ia tidak melogin pengguna atau menerbitkan token sendiri; tugas itu milik authorization server terpisah.
MCP dibangun di atas OAuth 2.1, yang mewajibkan PKCE untuk setiap alur authorization code. PKCE membuat klien membuktikan bahwa ia yang memulai permintaan dengan memegang verifier rahasia, sehingga penyerang yang menyadap authorization code tidak bisa menukarnya dengan token. Bagi agent otomatis tanpa pengawasan manusia, perlindungan ini bahkan lebih penting.
Dynamic client registration, dari RFC 7591, memungkinkan klien memperoleh client ID OAuth dari authorization server secara otomatis, tanpa manusia mengisi formulir pendaftaran. MCP mengandalkannya karena agent bisa terhubung ke server yang belum pernah dilihat, dan mendaftar manual untuk tiap server jadi tidak praktis.
RFC 8707 mendefinisikan parameter resource yang menyebut server persis yang menjadi tujuan sebuah token. Klien MCP wajib mengirimnya, dan server MCP wajib menolak token yang tidak mencantumkannya sebagai audience yang dituju. Pengikatan audience ini mencegah token yang bocor dari satu layanan diputar ulang ke layanan lain, sebuah pertahanan inti terhadap masalah confused deputy.

Ringkasan Utama
MCP OAuth sulit karena server Model Context Protocol remote harus berperan sebagai resource server OAuth 2.1. Ini mewajibkan PKCE, dynamic client registration agar agent bisa mendaftar sendiri, penemuan authorization server, dan pengikatan audience lewat RFC 8707 sehat token hanya berlaku di server yang dituju. Spesifikasinya pun berubah antar revisi bertanggal, sehingga implementasi ikut bergeser.
Model Context Protocol awalnya sederhana. Sebuah server lokal berjalan di mesin Anda lewat stdio, berbicara dengan satu klien, dan memercayai siapa pun yang menjalankannya. Tidak ada login, tidak ada token, tidak ada OAuth. Lalu MCP menumbuhkan transport remote lewat HTTP, dan segala hal tentang identitas berubah sekaligus.
Server MCP remote berada di internet publik dan bisa dijangkau siapa pun yang tahu URL-nya. Karena itu spesifikasi otorisasi MCP mengadopsi kerangka berbasis OAuth 2.1 untuk melindunginya. Di atas kertas itu pilihan yang bertanggung jawab. Dalam praktik, memasangnya adalah salah satu pekerjaan paling menyakitkan yang akan dihadapi developer tahun ini, dan penting memahami persis kenapa.
Server stdio lokal tidak butuh otorisasi karena sistem operasi sudah menyediakannya. Proses berjalan sebagai Anda, membaca kredensial dari environment variable, dan tidak bisa dijangkau lewat jaringan. Spesifikasi MCP bahkan menyebut implementasi stdio sebaiknya tidak mengikuti alur otorisasi dan cukup mengambil rahasia dari environment.
Server HTTP remote tidak punya jaminan itu. Ia adalah endpoint publik yang harus memutuskan, di setiap permintaan, siapa yang memanggil dan apakah mereka boleh masuk. Itulah persoalan klasik yang dibangun oleh OAuth: membiarkan pihak ketiga bertindak atas nama pengguna tanpa pernah melihat kata sandinya, memakai access token yang terbatas.
Spesifikasi otorisasi MCP tidak menciptakan skema baru. Ia bersandar pada draf OAuth 2.1, ditambah standar metadata, registrasi, dan resource indicator di sekitarnya. OAuth 2.1 pada dasarnya adalah OAuth 2.0 dengan bagian yang tidak aman dibuang: implicit grant hilang, password grant hilang, dan PKCE berubah dari opsional menjadi wajib untuk setiap alur authorization code.
PKCE berarti klien membuat verifier rahasia dan challenge turunannya, mengirim challenge saat meminta authorization code, lalu membuktikan ia memegang verifier saat menukar code itu dengan token. Ini menghentikan penyerang yang menyadap code agar tidak bisa memakainya. Bagi manusia yang mengeklik lewat browser, ini pipa yang tak terlihat. Bagi agent otonom tanpa manusia di keyboard, setiap langkah ini harus diimplementasikan dengan benar dalam kode, tanpa UI sebagai cadangan.
Jangan tergoda memakai implicit grant yang usang saat melihat agent melewati browser. OAuth 2.1 menghapusnya karena alasan keamanan, dan alur authorization code dengan PKCE adalah satu-satunya jalur yang disahkan spesifikasi MCP.
Kesulitannya bukan pada satu syarat pun. Melainkan karena beberapa standar asing harus bekerja bersama, dan tiap standar menambah langkah yang biasanya menuntut kehadiran manusia. Berikut bagian-bagian yang paling sering menjegal developer saat pertama kali menegakkan server MCP remote.
Keputusan paling berguna adalah tidak membuat authorization server sendiri. OAuth adalah ranjau penuh bug keamanan halus, dan spesifikasi MCP secara eksplisit memperlakukan authorization server sebagai urusan terpisah dari resource server. Delegasikan identitas ke penyedia sungguhan, entah platform identitas terkelola atau sistem login mapan Anda sendiri, dan biarkan ia menerbitkan serta memvalidasi token.
Lalu jaga perannya tetap bersih. Server MCP Anda hanyalah resource server: ia menerbitkan protected resource metadata, menunjuk ke authorization server, dan memvalidasi bahwa setiap token masuk menyebut dirinya sebagai audience. Ia tak pernah melihat kata sandi dan tak pernah menerbitkan token. Pemisahan ini persis yang digambarkan spesifikasi, dan inilah yang memungkinkan Anda memakai ulang kode teruji alih-alih menulis kriptografi dengan tangan.
Server MCP remote harus menolak token yang tidak diterbitkan untuknya dan tidak boleh meneruskan token klien ke API hulu. Melewati validasi audience membuka kembali masalah confused deputy yang justru ingin ditutup oleh seluruh desain ini.
Bagi developer agent, otorisasi bukan lagi renungan yang ditempel di akhir. Jika Anda membangun atau memakai server MCP remote, alur OAuth adalah bagian dari kontrak inti, dan menganggapnya opsional adalah cara token bocor dan server disalahgunakan. Kabar baiknya, ekosistemnya mulai menyatu: klien seperti Claude sudah memandu pengguna melewati jabat tangan OAuth saat menambahkan connector remote.
MCP OAuth sulit karena ia jujur mencerminkan betapa sulitnya akses terdelegasi yang aman begitu sebuah server meninggalkan laptop Anda dan menghadap internet. Frustrasinya nyata, tetapi hampir semuanya lenyap saat Anda memakai ulang penyedia identitas yang layak dan menjaga resource server dan authorization server sebagai peran yang berbeda. Benahi pemisahan itu, sisanya hanyalah pipa.