Skills 层(skills/)
Skills 是项目里唯一"非代码"的一层——它是写给 AI 看的说明书,告诉 AI 在什么场景该用哪个 MCP 工具、参数怎么填、结果怎么读。
skills/ 7 个 SKILL.md AI 说明书Skills 不是代码
flowchart LR Q[用户自然语言提问] --> AI[AI Agent] AI --> SK["读 SKILL.md
判断该用哪个工具"] SK --> T["调用 MCP 工具"] T --> SDK["SDK 方法"] SDK --> CRT[crt.sh] CRT --> AI --> A[用自然语言回答用户]
判断该用哪个工具"] SK --> T["调用 MCP 工具"] T --> SDK["SDK 方法"] SDK --> CRT[crt.sh] CRT --> AI --> A[用自然语言回答用户]
SKILL.md 本身不执行任何逻辑,它只是影响 AI 的决策。这让 Skills 可以独立于代码演进。
7 个 Skill
| Skill | 何时用 |
|---|---|
crtsh-search | 搜 CT 日志、域名、子域、SSL 证书、SHA 指纹 |
crtsh-cert | 取某张证书/CA 的详情、按 ID 查、查吊销 |
crtsh-ca | 调查 CA、issuer_ca_id、CA 披露、根属主、吊销中间证书 |
crtsh-chain | 分析证书结构、ASN.1、层级、关系图、CT 条目、路径校验、原始 PEM、add-chain |
crtsh-compliance | 合规检查、lint 结果、OCSP/PKI Meta 证据、吊销信号、OneCRL |
crtsh-intel | 发现 crt.sh 能力、高级搜索/信息页、CT 日志与 OCSP 响应器、人口统计、Censys 联动 |
crtsh-monitor | 设置监控、Atom 订阅、原始导出、周期性证书观察、下游 JSON/CSV/Atom 管道 |
一个 Skill 的结构
skills/crtsh-search/
├── SKILL.md # 入口:name/description/allowed-tools + 用法说明
├── evals/
│ └── evals.json # 回归测试用例:prompt + 期望输出
└── references/ # 详细资料,按需加载
├── certificate-reference.md
└── installation.mdSKILL.md 的 frontmatter 声明三件事:
name:skill 名(小写连字符)description:触发条件——AI 据此判断"现在该不该用这个 skill"allowed-tools:这个 skill 允许调用的 MCP 工具白名单(排序、去重、必须已注册)
references/ 是"长内容"的家:安装细节、选项表、schema、示例、排错。SKILL.md 保持精简(<500 行),重的内容下沉到 references,按需引用。
镜像与一致性
skills/ 是 canonical(权威源),.claude/skills/ 是它的逐字节镜像,供 Claude Code 项目本地使用。改完 skill 跑 ./scripts/check-skills.sh,它会:
- 重新生成
manifest.json与 catalog - 同步
.claude/skills/镜像 - 校验 frontmatter、eval 文件、行数、本地引用路径、generated 文件新鲜度
- 校验
allowed-tools与已注册 MCP 工具的一致性 - 严格 eval 覆盖审计
Skills 与代码的同步契约
加一个 crt.sh 能力后,Skills 的更新路径:
- SDK 加方法 → MCP 加工具(工具名注册到
tools.go) - 在相关 skill 的
allowed-tools加入新工具名 - 写或更新 eval 用例覆盖新工具
- 跑
check-skills.sh,让 manifest/catalog/镜像全部同步
audit-skills-coverage.sh --strict-evals 会确保每个注册的 MCP 工具都被某个 eval 提及——这是"能力是否真的暴露给了 AI"的硬约束。
接下来深入 功能实现原理。