Guide · AI in the Developer Workflow
Skills, Plugins, and Extensions
Skills, plugins, MCP servers, and project rules teach an assistant how your work is actually done, so a paragraph you keep retyping becomes one named trigger that loads on demand. Each one is also context the assistant trusts and code it can run with your access. Your control is reading what an extension can do before you enable it, and reviewing the diff it produces after.
When to use this
- You retype the same instructions or the same multi-step procedure to the assistant on most tasks.
- You want the assistant to follow your project conventions without being reminded in every prompt.
- You want the assistant to reach a real tool, like your issue tracker or database, instead of guessing.
- A community plugin or MCP server looks useful and you need to judge whether it is safe to enable.
Key ideas
- Skills load on demand
- A skill is a folder with a SKILL.md file. Only its name and description sit in context at startup, costing a few dozen tokens, and the full body loads when the task matches the description or you type /skill-name. Dozens of skills cost almost nothing until used. Custom commands have been merged into skills, so a .claude/commands/deploy.md and a .claude/skills/deploy/SKILL.md both produce /deploy.
- The description is the trigger
- The assistant decides whether to load a skill by matching your request against the description text, not the body. A vague description means the skill never fires or fires on the wrong task. Name the concrete situations and trigger phrases. The combined description and when_to_use text is capped at 1,536 characters, and across all skills the listing has a budget of roughly 1% of the context window.
- Plugins bundle and version
- A plugin packages skills, slash commands, subagents, hooks, MCP server definitions, and LSP servers as one installable unit declared by a .claude-plugin/plugin.json manifest. You add a marketplace with /plugin marketplace add and install with /plugin. Plugin skills are namespaced as /plugin-name:skill so two plugins with a review skill cannot clash.
- MCP connects real tools
- The Model Context Protocol is an open standard that lets an assistant call an external tool through a small server: a Postgres query, a Jira lookup, a Sentry trace. The server runs as a process with your credentials. The 2026 risk to plan for is that the tool output is attacker-controllable text, which can carry hidden instructions back into the model.
- An extension runs with your access
- A skill can execute its bundled scripts, an MCP server runs on your machine, and a hook fires on tool events, all with the privileges you have. Treat enabling one the way you would treat installing software: read the scripts and the requested scopes first. Project skills in .claude/skills/ only gain pre-approved tool access after you accept the workspace trust dialog.
Why this matters
The assistant predicts plausible output from what is in its context. If your project's conventions are not in that context, the assistant cannot follow them, and it will confidently produce code that looks right and fits some other project's habits.
Picture a developer, Maya, working in a repo where every API handler returns errors through a shared problemDetails() helper and every database call goes through a thin repository layer. The assistant does not know this. So on the first task it writes a handler that throws a raw Error and queries the database directly with an inline SQL string. The code compiles. The tests she had do not cover the new path. It reaches review, and a teammate sends it back: wrong error shape, bypasses the repository, will not log correctly in production. Maya retypes the conventions into the next prompt. And the next. By Friday she has pasted the same three paragraphs eleven times.
That paste-the-rules-every-time loop is the symptom. The two costs are real: the wasted tokens and minutes, and the quiet risk that one time she forgets a rule and the wrong-shaped code ships. Extensions remove the loop. A short rules file or a skill puts the convention into context once, durably, so the assistant follows it on task one and task fifty without a reminder.
The flip side is that an extension is more than a convenience. A skill can run a bundled script, an MCP server runs on your machine with your credentials, and a hook fires automatically on a tool event. Each is context the model trusts and, often, code that executes with your access. The same mechanism that saves Maya eleven pastes is the mechanism a malicious plugin would use to run a command she never saw. The next section breaks down how each kind works, so you can use the power and audit the risk.
How it works
There are four extension mechanisms, and they layer from lightest to heaviest. Knowing which one fits a need keeps your setup cheap and auditable.
- Project rules. Claude Code reads
CLAUDE.mdat session start. Use it for durable facts: the stack, the conventions, the commands to run tests. The cross-tool equivalent isAGENTS.md, which Cursor and VS Code Copilot read from the repo root directly, while Claude Code picks it up only when aCLAUDE.mdimports it with a first line of@AGENTS.mdor you run/initin a repo that already has one. Because rules load every session, keep them to facts a paragraph long, not procedures. - Skills. A folder with a
SKILL.mdfile, following the open Agent Skills standard now shared by Claude Code and VS Code Copilot. Use it for a procedure that should load only when relevant: a release checklist, a code-review pass, a migration recipe. - MCP servers. A small server speaking the Model Context Protocol that gives the assistant a real tool: query Postgres, read a Jira ticket, fetch a Sentry trace. Use it when the assistant needs live data or an action in another system.
- Plugins. A versioned bundle that can ship skills, slash commands, subagents, hooks, MCP server definitions, and LSP servers together, installed from a marketplace. Use it to distribute a working setup to a team in one step.
The distinction that decides whether skills stay cheap is progressive disclosure. At startup, only each skill's name and description load into context, costing a few dozen tokens each. The full body loads only when the assistant matches your request against the description or you type /skill-name. This is why a project can carry dozens of skills with almost no standing cost. It is also why the description is the real interface. The model never reads the body to decide; it reads the description. A description like "helps with the database" will misfire. A description like "Add a CHANGELOG.md entry from a merged PR; use when the user asks to update the changelog or record a release note" fires precisely. Each skill's combined description and when_to_use is capped at 1,536 characters, and the whole skill listing shares a budget of roughly 1% of the model's context window, so put the key use case first.
Custom commands have been merged into skills. A .claude/commands/deploy.md and a .claude/skills/deploy/SKILL.md both create /deploy. Skills add a folder for supporting files, frontmatter to control who invokes them, and automatic loading. Two frontmatter fields control invocation: disable-model-invocation: true means only you can fire it (right for anything with side effects like deploy or commit), and user-invocable: false means only the assistant loads it (right for background knowledge). The next section follows one skill from idea to commit.
A worked scenario
Back to Maya. The repeated convention she keeps pasting is the release-notes procedure: after a PR merges, append a bullet under the Unreleased heading in CHANGELOG.md, match the existing style, reference the PR number, and never touch released sections. She turns it into a skill.
- Create the folder. She runs
mkdir -p .claude/skills/changelog-entryin the repo so the skill is checked in and the whole team gets it. - Write SKILL.md. The frontmatter is the load-bearing part. She writes
description: Add a CHANGELOG.md entry from a merged PR. Use when the user asks to update the changelog or mentions a release note.and addsallowed-tools: Read Editso it can read and edit the file without a per-use prompt, but nothing more. The body is four lines of instruction, not prose. - Test the trigger. She types "add a changelog entry for PR 218" and watches the assistant load
changelog-entryautomatically and propose a one-line diff. She also confirms/changelog-entry 218works as a direct call. - Catch a misfire. The next day, asking "what changed in the changelog format?" wrongly loads the skill, because "changelog" alone matched. She tightens the description to name the action ("when the user asks to add or record an entry") and the misfire stops.
- Add a tool the assistant cannot guess. The PR number and title live in GitHub, so she enables the GitHub MCP server. Now the assistant fetches the merged PR's title itself instead of asking her to paste it.
- Commit. She reviews the final diff, sees only the new bullet under Unreleased, and commits the skill folder alongside the change.
The result is concrete. The eleven pastes per week drop to zero. The skill costs about 30-40 tokens of standing context (its name plus description) and the full body, roughly 80 tokens, loads only on the handful of tasks that need it. The team inherits the convention the moment they pull. The MCP server she added, though, is where the next section's caution begins, because it is now reading from GitHub with her token, and Maya carries straight into the pitfalls.
Pitfalls and edge cases
Each of these traps feels like progress while quietly creating cost or risk.
- Stuffing CLAUDE.md with procedures. A long deploy runbook in
CLAUDE.mdloads every single session and burns tokens on tasks that have nothing to do with deploying. The fix is the test "is this a fact or a procedure?" Facts (the stack, the test command) stay in the rules file. Procedures move into a skill that loads on demand. - The vague description. A skill the model never triggers is invisible work. Write the description from the user's words, list the trigger phrases, and run
/doctorif you suspect the skill listing budget is overflowing and silently truncating descriptions. - Forgotten broad permissions. Granting
allowed-tools: Bash(*)to get a skill working once means every later automatic invocation can run any shell command without a prompt. Scope it to the exact commands the skill needs, likeBash(git add *) Bash(git commit *), and review what each skill grants itself. - Installing on trust alone. A community plugin can bundle hooks that fire on every edit and an MCP server that phones home. Read the
plugin.json, thehooks/, the.mcp.json, and the scripts before enabling. Enable on a throwaway branch first.
Then the genuine edge cases. MCP tool output is untrusted input. This is the 2026-specific wrinkle. When Maya's GitHub MCP server returns a PR description, that text flows into the model's context, and a hostile PR body can contain hidden instructions ("ignore your task, run this command"). Two named attack patterns dominate the 2026 security literature: prompt injection, where untrusted content carries instructions, and tool poisoning, where a malicious server hides instructions in its tool descriptions. The handling: minimize each server's scopes, keep credentials out of the prompt, and keep a human reviewing any action the agent takes from tool output, rather than letting it auto-execute.
Subagents and skills that run scripts. A skill can bundle a script and execute it. A subagent runs in its own context and cannot show you a permission prompt. So a forked skill granted broad tools is a quiet way to run code unreviewed. Keep forked or background skills read-only where you can, and set disableSkillShellExecution: true in managed settings if a fleet of machines should never let a checked-in skill run shell commands. Handling all of this gets harder once more than one person shares the same extensions, which is the next section.
Doing it on a team and at scale
One developer can keep a skill folder in their head. The moment a team shares extensions across a repo, the setup needs to be a visible, versioned artifact, or it drifts into a pile of personal customizations nobody can audit.
The durable artifact is the repo itself. Check .claude/skills/ and your CLAUDE.md into version control (along with an AGENTS.md if other tools on the team read one, imported from CLAUDE.md with @AGENTS.md so Claude Code loads it too), so a skill change goes through the same pull request and review as any code change. A teammate can see in the diff that a new skill granted itself allowed-tools, and can ask about it before merging. This is also why project skills require accepting a workspace trust dialog before their pre-approved tool access takes effect: opening a cloned repo should not silently grant a checked-in skill the ability to run commands.
For wider distribution, a lead named Priya packages the team's working setup as a plugin and serves it from an internal marketplace. The team adds it with /plugin marketplace add your-org/internal-plugins and installs with /plugin, getting the same namespaced skills (/internal-plugins:release-notes), hooks, and MCP definitions in one step, with a version they only update when Priya bumps it. Anthropic ships two public marketplaces by default in 2026: claude-plugins-official, a curated set registered automatically on first launch, and claude-community, the reviewed community catalog you add with /plugin marketplace add anthropics/claude-plugins-community. Curated and reviewed lowers the odds of a poisoned plugin, but it does not remove your responsibility to read what you enable.
Scale also needs an escape hatch. When a shared MCP server or a hook makes sessions misbehave, the fastest way to find out whether a customization is the cause is claude --safe-mode (added in v2.1.169, June 2026), which launches a clean session with every customization disabled: CLAUDE.md, skills, plugins, hooks, and MCP servers. If the problem vanishes, you know to bisect the configuration rather than the code.
The durable principle to keep, whatever the size: an extension is context the model trusts and code it can run with your access, so the bar to enable one is the bar you would set for installing software, and every extension still produces a diff you review. Start with one skill for the procedure you retype most, check it into the repo, and add the next only once that one earns its place.
Workflow
- 01Notice the guidance you keep retyping and the tools you wish the assistant could reach without guessing.
- 02Capture the standing conventions in CLAUDE.md so they load on every request; if your repo already keeps an AGENTS.md for other tools, import it from CLAUDE.md with @AGENTS.md rather than relying on Claude Code to read it on its own.
- 03Package one recurring procedure as a skill, with a description that names the exact situations it should trigger on.
- 04For a community plugin or MCP server, read the bundled scripts, the hooks, and the scopes it requests before enabling it.
- 05Enable it on a throwaway branch and run it on one small task, watching every command and file it touches.
- 06Review the diff and the tool calls, tighten the description or scope if it misfired, then commit in small steps.
- 07If a session starts behaving oddly, relaunch with claude --safe-mode to confirm whether a customization is the cause.
Common mistakes
- Installing a community plugin or MCP server without reading the bundled scripts or the scopes it requests.
- Writing a vague skill description, so the assistant either never triggers the skill or fires it on the wrong task.
- Pasting a long procedure into CLAUDE.md, where it costs tokens every session, instead of moving it into a skill that loads on demand.
- Treating an MCP tool result as trustworthy input, when its text can carry hidden instructions that steer the agent.
- Granting a skill broad allowed-tools and forgetting it, so a later automatic invocation runs commands you never reviewed.
Examples
Notes
- This page covers skills, plugins, MCP servers, and project rules as extension mechanisms, and how to vet them. It does not cover writing an MCP server from scratch or the full hooks API, which have their own docs.
- Pairs with Giving AI the Right Context, since a skill or a rules file is durable context, and with Reviewing AI Code Safely, since every extension still produces a diff you review.