plugin.json di direktori .claude-plugin/ plugin. File ini membawa metadata plugin dan nilai userConfig yang diminta Claude Code kepada pengguna. File ini juga mendeklarasikan komponen apa pun yang Anda tentukan secara inline atau simpan di luar lokasi defaultnya.
Referensi ini untuk pembuat plugin, dan untuk pemilik marketplace yang menempatkan field komponen dalam entri marketplace.
Kasus-kasus ini tercakup di halaman lain:
- Belajar membangun plugin: mulai dengan Buat plugin
- Apa yang dilakukan setiap komponen saat runtime: lihat Komponen plugin
- Sebuah field: tabel Fields memberikan tipe setiap field, apakah diperlukan, defaultnya, dan apa yang diterima. Path rules mencakup awalan
./dan containment untuk setiap path komponen - Opsi
userConfigatau entrichannels: skema User configuration dan Channels ${CLAUDE_PLUGIN_ROOT}atau variabel lain yang dapat direferensikan plugin: Environment variables- Di mana file setiap komponen berada: Standard layout
- Pesan dari
claude plugin validate: halaman troubleshooting mencantumkan setiap pesan dengan perbaikannya dan tautan ke bagian relevan di halaman ini
Manifest file
Manifest bersifat opsional. Tanpanya, Claude Code memuat komponen yang ditemukannya di standard layout. Nama plugin kemudian berasal dari entri marketplace, atau dari nama direktori saat Anda memuat plugin dengan--plugin-dir.
Tulis manifest saat Anda menginginkan metadata, komponen di luar direktori defaultnya, userConfig, atau definisi komponen inline.
Simpan manifest di .claude-plugin/plugin.json di bawah root plugin. Letakkan setiap file plugin lainnya di root plugin, bukan di dalam .claude-plugin/. Ini termasuk skills/, commands/, dan hooks/.
Contoh berikut menetapkan sebagian besar kunci dalam tabel Fields. Ini melewati validasi di direktori plugin yang berisi setiap path yang direferensikan.
Unrecognized fields
Kunci tingkat atas yang tidak dikenali akan dihapus, dan kunci yang tidak dikenali di dalam opsiuserConfig, entri channels, config lspServers, atau entri monitors akan ditolak:
- Top-level fields: field dihapus dan plugin dimuat.
claude plugin validatemelaporkan setiap field tingkat atas yang tidak dikenali sebagai peringatan - Strict objects: opsi
userConfig, entrichannels, configlspServers, dan entrimonitorsbersifat ketat. Kunci yang tidak diketahui di dalamnya adalah kesalahan, dan plugin tidak dimuat
Validate the manifest
claude plugin validate adalah pemeriksaan otoritatif untuk manifest. Jalankan dari shell Anda terhadap direktori plugin:
Validation passed: manifest dimuatValidation passed with warnings: manifest dimuat, tetapi validator menemukan sesuatu untuk diperbaiki, seperti field tingkat atas yang tidak diketahui yang Claude Code hapus,nameyang bukan kebab-case, atauversion,description, atauauthoryang hilang. Lewatkan--strictuntuk mengubah peringatan menjadi kegagalan di CIValidation failed: manifest memiliki ketidakcocokan tipe, path yang hilang atau keluar dari root plugin, atau kunci yang tidak diketahui di dalam opsiuserConfig, entrichannels, configlspServers, atau entrimonitors. Claude Code melaporkan masalah yang sama saat memuat plugin
Fields
Tabel mencantumkan kunci tingkat atas dalamplugin.json. name adalah satu-satunya kunci yang diperlukan. Jika nama field adalah tautan, bagian yang ditautkan memiliki aturan lengkapnya.
Untuk kunci komponen seperti commands dan hooks, Component path forms menunjukkan setiap bentuk yang diterima dengan contoh, dan setiap path mengikuti path rules untuk awalan ./, ekstensi, dan containment.
Di kolom Type, path adalah string relatif terhadap root plugin, seperti
"./custom/commands".
name
Identifier plugin. Harus non-kosong, tanpa spasi, @, :, pemisah path, karakter kontrol, atau karakter pemformatan bidirectional; gunakan kebab-case.
Claude Code mem-namespace setiap komponen di bawahnya, jadi agent reviewer dalam plugin deploy-tools muncul sebagai deploy-tools:reviewer.
displayName
Nama yang ditampilkan di UI sebagai pengganti name. Mungkin berisi spasi dan casing apa pun, dan tidak digunakan untuk namespacing atau pencarian.
Untuk plugin yang diinstal dari marketplace, displayName di entri marketplace mengambil alih nilai ini.
version
String versi, tidak diperiksa terhadap semver. Menetapkannya mengunci plugin ke versi itu sampai Anda mengubahnya; lihat Versions and updates. Plugin dengan command source, plugin dari marketplace yang dihosting di claude.ai, dan plugin dimuat di tempat dari marketplace yang ditambahkan sebagai direktori lokal tidak dikunci oleh field ini.
metadata
Objek bentuk bebas untuk data Anda sendiri, seperti field katalog atau hak. Claude Code tidak membacanya. Memerlukan Claude Code v2.1.222 atau lebih baru.
defaultEnabled
Apakah plugin dimulai diaktifkan saat pengguna belum menetapkannya di enabledPlugins. Default ke true. Plugin yang diaktifkan plugin tergantung dimulai diaktifkan terlepas dari itu. Field yang sama di entri marketplace menimpanya.
Setelah entri enabledPlugins pengguna ditulis, itu bertahan di seluruh pembaruan plugin, jadi mengubah defaultEnabled dalam rilis kemudian tidak mengubah pengaturan untuk pengguna yang ada.
dependencies
Plugin yang harus diaktifkan agar yang ini berfungsi. Setiap entri adalah "name", "name@marketplace", atau { "name": "...", "marketplace": "...", "version": "..." }. Nama bare diselesaikan terhadap marketplace plugin ini sendiri. Lihat dependency constraints.
settings
Pengaturan yang Claude Code terapkan saat plugin diaktifkan. Hanya agent dan subagentStatusLine yang berlaku; kunci lain dihapus saat muat. settings.json di root plugin mengambil alih kunci ini. Lihat Default settings.
Component path forms
Setiap kunci komponen menerima path relatif terhadap root plugin.hooks, mcpServers, lspServers, dan experimental.monitors juga menerima config inline, commands juga menerima peta objek, dan mcpServers juga menerima path bundle MCP dan URL. Contoh-contoh berikut menunjukkan setiap bentuk yang diterima sekali. Untuk apa yang dilakukan setiap komponen saat runtime, lihat Plugin components.
Path-only fields
agents, skills, outputStyles, workflows, dan experimental.themes mengambil satu path atau array path. Entri agents harus file .md, dan entri skills harus direktori. Tiga lainnya menerima direktori atau file.
commands
commands mengambil path, array path, atau peta objek. Path menamai file perintah .md datar atau direktori. Dalam peta objek, setiap kunci menjadi nama perintah setelah awalan plugin. Misalnya, "about" dalam plugin deploy-tools berjalan sebagai /deploy-tools:about.
Setiap nilai menetapkan tepat satu dari source atau content, dan entri yang menetapkan keduanya atau tidak ada gagal validasi. Field lain dalam tabel ini opsional:
Peta ini mendeklarasikan satu perintah dari file dan satu dari konten inline:
hooks
hooks mengambil path file .json, objek hooks inline dalam bentuk yang sama seperti hooks dalam settings.json, atau array yang mencampur keduanya. Untuk event hook dan field handler, lihat hooks reference.
Claude Code menggabungkan apa pun yang Anda deklarasikan dengan hooks/hooks.json saat file itu ada.
mcpServers
mcpServers mengambil path file .json, path bundle MCP atau URL, peta inline, atau array yang mencampur mereka. Untuk field config server, lihat plugin-provided MCP servers.
Claude Code memuat .mcp.json di root plugin terlebih dahulu, kemudian setiap bentuk yang dideklarasikan secara berurutan. Nama server yang dideklarasikan kemudian menggantikan yang sebelumnya.
Nilai mcpServers mengambil salah satu bentuk berikut:
Path bundle atau URL harus berakhir dengan
.mcpb atau .dxt. Ekstensi lain apa pun gagal validasi.
lspServers
lspServers mengambil path file .json, peta inline nama server ke config, atau array keduanya.
Claude Code memuat .lsp.json di root plugin terlebih dahulu, kemudian setiap config yang dideklarasikan secara berurutan. Nama server yang dideklarasikan kemudian menggantikan yang sebelumnya.
Setiap config server adalah objek ketat dengan field berikut. Kunci yang tidak diketahui gagal validasi.
Config inline ini menjalankan
gopls untuk file .go:
monitors
experimental.monitors mengambil path file .json atau array inline. Saat Anda menghilangkan kunci, Claude Code memuat monitors/monitors.json jika ada.
Setiap entri adalah objek ketat dengan field berikut.
Array inline ini mendeklarasikan satu monitor yang dimulai pertama kali skill
deploy berjalan:
command tidak dapat mereferensikan ${user_config.*}. Lihat Fields that run through a shell.
Path rules
Setiap path komponen dalam manifest relatif terhadap root plugin dan harus dimulai dengan./. Path seperti commands/foo.md gagal validasi. skills dan mcpServers masing-masing menerima satu bentuk di luar aturan itu:
skills: juga menerima".". Baik"."maupun"./"menunjukkan root plugin. Sebelum v2.1.221,"."gagal validasi manifest, jadi gunakan"./"saat plugin harus dimuat di versi sebelumnyamcpServers: juga menerima URL bundlehttps://
Containment and existence
Setiap path komponen harus diselesaikan di dalam root plugin dan harus ada.claude plugin validate tidak memeriksa path outputStyles, lspServers, monitors, atau themes, jadi path yang buruk di field tersebut gagal hanya saat plugin dimuat:
- Containment: path yang diselesaikan di luar root plugin tidak dimuat, dan tab Errors
/pluginmenampilkan<component> path escapes plugin directory: <path>. Path yang berisi..adalah kasus biasa, danclaude plugin validatemelaporkannya sebagaiPath contains ".." which could be a path traversal attempt - Existence: path yang tidak ada tidak dimuat, dan tab Errors
/pluginmenampilkan<component> path not found: <path>.claude plugin validatemelaporkannya sebagaiPath not found
How each key combines with its default location
Setiap kunci komponen baik menggantikan lokasi defaultnya, menambahnya, atau menggabungkannya:- Menggantikan default:
commands,agents,outputStyles,workflows,experimental.themes,experimental.monitors. Saat Anda menetapkancommands, direktori defaultcommands/tidak dipindai. Untuk menyimpan default dan menambah lebih banyak, daftarkan secara eksplisit:"commands": ["./commands/", "./extras/"] - Menambah default:
skills. Direktoriskills/masih dipindai, dan direktori yang terdaftar dimuat bersama dengannya - Menggabungkan:
hooks,mcpServers,lspServers. File default dimuat terlebih dahulu, dan apa yang manifest deklarasikan digabungkan ke dalamnya, seperti dijelaskan di bawah Component path forms
commands/ dan juga menetapkan kunci manifest yang menggantinya, Claude Code memuat path manifest dan bukan folder. claude plugin list dan antarmuka /plugin kemudian menampilkan peringatan Default <folder>/ folder is ignored because the manifest sets "<key>".
Untuk menghindari peringatan, atur kunci ke path di dalam folder itu: "commands": ["./commands/deploy.md"] menamai file di folder default dan tidak menghasilkan peringatan.
User configuration
userConfig mendeklarasikan nilai yang Claude Code minta kepada pengguna saat plugin diaktifkan, sehingga pengguna tidak mengedit settings.json sendiri.
Kunci adalah identifier yang terdiri dari huruf, digit, dan garis bawah, dan tidak dapat dimulai dengan digit.
Setiap nilai adalah objek ketat dengan field berikut. Kunci yang tidak diketahui gagal validasi.
Setiap opsi setiap plugin yang diaktifkan juga muncul sebagai baris di panel
/config, kecuali opsi sensitive dan daftar multiple. Baris /config memerlukan Claude Code v2.1.269 atau lebih baru.
userConfig ini mendeklarasikan endpoint dan token yang disembunyikan:
Limit a field to fixed options
Aturoptions pada field userConfig untuk membuat pengguna memilih nilainya dari daftar tetap.
Untuk membatasi field tone ke tiga opsi, daftarkan di options dan atur default ke salah satunya:
options pada field apa pun, pengguna di versi Claude Code sebelum v2.1.271 tidak dapat memuat plugin.
options berlaku untuk field string yang bukan multiple atau sensitive. Atur default ke salah satu nilai yang terdaftar, atau atur required: true sehingga pengguna harus memilih satu. Setiap opsi adalah label polos 1 hingga 64 karakter, dan claude plugin validate, yang Anda jalankan di shell Anda, melaporkan apa pun yang ditolaknya. Plugin yang options-nya melanggar aturan ini gagal dimuat.
Where values are stored
Nilai non-sensitif disimpan di bawahpluginConfigs dalam settings.json pengguna. Nilai sensitif masuk ke penyimpanan kredensial aman platform sebagai gantinya. Halaman pengaturan mencantumkan file pengaturan mana yang pluginConfigs dibaca.
Reference a saved value
Referensikan nilai yang disimpan di mana plugin membutuhkannya, dalam salah satu dari dua bentuk:${user_config.KEY}: disubstitusi dalam config server MCP, config server LSP, exec-form hookargs, dan konten skill dan agent. Dalam konten skill dan agent, hanya nilai non-sensitif yang disubstitusi, dan nilai sensitif di sana menjadi placeholderCLAUDE_PLUGIN_OPTION_<KEY>: diekspor ke proses hook untuk setiap opsi, dengan<KEY>huruf besar. Hook bentuk shell membaca$CLAUDE_PLUGIN_OPTION_API_TOKENuntukapi_token
Fields that run through a shell
Perintah hook bentuk shell, perintah monitor, dan MCPheadersHelper menolak ${user_config.*}. Komponen yang mereferensikannya di salah satu field ini gagal dengan error daripada berjalan, karena nilai field dilewatkan ke shell yang akan mem-parse ulang nilai yang disubstitusi.
Tabel menunjukkan bagaimana nilai dapat mencapai setiap field ini sebagai gantinya.
Channels
channels mendeklarasikan saluran pesan yang disediakan plugin, seperti jembatan ke aplikasi chat. Saat Anda mendeklarasikan satu, Claude Code dapat meminta konfigurasi saluran saat plugin diaktifkan. Untuk bagaimana server menyuntikkan pesan, lihat channels reference.
Setiap entri adalah objek ketat yang terikat ke salah satu server MCP plugin, dengan field berikut:
Manifest ini mengikat saluran ke server MCP
telegram plugin dan meminta token bot yang disubstitusi ke dalam env server:
Environment variables
Claude Code menyediakan tiga variabel path ke komponen plugin. Referensikan sebagai${NAME} di field yang tercantum di bawah Where each variable resolves, dan bacanya sebagai variabel lingkungan dalam proses yang menerimanya.
${CLAUDE_PLUGIN_ROOT} berubah saat plugin diperbarui, jadi jangan tulis state di sana. Untuk di mana root bergerak dan kapan direktori lama dibersihkan, lihat halaman loading.
Saat Anda mencopot plugin dari tempat terakhir diinstal, direktori ${CLAUDE_PLUGIN_DATA} dihapus kecuali Anda melewatkan --keep-data.
Where each variable resolves
Di setiap komponen plugin, referensi${...} diselesaikan inline di field tertentu, dan beberapa komponen juga menerima variabel di lingkungan proses mereka:
Variabel tidak ada dalam lingkungan perintah yang Claude jalankan melalui tool Bash, dalam sesi utama atau dalam subagent. Dalam konten skill, command, dan agent, tulis referensi
${...} dalam badan Markdown sebagai gantinya, dan Claude Code mensubstitusi path inline saat memuat konten.
Quoting and path separators
Simpan setiap path yang disubstitusi sebagai argumen tunggal:- Hook commands: gunakan exec form dengan
argssehingga setiap path adalah satu argumen tanpa quoting - Shell-form hooks dan monitor commands: bungkus variabel dalam tanda kutip ganda sehingga path dengan spasi tetap satu kata
Standard layout
Setiap tipe komponen memiliki lokasi default di bawah root plugin, digunakan saat manifest tidak menunjuk ke tempat lain.
Plugin yang menggunakan setiap lokasi default, ditambah folder
scripts/ yang dipanggil hook-nya, diatur seperti ini:
CLAUDE.md di root plugin tidak dimuat sebagai konteks, dan claude plugin validate memperingatkan saat menemukannya. Untuk menyertakan instruksi yang dimuat ke dalam konteks Claude, letakkan di skill.
Marketplace entries and the manifest
Entri marketplace menerima setiap field di halaman ini bersama dengan field-nya sendiri, termasukstrict.
Field strict memutuskan apakah entri dapat menambahkan komponen ke plugin yang memiliki plugin.json-nya sendiri. Default ke true.
How entry fields combine with plugin.json
Entri baik berfungsi sebagai manifest, menambahkan komponen ke dalamnya, atau berkonflik dengannya:
- Tidak ada
plugin.json: entri adalah manifest, terlepas daristrict. Entryhooksdimuat hanya dalam bentuk objek inline. Untuk path file atau array di sana, tab Errors/pluginmenampilkan errornot yet supported in a marketplace entry plugin.jsonada,stricttidak diatur atautrue: Claude Code memuat manifest dan menambahkancommands,agents,skills,outputStyles, danthemesentri ke dalamnya. Untukhooks, matcher entri untuk event menggantikan matcher manifest untuk event yang sama, dan event hanya manifest yang mendeklarasikan tetap miliknyaplugin.jsonada,strict: false: entri yang mendeklarasikan salah satu daricommands,agents,skills,hooks,outputStyles, atauthemesadalah konflik, dan plugin gagal dimuat denganPlugin <name> has conflicting manifests
source-nya adalah root marketplace mencantumkan subdirektori skills tertentu, hanya subdirektori tersebut yang dimuat, dan direktori default skills/ plugin tidak dipindai. Kunci skills dalam manifest sebagai gantinya menambah default.
Metadata precedence
Beberapa field metadata memiliki preseden tetap terlepas daristrict:
defaultEnableddan display fields:defaultEnabledentri dan display fields-nya sepertidisplayNamemenimpakan manifestversion:versionmanifest menimpakan entriname: saat entri mencantumkan plugin di bawahnameberbeda dari manifest,enabledPluginsmenggunakan nama entri, dan komponen di-namespace di bawah nama manifest
Next steps
- Tambahkan komponen ke plugin: apa yang dilakukan setiap komponen saat runtime, dengan contoh yang divalidasi
- Referensi marketplace: field entri yang dapat ditetapkan marketplace untuk plugin Anda
- Referensi perintah plugin: flag dan output
claude plugin validate - Troubleshoot plugins: setiap pesan validasi dengan perbaikannya