Skip to content

四层架构总览

crt.sh-skills 用四层把 crt.sh 的能力递送给不同消费者。下层是上层的基础,所有能力最终汇到 SDK。

四层架构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

各层职责

📖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["四层贯通
行为一致"]

目录映射

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/ #   项目本地镜像

逐层深入

SDK 层 · MCP 层 · CLI 层 · Skills 层