Referensi cepat
Buat alat kustom
Alat didefinisikan oleh empat bagian, dilewatkan sebagai argumen ke helpertool() 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.
argspada 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 dalamAnnotated, 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.
- TypeScript: sebuah skema Zod.
- 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 dengantypedari"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 bersamacontent. Lihat Return structured data.isError(opsional): atur ketrueuntuk menandakan kegagalan alat sehingga Claude dapat bereaksi terhadapnya. Lihat Handle errors.
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:
- Python (uv)
- Python (pip)
Contoh alat cuaca
Contoh ini mendefinisikan toolget_temperature dan membungkusnya dalam server MCP, tanpa meneruskan server ke query. Untuk menjalankan tool, lihat Call a custom tool di bawah.
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 denganargs.get(). Untuk skema bertipe dengan kunci opsional, lihat kelas TypedDict.
get_precipitation_chance di bawah menunjukkan kedua pola.
Panggil alat kustom
Teruskan server MCP yang Anda buat kequery 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.
weather.py atau weather.ts, kemudian jalankan dari terminal Anda:
- TypeScript
- Python (uv)
- Python (pip)
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 arraytools-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.
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 helpertool() 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.
ToolAnnotations dalam referensi TypeScript atau Python.
Kontrol akses tool
Contoh weather tool mendaftarkan server dan mencantumkan tools dalamallowedTools. 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
Opsitools 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
Arraycontent 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 bidangtext 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.
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_typedibatasi pada sekumpulan nilai tetap. Di TypeScript, gunakanz.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: truesehingga Claude dapat memberitahu pengguna apa yang salah daripada memperlakukan kegagalan sebagai hasil normal.
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.