.claude-plugin/plugin.json yang menggantikan atau menambah folder tersebut, dan nama yang dilihat pengguna. Untuk tabel bidang lengkap setiap kunci, lihat referensi manifest.
Gunakan halaman ini untuk menambahkan komponen ke plugin yang sudah dimuat.
Setelah Anda menambahkan komponen, jalankan /reload-plugins dalam sesi yang sedang berjalan atau mulai sesi baru sehingga Claude Code memuatnya. Untuk memeriksa file komponen sebelum memuatnya, jalankan claude plugin validate . di shell Anda dari direktori plugin.
Kasus-kasus ini tercakup di halaman lain:
- Membangun plugin pertama Anda: mulai dengan Buat plugin
- Memasang plugin orang lain: lihat Pasang plugins
- Pengguna plugin Anda berada di claude.ai atau di Cowork: serangkaian komponen yang berbeda dimuat di sana. Lihat Plugins di claude.ai dan di Cowork
Jelajahi direktori plugin
Explorer menunjukkan plugin contoh,my-plugin, yang memiliki satu dari setiap jenis komponen di lokasi defaultnya:
- Skill review dan perintah
about - Subagent security-review
- Hook yang memformat file setelah Claude mengeditnya, dan folder
scripts/yang dipanggilnya - Monitor log
- Gaya output dan tema warna
- Workflow route-audit
- Executable
hello-plugin - Pengaturan default
- Server MCP lokal dan language server Go
Tambahkan setiap jenis komponen
Setiap bagian di bawah mencakup satu jenis komponen: di mana file-filenya berada di plugin, contoh yang memvalidasi, apa yang dilihat pengguna setelah plugin dimuat, dan kunci manifest yang mengubah lokasi default. Tambahkan yang dibutuhkan plugin Anda; tidak ada yang diperlukan.Skills
Skill adalah fileSKILL.md yang dapat dimuat Claude ketika deskripsinya cocok dengan tugas. Pengguna juga dapat menjalankannya sebagai perintah. Simpan setiap skill di direktorinya sendiri di bawah skills/:
SKILL.md description sehingga Claude tahu kapan menggunakannya:
skills/review/SKILL.md
/my-plugin:review menjalankan skill. Nama perintah dan siapa yang dapat memanggilnya mengikuti aturan ini:
- Nama perintah:
/<plugin>:<directory>, jadiskills/review/SKILL.mddimy-pluginadalah/my-plugin:review. Jika Anda menetapkannamedi frontmatter, itu menggantikan segmen terakhir dan awalan plugin tetap. Lihat bagaimana skill mendapatkan nama perintahnya - Siapa yang memanggilnya: Claude, pengguna, atau keduanya, dikendalikan oleh frontmatter. Lihat Kontrol siapa yang memanggilnya skill
skills/:
- Direktori tambahan: daftarkan di kunci manifest
skills. Mereka menambah pemindaian defaultskills/daripada menggantinya, tidak seperticommandsdanagents - Skill tunggal di root plugin: tanpa direktori
skills/dan tanpa kunci manifestskills,SKILL.mddi root plugin dimuat sebagai satu skill. Tetapkannamedi frontmatter-nya, karena jika tidak, instalasi marketplace menamakan skill setelah cache directory-nya daripada plugin Anda
CLAUDE.md di root plugin, dan claude plugin validate memperingatkan CLAUDE.md at the plugin root is not loaded as project context.
Untuk field frontmatter dan file pendukung, lihat Skills.
Commands
Perintah adalah file Markdown tunggal yang dijalankan pengguna berdasarkan nama, seperti/my-plugin:about.
Perintah adalah format yang lebih lama, dan skills menggantikannya untuk pekerjaan baru. Skill berjalan berdasarkan nama dengan cara yang sama, dan itu juga dapat membawa file pendukung di direktorinya. Simpan
commands/ untuk file yang Anda pindahkan dari .claude/commands/.commands/<file>.md dan itu menjadi /<plugin>:<file>. Subdirektori menambah segmen, jadi commands/db/migrate.md adalah /my-plugin:db:migrate.
File perintah mengambil frontmatter yang sama dengan skills.
Tentukan perintah di manifest
Anda hanya membutuhkan ini jika Anda ingin menyimpan file perintah di tempat lain selaincommands/, atau untuk mendefinisikan perintah pendek di dalam plugin.json tanpa file Markdown terpisah. Tetapkan kunci manifest commands, dan Claude Code membacanya daripada memindai commands/. Kunci mengambil jalur, array jalur, atau objek yang memetakan setiap nama perintah ke file source atau content inline.
Manifest ini mendefinisikan /my-plugin:about inline, tanpa file Markdown:
.claude-plugin/plugin.json
/my-plugin:about dalam sesi untuk mengonfirmasi itu dimuat.
Untuk sintaks kunci lengkap, lihat commands.
Agents
Subagent adalah asisten terpisah, dengan instruksinya sendiri dan jendela konteks, yang dapat didelegasikan Claude untuk menyelesaikan tugas. Setiap file Markdown di bawahagents/ mendefinisikan satu:
agents/security-reviewer.md
my-plugin:security-reviewer, dan pengguna dapat memanggilnya secara eksplisit dengan @agent-my-plugin:security-reviewer. Bentuk nama adalah <plugin>:<name>, di mana <name> berasal dari frontmatter, atau dari nama file ketika tidak ada.
Kunci manifest agents menggantikan pemindaian agents/.
Atur agents dalam subfolder
Anda dapat menempatkan file agent plugin dalam subfolderagents/. Claude Code memuatnya secara rekursif dan menggabungkan nama plugin, setiap nama subfolder, dan nama file dengan titik dua untuk membentuk nama scoped agent. Misalnya, agents/review/security.md dalam plugin bernama my-plugin dimuat sebagai my-plugin:review:security. Dua pengaturan mengubah nama itu:
- Frontmatter
name: itu menggantikan hanya nama file, jadiname: auditdiagents/review/security.mddimuat sebagaimy-plugin:review:audit - Field manifest
agents: file yang Anda daftarkan di sana dimuat tanpa nama subfolder, jadi"agents": "./custom/review/security.md"dimuat sebagaimy-plugin:security
Field frontmatter dalam agent plugin
Frontmatter agent plugin mengikuti aturan ini:- Field yang didukung:
name,description,model,effort,maxTurns,tools,disallowedTools,skills,memory,background,omitClaudeMd,isolation,color, dan kuncicacheTtldariexperimental. Satu-satunya nilaiisolationyang valid adalah"worktree". Lihat field frontmatter yang didukung untuk apa yang dilakukan masing-masing - Field yang diabaikan:
permissionMode,hooks,mcpServers, daninitialPrompt. File agent tidak dapat menambahkan hooks atau server MCP sendiri, jadi tambahkan itu sebagai plugin hooks dan server MCP sebagai gantinya - Frontmatter yang tidak diuraikan: agent masih dimuat dengan setiap field diabaikan. Itu dinamai setelah file, dan deskripsinya berbunyi
Agent from my-plugin plugin. Jalankanclaude plugin validatedi shell Anda untuk menemukan file-file ini
Hooks
Hook menjalankan sesuatu secara otomatis pada titik dalam siklus hidup Claude Code, seperti setelah setiap pengeditan file: perintah shell, permintaan HTTP, panggilan tool MCP, prompt ke model, atau subagent. Simpan hooks plugin dihooks/hooks.json di root plugin, di bawah kunci top-level "hooks", dalam bentuk yang sama dengan objek hooks di settings.json. Itu memungkinkan Anda menyalin hook pengaturan yang ada tanpa perubahan.
Hook ini menjalankan script bundled setelah setiap Write atau Edit:
hooks/hooks.json
scripts/format.sh dan buat dapat dieksekusi.
Muat plugin dan minta Claude untuk mengedit file. Hook PostToolUse yang keluar 0 tidak menunjukkan apa pun dalam transkrip, jadi konfirmasi itu berjalan dengan debug logging atau dengan apa yang diubah script itu sendiri.
Hooks di hooks/hooks.json dan di kunci manifest hooks keduanya dimuat. Untuk setiap event dan payload-nya, lihat Hook events.
Kapan hook plugin dipecat
Hook plugin tidak menunggu salah satu skill atau perintah plugin digunakan. Claude Code mendaftarkannya ketika sesi memuat plugin, dan mereka dipecat pada event mereka sejak saat itu. Untuk membatasi kapan hook berjalan, persempitmatcher-nya.
Jika hook tidak pernah dipecat, lihat hooks yang tidak dipecat.
Lingkungan, quoting, dan pencocokan tool MCP
Lingkungan hook, quoting${CLAUDE_PLUGIN_ROOT}, dan matcher untuk tool MCP plugin sendiri bekerja sebagai berikut:
- Lingkungan: setiap proses hook menerima
CLAUDE_PLUGIN_ROOTdanCLAUDE_PLUGIN_DATAdi lingkungannya, ditambahCLAUDE_PLUGIN_OPTION_<KEY>untuk setiap nilai konfigurasi pengguna, sehingga script Anda dapat membacanya dari sana - Quoting: ketika
commandtidak memilikiargs, itu berjalan melalui shell, jadi bungkus jalur${CLAUDE_PLUGIN_ROOT}dalam tanda kutip ganda, seperti contohhooks/hooks.jsondi bawah Hooks, untuk menjaga jalur yang diperluas sebagai satu kata shell. Ketika Anda melewatkanargssebagai gantinya, setiap elemen dilewatkan sebagai satu argumen tanpa shell dan tidak memerlukan quoting. Lihat exec form dan shell form - Pencocokan tool MCP plugin sendiri: tool dari server MCP yang dideklarasikan plugin ini dinamai
mcp__plugin_<plugin>_<server>__<tool>, jadi tulis nama lengkap itu di matcher. Matcher pada nama server saja tidak pernah dipecat. Lihat Match MCP tools
Server MCP
Server MCP memberikan Claude tools dari sistem eksternal. Deklarasikan di.mcp.json di root plugin, dalam bentuk yang sama dengan project .mcp.json. .mcp.json ini mendeklarasikan satu server bernama db:
.mcp.json
mcpServers dan menempatkan db di level atas file.
Muat plugin dan jalankan /mcp untuk mengonfirmasi server muncul sebagai plugin:my-plugin:db.
claude plugin validate memeriksa .mcp.json dan melaporkan entri server yang akan dijatuhkan Claude Code pada waktu muat sebagai kesalahan. Memerlukan Claude Code v2.1.281 atau lebih baru.
Untuk di mana entri buruk muncul pada waktu muat, lihat Server MCP yang tidak dimulai.
Kunci manifest mcpServers mengambil peta server inline, jalur ke file JSON, atau array dari itu. Ketika server manifest memiliki nama yang sama dengan yang di .mcp.json, server manifest menggantinya.
Jangkau pengguna di claude.ai dan Cowork
Server stdio lokal, seperti serverdb di bawah Server MCP, berjalan di Claude Code dan dalam sesi Cowork yang berjalan di mesin Anda di aplikasi Claude Desktop, tetapi bukan di claude.ai. Untuk menjangkau pengguna di sana juga, referensikan server jarak jauh dengan URL https://-nya, yang claude.ai dan Cowork tawarkan kepada pengguna sebagai konektor.
Nama server, nama tool, dan reload
Nama server, substitusi variabel, dan perilaku reload mengikuti aturan ini:- Nama server:
plugin:<plugin>:<server>, jadi serverdbdimy-pluginadalahplugin:my-plugin:dbdi/mcp. Gunakan bentuk yang sama untuk menamakan server dalam hookmcp_tool - Nama tool:
mcp__plugin_<plugin>_<server>__<tool>, jadi toolquerypada serverdbitu adalahmcp__plugin_my-plugin_db__query. Itu adalah nama yang digunakan dalam aturan izin dan matcher hook - Substitusi:
${CLAUDE_PLUGIN_ROOT}dan variabel jalur lainnya disubstitusikan dalamcommand,args, danenv. Tidak ada quoting yang diperlukan dalamargs, karena setiap elemen dilewatkan sebagai satu argumen - Reload: ketika pengguna menjalankan
/reload-pluginsdan reload berlaku, server yang konfigurasinya tidak berubah menjaga koneksinya. Server yang konfigurasinya berubah terhubung kembali, dan yang Anda hapus terputus
Sertakan server MCPB yang dikemas
KuncimcpServers juga menerima server yang dikemas sebagai file MCPB, yang ekstensinya adalah .mcpb atau .dxt yang lebih lama. Arahkan kunci ke file, sebagai jalur di dalam plugin atau URL https://:
.claude-plugin/plugin.json
name dalam manifest bundle.
Untuk transport dan autentikasi, lihat MCP.
Server LSP
Server LSP memberikan Claude diagnostics dan code navigation untuk bahasa. Jika plugin code intelligence resmi sudah mencakup bahasa Anda, pasang itu daripada menulis satu. Jika tidak, deklarasikan server di.lsp.json di root plugin:
.lsp.json
command adalah nama binary, dengan argumennya di args. extensionToLanguage memerlukan setidaknya satu ekstensi, masing-masing dimulai dengan ..
claude plugin validate tidak membaca file ini. Ketika entri apa pun tidak valid, seluruh file dilewati pada waktu muat dan Invalid LSP server config for ".lsp.json" muncul di tab Errors /plugin.
Plugin Anda mengonfigurasi koneksi tetapi tidak memasang binary server, dan setiap ekstensi file mendapat satu server:
- Binary yang hilang: Claude Code memulai
commandberdasarkan nama dariPATHpengguna. Ketika binary tidak ada, server gagal dimulai danclaude --debugmencatatLSP server <name> failed to start - Konflik ekstensi: ketika dua server yang diaktifkan mengklaim ekstensi yang sama, yang pertama terdaftar menangani file-file itu dan yang lain tidak digunakan untuk mereka, apakah server berasal dari satu plugin atau dua. Tab Errors
/pluginmenunjukkan peringatanLSP server "<name>" is not used for <ext> files
lspServers mengambil peta yang sama inline, jalur ke file JSON, atau array dari itu, dan server-nya menambah yang di .lsp.json. Ketika server manifest memiliki nama yang sama dengan yang di .lsp.json, server manifest menggantinya.
Untuk transport, timeout, restart, dan field lainnya, lihat lspServers.
Kirim output log ke stderr, bukan stdout. Claude Code membaca stdout server sebagai pesan protokol saja, dan menerima header pesan hingga 64 KiB dan body pesan hingga 32 MiB.
Claude Code memutuskan server yang melebihi batas apa pun atau menulis output non-protokol ke stdout, dan menghitung putus sebagai crash untuk restartOnCrash dan maxRestarts. Ketika Anda menjalankan dengan --debug, Claude Code menulis kesalahan yang menamai penyebabnya ke log debug.
Executables
File dibin/ di root plugin berada di PATH shell tool Bash sementara plugin diaktifkan, sehingga Claude dapat menjalankannya sebagai perintah bare. Tambahkan script yang dapat dieksekusi:
bin/hello-plugin
chmod +x bin/hello-plugin dan muat plugin. Ketika Anda meminta Claude untuk menjalankan hello-plugin, hasil tool Bash menunjukkan output script.
Direktori bin/ plugin datang setelah entri PATH pengguna sendiri, jadi plugin tidak dapat menaungi git, ls, atau perintah sistem lainnya.
claude.ai dan Cowork tidak memasang plugin yang memiliki direktori bin/ level atas, termasuk yang Anda distribusikan melalui pengaturan organisasi claude.ai.
Pengaturan default
Untuk menetapkan default yang berlaku sementara plugin diaktifkan, tambahkansettings.json di root plugin, atau letakkan objek yang sama inline di kunci manifest settings. Dua kunci berlaku, agent dan subagentStatusLine, dan setiap kunci lain dijatuhkan.
Tetapkan agent untuk menjalankan salah satu agent plugin sendiri sebagai thread utama:
settings.json
security-reviewer.
Untuk semua yang dikontrol kunci, lihat pengaturan agent.
Ketika kunci yang sama ditetapkan di lebih dari satu tempat, aturan ini memutuskan nilai mana yang berlaku:
- File atas manifest: ketika keduanya ada dan
settings.jsonmenetapkan setidaknya satu kunci yang didukung,settings.jsonberlaku dansettingsmanifest diabaikan - Pengaturan pengguna atas default plugin: di seluruh sumber pengaturan, default plugin adalah layer terendah, jadi
agentpengguna sendiri di~/.claude/settings.jsonmenggantikan milik Anda - Dua plugin menetapkan kunci yang sama: nilai dari plugin yang dimuat terakhir berlaku, dan
claude --debugmencatatoverrides setting
subagentStatusLine, lihat subagent status lines.
Tema dan output styles
Plugin dapat menyertakan color themes dan output styles. Keduanya muncul di picker yang sama dengan pengguna sendiri. Untuk salah satu, menetapkan kunci manifest menggantikan pemindaian folder.
Tema plugin adalah read-only, jadi ketika pengguna mengedit satu di
/theme, edit disimpan sebagai salinan di direktori tema mereka sendiri.
Tema ini mengubah warna prompt accent dan error text pada preset dark:
themes/dracula.json
Channels
Channel memungkinkan sistem luar seperti aplikasi chat mengirim pesan ke sesi. Dalam plugin, channel adalah salah satu server MCP ditambah entrichannels yang mengikat ke itu dan dapat meminta konfigurasinya sendiri. Manifest ini mengikat channel ke server telegram dan meminta token bot:
.claude-plugin/plugin.json
server harus cocok dengan kunci di mcpServers. Per-channel userConfig mengambil bentuk yang sama dengan kunci userConfig level atas.
Untuk apa yang harus diimplementasikan server dan bagaimana pengguna mengaktifkan plugin channel, lihat Package as a plugin dalam referensi channels. Untuk tabel field, lihat channels.
Monitors
Monitor adalah perintah shell yang berjalan di latar belakang untuk seluruh sesi. Apa yang dicetak mencapai Claude sebagai notifikasi, sehingga Claude dapat bereaksi terhadap log atau perubahan status tanpa diminta untuk menontonnya. Simpan entri dimonitors/monitors.json:
monitors/monitors.json
- Sesi interaktif saja: monitor plugin dimulai dalam sesi interaktif dan tidak pernah dalam mode non-interaktif dengan flag
-p. Mereka juga dimulai hanya di mana Monitor tool tersedia - Tidak ada konfigurasi pengguna:
commandmendapat variabel jalur dan${ENV_VAR}dari lingkungan, tetapi tidak pernah${user_config.*}. Monitor yang mereferensikan satu tidak dimulai, dan proses monitor tidak menerimaCLAUDE_PLUGIN_OPTION_<KEY>juga - Menonaktifkan mid-session: jika Anda menonaktifkan plugin mid-session, Claude Code tidak menghentikan monitor yang sudah berjalan. Mereka berhenti ketika sesi berakhir
experimental.monitors mengambil array yang sama inline atau jalur ke file JSON, dan dibaca daripada monitors/monitors.json.
Untuk trigger when dan field lainnya, lihat monitors.
Minta pengguna untuk nilai konfigurasi
Deklarasikan nilai yang dibutuhkan plugin Anda dari pengguna di kunci manifestuserConfig, sehingga pengguna tidak mengedit settings.json sendiri. Setiap opsi muncul dalam dialog dengan title-nya sebagai label dan description-nya di bawahnya.
Tetapkan "sensitive": true untuk token atau password. Dialog kemudian menutupi input, dan nilai disimpan dalam penyimpanan aman daripada settings.json.
Manifest ini meminta endpoint dan token:
.claude-plugin/plugin.json
Kapan dialog konfigurasi muncul
Dialog muncul hanya dalam antarmuka/plugin interaktif. Itu terbuka untuk opsi apa pun yang belum ditetapkan ketika pengguna melakukan salah satu dari berikut:
- Memasang plugin di
/plugin - Menjalankan
/plugin install <plugin>@<marketplace>di dalam sesi - Mengaktifkan plugin dari tab Installed di
/plugin
/plugin configure <plugin>@<marketplace>.
Perintah shell claude plugin install tidak pernah meminta nilai userConfig. Untuk menetapkan nilai dari shell, lewatkan masing-masing sebagai --config KEY=VALUE. Ketika opsi tetap tidak ditetapkan, perintah mencetak baris userConfig options not yet set yang menamai kedua cara untuk menetapkannya. Dialog userConfig tidak pernah muncul mengutip baris.
Untuk field opsi, di mana setiap nilai disimpan, bagaimana komponen mereferensikan nilai yang disimpan, dan field mana yang menolak ${user_config.*}, lihat User configuration.
Referensikan jalur plugin dan simpan data
Anda tidak tahu di mana plugin Anda akan dipasang, jadi referensikan file dan data-nya melalui variabel ini daripada jalur tetap. Mereka disubstitusikan dalam skill, command, dan agent content, dalam hook dan monitor commands, dan dalam konfigurasi server MCP dan LSP. Mereka juga diekspor ke hook, MCP, dan proses LSP:${CLAUDE_PLUGIN_ROOT}: direktori instalasi plugin. Setiap versi memiliki cache directory-nya sendiri, jadi jalur berubah ketika plugin diperbarui. Jangan tulis state di sana${CLAUDE_PLUGIN_DATA}: direktori yang bertahan dari update, untuknode_modules, virtual environments, dan caches. Itu diselesaikan ke~/.claude/plugins/data/<id>/dan dibuat ketika pertama kali direferensikan${CLAUDE_PROJECT_DIR}: root proyek, nilai yang sama yang diterima hooks
<id> adalah identifier plugin dengan setiap karakter selain huruf, digit, _, dan - diganti dengan -, jadi my-plugin@my-marketplace menjadi my-plugin-my-marketplace.
Di Windows, jalur yang disubstitusikan menggunakan forward slashes sehingga shell tidak membaca backslashes sebagai escapes.
Pasang dependensi ke direktori data
Untuk plugin yang dipasang marketplace, Claude Code memasang dependensi paket Node.js yang memenuhi syarat secara otomatis ketika itu cache plugin, jadi Anda mungkin tidak perlu memasangnya sendiri. Ketika Anda melakukannya, hookSessionStart ini memasang node_modules ke ${CLAUDE_PLUGIN_DATA} pada run pertama dan lagi setelah update mengubah package.json:
hooks/hooks.json
~/.claude/plugins/data/<id>/node_modules ada. Server MCP kemudian dapat menetapkan NODE_PATH ke ${CLAUDE_PLUGIN_DATA}/node_modules di env-nya. Untuk field mana yang mensubstitusikan variabel mana, lihat Environment variables.
Langkah berikutnya
- Referensi manifest plugin: field
plugin.json, aturan jalur, dan layout standar - Test plugins dengan evals: periksa bahwa komponen yang Anda tambahkan mengubah perilaku Claude dengan cara yang Anda maksudkan
- Publikasikan dan distribusikan plugin: versi plugin dan letakkan di marketplace
- Troubleshoot plugins: apa yang harus dilakukan ketika komponen tidak dimuat atau hook tidak dipecat