四层架构总览
crt.sh-skills 用四层把 crt.sh 的能力递送给不同消费者。下层是上层的基础,所有能力最终汇到 SDK。
自上而下
flowchart TB subgraph L4["第 4 层 · Skills(skills/)"] SK["7 个 SKILL.md
告诉 AI 何时用、怎么用"] end subgraph L3["第 3 层 · 接入层"] MCP["MCP Server
20 工具 · stdio/HTTP/SSE"] CLI["CLI
26 命令 · cobra"] end subgraph L2["第 2 层 · SDK(pkg/crtsh/)"] API["Client 方法
20 个 + 辅助函数"] PARSE["parser.go
HTML/Atom 解析"] REG["registry.go
选项单一来源"] VALID["validate.go
前置校验"] end subgraph L1["第 1 层 · crt.sh"] CRT["crt.sh 网页端点"] end SK --> MCP MCP --> API CLI --> API API --> PARSE API --> REG API --> VALID API --> CRT
告诉 AI 何时用、怎么用"] end subgraph L3["第 3 层 · 接入层"] MCP["MCP Server
20 工具 · stdio/HTTP/SSE"] CLI["CLI
26 命令 · cobra"] end subgraph L2["第 2 层 · SDK(pkg/crtsh/)"] API["Client 方法
20 个 + 辅助函数"] PARSE["parser.go
HTML/Atom 解析"] REG["registry.go
选项单一来源"] VALID["validate.go
前置校验"] end subgraph L1["第 1 层 · crt.sh"] CRT["crt.sh 网页端点"] end SK --> MCP MCP --> API CLI --> API API --> PARSE API --> REG API --> VALID API --> CRT
各层职责
📖Skills
用自然语言告诉 AI"遇到什么场景用哪个工具、参数怎么填、结果怎么解读"。消费者:AI Agent(Claude Code、Cursor)
🔌MCP Server
把 SDK 方法包装成 20 个结构化工具,带输入 schema。消费者:任何 MCP 兼容客户端
⌨️CLI
把 SDK 方法包装成 26 条人类可读命令,JSON/表格/CSV 输出。消费者:人类、shell 脚本、CI
📦SDK
唯一事实来源:HTTP 请求构造、HTML 解析、重试、错误、校验。消费者:Go 程序、上面三层
为什么这样分层
一个能力只实现一次
在 SDK 加一个方法,MCP 和 CLI 各加一层薄封装(参数映射 + 输出格式化),能力就贯通了。避免了"工具实现一套、CLI 实现一套、行为不一致"的维护噩梦。
Skills 与代码解耦
Skills 是 Markdown 文档,不是代码——它只描述"怎么用 MCP 工具"。改 Skills 不用改代码,反之 SDK 加方法后 Skills 也只需补一段描述。
加一个新能力时,四层的改动量呈倒金字塔——SDK 是根,其余各层只是薄封装:
flowchart LR NEW["新增一项 crt.sh 能力"] --> SDK["SDK 层
实现方法本体
(HTTP + 解析 + 错误)"] SDK --> MCP["MCP 层
注册 1 个工具
参数 schema 映射"] SDK --> CLI["CLI 层
加 1 条命令
flag + 输出格式化"] MCP --> SKILL["Skills 层
补一段 Markdown
告诉 AI 何时用"] CLI --> SKILL SKILL --> DONE["四层贯通
行为一致"]
实现方法本体
(HTTP + 解析 + 错误)"] SDK --> MCP["MCP 层
注册 1 个工具
参数 schema 映射"] SDK --> CLI["CLI 层
加 1 条命令
flag + 输出格式化"] MCP --> SKILL["Skills 层
补一段 Markdown
告诉 AI 何时用"] CLI --> SKILL SKILL --> DONE["四层贯通
行为一致"]
目录映射
crt.sh-skills/
├── pkg/crtsh/ # SDK 层(唯一事实来源)
│ ├── api.go # Client 与所有方法
│ ├── parser.go # HTML/Atom 解析器
│ ├── registry.go # 搜索类型/匹配模式/linter 单一来源
│ ├── validate.go # 前置校验
│ ├── options.go # ClientOption
│ ├── errors.go # 强类型错误
│ └── iterate.go # 自动分页迭代器
├── cmd/mcp-server/ # MCP 层
│ ├── main.go # 传输选择(stdio/sse/http)
│ └── tools.go # 20 个工具注册
├── cmd/crtsh-cli/ # CLI 层(cobra)
│ └── main.go # 26 条命令
└── skills/ # Skills 层(canonical)
└── .claude/skills/ # 项目本地镜像