Demo MCP biasanya memperlihatkan agen menemukan tool, memanggilnya, lalu menjawab dengan data dari layanan lain. Bagian yang tidak terlihat justru menentukan apakah integrasi dapat diandalkan: identitas pemanggil, kontrak data, versi protokol, dan batas kepercayaan pada hasil tool.
MCP menstandarkan pertukaran konteks dan kemampuan antara aplikasi serta server. Artikel ini merujuk spesifikasi 2026-07-28, bukan menganggap semua contoh dari versi lama tetap identik. Rancangan layanan arsip di bawah bersifat ilustratif dan tidak membuka server atau akun nyata.
Pisahkan host, client, server, dan layanan asal
Host adalah aplikasi yang dipakai pengguna. Client di dalam host menghubungkannya ke server MCP. Server kemudian menyediakan kemampuan tertentu, misalnya mengambil artikel dari arsip. Layanan asal dapat memiliki identitas serta hak aksesnya sendiri.
Autentikasi ke server tidak otomatis memberi akses ke semua data yang dapat dijangkau server. Jika server memakai kredensial bersama dengan hak luas, ia tetap perlu menerapkan batas pengguna pada setiap operasi. Jangan memindahkan keputusan akses ke model melalui instruksi “jangan tampilkan dokumen privat”.
Tentukan apa yang diekspos sebagai resource dan apa yang menjadi tool. Membaca artikel publik berbeda dari menyunting atau menerbitkan artikel. Kemampuan yang memiliki efek samping perlu kontrak serta keputusan otorisasi tersendiri.
Descriptor tool harus menjelaskan batas tugas
Spesifikasi tools menjelaskan nama, schema input, serta schema output yang dapat membantu konsumen memvalidasi hasil. Contoh ini adalah descriptor rancangan, bukan request JSON-RPC lengkap:
{
"name": "get_public_article",
"description": "Membaca satu artikel yang sudah terbit dari arsip publik.",
"inputSchema": {
"type": "object",
"properties": {"article_id": {"type": "string"}},
"required": ["article_id"],
"additionalProperties": false
},
"outputSchema": {
"type": "object",
"properties": {
"title": {"type": "string"},
"url": {"type": "string"},
"revision": {"type": "integer"}
},
"required": ["title", "url", "revision"],
"additionalProperties": false
}
}
Validasi ID dan akses dilakukan server. Deskripsi tidak menggantikan pembatasan query. Jika artikel belum terbit, hasilnya perlu menyatakan tidak tersedia melalui kontrak error yang didukung; jangan mengembalikan draf lalu meminta model merahasiakannya.
Versi 2026-07-28 memiliki persyaratan metadata request yang perlu diikuti klien. Gunakan implementasi dan dokumentasi yang cocok, bukan menyusun request lengkap dari potongan descriptor ini.
Otorisasi HTTP dan kredensial proses berbeda
Spesifikasi authorization membahas alur untuk transport HTTP dan membedakannya dari STDIO, yang mengambil kredensial dari lingkungan sesuai implementasi. Token perlu divalidasi untuk resource yang dituju; token yang diterbitkan bagi layanan lain tidak otomatis sah untuk server ini.
Tentukan siapa yang boleh memasang integrasi, siapa yang dapat memanggil tool, dan data apa yang boleh dikembalikan. Scope terlalu luas membuat satu kemampuan baca menjadi jalan menuju seluruh akun.
Jangan memasukkan token ke deskripsi tool, prompt, atau respons. Logging harus membantu diagnosis tanpa menyalin kredensial. Saat debugging, gunakan identitas uji dengan hak terbatas dan data sintetis sebelum menyambungkan dokumen organisasi.
Hasil tool tetap perlu divalidasi
Keluaran terstruktur memudahkan pemrosesan, tetapi server yang salah konfigurasi dapat mengembalikan URL atau tipe nilai yang tidak diharapkan. Contoh JavaScript lokal berikut memeriksa sebagian aturan arsip fiktif:
export function validatePublicArticle(value) {
if (!value || typeof value !== 'object' || Array.isArray(value)) {
return false;
}
if (Object.keys(value).sort().join(',') !== 'revision,title,url') return false;
if (typeof value.title !== 'string' || !value.title.trim()) return false;
if (!Number.isInteger(value.revision) || value.revision < 1) return false;
try {
const url = new URL(value.url);
return url.origin === 'https://example.com'
&& !url.username && !url.password
&& /^\/articles\/[a-z0-9]+(?:-[a-z0-9]+)*\/$/.test(url.pathname)
&& !url.search && !url.hash;
} catch {
return false;
}
}
Domain contoh harus diganti dengan origin yang disetujui aplikasi. Validator ini tidak mengakses URL dan tidak membuktikan artikel benar-benar terbit. Status publik tetap berasal dari pemeriksaan server terhadap penyimpanan yang berwenang.
Teks dari server bukan instruksi baru bagi host
Artikel atau hasil pencarian dapat berisi kalimat yang mencoba mengubah tugas agen. Host perlu mempertahankan perbedaan antara instruksi pengguna dan data yang baru dibaca. Server yang dipercaya mengirim data pun tidak otomatis berwenang mengubah kebijakan aplikasi.
Batasi ukuran keluaran, beri identitas sumber, dan tampilkan error secara jelas. Untuk tool yang mengubah data, gunakan identitas operasi yang stabil serta pemeriksaan versi. Timeout bukan bukti bahwa tindakan belum terjadi.
| Skenario uji | Hasil yang diharapkan |
|---|---|
| Token untuk resource lain | Ditolak sebelum akses data |
| ID artikel draf | Tidak mengembalikan isi draf |
| Keluaran melanggar schema | Tidak diteruskan sebagai data valid |
| Isi artikel menyisipkan instruksi | Diproses sebagai bahan bacaan |
| Tool timeout setelah tindakan | Status diperiksa sebelum retry |
Integrasi siap dipakai setelah kontraknya dapat diuji
Siapkan tes kontrak dengan respons sukses, error, dan data tidak sesuai schema. Uji kompatibilitas client-server pada versi protokol yang didukung. Perubahan schema atau izin perlu dianggap sebagai perubahan integrasi, meskipun nama tool tetap sama.
Untuk arsip contoh, uji pula perubahan artikel dari publik menjadi ditarik. Hasil yang sebelumnya valid tidak boleh terus dibagikan dari cache tanpa pemeriksaan kelayakan. Simpan revisi serta waktu pengambilan pada lapisan aplikasi agar host dapat menampilkan konteks, sambil tetap memeriksa akses pada operasi berikutnya.
Ukur keberhasilan tugas utuh, latensi tool, penolakan akses yang benar, serta beban pemulihan kegagalan. Jumlah tool yang tersedia bukan ukuran manfaat. Untuk tindakan yang perlu keputusan manusia, sambungkan server ke alur handoff berbasis versi dan idempotensi pekerjaan.