Skip to main content
Alat kustom memperluas SDK Agent dengan memungkinkan Anda menentukan fungsi Anda sendiri yang dapat dipanggil Claude selama percakapan. Menggunakan server MCP dalam proses SDK, Anda dapat memberikan Claude akses ke database, API eksternal, logika khusus domain, atau kemampuan lain yang dibutuhkan aplikasi Anda.

Referensi cepat

Buat alat kustom

Alat didefinisikan oleh empat bagian, dilewatkan sebagai argumen ke helper tool() di TypeScript atau dekorator @tool di Python:
  • Nama: pengidentifikasi unik yang digunakan Claude untuk memanggil alat.
  • Deskripsi: apa yang dilakukan alat. Claude membaca ini untuk memutuskan kapan memanggilnya.
  • Skema input: argumen yang diterima tool, dideklarasikan per bahasa:
    • TypeScript: sebuah skema Zod. args pada handler mengambil tipenya dari skema tersebut. Panggil .describe() pada sebuah bidang untuk memberinya deskripsi yang dilihat Claude.
    • Python: dict yang memetakan nama ke tipe, seperti {"latitude": float}, yang dikonversi SDK ke JSON Schema untuk Anda. Bungkus sebuah tipe dalam Annotated, seperti {"latitude": Annotated[float, "Latitude coordinate"]}, untuk memberi bidang tersebut deskripsi yang dilihat Claude. Dekorator juga menerima dict JSON Schema lengkap secara langsung ketika Anda membutuhkan enum, rentang, bidang opsional, atau objek bersarang.
  • Handler: fungsi async yang berjalan ketika Claude memanggil alat. Ini menerima argumen yang divalidasi dan harus mengembalikan objek dengan:
    • content (diperlukan): array blok hasil, masing-masing dengan type dari "text", "image", "audio", "resource", atau "resource_link". Lihat Return images and resources untuk blok non-teks.
    • structuredContent (opsional): objek JSON yang menyimpan hasil sebagai data yang dapat dibaca mesin, dikembalikan bersama content. Lihat Return structured data.
    • isError (opsional): atur ke true untuk menandakan kegagalan alat sehingga Claude dapat bereaksi terhadapnya. Lihat Handle errors.
Setelah mendefinisikan alat, bungkus dalam server dengan createSdkMcpServer (TypeScript) atau create_sdk_mcp_server (Python). Server berjalan in-process di dalam aplikasi Anda, bukan sebagai proses terpisah. Contoh Python di halaman ini yang membuat permintaan HTTP menggunakan httpx. Tambahkan dengan package manager yang digunakan proyek Anda:

Contoh alat cuaca

Contoh ini mendefinisikan tool get_temperature dan membungkusnya dalam server MCP, tanpa meneruskan server ke query. Untuk menjalankan tool, lihat Call a custom tool di bawah.
Lihat referensi TypeScript tool() atau referensi Python @tool untuk detail parameter lengkap, termasuk format input JSON Schema dan struktur nilai pengembalian.

Jadikan parameter opsional

Untuk menjadikan parameter opsional, deklarasikan sebagai opsional dalam skema dan terapkan nilai default di handler:
  • TypeScript: tambahkan .optional() ke bidang Zod.
  • Python: skema dict mewajibkan setiap kunci. Gunakan bentuk JSON Schema, keluarkan parameter dari required, dan baca dengan args.get(). Untuk skema bertipe dengan kunci opsional, lihat kelas TypedDict.
Tool get_precipitation_chance di bawah menunjukkan kedua pola.

Panggil alat kustom

Teruskan server MCP yang Anda buat ke query melalui opsi mcpServers. Nama lengkap (fully qualified name) setiap tool adalah mcp__{server_name}__{tool_name}, dengan {server_name} adalah kunci yang Anda berikan untuk server dalam mcpServers. Jika kunci tersebut berisi karakter seperti . atau spasi, ganti karakter tersebut dengan _ saat Anda menulis {server_name}. Daftarkan nama lengkap tersebut dalam allowedTools sehingga tool berjalan tanpa permintaan izin. Potongan ini menggunakan kembali weatherServer dari contoh alat cuaca untuk menanyakan Claude tentang cuaca di lokasi tertentu.
Gabungkan potongan ini dengan definisi tool dan server dari contoh tool cuaca dalam satu file, weather.py atau weather.ts, kemudian jalankan dari terminal Anda:
Claude memanggil get_temperature dan skrip mencetak jawaban satu baris dengan suhu saat ini di San Francisco.

Tambahkan lebih banyak alat

Server menampung sebanyak alat yang Anda daftarkan dalam array tools-nya. Dengan lebih dari satu alat di server, Anda dapat mendaftarkan masing-masing dalam allowedTools secara individual atau menggunakan wildcard mcp__weather__* untuk mencakup setiap alat yang diekspos server. Contoh di bawah mendefinisikan alat kedua, get_precipitation_chance, dan mengganti definisi weatherServer dari contoh alat cuaca dengan yang mencantumkan kedua alat dalam array.
Tool search aktif secara default dan menunda alat SDK MCP: Claude melihat nama setiap alat dalam daftar kompak dan memuat skema lengkapnya sesuai permintaan. Dengan pencarian alat dinonaktifkan, setiap alat dalam array ini mengonsumsi ruang jendela konteks pada setiap giliran. Di TypeScript, teruskan alwaysLoad: true dalam argumen extras dari tool() atau dalam opsi createSdkMcpServer() untuk menjaga skema lengkap alat dalam prompt awal.

Tambahkan anotasi alat

Anotasi alat adalah metadata opsional yang menjelaskan bagaimana alat berperilaku. Teruskan sebagai argumen kelima ke helper tool() di TypeScript atau melalui argumen kata kunci annotations untuk dekorator @tool di Python. Semua bidang petunjuk adalah Boolean. Anotasi adalah metadata, bukan penegakan. Alat yang ditandai readOnlyHint: true masih dapat menulis ke disk jika itulah yang dilakukan handler. Jaga anotasi tetap akurat dengan handler. Contoh ini menambahkan readOnlyHint ke alat get_temperature dari contoh alat cuaca.
Lihat ToolAnnotations dalam referensi TypeScript atau Python.

Kontrol akses tool

Contoh weather tool mendaftarkan server dan mencantumkan tools dalam allowedTools. Bagian ini mencakup cara membatasi akses ketika Anda memiliki beberapa tools atau ingin membatasi built-ins. Untuk cara nama tool dibangun, lihat Call a custom tool.

Konfigurasi tools yang diizinkan

Opsi tools dan daftar allowed/disallowed mempengaruhi dua lapisan: availability, yang mengontrol apakah tool muncul dalam konteks Claude, dan permission, yang mengontrol apakah panggilan disetujui setelah Claude mencobanya. tools dan entri disallowedTools dengan nama bare mengubah availability. allowedTools dan aturan disallowedTools yang scoped mengubah permission. Jika Anda menyebutkan salah satu dari task-tracking tools dalam allowedTools, Claude Code juga memilih sesi masuk. Untuk menghapus built-in sepenuhnya, hilangkan dari tools atau cantumkan nama barenya dalam disallowedTools (Python: disallowed_tools); keduanya membuat tool tetap keluar dari konteks sehingga Claude tidak pernah mencobanya. Aturan disallowedTools yang scoped memblokir panggilan yang cocok tetapi membiarkan tool tetap terlihat, jadi Claude mungkin membuang giliran mencobanya. Lihat Configure permissions untuk urutan evaluasi lengkap.

Menangani kesalahan

Kesalahan handler tidak menghentikan loop agen. Server MCP in-process SDK menangkap pengecualian yang tidak tertangani dan mengembalikannya sebagai hasil kesalahan, jadi cara Anda melaporkan kesalahan menentukan apa yang Claude baca, bukan apakah kueri gagal: Dalam kedua kasus Claude dapat mencoba kembali, mencoba alat yang berbeda, atau menjelaskan kegagalan. Tangkap kesalahan sendiri ketika pesan pengecualian mentah tidak cukup bagi Claude untuk bertindak. Contoh di bawah ini menangkap dua jenis kegagalan di dalam handler dan menyusun pesan kesalahan yang Claude baca. Status HTTP non-200 ditangkap dari respons dan dikembalikan sebagai hasil kesalahan. Kesalahan jaringan atau JSON yang tidak valid ditangkap oleh try/except (Python) atau try/catch (TypeScript) di sekitarnya dan juga dikembalikan sebagai hasil kesalahan. Dalam kedua kasus Claude menerima pesan yang menjelaskan kegagalan alih-alih string pengecualian kosong.

Mengembalikan gambar dan sumber daya

Array content dalam hasil tool menerima blok text, image, audio, resource, dan resource_link. Anda dapat mencampurnya dalam respons yang sama. Di TypeScript, SDK menyimpan blok audio ke disk dan Claude menerima blok teks dengan jalur file yang disimpan; di Python, SDK menghapus blok audio dari hasil tool dan mencatat peringatan. Claude menerima setiap blok tautan sumber daya sebagai blok teks yang berisi nama tautan, URI, dan deskripsi. Di TypeScript, aplikasi Anda juga menerima tautan itu sendiri sebagai resourceLinks pada tool_use_result pesan pengguna; di Python, SDK meratakan mereka ke teks sebelum CLI melihat hasilnya, jadi kunci Python resourceLinks tidak pernah diproduksi untuk tool dalam proses.

Gambar

Blok gambar membawa byte gambar secara inline, dikodekan sebagai base64. Tidak ada bidang URL. Untuk mengembalikan gambar yang berada di URL, ambil dalam handler, baca byte respons, dan kodekan base64 sebelum mengembalikan. Gambar PNG, JPEG, GIF, atau WebP mencapai Claude sebagai input visual; gambar dari jenis lain apa pun disimpan ke disk dan Claude menerima jalur filenya sebagai teks sebagai gantinya.

Sumber Daya

Blok sumber daya menyematkan sepotong konten yang diidentifikasi oleh URI. Konten aktual berada di bidang text atau blob blok. Gunakan ini ketika tool Anda menghasilkan file yang dihasilkan atau catatan dari sistem eksternal. Contoh ini menunjukkan blok sumber daya yang dikembalikan dari dalam handler tool. SDK tidak membaca dari URI contoh, file:///tmp/report.md.
Bentuk blok ini berasal dari tipe MCP CallToolResult. Lihat spesifikasi MCP untuk definisi lengkapnya.

Mengembalikan data terstruktur

structuredContent adalah objek JSON opsional pada hasil, terpisah dari array content. Gunakan untuk mengembalikan nilai mentah yang dapat dibaca Claude sebagai bidang yang tepat daripada menguraikannya dari string teks atau gambar. Ketika structuredContent diatur, Claude menerima JSON ditambah blok gambar atau sumber daya apa pun dari content. Blok teks dalam content tidak diteruskan, karena diasumsikan menduplikasi data terstruktur. Contoh di bawah merender bagan sebagai blok gambar dan mengembalikan titik data di baliknya dalam structuredContent dari penangan yang sama. Dalam cuplikan, chartPngBuffer adalah Buffer yang menyimpan byte PNG yang dirender.
TypeScript
Dekorator Python @tool hanya meneruskan content dan is_error dari dict pengembalian penangan. Untuk mengembalikan structuredContent dari Python, jalankan server MCP mandiri daripada server SDK dalam proses.

Contoh: konverter satuan

Alat ini mengonversi nilai antara satuan panjang, suhu, dan berat. Pengguna dapat bertanya “konversi 100 kilometer ke mil” atau “berapa 72°F dalam Celsius,” dan Claude memilih jenis satuan dan satuan yang tepat dari permintaan. Ini mendemonstrasikan dua pola:
  • Enum schemas: unit_type dibatasi pada sekumpulan nilai tetap. Di TypeScript, gunakan z.enum(). Di Python, dict schema tidak mendukung enums, jadi JSON Schema dict lengkap diperlukan.
  • Unsupported input handling: ketika pasangan konversi tidak ditemukan, handler mengembalikan isError: true sehingga Claude dapat memberitahu pengguna apa yang salah daripada memperlakukan kegagalan sebagai hasil normal.
Setelah server didefinisikan, teruskan ke query dengan cara yang sama seperti contoh cuaca. Contoh ini mengirimkan tiga prompt berbeda dalam loop untuk menunjukkan alat yang sama menangani jenis satuan yang berbeda. Untuk setiap respons, ia memeriksa objek AssistantMessage (yang berisi panggilan alat yang dibuat Claude selama giliran itu) dan mencetak setiap ToolUseBlock sebelum mencetak teks ResultMessage akhir. Ini memungkinkan Anda melihat kapan Claude menggunakan alat versus menjawab dari pengetahuannya sendiri. Karena tool search aktif secara default, output juga dapat mencakup panggilan ToolSearch saat Claude memuat skema alat yang ditunda.

Langkah Berikutnya

Anda dapat menggabungkan pola-pola di halaman ini dalam server yang sama: satu server dapat menampung alat database, alat gateway API, dan renderer gambar bersama-sama. Dari sini:
  • Jika server Anda berkembang menjadi puluhan alat, lihat pencarian alat untuk menunda pemuatan hingga Claude membutuhkannya.
  • Untuk terhubung ke server MCP eksternal (filesystem, GitHub, Slack) alih-alih membangun server Anda sendiri, lihat Hubungkan server MCP.
  • Untuk mengontrol alat mana yang berjalan secara otomatis versus memerlukan persetujuan, lihat Konfigurasi izin.