Catalog
softaworks/openapi-to-typescript

softaworks

openapi-to-typescript

Converts OpenAPI 3.0 JSON/YAML to TypeScript interfaces and type guards. This skill should be used when the user asks to generate types from OpenAPI, convert schema to TS, create API interfaces, or generate TypeScript types from an API specification.

global
0installs0uses~2.0k
v1.1Saved Apr 20, 2026

OpenAPI to TypeScript

Converts OpenAPI 3.0 specifications to TypeScript interfaces and type guards.

Input: OpenAPI file (JSON or YAML) Output: TypeScript file with interfaces and type guards

When to Use

  • "generate types from openapi"
  • "convert openapi to typescript"
  • "create API interfaces"
  • "generate types from spec"

Workflow

  1. Request the OpenAPI file path (if not provided)
  2. Read and validate the file (must be OpenAPI 3.0.x)
  3. Extract schemas from components/schemas
  4. Extract endpoints from paths (request/response types)
  5. Generate TypeScript (interfaces + type guards)
  6. Ask where to save (default: types/api.ts in current directory)
  7. Write the file

OpenAPI Validation

Check before processing:

- Field "openapi" must exist and start with "3.0"
- Field "paths" must exist
- Field "components.schemas" must exist (if there are types)

If invalid, report the error and stop.

Type Mapping

Primitives

OpenAPI TypeScript
string string
number number
integer number
boolean boolean
null null

Format Modifiers

Format TypeScript
uuid string (comment UUID)
date string (comment date)
date-time string (comment ISO)
email string (comment email)
uri string (comment URI)

Complex Types

Object:

// OpenAPI: type: object, properties: {id, name}, required: [id]
interface Example {
  id: string;      // required: no ?
  name?: string;   // optional: with ?
}

Array:

// OpenAPI: type: array, items: {type: string}
type Names = string[];

Enum:

// OpenAPI: type: string, enum: [active, draft]
type Status = "active" | "draft";

oneOf (Union):

// OpenAPI: oneOf: [{$ref: Cat}, {$ref: Dog}]
type Pet = Cat | Dog;

allOf (Intersection/Extends):

// OpenAPI: allOf: [{$ref: Base}, {type: object, properties: ...}]
interface Extended extends Base {
  extraField: string;
}

Code Generation

File Header

/**
 * Auto-generated from: {source_file}
 * Generated at: {timestamp}
 *
 * DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema
 */

Interfaces (from components/schemas)

For each schema in components/schemas:

export interface Product {
  /** Product unique identifier */
  id: string;

  /** Product title */
  title: string;

  /** Product price */
  price: number;

  /** Created timestamp */
  created_at?: string;
}
  • Use OpenAPI description as JSDoc
  • Fields in required[] have no ?
  • Fields outside required[] have ?

Request/Response Types (from paths)

For each endpoint in paths:

// GET /products - query params
export interface GetProductsRequest {
  page?: number;
  limit?: number;
}

// GET /products - response 200
export type GetProductsResponse = ProductList;

// POST /products - request body
export interface CreateProductRequest {
  title: string;
  price: number;
}

// POST /products - response 201
export type CreateProductResponse = Product;

Naming convention:

  • {Method}{Path}Request for params/body
  • {Method}{Path}Response for response

Type Guards

For each main interface, generate a type guard:

export function isProduct(value: unknown): value is Product {
  return (
    typeof value === 'object' &&
    value !== null &&
    'id' in value &&
    typeof (value as any).id === 'string' &&
    'title' in value &&
    typeof (value as any).title === 'string' &&
    'price' in value &&
    typeof (value as any).price === 'number'
  );
}

Type guard rules:

  • Check typeof value === 'object' && value !== null
  • For each required field: check 'field' in value
  • For primitive fields: check typeof
  • For arrays: check Array.isArray()
  • For enums: check .includes()

Error Type (always include)

export interface ApiError {
  status: number;
  error: string;
  detail?: string;
}

export function isApiError(value: unknown): value is ApiError {
  return (
    typeof value === 'object' &&
    value !== null &&
    'status' in value &&
    typeof (value as any).status === 'number' &&
    'error' in value &&
    typeof (value as any).error === 'string'
  );
}

$ref Resolution

When encountering {"$ref": "#/components/schemas/Product"}:

  1. Extract the schema name (Product)
  2. Use the type directly (don't resolve inline)
// OpenAPI: items: {$ref: "#/components/schemas/Product"}
// TypeScript:
items: Product[]  // reference, not inline

Complete Example

Input (OpenAPI):

{
  "openapi": "3.0.0",
  "components": {
    "schemas": {
      "User": {
        "type": "object",
        "properties": {
          "id": {"type": "string", "format": "uuid"},
          "email": {"type": "string", "format": "email"},
          "role": {"type": "string", "enum": ["admin", "user"]}
        },
        "required": ["id", "email", "role"]
      }
    }
  },
  "paths": {
    "/users/{id}": {
      "get": {
        "parameters": [{"name": "id", "in": "path", "required": true}],
        "responses": {
          "200": {
            "content": {
              "application/json": {
                "schema": {"$ref": "#/components/schemas/User"}
              }
            }
          }
        }
      }
    }
  }
}

Output (TypeScript):

/**
 * Auto-generated from: api.openapi.json
 * Generated at: 2025-01-15T10:30:00Z
 *
 * DO NOT EDIT MANUALLY - Regenerate from OpenAPI schema
 */

// ============================================================================
// Types
// ============================================================================

export type UserRole = "admin" | "user";

export interface User {
  /** UUID */
  id: string;

  /** Email */
  email: string;

  role: UserRole;
}

// ============================================================================
// Request/Response Types
// ============================================================================

export interface GetUserByIdRequest {
  id: string;
}

export type GetUserByIdResponse = User;

// ============================================================================
// Type Guards
// ============================================================================

export function isUser(value: unknown): value is User {
  return (
    typeof value === 'object' &&
    value !== null &&
    'id' in value &&
    typeof (value as any).id === 'string' &&
    'email' in value &&
    typeof (value as any).email === 'string' &&
    'role' in value &&
    ['admin', 'user'].includes((value as any).role)
  );
}

// ============================================================================
// Error Types
// ============================================================================

export interface ApiError {
  status: number;
  error: string;
  detail?: string;
}

export function isApiError(value: unknown): value is ApiError {
  return (
    typeof value === 'object' &&
    value !== null &&
    'status' in value &&
    typeof (value as any).status === 'number' &&
    'error' in value &&
    typeof (value as any).error === 'string'
  );
}

Common Errors

Error Action
OpenAPI version != 3.0.x Report that only 3.0 is supported
$ref not found List missing refs
Unknown type Use unknown and warn
Circular reference Use type alias with lazy reference
Files2
2 files · 9.1 KB

Select a file to preview

Overall Score

87/100

Grade

A

Excellent

Safety

92

Quality

88

Clarity

85

Completeness

82

Summary

Converts OpenAPI 3.0 specifications (JSON/YAML) to TypeScript interfaces, request/response types, and runtime type guards. The skill reads OpenAPI files, validates the specification, extracts schemas and endpoint definitions, generates properly typed TypeScript code with JSDoc comments and type guards for runtime validation, and writes the output to a TypeScript file.

Detected Capabilities

Read and parse OpenAPI JSON/YAML filesValidate OpenAPI 3.0.x specification structureExtract schema definitions from components/schemasExtract endpoint paths and HTTP method informationGenerate TypeScript interfaces with JSDoc commentsGenerate request/response type definitionsGenerate runtime type guards for validationHandle complex types (unions, intersections, enums, arrays)Resolve $ref references to schema definitionsWrite generated TypeScript code to files

Trigger Keywords

Phrases that MCP clients use to match this skill to user intent.

generate types from openapiconvert openapi to typescriptcreate API interfacestypescript from specopenapi type generationapi schema to types

Risk Signals

INFO

File write operation to user-specified output path

SKILL.md: Workflow step 6-7, default path types/api.ts
INFO

File read operation for OpenAPI specifications

SKILL.md: Workflow step 2, input validation section
INFO

Type casting with 'as any' in generated type guards

SKILL.md: Type Guards section, code generation examples

Use Cases

  • Generate type-safe TypeScript interfaces from API documentation
  • Create request/response type definitions for REST API endpoints
  • Maintain type alignment between backend OpenAPI specs and frontend code
  • Build runtime type guards for validating API responses
  • Convert API schema documentation into executable TypeScript code

Quality Notes

  • Excellent documentation: comprehensive type mapping tables, clear workflow steps, and detailed code generation examples
  • Well-structured instructions with clear section hierarchy (validation, type mapping, code generation, error handling)
  • Complete example provided showing both input OpenAPI specification and expected TypeScript output
  • Type guard generation rules are explicit and consistent across primitive, complex, enum, and array types
  • Error handling table documents expected failure modes (unsupported versions, missing refs, unknown types, circular references)
  • Naming conventions are clearly defined (PascalCase interfaces, {Method}{Path}Request/Response patterns, is{TypeName} guards)
  • $ref resolution strategy is clear and prevents unnecessary inline expansion
  • Strong practical guidance: OpenAPI validation checks are specified before processing, default output path is provided, JSDoc comments preserved from OpenAPI descriptions
  • Type mapping includes format modifiers (uuid, date, date-time, email, uri) with appropriate comment generation
  • README provides complementary context, usage examples, and trigger phrases aligned with skill purpose
Model: claude-haiku-4-5-20251001Analyzed: Apr 20, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

v1.1

Content updated

2026-04-20

Latest
v1.0

No changelog

2026-04-12

Add softaworks/openapi-to-typescript to your library

Command Palette

Search for a command to run...