Skip to main content
skill Claude Code CX Codex Cursor GitHub Copilot

orval — Claude Code skill: what it does, how to install

Generates type-safe TypeScript clients, TanStack Query hooks, Zod schemas, and MSW mocks from OpenAPI specs.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add orval-labs/orval --skill orval -a claude-code
Open on GitHub

What orval does

This skill configures TypeScript code generation from OpenAPI v3 and Swagger v2 specifications. Orval produces API clients for Fetch or Axios, hooks for TanStack Query across React, Vue, Svelte, and Solid, as well as Hono route handlers and MCP servers.

Running code generation requires orval in devDependencies and an orval.config.ts configuration file. The tool supports multiple output architectures, from a single bundle file to tags-split, which separates schemas and endpoints into tag-based directories.

Remote specification URLs that require authentication need explicit authorization headers declared in parserOptions. Missing credentials will cause the schema fetch step to fail before code generation begins.

What it helps with

  • generate TanStack Query hooks and types from an OpenAPI spec
  • scaffold Zod validation schemas and MSW mocks for testing
  • create Hono API route handlers directly from a Swagger definition
  • split generated endpoints into tag-based directories using tags-split

Example prompts for the agent

  • Configure orval.config.ts to generate react-query hooks from petstore.yaml
  • Run orval generation for petstore using npx orval --project petstore
  • Generate Zod schemas and MSW mocks from our OpenAPI specification

How to install orval

1Skills CLI (Vercel)

npx skills add orval-labs/orval --skill orval -a claude-code

2Manually: put the files in place

~/.claude/skills/orval/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/orval/

Similar

threejs-gameplay-systems majidmanzarpour Scaffolds and tunes playable Three.js browser games with Vite and TypeScript. Helps design core loops, handle input, camera motion, and Rapier physics. Claude Code CX Codex Cursor +1 3,300installs firecrawl-website-design-clone firecrawl Extracts a live website's visual system into DESIGN.md: tokens, components, logo, fonts and palette. Claude Code CX Codex Cursor +1 33,100installs threejs-gltf-loading gamedev-skills Loads glTF/GLB models into three.js and plays their baked or skinned clips, with patterns for DRACO, Meshopt and KTX2. For the case where the file imports but nothing shows up on screen. Claude Code CX Codex Cursor +1 5,400installs threejs-materials-lighting gamedev-skills Picks the right three.js material, adds lights and shadow maps, and wires an HDR environment so a model stops rendering black or flat. Claude Code CX Codex Cursor +1 5,300installs svelte-core-bestpractices sveltejs A skill that tells the agent how to write Svelte components with runes: $state, $derived, events, styling. Useful as soon as the agent edits a Svelte project. Claude Code CX Codex Cursor +1 10,700installs top-design wondelai Directs AI coding agents to build Awwwards-style web experiences with dramatic typography, orchestrated scroll motion, and a 10-point scoring rubric. Claude Code CX Codex Cursor +1 7,100installs frontend-design official anthropics This skill guides intentional visual design for new interfaces and redesigns. Use it when a generic generated UI is not enough. Claude Code Claude.ai 1,025,790installs design-taste-frontend Leonxlnx This skill directs the design of public pages and work screens, then checks the result in a browser through screenshots. Use it when an interface feels generic or unfinished. Claude Code CX Codex Cursor +1 673,100installs

Questions about orval

How to install orval in Claude Code?

Run npx skills add orval-labs/orval --skill orval -a claude-code in your terminal.

What HTTP clients and frameworks does orval support?

It supports TanStack Query for React, Vue, Svelte, Solid, and Angular, along with SWR, native Fetch, Axios, Hono handlers, and MCP servers.

Which output mode should be used for large APIs?

The tags-split mode is recommended for large APIs because it groups files by OpenAPI tag instead of dumping all endpoints into one file.

Source text

SKILL.md · MIT
---
name: orval
description: Generate type-safe API clients, TanStack Query/SWR hooks, Zod schemas, MSW mocks, Hono server handlers, MCP servers, and SolidStart actions from OpenAPI specs using Orval. Covers all clients (React/Vue/Svelte/Solid/Angular Query, Fetch, Axios), custom HTTP mutators, authentication patterns, NDJSON streaming, programmatic API, and advanced configuration.
---

# Orval - OpenAPI to TypeScript Code Generator

Orval generates type-safe TypeScript clients, hooks, schemas, mocks, and server handlers from OpenAPI v3/Swagger v2 specifications.

## Quick Start

### Installation

```bash
npm install orval -D
# or yarn add orval -D
# or pnpm add orval -D
# or bun add orval -D
```

### Minimal Configuration

```ts
import { defineConfig } from 'orval';

export default defineConfig({
  petstore: {
    input: {
      target: './petstore.yaml',
    },
    output: {
      target: './src/api/petstore.ts',
      schemas: './src/api/model',
      client: 'react-query',
    },
  },
});
```

### Run

```bash
npx orval
npx orval --config ./orval.config.ts
npx orval --project petstore
npx orval --watch
```

## Choosing Your Setup

### Client Selection Guide

| Use Case                 | Client            | httpClient         | Notes                                   |
| ------------------------ | ----------------- | ------------------ | --------------------------------------- |
| React with server state  | `react-query`     | `fetch` or `axios` | TanStack Query hooks                    |
| Vue 3 with server state  | `vue-query`       | `fetch` or `axios` | TanStack Query for Vue                  |
| Svelte with server state | `svelte-query`    | `fetch` or `axios` | TanStack Query for Svelte               |
| SolidJS standalone app   | `solid-query`     | `fetch` or `axios` | TanStack Query for Solid                |
| SolidStart full-stack    | `solid-start`     | native fetch       | Uses `query()`/`action()` primitives    |
| Angular with signals     | `angular-query`   | `angular`          | Injectable functions, signal reactivity |
| Angular traditional      | `angular`         | —                  | HttpClient services                     |
| React with SWR           | `swr`             | `fetch` or `axios` | Vercel SWR hooks                        |
| Lightweight / Edge       | `fetch`           | —                  | Zero dependencies, works everywhere     |
| Node.js / existing Axios | `axios-functions` | —                  | Factory functions (default)             |
| Axios with DI            | `axios`           | —                  | Injectable Axios instance               |
| Validation only          | `zod`             | —                  | Zod schemas, no HTTP client             |
| Backend API server       | `hono`            | —                  | Hono handlers with Zod validation       |
| AI agent tools           | `mcp`             | —                  | Model Context Protocol servers          |

### Mode Selection Guide

- **`single`** — Everything in one file. Best for small APIs.
- **`split`** — Separate files: `petstore.ts`, `petstore.schemas.ts`, `petstore.msw.ts`. Good for medium APIs.
- **`tags`** — One file per OpenAPI tag + shared schemas. Organizes by domain.
- **`tags-split`** — Folder per tag with split files. Best for large APIs. Recommended.

### httpClient Option

For `react-query`, `vue-query`, `svelte-query`, and `swr` clients:

```ts
output: {
  client: 'react-query',
  httpClient: 'fetch',  // 'fetch' (default) | 'axios'
}
```

For `angular-query`:

```ts
output: {
  client: 'angular-query',
  httpClient: 'angular',  // Uses Angular HttpClient
}
```

## Configuration Reference

### Config Structure

```ts
import { defineConfig } from 'orval';

export default defineConfig({
  [projectName]: {
    input: InputOptions,
    output: OutputOptions,
    hooks: HooksOptions,
  },
});
```

Multiple projects can share the same config file with different input/output settings.

### Input Options

```ts
input: {
  target: './spec.yaml',              // Path or URL to OpenAPI spec (required)
  override: {
    transformer: './transform.js',    // Transform spec before generation
  },
  filters: {
    mode: 'include',                  // 'include' | 'exclude'
    tags: ['pets', /health/],         // Filter by OpenAPI tags
    schemas: ['Pet', /Error/],        // Filter by schema names
  },
  parserOptions: {
    headers: [                        // Auth headers for remote spec URLs
      {
        domains: ['api.example.com'],
        headers: {
          Authorization: 'Bearer YOUR_TOKEN',
          'X-API-Key': 'your-api-key',
        },
      },
    ],
  },
}
```

### Output Options

```ts
output: {
  target: './src/api/endpoints.ts',     // Output path (required)
  client: 'react-query',               // Client type (see table above)
  httpClient: 'fetch',                  // 'fetch' (default) | 'axios' | 'angular'
  mode: 'tags-split',                   // 'single' | 'split' | 'tags' | 'tags-split'
  schemas: './src/api/model',           // Output path for model types
  operationSchemas: './src/api/params', // Separate path for operation-derived types
  workspace: 'src/',                    // Base folder for all files
  fileExtension: '.ts',                 // Custom file extension
  namingConvention: 'camelCase',        // File naming: camelCase | PascalCase | snake_case | kebab-case
  indexFiles: true,                     // Generate index.ts barrel files
  clean: true,                          // Clean output before generating
  prettier: true,                       // Format with Prettier
  biome: true,                          // Format with Biome
  headers: true,                        // Generate header parameters
  baseUrl: '/api/v2',                   // API base URL
  // or from spec:
  // baseUrl: { getBaseUrlFromSpecification: true, index: 0, variables: { environment: 'api.dev' } },
  mocks: true,                          // Generate MSW + Faker mocks (boolean, object, or function)
  docs: true,                           // Generate TypeDoc documentation
  // docs: { configPath: './typedoc.config.mjs' },
  allParamsOptional: true,              // Make all params optional (except path params)
  urlEncodeParameters: true,            // URL-encode path/query parameters
  optionsParamRequired: false,          // Make options parameter required
  propertySortOrder: 'Specification',   // 'Alphabetical' | 'Specification'
  tsconfig: './tsconfig.json',          // Custom tsconfig path
  override: { ... },                    // Advanced overrides (see below)
}
```

### Multiple API Specs

```ts
export default defineConfig({
  petstoreV1: {
    input: { target: './specs/v1.yaml' },
    output: { target: 'src/api/v1', client: 'react-query' },
  },
  petstoreV2: {
    input: { target: './specs/v2.yaml' },
    output: { target: 'src/api/v2', client: 'react-query' },
  },
});
```

### Filter Endpoints

```ts
input: {
  target: './spec.yaml',
  filters: {
    mode: 'include',
    tags: ['pets'],
  },
}
```

## Detailed Guides

When the user's question involves a specific topic below, read the corresponding file from this skill's directory.

| Topic                | File                                             | Load when user asks about...                                                                                            |
| -------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
| TanStack Query / SWR | [tanstack-query.md](tanstack-query.md)           | React Query, Vue Query, Svelte Query, Solid Query, SWR, query hooks, invalidation, infinite queries, suspense, prefetch |
| Angular              | [angular.md](angular.md)                         | Angular Query, Angular HttpClient, signals, inject functions, Angular services, providedIn                              |
| SolidStart           | [solid-start.md](solid-start.md)                 | SolidStart, @solidjs/router, query(), action(), createAsync, revalidate                                                 |
| Custom HTTP / Auth   | [custom-http-clients.md](custom-http-clients.md) | Custom mutator, authentication, tokens, interceptors, custom fetch/axios, baseURL, hook-based mutator                   |
| Zod Validation       | [zod-validation.md](zod-validation.md)           | Zod schemas, validation, runtime validation, coerce, strict, preprocess                                                 |
| Mocking / MSW        | [mocking-msw.md](mocking-msw.md)                 | MSW mocks, testing, test setup, faker, Vitest, mock handlers, useExamples                                               |
| Hono Server          | [hono.md](hono.md)                               | Hono handlers, zValidator, composite routes, context types, server-side generation                                      |
| Advanced Config      | [advanced-config.md](advanced-config.md)         | Type generation, enums, per-operation overrides, FormData, JSDoc, params serializer, full example                       |
| Tooling / Workflow   | [tooling-workflow.md](tooling-workflow.md)       | Programmatic API, transformers, hooks, NDJSON streaming, MCP, afterAllFilesWrite                                        |

## OpenAPI Specification Best Practices

1. **Use unique `operationId`** for every operation — Orval uses these for function and hook names
2. **Define reusable schemas** in `components/schemas` — reduces duplication in generated types
3. **Use tags** to group operations — works with `tags` and `tags-split` modes
4. **Define response types** for all operations — enables full type safety
5. **Mark required fields** — affects optional/required in generated TypeScript interfaces
6. **Use `x-enumNames`** for numeric enums — generates readable const names
7. **Provide `example` values** — used by mock generation when `useExamples: true`
8. **Use `application/x-ndjson`** content type for streaming endpoints — enables typed NDJSON generation

## CLI Reference

```bash
orval                                    # Generate using auto-discovered config
orval --config ./api/orval.config.ts     # Specify config file
orval --project petstore                 # Run specific project(s)
orval --watch                            # Watch mode
orval --watch ./src                      # Watch specific directory
orval --clean                            # Clean generated files
orval --prettier                         # Format with Prettier
orval --biome                            # Format with Biome
orval --tsconfig ./src/tsconfig.json     # Custom tsconfig path
orval --mode split                       # Override output mode
orval --client react-query               # Override client
orval --mock                             # Override mock generation
orval --input ./spec.yaml --output ./api.ts  # Direct generation
```

## Resources

- [Documentation](https://orval.dev)
- [GitHub](https://github.com/orval-labs/orval)
- [Sample Projects](https://github.com/orval-labs/orval/tree/master/samples)

© orval-labs · MIT · orval-labs/orval

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor