mcpField
D
dev-api-design

dev-api-design

github.com/vasilyu1983开发176 次安装
代码仓库

关于 dev-api-design

dev-api-design 是一项用于在实现前设计和审查 API 契约的技能,面向开发者。它帮助选择 API 风格,并检查兼容性、安全边界、错误处理及发布依据。

主要功能

  1. 01API 风格选择与契约定义
  2. 02认证、版本与错误模型审查
  3. 03分页、限流与幂等性规则
  4. 04契约兼容性依据检查
  5. 05验证、变更检测与交接流程

适用场景

  1. 01为新服务选择合适的 API 风格
  2. 02在实现前审查 API 契约
  3. 03规划兼容性变更及部署顺序

MCP 相关

当 Agent 或大模型是主要使用者时,该技能将 MCP 工具架构视为一种 API 契约选项,并指导通过 MCP 暴露面向 Agent 的接口。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/vasilyu1983/ai-agents-public --skill dev-api-design

安装后在 Claude Code 中输入/dev-api-design确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

learnings.consolidated.md
learnings.md
agents/
openai.yaml
assets/
oasdiff-ci.yml
openapi-template.yaml
spectral-ruleset.yaml
assets/cross-platform/
api-patterns-universal.md
template-api-design-review-checklist.md
template-api-error-model.md
template-api-governance.md
data/
sources.json
versions.json
references/
api-design-best-practices.md
api-security-checklist.md
api-testing-patterns.md
asyncapi-patterns.md
authentication-patterns.md
error-handling-patterns.md
graphql-patterns.md
grpc-patterns.md
llm-agent-api-contracts.md
openapi-32-arazzo-101.md
openapi-guide.md
pagination-filtering.md
rate-limiting-patterns.md
real-time-api-patterns.md
restful-design-patterns.md
trpc-patterns.md
versioning-strategies.md
webhook-patterns.md

详细介绍

API 设计

使用此技能进行 REST、GraphQL、gRPC、tRPC、AsyncAPI 和面向 Agent 的接口的契约优先 API 设计。它负责契约选择、身份验证边界、版本控制、错误、分页、速率限制、幂等性和验证;不能替代后端实现或安全审查。

风格决策表

API 风格适用场景不适用场景规范产物
REST + OpenAPI公共 API、广泛的工具兼容性、可缓存资源以流式处理为先的服务契约OpenAPI 3.x
GraphQL复杂的、由客户端驱动的查询形态,多团队共同负责 Schema简单的 CRUD、缓存至关重要、单团队GraphQL SDL
gRPC内部服务、双向流、类型要求严格的边界公共互联网消费者、浏览器原生客户端protobuf
tRPC共享服务端和客户端的 TypeScript 单体仓库非 TypeScript 技术栈、公共第三方消费者TypeScript 类型
AsyncAPI + webhooks事件驱动契约、发布/订阅、推送通知同步请求-响应AsyncAPI 3.x
MCP 工具层Agent 或大模型是主要消费者仅面向人工的客户端MCP 工具 Schema

快速参考

API 风格加载内容
REST + OpenAPIreferences/restful-design-patterns.md、references/openapi-guide.md
GraphQLreferences/graphql-patterns.md
gRPCreferences/grpc-patterns.md
tRPCreferences/trpc-patterns.md
AsyncAPI 和 webhooksreferences/asyncapi-patterns.md、references/webhook-patterns.md
核心通用内容references/error-handling-patterns.md、references/authentication-patterns.md、references/pagination-filtering.md、references/rate-limiting-patterns.md、references/api-testing-patterns.md

契约审查清单

交接前,对每份 API 契约执行以下检查:

  • 存在规范的规格说明产物(OpenAPI、AsyncAPI、protobuf、GraphQL SDL 或 MCP Schema)
  • 明确兼容性和版本控制模型:渐进式变更、URL 路径(/v1/)、标头或内容类型协商
  • 在规格说明或关联文档中写明弃用时间线;Deprecation 标头采用 RFC 9745 的 @<unix-seconds> 格式,Sunset 遵循 RFC 8594
  • 错误模型:对于 REST/HTTP,使用 RFC 9457 Problem Details,并提供稳定的 type URI;客户端需要时,使用应用程序 code 扩展;对于 GraphQL、gRPC 和事件,在各自的原生契约中定义错误
  • 身份验证边界:哪些端点需要哪些作用域;令牌类型(JWT、不透明令牌);撤销途径
  • 分页:高基数场景使用基于游标的分页;仅对规模小且稳定的数据集使用偏移量分页
  • 速率限制:使用 IETF httpapi 的 RateLimit / RateLimit-Policy 字段,或记录在文档中的旧版 X-RateLimit-* 三元组;429 响应包含 Retry-After。IETF 字段在不同草案版本间的形式有所变化:请在 IETF datatracker 上查阅当前修订版本和 RFC 状态,采用该修订版本中的语法,并在规格说明中注明修订版本
  • 幂等性:POST/PATCH 操作须说明幂等键,或明确标记为非幂等;无论 IETF Idempotency-Key 标头处于何种状态(请检查 datatracker),规格说明都必须定义键的作用范围、保留期限和重复使用键时的响应
  • 长时间运行的任务:使用 202 + Location 轮询 URL;state 枚举中明确列出终止状态
  • Webhooks:HMAC 签名;重放保护;负载中包含 trace_id
  • 破坏性变更检测:在 CI 中配置 oasdiff 或等效工具
  • 契约测试:接入 Schemathesis(基于属性)或 Pact(由消费者驱动)

工作流

  1. 根据上方的决策表选择 API 风格。
  2. 定义规范的契约制品。
  3. 执行契约审查清单。
  4. 添加契约验证、破坏性变更检测和文档。
  5. 交接规范、示例和发布说明。
按变更类别提供兼容性证据

在判定契约兼容之前,先对每项变更进行分类:

变更类别所需证据
结构变更Schema 差异,以及生成的客户端编译通过或消费者契约测试
结构稳定的语义变更变更前后示例,以及明确命名的行为断言
默认值、顺序、配额或超时变更近似生产环境的消费者测试和发布说明
移除或收窄使用情况证据、弃用期,以及回滚方案或兼容性垫片

对于提供方/消费者部署,应根据消息方向、发生变更的载荷一侧,以及消费者的实际容忍度,推导安全的部署顺序。对于新的可选请求能力,应先发布提供方支持,再由消费者发送该能力。对于响应枚举/事件扩展,或消费者可能拒绝未知字段或变体的情况,应先发布并验证具备容错能力的消费者,再由提供方发出新值。对于移除操作,应先发布消费者,确认旧字段的流量已消失,再移除提供方行为。应验证相关消费者的实际行为,而不是根据 Schema 的可加性推断安全性;仅有通过的 Schema 差异不足以证明语义兼容性或部署顺序安全。

其他参考

默认做法

  • 在实现或代码生成之前定义契约。
  • 对需要响应正文的 REST/HTTP 错误使用 RFC 9457 Problem Details;对其他 API 风格定义原生错误结构。
  • 在规范中明确版本管理、弃用、幂等性、分页和速率限制。
  • 对 HTTP 或事件驱动接口,优先采用 OpenAPI 3.x 或 AsyncAPI 作为规范来源;固定使用流水线中所有验证器、检查器和生成器均支持的最新次要版本。
  • 将 Agent API 视为具有明确副作用的领域契约,而不是随机端点的薄封装。
  • 当 Agent 是主要消费者时,使用 MCP 作为工具暴露层。其授权模型基于 OAuth 资源服务器标准(RFC 9728 Protected Resource Metadata、RFC 8707 Resource Indicators),但会话、握手和身份验证要求会随规范修订而变化:在围绕会话或 initialize 握手进行设计之前,请前往 modelcontextprotocol.io 查阅当前修订版。参见 references/llm-agent-api-contracts.md。

版本管理策略表

方法使用场景破坏性变更门槛
URL 路径版本管理(/v2/)公共 API、客户端安装基础广泛在 CI 中运行 oasdiff --fail-on ERR
Header 版本管理(API-Version: 2)内部 API、频繁迭代每个 PR 都运行 oasdiff
内容类型协商超媒体或由媒体类型驱动的 API人工审查 + 测试
演进式(GraphQL、gRPC)团队负责 Schema,并运行内省工具GraphQL Inspector / protobuf 兼容性

专家判断

版本策略——根据客户端由谁控制来选择,而不是根据团队偏好。

  • 如果你无法控制每一个客户端(公共 API、第三方集成方、无法强制更新的移动应用),请发布版本策略和支持期限,并根据观察到的使用情况和迁移准备时间来制定;你无法在不通知的情况下迁移调用方。
  • 如果你控制每一个客户端(内部服务网格、使用生成式客户端的单体代码库),优先采用渐进式兼容(添加字段、先弃用再移除),而不是版本化——新版本号会带来你无需承担的协调成本。
  • 如果每个账户或请求都可以独立固定行为,按日期划分的版本会很有用。如果请求未指定版本,应解析为文档中说明的固定默认版本,而不是在不通知的情况下升级调用方,并在响应头中回显解析出的版本。
  • 绝不要让“渐进式演进”成为跳过兼容性检查的借口——GraphQL 和 gRPC 仍需要由 CI 强制执行架构差异检查(GraphQL Inspector、buf breaking);“不做版本化”不等于“不讲规范”。

规则:当 Claude 编辑匹配的文件时,rules/api/contracts.md 会加载此不变量。

识别破坏性变更的直觉——架构差异工具无法从结构上捕获的内容:

以下情况都是 Hyrum 定律的体现:API 的消费者足够多时,每一种可观察到的行为——而不仅仅是文档中描述的架构——都会成为事实上的契约,无论你是否曾作出承诺。(同一定律也适用于架构部署顺序,而非 API 表面,参见 software-database-design/references/migration-strategies.md。)因此,架构差异检查结果干净并不能证明兼容:

  • 形状不变的语义变更:收紧现有枚举允许的值、缩小原本宽松的验证规则范围,或在保持字段类型不变的情况下改变字段的含义——oasdiff/buf breaking 会报告差异为零。
  • 行为默认值:更改默认排序顺序、默认页面大小或默认超时时间,会破坏依赖默认值的调用方,即使架构未变。
  • 跨字段耦合:某个字段从可选但会被忽略变为可选但会被强制执行(例如,以前只用于展示的 region 字段现在会影响路由)。
  • 收紧速率限制和配额:从架构角度看,这不算契约破坏,但对生产流量的影响与移除字段相同——对待配额变更时,应遵循与移除字段相同的弃用通知规范。
  • 错误代码重新分类:将某种情况的代码从 404 改为 410,或从通用的 code 改为更具体的代码,会破坏按旧代码进行模式匹配的客户端,即使 Problem Details 的形状没有变化。
  • 将自动差异检查(oasdiff、GraphQL Inspector、buf breaking、Pact)视为最低要求,而非上限——同时由了解调用方实际依赖内容的人审查变更日志。

Hyrum 定律的表述改编自 addyosmani/agent-skills(MIT),提交 7676817,2026-08-09。 GraphQL、gRPC 或事件驱动契约不适用的情况:

  • 对于只有一种客户端形态的简单 CRUD、需要 HTTP 缓存语义的团队(GraphQL-over-HTTP 规范要求支持 POST,但 GET 是可选的,因此许多服务器只接受 POST;要实现 HTTP 缓存,就需要 GET 加持久化查询),以及单团队负责、无法发挥查询灵活性优势的场景,GraphQL 都不适用——你会平白承担 N+1 风险、查询复杂度 DoS 攻击面和联邦工具链成本,却不给客户端带来任何好处。
  • 原生 gRPC 不适合作为浏览器客户端的默认选择,因为浏览器需要 gRPC-Web 或兼容的传输层。对于公开的第三方集成方,还要考虑 protobuf 工具链和传输支持;如果广泛的 HTTP 互操作性和可发现性更重要,应选择 REST+OpenAPI。
  • 当调用方需要针对特定请求立即获得可关联的答复时,AsyncAPI/事件契约并不适用——通过发布/订阅强行实现请求/响应工作流,会增加关联 ID 管理负担和超时歧义,而普通的同步 HTTP 可以避免这些问题。
  • 如果团队中没人能说出所选风格解决的具体延迟预算、客户端平台限制或多团队协作问题,那就说明这项选择追逐的是潮流,而非实际需求。

常见陷阱

  • 为了架构潮流而非实际客户端、延迟或互操作性限制选择 GraphQL、gRPC 或 AsyncAPI。
  • 设计顺利路径上的资源,却没有明确说明幂等和重试方案,无法应对重复请求或部分失败的请求。
  • 将身份验证问题含糊处理,直到实现阶段才着手,导致各端点的执行方式不一致。
  • 复用会将内部存储语义泄露到公开契约中的分页模型。
  • 将 Webhook 或事件投递视为可靠推送,却没有签名验证、重放保护或消费者背压机制。
  • 实现后再从代码生成规范,却称其为契约优先。
  • 将任意内部端点包装成 Agent API,却没有稳定的副作用、身份验证和验证规则。

导航

核心模式:

资源和模板:

相关技能:

经验循环

当以往的决策或陷阱与当前任务相关时,如果存在 learnings.consolidated.md,请查阅该文件;仅在需要查看历史记录或将其作为可用的后备方案时,使用 learnings.md。否则跳过这两个文件。

应用经验后,如果遇到了值得记住的模式、值得避免的错误,或令你意外的领域事实,请通过 agents-skills-feedback-loop/scripts/append_learning.py 向 learnings.md 追加一条带日期的项目。不要修改 SKILL.md 本身。

评论

支持 Markdown