Agent-skills openapi-spec-generator
git clone https://github.com/LambdaTest/agent-skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/LambdaTest/agent-skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/api/OpenAPI-Spec-Generator" ~/.claude/skills/lambdatest-agent-skills-openapi-spec-generator && rm -rf "$T"
api/OpenAPI-Spec-Generator/SKILL.mdOpenAPI / Swagger Specification Generator
Generate complete, valid OpenAPI 3.x or Swagger 2.0 specifications from descriptions, code, or partial specs.
Workflow
Step 1 — Gather Context
Before writing any YAML/JSON, ask (or infer from context) the following:
| Question | Why it matters |
|---|---|
| OpenAPI 3.x or Swagger 2.0? | Different , /, / structure |
| Output format: YAML or JSON? | YAML default unless user specifies JSON |
| What does this API do? | Sets , , tags |
| List of endpoints (or code to extract from)? | Core paths object |
| Authentication type(s)? | — see reference |
| Common data models or entities? | / |
| Any existing partial spec to extend? | Merge rather than overwrite |
If the user provides code (Express routes, FastAPI, Django URLs, Spring controllers, etc.), extract endpoints automatically — do not ask what the user already told you.
Step 2 — Build the Spec
Follow the structure guide for the chosen version. Always produce a complete, valid spec — never leave placeholder comments like
# TODO: add schema.
OpenAPI 3.x Skeleton
openapi: "3.1.0" info: title: <API Title> version: "1.0.0" description: <Short description> contact: name: <Team or Author> email: <contact@example.com> servers: - url: https://api.example.com/v1 description: Production - url: https://staging-api.example.com/v1 description: Staging tags: - name: <Tag> description: <Tag description> paths: /resource: get: summary: List resources operationId: listResources tags: [<Tag>] parameters: [] responses: "200": description: Success content: application/json: schema: $ref: "#/components/schemas/ResourceList" example: items: [] total: 0 "401": $ref: "#/components/responses/Unauthorized" "500": $ref: "#/components/responses/InternalError" security: - BearerAuth: [] components: schemas: {} responses: Unauthorized: description: Authentication required content: application/json: schema: $ref: "#/components/schemas/Error" InternalError: description: Internal server error content: application/json: schema: $ref: "#/components/schemas/Error" securitySchemes: {}
Swagger 2.0 Skeleton
swagger: "2.0" info: title: <API Title> version: "1.0.0" description: <Short description> host: api.example.com basePath: /v1 schemes: [https] consumes: [application/json] produces: [application/json] tags: [] paths: {} definitions: {} securityDefinitions: {}
Step 3 — Schemas and Models
- Always use
for any schema used in more than one place.$ref - Include
orexample
on every schema and response body.examples - Mark required fields with the
array.required - Use
(OAS 3.0) ornullable: true
(Swagger 2.0) for optional nullable fields.x-nullable: true - Prefer
keywords:format
,int32
,int64
,float
,date
,date-time
,uuid
,email
,uri
,byte
.binary
Common schema patterns:
# Pagination wrapper PagedResult: type: object required: [items, total, page, pageSize] properties: items: type: array items: $ref: "#/components/schemas/Resource" total: type: integer format: int64 example: 100 page: type: integer format: int32 example: 1 pageSize: type: integer format: int32 example: 20 # Standard error Error: type: object required: [code, message] properties: code: type: string example: RESOURCE_NOT_FOUND message: type: string example: The requested resource was not found. details: type: object additionalProperties: true # Timestamps mixin (use allOf) Timestamps: type: object properties: createdAt: type: string format: date-time updatedAt: type: string format: date-time
Step 4 — Security Schemes
Read
references/security-schemes.md for detailed patterns. Quick reference:
| Scheme | OAS 3.x type | Notes |
|---|---|---|
| Bearer JWT | , scheme | Most common for REST APIs |
| API Key (header) | , in | e.g. |
| API Key (query) | , in | Avoid — leaks in logs |
| OAuth 2 | | Use to define grant types |
| Basic Auth | , scheme | Only over HTTPS |
| OpenID Connect | | Provide |
Apply security globally at the root and override per-operation only where it differs (e.g., public endpoints use
security: []).
Step 5 — Parameters
Path parameters — always
required: true:
parameters: - name: userId in: path required: true schema: type: string format: uuid example: 123e4567-e89b-12d3-a456-426614174000
Query parameters — document defaults and enums:
- name: status in: query schema: type: string enum: [active, inactive, pending] default: active
Headers — include
X-Request-ID, correlation IDs, etc. as common parameters defined under components/parameters.
Step 6 — Response Codes
Always include at minimum:
| Code | When |
|---|---|
| Successful GET, PUT, PATCH |
| Successful POST that creates a resource |
| Successful DELETE (no body) |
| Validation / bad request |
| Missing or invalid auth |
| Authenticated but not authorized |
| Resource not found |
| Conflict (duplicate, state mismatch) |
| Unprocessable entity (semantic errors) |
| Rate limited |
| Internal server error |
Use
$ref to components/responses for 401, 403, 404, 429, 500 to avoid repetition.
Step 7 — Quality Checklist
Before delivering the spec, verify:
-
oropenapi
version field presentswagger - Every path has at least one operation
- Every operation has
(camelCase, unique)operationId - Every operation has at least one
/200
/201
response204 -
and4xx
responses defined for all operations5xx - All
targets exist in$ref
orcomponents/definitions/ - Required fields listed in
array for all request/response bodiesrequired - Security schemes defined AND applied
- At least one
per schema or response bodyexample - Tags defined at root level to match operation tags
- No orphaned schemas (everything in
is referenced)components/schemas
Step 8 — Output
- Emit the complete YAML (or JSON) spec in a code block labeled
oryaml
.json - After the spec, provide a brief summary table of endpoints generated.
- Offer to:
- Export as
/.yaml
file.json - Validate against Spectral or swagger-parser
- Generate mock server config (Prism)
- Generate client SDK stubs (language of choice)
- Export as
Extracting from Code
When the user provides source code, extract:
Express / Koa / Fastify (Node.js)
- Look for
,.get()
,.post()
,.put()
,.patch()
calls.delete() - Route params
→ path parameter:param{param} - Middleware like
→ note security requirementauthenticate
,req.body
,req.query
usage → infer request schemareq.params
FastAPI / Flask (Python)
- Decorators:
,@app.get()
, etc.@router.post() - Pydantic models → translate directly to JSON Schema
,Query()
,Path()
→ map to parameter locationBody()
Spring Boot (Java)
,@GetMapping
, etc.@PostMapping
,@PathVariable
,@RequestParam@RequestBody- DTO classes → schemas
Django REST Framework
andViewSet
→ CRUD endpointsRouter
fields → schema propertiesSerializer
Rails
resource routes → standard REST endpointsroutes.rb- Strong params → request body schema
Reference Files
— Detailed security scheme examples for all auth typesreferences/security-schemes.md
— Pagination, HATEOAS, problem+json, webhooks, file upload patternsreferences/common-patterns.md
Read these when the user asks about a specific pattern or when generating complex auth/pagination setups.
After Completing the OpenAPI/Swagger Specification design
Once the OpenAPI/Swagger Specification output is delivered, ask the user:
"Would you like me to generate API test cases for this design? (yes/no)"
If the user says yes:
- Check if the API Test Case Generator skill is available in the installed skills list
- If the skill is available:
- Read and follow the instructions in the API Test Case Generator skill
- Use the specification output above as the input
- If the skill is NOT available:
- Inform the user: "It looks like the API Documentation skill isn't installed. You can install it and re-run.
If the user says no:
- End the task here