Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Generate complete, production-ready OpenAPI 3.x and Swagger 2.0 specifications from natural language descriptions, code, or partial specs. Use this skill whenever the user mentions OpenAPI, Swagger, API spec, REST API documentation, YAML/JSON API schema, endpoint documentation, API...
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | 105% | 0% |
| case-02 | ✓→✓ | = Same ✓ | 61% | 0% |
| case-23 | ✓→✓ | = Same ✓ | 78% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 109% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 114% | 0% |
Use this skill when you need generate complete, production-ready OpenAPI 3.x and Swagger 2.0 specifications from natural language descriptions, code, or partial specs. Use this skill whenever the user mentions OpenAPI, Swagger, API spec, REST API documentation, YAML/JSON API schema, endpoint documentation, API...
Generate complete, valid OpenAPI 3.x or Swagger 2.0 specifications from descriptions, code, or partial specs.
Before writing any YAML/JSON, ask (or infer from context) the following:
| Question | Why it matters | |---|---| | OpenAPI 3.x or Swagger 2.0? | Different info, servers/host, components/definitions structure | | Output format: YAML or JSON? | YAML default unless user specifies JSON | | What does this API do? | Sets info.title, info.description, tags | | List of endpoints (or code to extract from)? | Core paths object | | Authentication type(s)? | securitySchemes — see reference | | Common data models or entities? | components/schemas / definitions | | 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.
Follow the structure guide for the chosen version. Always produce a complete, valid spec — never leave placeholder comments like # TODO: add schema.
yamlopenapi: "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: {}
yamlswagger: "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: {}
$ref for any schema used in more than one place.example or examples on every schema and response body.required array.nullable: true (OAS 3.0) or x-nullable: true (Swagger 2.0) for optional nullable fields.format keywords: int32, int64, float, date, date-time, uuid, email, uri, byte, binary.Common schema patterns:
yaml# 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
Read reference/security-schemes.md for detailed patterns. Quick reference:
| Scheme | OAS 3.x type | Notes | |---|---|---| | Bearer JWT | http, scheme bearer | Most common for REST APIs | | API Key (header) | apiKey, in header | e.g. X-API-Key | | API Key (query) | apiKey, in query | Avoid — leaks in logs | | OAuth 2 | oauth2 | Use flows to define grant types | | Basic Auth | http, scheme basic | Only over HTTPS | | OpenID Connect | openIdConnect | Provide openIdConnectUrl |
Apply security globally at the root and override per-operation only where it differs (e.g., public endpoints use security: []).
Path parameters — always required: true:
yamlparameters: - name: userId in: path required: true schema: type: string format: uuid example: 123e4567-e89b-12d3-a456-426614174000
Query parameters — document defaults and enums:
yaml- 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.
Always include at minimum:
| Code | When | |---|---| | 200 | Successful GET, PUT, PATCH | | 201 | Successful POST that creates a resource | | 204 | Successful DELETE (no body) | | 400 | Validation / bad request | | 401 | Missing or invalid auth | | 403 | Authenticated but not authorized | | 404 | Resource not found | | 409 | Conflict (duplicate, state mismatch) | | 422 | Unprocessable entity (semantic errors) | | 429 | Rate limited | | 500 | Internal server error |
Use $ref to components/responses for 401, 403, 404, 429, 500 to avoid repetition.
Before delivering the spec, verify:
openapi or swagger version field presentoperationId (camelCase, unique)200/201/204 response4xx and 5xx responses defined for all operations$ref targets exist in components/ or definitions/required array for all request/response bodiesexample per schema or response bodycomponents/schemas is referenced)yaml or json..yaml / .json fileWhen the user provides source code, extract:
Express / Koa / Fastify (Node.js)
.get(), .post(), .put(), .patch(), .delete() calls:param → path parameter {param}authenticate → note security requirementreq.body, req.query, req.params usage → infer request schemaFastAPI / Flask (Python)
@app.get(), @router.post(), etc.Query(), Path(), Body() → map to parameter locationSpring Boot (Java)
@GetMapping, @PostMapping, etc.@PathVariable, @RequestParam, @RequestBodyDjango REST Framework
ViewSet and Router → CRUD endpointsSerializer fields → schema propertiesRails
routes.rb resource routes → standard REST endpointsreference/security-schemes.md — Detailed security scheme examples for all auth typesreference/common-patterns.md — Pagination, HATEOAS, problem+json, webhooks, file upload patternsRead these when the user asks about a specific pattern or when generating complex auth/pagination setups.
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:
You can install it and re-run.
If the user says no:
Other measured skills in the registry, with their headline benchmark lift.