OpenAPI Core Knowledge
SkillDocs & knowledgeOpenAPI/Swagger specification. Covers schema definition, paths, and documentation. Use for API documentation.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the OpenAPI Core Knowledge skill
What this skill tells your AI
The instructions your AI receives, as published by claude-dev-suite/claude-dev-suite in skills/api-design/openapi/SKILL.md and read by ahel’s review.
Deep Knowledge: Use
mcp__documentation__fetch_docswith technology:openapifor comprehensive documentation.
Basic Structure
openapi: 3.1.0
info:
title: User API
version: 1.0.0
description: API for managing users
servers:
- url: https://api.example.com/v1
paths:
/users:
get:
summary: List users
operationId: listUsers
parameters:
- name: limit
in: query
schema:
type: integer
default: 20
responses:
'200':
description: List of users
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/User'
post:
summary: Create user
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateUser'
responses:
'201':
description: User created
content:
application/json:
schema:
$ref: '#/components/schemas/User'
/users/{id}:
get:
summary: Get user by ID
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: User found
'404':
description: User not found
components:
schemas:
User:
type: object
properties:
id:
type: string
name:
type: string
email:
type: string
format: email
required: [id, name, email]
CreateUser:
type: object
properties:
name:
type: string
email:
type: string
format: email
required: [name, email]
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
security:
- bearerAuth: []
Schema Types
# String with validation
type: string
minLength: 1
maxLength: 100
pattern: '^[a-zA-Z]+$'
format: email | date | date-time | uri | uuid
# Number
type: integer
minimum: 0
maximum: 100
# Enum
type: string
enum: [active, inactive, pending]
# Array
type: array
items:
type: string
minItems: 1
maxItems: 10
# Object
type: object
additionalProperties: false
When NOT to Use This Skill
- GraphQL API documentation (use
graphqlskill) - tRPC type-safe APIs (use
trpcskill) - Generating API clients (use
openapi-codegenskill) - Spring Boot API documentation (use
springdoc-openapiskill) - Code-first API development (consider using annotations/decorators)
Anti-Patterns
| Anti-Pattern | Why It's Bad | Solution |
|---|---|---|
| Missing response schemas | No type safety, poor docs | Define schemas for all responses |
| No examples in schemas | Hard to understand API | Add example or examples to all schemas |
Using only object without properties | Loses type information | Define explicit properties with types |
| Not defining error responses | Incomplete API contract | Document 4xx and 5xx responses |
| Hardcoding server URLs | Environment-specific config in spec | Use server variables or multiple servers |
Missing required fields | Ambiguous API contract | Mark all required fields explicitly |
| Duplicate schema definitions | Maintenance nightmare | Use $ref and components |
| No security schemes defined | Unclear authentication | Define security schemes in components |
Missing operationId | Poor code generation | Add unique operationId to each endpoint |
Using additionalProperties: true everywhere | Loses validation benefits | Set to false unless needed |
Quick Troubleshooting
| Issue | Possible Cause | Solution |
|---|---|---|
| Validation errors in spec | Invalid YAML/JSON syntax | Use @redocly/cli lint or Swagger Editor |
| Code generation fails | Missing operationId or invalid refs | Add operationIds, verify all $refs resolve |
| Swagger UI not loading | CORS or invalid spec | Check browser console, validate spec |
| Type errors in generated code | Schema mismatch with implementation | Ensure schemas match actual API responses |
| Missing fields in generated types | Schema not defining all properties | Add all properties to schema definition |
| Circular reference errors | Self-referencing schemas | Use allOf or refactor schema structure |
| Example validation fails | Example doesn't match schema | Ensure examples conform to schema constraints |
| Missing auth in Swagger UI | Security not configured | Add securitySchemes and security requirements |
Production Readiness
Complete Error Responses
components:
schemas:
Error:
type: object
properties:
code:
type: string
example: 'NOT_FOUND'
message:
type: string
example: 'User not found'
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required: [code, message]
responses:
BadRequest:
description: Invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
example:
code: 'VALIDATION_ERROR'
message: 'Invalid input'
details:
- field: 'email'
message: 'Invalid email format'
Unauthorized:
description: Authentication required
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Resource not found
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
RateLimited:
description: Too many requests
headers:
X-RateLimit-Limit:
schema:
type: integer
X-RateLimit-Remaining:
schema:
type: integer
X-RateLimit-Reset:
schema:
type: integer
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
paths:
/users:
post:
responses:
'201':
description: Created
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/RateLimited'
Pagination
components:
schemas:
PaginatedResponse:
type: object
properties:
data:
type: array
items: {}
pagination:
type: object
properties:
page:
type: integer
limit:
type: integer
total:
type: integer
totalPages:
type: integer
parameters:
PageParam:
name: page
in: query
schema:
type: integer
minimum: 1
default: 1
LimitParam:
name: limit
in: query
schema:
type: integer
minimum: 1
maximum: 100
default: 20
paths:
/users:
get:
parameters:
- $ref: '#/components/parameters/PageParam'
- $ref: '#/components/parameters/LimitParam'
responses:
'200':
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/PaginatedResponse'
- type: object
properties:
data:
items:
$ref: '#/components/schemas/User'
Code Generation
# Generate TypeScript types
npx openapi-typescript ./openapi.yaml -o ./src/types/api.ts
# Generate client SDK
npx @openapitools/openapi-generator-cli generate \
-i openapi.yaml \
-g typescript-fetch \
-o ./src/api-client
# Validate spec
npx @redocly/cli lint openapi.yaml
// Generated type usage
import type { paths, components } from './types/api';
type User = components['schemas']['User'];
type CreateUserRequest = paths['/users']['post']['requestBody']['content']['application/json'];
type UserListResponse = paths['/users']['get']['responses']['200']['content']['application/json'];
Testing
// Contract testing with OpenAPI
import SwaggerParser from '@apidevtools/swagger-parser';
import { expect, test } from 'vitest';
test('OpenAPI spec is valid', async () => {
const api = await SwaggerParser.validate('./openapi.yaml');
expect(api.info.title).toBeDefined();
});
// API response validation
import Ajv from 'ajv';
import addFormats from 'ajv-formats';
const ajv = new Ajv({ strict: false });
addFormats(ajv);
test('GET /users returns valid response', async () => {
const response = await fetch('/api/users');
const data = await response.json();
const validate = ajv.compile(userListSchema);
expect(validate(data)).toBe(true);
});
Monitoring Metrics
| Metric | Target |
|---|---|
| Spec validation errors | 0 |
| Breaking changes | 0 (semver) |
| Documentation coverage | 100% |
| Example coverage | > 80% |
Checklist
- Standard error response schema
- Pagination parameters defined
- All responses documented
- Security schemes defined
- Request/response examples
- Reusable components
- Code generation configured
- Spec validation in CI
- Contract tests
- Versioning strategy
Frontend Integration
OpenAPI specs can be consumed by frontend applications to generate type-safe clients.
Workflow
OpenAPI Spec → Code Generation → Type-Safe Client → Frontend App
Related Skills
| Skill | Purpose |
|---|---|
| HTTP Clients | Axios, Fetch, ky, ofetch patterns |
| OpenAPI Codegen | Generate clients from specs |
| Type-Safe API | End-to-end type safety |
Quick Client Generation
# Generate TypeScript types only
npx openapi-typescript ./openapi.yaml -o ./src/types/api.ts
# Generate full client
npx @openapitools/openapi-generator-cli generate \
-i openapi.yaml \
-g typescript-fetch \
-o ./src/api-client
# swagger-typescript-api (simpler)
npx swagger-typescript-api -p ./openapi.yaml -o ./src/api --axios
Type Usage in Frontend
import type { paths, components } from './types/api';
import { createApiClient } from './api-client';
// Type-safe request/response
type User = components['schemas']['User'];
type CreateUserBody = paths['/users']['post']['requestBody']['content']['application/json'];
type UsersResponse = paths['/users']['get']['responses']['200']['content']['application/json'];
// With generated client
const api = createApiClient({ baseUrl: '/api' });
const users = await api.users.list(); // Fully typed
Reference Documentation
Signals
- GitHub stars
- 33
- Forks
- 6
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
openapi- Source
- github.com/claude-dev-suite/claude-dev-suite