A skill explains a reusable procedure. A plugin packages capabilities for a client. An MCP server exposes callable tools or resources. A hook runs at a supported lifecycle event. These mechanisms can work together, but they solve different problems.
Follow one change through the system
Imagine asking an agent to review a Swift file. Project instructions establish the app's constraints. A skill can describe which checks matter. An MCP tool can inspect the file and return findings. A supported hook can run a deterministic check at the appropriate event. You still inspect the change and its evidence.
- 1Plugin packages capabilities
- 2Skill supplies procedure
- 3MCP exposes operations
- 4Hook invokes event checks
The arrows describe responsibility, not a guarantee that every client loads every component. A plugin may distribute a skill and a server configuration together, but the installed client must still discover and execute them correctly.
Four terms, four questions
| Mechanism | Question it answers | Concrete example |
|---|---|---|
| Skill | How should this task be approached? | Review concurrency before accepting a Swift change |
| Plugin | How are capabilities packaged for this client? | A manifest plus skill and tool configuration |
| MCP server | Which operations can the agent call? | Review a Swift file and return finding locations |
| Hook | What runs at this lifecycle event? | Check protected generated files or run verification |
Do not install all four simply because the words appear in a guide. Start with the need. If you only need guidance, a tool server may be unnecessary. If you need a simulator screenshot, prose alone cannot take one; the environment needs an executable operation and the required local tools.
Where failures belong
If the skill is missing, investigate discovery and task routing. If tools are absent, inspect the MCP connection. If a hook does not run, inspect the client's event and configuration support. If the tool runs but the app does not compile, inspect the actual compiler failure. Reinstalling a plugin does not automatically fix a Swift error.
Anthropic's customization guide distinguishes several of these extension mechanisms. Use the documentation for your client before copying event names or configuration structures.
A small installation exercise
Open the project's setup guide and choose one client. Configure one connection path. Reconnect the client, ask it to list the available tools, and perform one read-only operation against synthetic source. Record the client and package version. Do not equate a tool list with a completed app-building workflow.
Next, read the hook walkthrough. Notice that it distinguishes executing a script directly from having a client dispatch that hook. This distinction is useful whenever a configuration example looks correct but has not been tested through the actual runtime.
Completion checkpoint
You should now be able to explain which component provides guidance, which provides execution and which provides lifecycle enforcement. If an integration fails, name the layer before changing it. That habit makes later build/test loops easier to debug and keeps setup complexity proportional to the task.
Related reading
- How can Claude Code hooks protect generated files and verify a project before stopping?
A tested generated-file guard and Stop check, with configuration, reproducible exit codes, and enforcement limits.
- Which Muse Code MCP settings actually work with a local Swift review server?
A reproducible Muse 1.3.0 connection check, with the exact configuration and clear limits on what discovery proves.
What to do next
Next: Build a SwiftUI to-do app with Claude Code: the brief, checks and repair workflow