Skip to main content
Plugin Claude Code dibangun dari komponen, seperti skills, agents, hooks, dan server MCP. Setiap komponen memiliki folder default di plugin, kunci manifest opsional di .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:

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
Setiap file adalah contoh valid terkecil dari formatnya, ada untuk menunjukkan bentuknya daripada untuk berguna: skill atau agent nyata membawa instruksi lengkap dan sering kali file pendukung, dan hook atau monitor nyata melakukan pekerjaan nyata. Bagian setelah explorer menggunakan file yang sama sebagai contoh mereka dan menautkan ke yang lebih lengkap. Pilih file atau folder untuk membaca tujuannya, lihat apa yang ada di dalamnya, dan temukan bagian yang mencakupnya.

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 file SKILL.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/:
Berikan SKILL.md description sehingga Claude tahu kapan menggunakannya:
skills/review/SKILL.md
Setelah Anda memuat plugin, /my-plugin:review menjalankan skill. Nama perintah dan siapa yang dapat memanggilnya mengikuti aturan ini: Anda juga dapat menempatkan skills di luar direktori default skills/:
  • Direktori tambahan: daftarkan di kunci manifest skills. Mereka menambah pemindaian default skills/ daripada menggantinya, tidak seperti commands dan agents
  • Skill tunggal di root plugin: tanpa direktori skills/ dan tanpa kunci manifest skills, SKILL.md di root plugin dimuat sebagai satu skill. Tetapkan name di frontmatter-nya, karena jika tidak, instalasi marketplace menamakan skill setelah cache directory-nya daripada plugin Anda
Untuk menyertakan instruksi dalam plugin, tulislah sebagai skill. Claude Code tidak memuat 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/.
Simpan perintah di 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 selain commands/, 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
Muat plugin dan jalankan /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 bawah agents/ mendefinisikan satu:
agents/security-reviewer.md
Agent ini dinamai 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 subfolder agents/. 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, jadi name: audit di agents/review/security.md dimuat sebagai my-plugin:review:audit
  • Field manifest agents: file yang Anda daftarkan di sana dimuat tanpa nama subfolder, jadi "agents": "./custom/review/security.md" dimuat sebagai my-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 kunci cacheTtl dari experimental. Satu-satunya nilai isolation yang valid adalah "worktree". Lihat field frontmatter yang didukung untuk apa yang dilakukan masing-masing
  • Field yang diabaikan: permissionMode, hooks, mcpServers, dan initialPrompt. 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. Jalankan claude plugin validate di shell Anda untuk menemukan file-file ini
Untuk apa yang dilakukan setiap field dan aturan prioritas, lihat Subagents.

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 di hooks/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
Simpan script di 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, persempit matcher-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_ROOT dan CLAUDE_PLUGIN_DATA di lingkungannya, ditambah CLAUDE_PLUGIN_OPTION_<KEY> untuk setiap nilai konfigurasi pengguna, sehingga script Anda dapat membacanya dari sana
  • Quoting: ketika command tidak memiliki args, itu berjalan melalui shell, jadi bungkus jalur ${CLAUDE_PLUGIN_ROOT} dalam tanda kutip ganda, seperti contoh hooks/hooks.json di bawah Hooks, untuk menjaga jalur yang diperluas sebagai satu kata shell. Ketika Anda melewatkan args sebagai 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
Anda juga dapat menghilangkan wrapper 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 server db 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 server db di my-plugin adalah plugin:my-plugin:db di /mcp. Gunakan bentuk yang sama untuk menamakan server dalam hook mcp_tool
  • Nama tool: mcp__plugin_<plugin>_<server>__<tool>, jadi tool query pada server db itu adalah mcp__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 dalam command, args, dan env. Tidak ada quoting yang diperlukan dalam args, karena setiap elemen dilewatkan sebagai satu argumen
  • Reload: ketika pengguna menjalankan /reload-plugins dan 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

Kunci mcpServers 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
Server mengambil namanya dari 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
File memetakan setiap nama server langsung ke konfigurasinya, tanpa objek wrapper di sekitar peta. 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 command berdasarkan nama dari PATH pengguna. Ketika binary tidak ada, server gagal dimulai dan claude --debug mencatat LSP 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 /plugin menunjukkan peringatan LSP server "<name>" is not used for <ext> files
Kunci manifest 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 di bin/ 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
Buat dapat dieksekusi dengan 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, tambahkan settings.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
Muat plugin dan mulai sesi. Claude kemudian menjawab dalam percakapan utama dengan system prompt dan model agent 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.json menetapkan setidaknya satu kunci yang didukung, settings.json berlaku dan settings manifest diabaikan
  • Pengaturan pengguna atas default plugin: di seluruh sumber pengaturan, default plugin adalah layer terendah, jadi agent pengguna sendiri di ~/.claude/settings.json menggantikan milik Anda
  • Dua plugin menetapkan kunci yang sama: nilai dari plugin yang dimuat terakhir berlaku, dan claude --debug mencatat overrides setting
Untuk bentuk 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 entri channels 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 di monitors/monitors.json:
monitors/monitors.json
Perintah berjalan dalam shell, di direktori kerja tempat sesi dimulai. Perintah monitor dibatasi di mana itu dimulai dan apa yang dapat direferensikan:
  • 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: command mendapat variabel jalur dan ${ENV_VAR} dari lingkungan, tetapi tidak pernah ${user_config.*}. Monitor yang mereferensikan satu tidak dimulai, dan proses monitor tidak menerima CLAUDE_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
Kunci manifest 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 manifest userConfig, 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
Untuk membuka dialog yang sama kapan saja, pengguna menjalankan /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, untuk node_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
Dalam jalur direktori data, <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, hook SessionStart ini memasang node_modules ke ${CLAUDE_PLUGIN_DATA} pada run pertama dan lagi setelah update mengubah package.json:
hooks/hooks.json
Setelah sesi pertama, ~/.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