Primitif MCP: Tools, Resources, dan Prompts

Sebuah server MCP bisa mengekspos tools, resources, dan prompts. Mereka dibedakan oleh control model-nya, yaitu siapa yang memutuskan kapan masing-masing berjalan: tools dikendalikan model, resources dikendalikan aplikasi, dan prompts dikendalikan pengguna. Satu perbedaan itu menjelaskan sebagian besar cara masing-masing dimaksudkan untuk dipakai.
Sebuah tool dikendalikan model: AI memutuskan untuk memanggilnya, biasanya untuk mengambil aksi atau menjemput sesuatu yang dinamis. Sebuah resource dikendalikan aplikasi: aplikasi klien memutuskan mana yang dimuat sebagai konteks, dan masing-masing dialamatkan lewat URI. Singkatnya, tools membuat model bertindak sementara resources memasok konteks read-only.
Pakai prompt ketika seseorang seharusnya memicu template yang dapat dipakai ulang dan berparameter dengan sengaja, seperti permintaan review kode atau ringkasan yang ingin Anda tawarkan sebagai titik awal sekali klik. Prompts dikendalikan pengguna dan sering ditampilkan sebagai slash command, yang membuatnya ideal untuk permintaan umum terstruktur yang jika tidak akan diketik ulang orang.
Sebaiknya tidak. Karena resources dikendalikan aplikasi, tak ada jaminan sebuah klien memuat resource tertentu ke konteks, jadi apa pun yang harus selalu diikuti model bisa diam-diam dilewati. Taruh instruksi wajib di deskripsi tool atau sebuah prompt saja, di mana mereka jauh lebih mungkin sampai ke model.
Tanyakan siapa yang seharusnya memutuskan kapan kapabilitas itu berjalan. Jika model yang seharusnya memutuskan dan ia mungkin bertindak atau menjemput secara dinamis, jadikan ia tool. Jika ia konteks read-only yang dipilih aplikasi, jadikan ia resource dengan URI yang stabil. Jika seseorang seharusnya memicunya secara sengaja sebagai template yang dapat dipakai ulang, jadikan ia prompt.

Ringkasan Utama
Server MCP mengekspos tiga primitif: tools, resources, dan prompts. Tools adalah aksi yang dikendalikan model yang bisa dipanggil AI, resources adalah konteks yang dikendalikan aplikasi yang dialamatkan lewat URI, dan prompts adalah template yang dikendalikan pengguna. Mengetahui primitif mana yang cocok untuk pekerjaan mana adalah beda antara server yang dipakai model dengan baik dan yang terus menjangkau tuas yang salah.
Ketika orang pertama kali mengenal Model Context Protocol, mereka cenderung terpaku pada tools dan mengira itulah semua yang ditawarkan server. Nyatanya spesifikasinya mendefinisikan tiga primitif server, dan perbedaan di antaranya bukan apa yang mereka lakukan melainkan siapa yang memutuskan kapan mereka berjalan. Membuat perbedaan itu benar adalah yang memisahkan server yang dipakai model dengan mulus dari yang meraba-raba.
Penjelasan ini menelusuri ketiga primitif, menunjukkan bagaimana mereka berbeda dalam kode, dan memberi satu aturan sederhana untuk memilih di antaranya ketika Anda merancang sebuah server.
Sebuah server MCP bisa mengekspos tools, resources, dan prompts. Mereka dibedakan oleh control model-nya, yaitu pihak mana dalam percakapan yang diharapkan memutuskan kapan kapabilitas itu dipanggil. Satu gagasan itu menjelaskan sebagian besar cara mereka dimaksudkan untuk dipakai.
Singkatnya:
Perbedaannya paling mudah terlihat ketika Anda mendaftarkan satu dari masing-masing pada sebuah server. Bentuknya mirip, tetapi maksud di balik tiap pendaftaran berbeda, dan klien memperlakukannya secara berbeda sebagai hasilnya.
Di sini ketiganya didaftarkan pada objek server yang sama:
// Tool: model-controlled action the client can invoke
server.tool(
"create_issue",
{ title: z.string() },
async ({ title }) => ({
content: [{ type: "text", text: "Created: " + title }],
})
);
// Resource: application-controlled context, addressed by a URI
server.resource(
"readme",
"file:///project/README.md",
async (uri) => ({
contents: [{ uri: uri.href, text: "Project overview..." }],
})
);
// Prompt: user-controlled template, surfaced as a slash command
server.prompt(
"summarize",
{ topic: z.string() },
({ topic }) => ({
messages: [
{
role: "user",
content: { type: "text", text: "Summarize " + topic },
},
],
})
);Control model adalah model mental yang harus dipegang. Sebelum menambahkan sebuah kapabilitas, tanyakan siapa yang seharusnya memutuskan kapan ia berjalan. Jawaban itu, bukan implementasinya, memberi tahu Anda apakah ia sebaiknya menjadi tool, resource, atau prompt.
Tools adalah primitif yang paling diandalkan kebanyakan server karena mereka membuat model bisa bertindak. Karena model memanggilnya atas penilaiannya sendiri, mereka memikul tanggung jawab paling besar dan pantas mendapat perhatian paling besar.
Resources mengekspos data yang bisa dipilih aplikasi untuk ditarik ke konteks, masing-masing diidentifikasi lewat URI seperti jalur berkas atau skema kustom. Mereka dimaksudkan untuk konteks read-only, seperti sebuah dokumen atau berkas konfigurasi, yang diputuskan relevan oleh klien alih-alih dituntut model.
Prompts adalah template yang dapat dipakai ulang dan berparameter yang dipanggil pengguna dengan sengaja. Mereka ideal untuk permintaan umum yang terstruktur, sebuah prompt review kode atau prompt ringkasan, yang ingin Anda tawarkan sebagai titik awal sekali klik alih-alih membuat orang mengetik ulang tiap kali.
Jangan mengandalkan resources untuk instruksi yang harus selalu diikuti model. Karena resources dikendalikan aplikasi, tak ada jaminan sebuah klien memuat resource tertentu ke konteks, jadi apa pun yang wajib menjadi bagian deskripsi tool atau sebuah prompt, bukan resource yang bisa diam-diam dilewati klien.
Kebanyakan kesalahan desain datang dari memaksa satu primitif mengerjakan tugas primitif lain. Satu aturan keputusan singkat menjaga server tetap bersih dan dapat diprediksi bagi klien yang memakainya.
Ketiga primitif MCP tidak bisa dipertukarkan; masing-masing menjawab pertanyaan berbeda tentang siapa yang memegang kendali. Tools untuk model bertindak, resources untuk aplikasi memasok konteks, dan prompts untuk pengguna memanggil sebuah template. Rancang mengikuti pembagian itu dan server Anda akan terasa jelas bagi tiap klien yang terhubung dengannya.