手把手教你构建 Claude Code 插件:从核心原理到实战

深入探讨 Claude Code 插件系统,对比 Skills、MCP 与 Hooks 的异同,并手把手教你从零构建一个自动会话日志插件。

阅读时长: 4 分钟
共 1870字
作者: eimoon.com

Claude Code 的出现确实让 CLI 编程体验上了一个台阶,但“开箱即用”的功能往往只能覆盖通用需求。每个开发者或团队都有自己的特定工作流:可能是按照公司规范快速生成组件脚手架,或者是提交代码前必须运行的 Lint 检查,亦或是需要快速访问特定的私有文档。

插件(Plugins)就是解决这些个性化需求的钥匙。通过插件,你可以将一系列扩展功能打包,像分享代码库一样在团队间分发。

了解 Claude Code 插件的“三驾马车”

一个 Claude Code 插件本质上是多种功能的集合包,它通常包含以下三种核心组件:

  1. 技能 (Skills):这是最常见的扩展方式。你可以创建自定义命令(如 /deploy),或者提供一段上下文相关的 Prompt,让 Claude 在处理特定任务时自动“想起”这些规则。
  2. MCP 服务 (Model Context Protocol):这属于进阶玩法,通过 MCP 协议连接外部服务(如 GitHub、Slack 或公司内部 API),让 Claude 拥有实时获取外部数据的能力。
  3. 钩子 (Hooks):这是一种确定性的脚本。与 Skills 不同,Hooks 不需要 Claude “决定”是否运行,而是在特定事件(如文件编辑后、提交代码前)发生时由系统强制触发。

一个插件可以只包含其中一种,也可以三者兼备。比如一个“部署插件”可以包含 /deploy 技能、检查服务器状态的 MCP,以及部署前运行测试的 Hook。

如何安装与管理插件

安装插件非常直接,主要取决于插件的存放位置:

# 从官方目录安装
claude plugin add @anthropic/deploy-helper

# 直接从 GitHub 仓库安装
claude plugin add github:username/repo-name

# 安装本地正在开发的插件
claude plugin add ./my-plugin

在安装时,你可以选择“用户级别”或“项目级别”。默认是用户级别(存放在 ~/.claude/plugins/),全系统通用。如果你希望某个插件只在特定的 Git 仓库中生效,加上 --project 标志即可。

深度对比:Skills 与 MCP 的 Token 博弈

在设计扩展功能时,选择 Skills 还是 MCP 需要权衡资源消耗,尤其是 Token。

MCP 的代价

传统的 MCP 服务会在会话启动时将所有工具的定义(名称、描述、参数 Schema)一次性塞进上下文。一个包含 GitHub、Slack、Sentry 等 5 个服务的典型配置,在没写一行代码前就可能吃掉约 5.5 万个 Token,接近上下文窗口的四分之一。

Skills 的“懒加载”策略

相比之下,Skills 采用的是渐进式加载。启动时,Claude 只会看到 Skill 的名称和一行简介(约 100 Token)。只有当 Claude 觉得“这个任务需要用到这个技能”时,完整的指令和参考文件才会被载入。这种设计极大地节省了宝贵的上下文空间。

注:Anthropic 在 2025 年底推出的 Tool Search 功能也为 MCP 引入了类似的“按需加载”机制,将大型工具库的 Token 消耗显著降低。

怎么选?

  • 如果你的任务需要 Claude 发挥判断力、遵循特定的自然语言流程,优先选 Skills
  • 如果需要与 Slack、数据库等外部实时数据打交道,或者需要企业级的审计日志和权限控制,MCP 是不二之选。
  • 如果是一定要执行的操作(如禁止修改 .config 目录),不要指望 AI 的自觉性,直接用 Hooks

实战:从零构建一个会话日志插件

我们来动手写一个名为 session-logger 的插件。它的功能很简单:当你输入 /session-logger:summarize 时,Claude 会总结当前会话的成果,并追加到 SESSION_LOG.md 文件中。

1. 创建插件结构

在本地创建一个工作目录:

mkdir -p session-logger/.claude-plugin
mkdir -p session-logger/skills/summarize

插件的灵魂在于 .claude-plugin/plugin.json

2. 编写 Manifest(清单文件)

session-logger/.claude-plugin/plugin.json 中写入:

{
  "name": "session-logger",
  "description": "将绘画摘要记录到 Markdown 文件",
  "version": "1.0.0"
}

注意:这里的 name 会成为你命令的前缀。

3. 定义 Skill 逻辑

session-logger/skills/summarize/SKILL.md 中定义具体的行为逻辑。文件名必须是 SKILL.md

---
description: 总结当前会话并记录到 SESSION_LOG.md
disable-model-invocation: true
---

被调用时,请回顾之前的对话并生成包含以下部分的摘要:

- **日期/时间**: 当前时间戳
- **完成的任务**: 实现了哪些功能
- **修改的文件**: 列出新建或更改的文件
- **技术决策**: 架构或实现上的选择

将摘要追加到项目根目录的 SESSION_LOG.md 中。如果文件不存在则创建它。

这里 disable-model-invocation: true 非常关键。它意味着这个命令只能由你手动输入触发,防止 Claude 在它觉得“该总结了”的时候自作主张运行。

4. 本地测试

进入你想要试用插件的项目目录,启动 Claude Code 时指向你的插件路径:

cd ~/my-project
claude --plugin-dir ~/path/to/session-logger

现在输入 /session-logger:summarize,你会发现 Claude 乖乖地开始分析你们的对话并写日志了。

总结

插件的真正魅力不在于它能写多么复杂的代码,而在于它能把原本碎片化的、需要反复叮嘱 AI 的规则转化为标准化的工具。

如果你经常发现自己在反复教 Claude 同样的背景知识,或者在重复同样的检查步骤,那可能就是该写个插件的时候了。建议去 GitHub 的 awesome-claude-code 库转转,看看别人是怎么组织逻辑的。很多时候,一个精巧的插件只需要几个 Markdown 文件和几行配置,就能省下你每天大把的“调教”时间。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计