Type-safe MCP server for OpenAPI Sync to inspect, validate, and synchronize OpenAPI specs.
Type-safe MCP server for OpenAPI Sync that inspects, validates, and synchronizes OpenAPI specifications. Its purpose is to keep API documentation aligned with a codebase by working with OpenAPI (formerly Swagger) specs, including generating TypeScript types as described in the project excerpt.
π οΈ Key Features
Type-safe MCP server
Inspects OpenAPI specs
Validates OpenAPI specs
Synchronizes OpenAPI specifications
Generates TypeScript types (per readme excerpt)
π Use Cases
Synchronize OpenAPI documentation with the codebase
Validate OpenAPI specs before synchronization
β‘ Developer Benefits
Type-safe workflows for OpenAPI Sync (per server description)
Supports producing TypeScript types from OpenAPI specifications
β οΈ Limitations
Tool capabilities beyond inspect/validate/synchronize and TypeScript type generation are not specified in the provided data.
OpenAPI Sync is a powerful developer tool that automates the synchronization of your API documentation with your codebase using OpenAPI (formerly Swagger) specifications. It generates TypeScript types, fully-typed API clients (Fetch, Next.js Fetch, Axios, React Query, SWR, RTK Query), endpoint definitions, runtime validation schemas (Zod, Yup, Joi), and comprehensive documentation from your OpenAPI schemaβensuring type safety from API specification through client implementation to runtime validation.
π‘οΈ Enterprise Ready - Error handling, validation, state persistence, and custom code preservation
π¦ Folder Splitting - Organize code by tags or custom logic with aggregator files for easy imports
π Rich Documentation - JSDoc comments with cURL examples and inline usage guides
π€ Agent-Ready Endpoints - Browse endpoints with pagination and path filtering, inspect deep endpoint details, and read generated types without reloading the spec
npm install openapi-sync
# or
npm install -g openapi-sync
# or use directly
npx openapi-sync
β οΈ macOS Big Sur Users: If you encounter an esbuild error (Symbol not found: _SecTrustCopyCertificateChain), install esbuild@0.17.19 first. See Troubleshooting for details.
π€ Using with AI Agents
All CLI commands and programmatic APIs are agent-safe β no interactive prompts, fully non-blocking. Use --json for machine-readable output and --silent to suppress logs.
Full agent reference:llms.txt β a structured discovery file for LLMs, Copilots, and MCP tools.
Every command emits a single, pure JSON object to stdout when --json is passed, making it safe to pipe directly into jq or consume from automated agents. All human-readable progress logs are suppressed or directed to stderr.
Flat Mode (Default): When folderSplit is omitted or empty ({}), files are placed directly in the API folder (endpoints.ts, types/index.ts, types/shared.ts).
Tag-Split Mode: Setting folderSplit: { byTags: true } organizes endpoints into tag subfolders (e.g. {tag}/endpoints.ts, {tag}/types.ts, shared.ts).
Custom Client Directory:clientGeneration.outputDir (or CLI --output) is fully supported in both flat and folder-split layouts. In flat mode, clients are placed directly in {outputDir}/clients.ts (or api.ts), while in folder-split mode clients are placed in {outputDir}/{tag}/client.ts and aggregated at {outputDir}/clients.ts, with relative imports resolving back to your generated types and endpoints.
Programmatic API (TypeScript)
typescript
import {
ValidateConfig,
Init,
GenerateClient,
ListEndpoints,
GetEndpointDetails,
ReadGeneratedType,
Doctor,
Purge,
} from"openapi-sync";
// Pre-flight check β no files writtenconst validation = awaitValidateConfig({ silent: true });
if (!validation.valid) thrownewError(JSON.stringify(validation));
// Diagnostic health check on config, specs, peer dependencies, and directoriesconst health = awaitDoctor({ silent: true });
console.log("Health check:", health.healthy ? "All checks passed" : "Issues detected");
// Inspect API surface with pagination and filteringconst endpoints = awaitListEndpoints({
apiName: "petstore",
pathContains: "pet",
limit: 5,
offset: 0,
silent: true,
});
console.log(endpoints.petstore.length, "endpoints found");
// Inspect a single endpoint in full detail (4-tier fuzzy matching)const detail = awaitGetEndpointDetails({ apiName: "petstore", operationId: "getPetById", silent: true });
console.log(detail.endpoint.path);
// Read an exact generated type declaration (with optional line pagination)const typeDecl = awaitReadGeneratedType({ apiName: "petstore", typeName: "Pet", silent: true });
console.log(typeDecl);
// Sync and get structured resultconst syncResult = awaitInit({ silent: true });
if (!syncResult.success) thrownewError(JSON.stringify(syncResult));
console.log("Files written:", syncResult.filesWritten);
// Generate clientconst clientResult = awaitGenerateClient({ type: "react-query", silent: true });
console.log(JSON.stringify(clientResult));
// Detect and purge stale files from diskconst purgeResult = awaitPurge({ yes: true, silent: true });
console.log("Purged files:", purgeResult.purged);
Exit Codes
Code
Meaning
0
Success
1
Config error or validation failed
2
Network / spec fetch error
3
Generation / file write error
Agent-safe vs Interactive Commands
Command
Agent-safe?
Description
npx openapi-sync
β
Sync specs, generate types, endpoints, schemas
npx openapi-sync validate
β
Validate config + specs; no files written
npx openapi-sync doctor
β
Diagnostic health check on config, network, peer deps, cache
npx openapi-sync list-endpoints
β
List endpoints with filtering and pagination; no files written
npx openapi-sync get-endpoint
β
Inspect detailed schema for one endpoint by operationId or name
npx openapi-sync read-type
β
Read generated TypeScript declaration block
npx openapi-sync generate-client
β
Generate typed API client (fetch, next-fetch, axios, react-query, swr, rtk-query)
npx openapi-sync purge --yes
β
Remove stale generated files without prompting
npx openapi-sync init --no-interactive
β
Create config file without prompts
npx openapi-sync init (no flag)
β
Interactive wizard (requires stdin)
Quick Start
Option 1: Interactive Setup (Recommended) π―
The easiest way to get started is with the interactive setup wizard:
bash
npx openapi-sync init
The wizard will guide you through:
π Configuration file format selection (TypeScript, JSON, or JavaScript)
π API specification source (URL or local file)
π Folder organization options (split by tags or custom logic)
Presets bundle opinionated defaults for your framework, client library, and validation stack into a single name. Instead of configuring dozens of settings by hand, pick a preset during npx openapi-sync init or set "preset": "<name>" in your config file. Any explicit configuration values you define always override preset defaults.
Generated clients support custom code sections that are preserved during regeneration:
typescript
// client.ts (Generated)// ============================================================// π CUSTOM CODE START// Add your custom code below this line// This section will be preserved during regeneration// ============================================================// Your custom helper functions, middleware, etc.// π CUSTOM CODE END// ============================================================
Fetch OpenAPI specifications protected behind Bearer tokens, Basic auth, API keys, or custom headers.
β οΈ IMPORTANT FOR HUMANS & AI AGENTS:
Referencing environment variables for credentials requires using a TypeScript (openapi.sync.ts) or JavaScript (openapi.sync.js) configuration file.
Static JSON (openapi.sync.json) does not support JavaScript runtime expressions like process.env. Always use openapi.sync.ts or openapi.sync.js when dynamic environment variables are needed to keep secrets safe and prevent invalid JSON syntax errors.
Launch an interactive wizard that guides you through creating your configuration file. Perfect for first-time setup or exploring available options.
Sync API Types
bash
# Sync with default config
npx openapi-sync
# Sync with custom refetch interval
npx openapi-sync --refreshinterval 10000
Synchronize your OpenAPI specifications and generate TypeScript types, endpoints, and validation schemas.
Zero-Config CLI Execution & Config Overrides
You can run openapi-sync directly from terminal scripts or CI/CD pipelines without creating a configuration file on disk. Pass any property supported by the configuration file via CLI flags:
If run without a configuration file on disk and without necessary CLI flags (e.g. --api-url, --api <name>=<url>, or --config-json), openapi-sync will display the standard ConfigNotFoundError, prompting you to run npx openapi-sync init.
Generate API Client
bash
# Generate React Query hooks
npx openapi-sync generate-client --type react-query
# Generate for specific API
npx openapi-sync generate-client --type axios --api petstore
# Generate with filters
npx openapi-sync generate-client --type fetch --tags pets,users# Generate for specific endpoints
npx openapi-sync generate-client --type swr --endpoints getPetById,createPet
Generate fully-typed API clients for various frameworks and libraries.
Available Commands & Options
Command
Description
init
Interactive setup wizard (or non-interactive with -y / --no-interactive)
sync (default)
Sync OpenAPI specs and generate types, endpoints, and validation schemas
generate-client
Generate typed API client code (fetch, axios, react-query, swr, rtk-query)
validate
Validate configuration and remote/local specs without writing files
doctor
Run diagnostic health checks on config, specs, peer dependencies, and cache
purge
Detect and remove stale generated files that no longer exist in specs
list-endpoints
List all discovered endpoints with filtering, tags, and pagination
get-endpoint
Inspect details, parameters, and generated code for a specific endpoint
read-type
Extract and display generated TypeScript type definitions for any schema
--help, -h
Show help information
--version, -v
Show version number
CLI Flag Aliases
Flags are interchangeable across init, sync, validate, and generate-client:
Output folder: --output-folder or --folder (-f) (defaults to project root "")
Validation library: --validation-library or --validation-lib (--validations-library)
Tag folder split: --folder-split or --split-by-tags
Type prefix: --types-prefix or --type-prefix
Diagnostic Health Checks (doctor)
Run an automated environment audit to diagnose config syntax, specification accessibility, optional peer dependencies (zod, yup, joi), cache state, and directory write permissions:
bash
# Run human-readable diagnostic report
npx openapi-sync doctor
# Run machine-readable health check for agents and CI
npx openapi-sync doctor --json
Output Example:
json
{"healthy":true,"checks":[{"name":"Configuration","status":"ok","message":"Valid openapi.sync.ts found"},{"name":"Spec Reachability: petstore","status":"ok","message":"HTTP 200 OK (20 endpoints)"},{"name":"Peer Dependency: zod","status":"ok","message":"zod v3.23.8 installed"},{"name":"Output Directory","status":"ok","message":"./src/api is writable"}],"recommendations":[]}
Stale File Detection & Cleanup (purge)
Whenever endpoints or schemas are removed from your OpenAPI specification, previously generated files can become orphaned in your codebase. openapi-sync tracks generated artifacts via .openapi-sync/manifest.json and automatically detects stale files.
bash
# Preview what stale files would be deleted without making changes
npx openapi-sync purge --dry-run
# Preview stale files as JSON (for CI / AI agents)
npx openapi-sync purge --dry-run --json
# Delete stale files without an interactive prompt
npx openapi-sync purge --yes# Limit purge to a single configured API
npx openapi-sync purge --api petstore --yes
AI agents and developers can query specific endpoint metadata or read generated type declarations without loading huge files or blowing LLM context windows:
bash
# Inspect full endpoint definition by operationId
npx openapi-sync get-endpoint --operation-id getPetById --json
# Inspect endpoint using 4-tier fuzzy matching by name or path
npx openapi-sync get-endpoint --name pet_update --json
# Read exact generated TypeScript type definition
npx openapi-sync read-type --api petstore --type-name Pet --json
Typed Error Codes & Recovery
All CLI commands and programmatic methods throw structured error objects extending OpenApiSyncError. Each error exposes a stable code string:
openapi-sync ships with a complete Model Context Protocol (MCP) server. AI agents (Claude Desktop, Cursor, Windsurf, Zed, and any MCP-compatible client) can query endpoints, inspect schemas, read generated types, and execute syncs directly via type-safe tool calls over stdio β without pasting entire 5MBβ15MB specs into prompt context.
The MCP server is published both as part of openapi-sync and as a dedicated zero-install companion package on npm: openapi-sync-mcp.
4 Ways Users & Agents Can Access OpenAPI Sync
Method
Command / Import
Best For
1. Standalone MCP Package
npx openapi-sync-mcp
Claude Desktop, Cursor, Windsurf, Zed configs (zero workspace install needed)
2. Main CLI MCP Subcommand
npx openapi-sync mcp
When openapi-sync is already in your devDependencies or global PATH
3. Agent-Safe CLI (--json)
npx openapi-sync <cmd> --json
Autonomous agents with bash/terminal access (Cursor Agent, Claude Code, Antigravity)
4. Programmatic Node / ESM
require("openapi-sync/mcp")
Custom orchestration scripts, internal developer portals, and CI bots
Starting the Server
bash
# Option A: Via standalone companion package (recommended for agent configs)
npx openapi-sync-mcp
# Option B: Via main CLI (if openapi-sync is installed)
npx openapi-sync mcp
# Option C: If installed globally
openapi-sync-mcp
Transport: The server uses stdio transport β it reads JSON-RPC from stdin and writes responses to stdout. The working directory (cwd) of the process is used as the project root for reading and writing files.
Host Configuration Guides
1. Cursor Configuration
Create or update .cursor/mcp.json in your project root:
Read the current config file β start here to understand what's configured
openapi_sync_validate
Validate config + specs without writing any files (supports auth and config overrides)
openapi_sync_doctor
Run full diagnostic health check on config, specs, peer dependencies, and cache
openapi_sync_list_endpoints
List endpoints with tag filtering, pagination, path matching, and optional cache reuse
openapi_sync_get_endpoint_details
Return the full stored endpoint definition for one endpoint by operationId or name
openapi_sync_read_generated_type
Read the exact generated TypeScript interface/type declaration from the generated types file
openapi_sync_sync
Generate types, endpoints, and validation schemas
openapi_sync_generate_client
Generate a typed API client (fetch, next-fetch, axios, react-query, swr, rtk-query)
openapi_sync_purge
Detect and remove stale generated files (supports dryRun and yes)
openapi_sync_init
Create an openapi.sync config file (non-interactive, with first-class auth & runSync)
Typical agent workflow via MCP
code
1. openapi_sync_read_config β check if config exists
2. openapi_sync_init β create config if needed (non-interactive, default folder "")
3. openapi_sync_doctor β verify environment, spec reachability, and peer dependencies
4. openapi_sync_validate β confirm specs are reachable and valid
5. openapi_sync_list_endpoints β inspect a paged subset of endpoints or search by path
6. openapi_sync_get_endpoint_details β inspect the full schema for one endpoint
7. openapi_sync_read_generated_type β read a specific generated TypeScript declaration
8. openapi_sync_sync β generate types + schemas
9. openapi_sync_generate_client β generate a typed client with optional cache reuse
10. openapi_sync_purge β clean up stale files when specs evolve
Tool input/output types
All tools return JSON-serialized versions of the same structured types used by the programmatic API:
If you find OpenAPI Sync useful and would like to support its development, thank you β your support helps pay for hosting, CI, and ongoing maintenance.
You can support the project in any of the following ways: