Extending: skills, MCP, subagents, hooks, plugins
- 01Skills: teaching Claude a workflow7 min
A skill teaches Claude a workflow by gathering a complete operating procedure into a single SKILL.md file. Claude triggers it in two ways: a slash command bearing the folder's name, or automatically when its description matches the request. Once loaded, its text is added to the turn as additional instructions.
- 02Creating a skill that is also a command9 min
A custom command and a skill are now the same mechanism: a .claude/commands/name.md file and a .claude/skills/name/SKILL.md folder both produce the /name command with the same behaviour, and for a personal or project skill, it is the folder's name, not the frontmatter's name field, that becomes the command's name.
- 03Discovering, curating and stacking skills8 min
Search the two public libraries maintained by Anthropic, claude-plugins-official and claude-community, before writing a skill. Several skills can load together on the same task, but each adds text to the context of every session: remove any whose description no longer matches a recurring need.
- 04MCP: the connection protocol8 min
MCP is an open standard that describes how Claude Code connects to tools and data living outside it. An MCP server exposes three distinct primitives: tools Claude calls with arguments, resources it reads as content, and prompts that only the user triggers. These primitives do not substitute for one another.
- 05Connecting an MCP server, and what changed9 min
A remote MCP server connects in one command, claude mcp add, and Claude Code itself detects whether authentication is required. claude mcp list shows the real status of each declared server. Independently of Claude Code, the MCP specification changed at its core: a stateless core replaces the stateful one.
- 06Building your own MCP server9 min
A homemade MCP server is an ordinary program that Claude Code itself launches as a child process over the stdio transport. The JSON schema declares what the tool expects, but validation remains the server's responsibility, and the description field decides whether Claude chooses that tool.
- 07Subagents: delegating in an isolated context9 min
A subagent runs a task in its own context window, separate from the main conversation. When it finishes, only its conclusion comes back into your thread: the files read, the logs scanned and the dead ends explored stay in its own context. A good delegation gives a complete objective and a named write scope.
- 08Hooks: automating the lifecycle7 min
A hook is an action the harness runs itself when a precise lifecycle event occurs. An instruction written in memory remains a preference the model may forget; a hook declared once runs on every occurrence, independently of what the model recalls at that moment.
- 09Hook events, from trigger to message11 min
PreToolUse runs before the tool and can prevent the call; PostToolUse runs afterwards and can only react, including by replacing the tool's result. A hook communicates its decision through a JSON object with precise fields and through its exit code, never through a sentence written to standard output.
- 10Plugins: bundling skills, hooks, MCP and agents8 min
A plugin bundles skills, hooks, MCP servers, commands and sub-agents into a single versioned directory, installable and shareable in one go. Its manifest, plugin.json, is the only file in .claude-plugin/; the most frequent mistake is to put skills/, commands/, agents/ or hooks/ there instead of at the plugin root.
- 11settings.json in depth9 min
On a simple key present at several levels, the highest-ranking level wins entirely, while most lists, including permissions.allow and permissions.deny, merge across levels. The env block follows the same levels as the rest of the file, and a shell environment variable is not a level in this stack.
- 12Skill routing fails silently8 min
Claude decides whether to invoke a skill by comparing the request's vocabulary against that skill's description field alone, and a mismatch of language or jargon between the two causes automatic invocation to fail with no visible signal in the response.