Why use it
- Zero boilerplate — Turn REST APIs into MCP tools without writing glue code
- Type-safe — Automatic Zod schema generation from OpenAPI specs
- Multi-auth support — Built-in support for multiple authentication providers
- Production-ready — Comprehensive security validation and error handling
- Flexible — Filter operations, customize schemas, and inject custom logic
Installation
Quick start
Configuration
Required Options
Unique identifier for this adapter instance. Used to prefix tool names when multiple adapters are present.
Base URL for API requests (e.g.,
https://api.example.com/v1).In-memory OpenAPI specification object. Use either
spec or url, not both.URL or file path to the OpenAPI specification. Can be a local file path or remote URL. Use either
spec or url, not
both.Optional Configuration
Static headers applied to every request. Useful for API keys or static authentication tokens.
Function to dynamically set headers based on authenticated user context. Headers set here are hidden from MCP clients.
Function to transform or augment the request body before sending. Useful for adding tenant IDs or user-specific data.
Options for loading the OpenAPI specification (headers, timeout, etc.). See
mcp-from-openapi for details.
Options for tool generation. See Advanced Features for details.
Authentication
The OpenAPI adapter provides multiple authentication strategies with different security risk levels. Choose the approach that best fits your use case.Strategy 1: Static Headers (Medium Risk)
Best for: Server-to-server APIs with static credentials.Strategy 2: Auth Provider Mapper (Low Risk) ⭐ Recommended
Best for: Multi-provider authentication (GitHub, Slack, Google, etc.). This approach maps OpenAPI security scheme names to authentication extractors. Each security scheme can use a different auth provider from the authenticated user context.- Extracts security scheme names from OpenAPI spec (e.g.,
GitHubAuth,SlackAuth) - For each tool, looks up the required security scheme
- Calls the corresponding extractor function to get the token from
authInfo - Applies the token to the request
Security Risk: LOW — Authentication is resolved from authenticated user context, not exposed to MCP clients.
Strategy 3: Custom Security Resolver (Low Risk)
Best for: Complex authentication logic or custom security requirements.Security Risk: LOW — Full control over authentication resolution from user context.
Strategy 4: Static Auth (Medium Risk)
Best for: Server-to-server APIs where credentials don’t change per user.Strategy 5: Dynamic Headers & Body Mapping (Low Risk)
Best for: Adding user-specific data (tenant IDs, user IDs) to requests.Security Risk: LOW — User-specific data is injected server-side, hidden from MCP clients.
Default Behavior (Medium Risk)
If no authentication configuration is provided, the adapter usesauthInfo.token for all Bearer auth schemes.
Advanced Features
Filtering Operations
Control which API operations become MCP tools.Input Schema Transformation
Customize the input schema for generated tools.Load Options
Configure how the OpenAPI spec is loaded.How It Works
Request Processing
- Path Parameters — Interpolated into URL template (e.g.,
/users/{id}→/users/123) - Query Parameters — Validated and appended to URL
- Headers — Merged from
additionalHeaders,headersMapper, and security config - Request Body — Validated and transformed by
bodyMapper(for POST/PUT/PATCH) - Authentication — Applied via selected strategy (auth provider mapper, security resolver, etc.)
Response Processing
- JSON responses — Automatically parsed to objects
- Text responses — Returned as plain text
- Error responses — Thrown as errors with status code and message
Complete Examples
Multi-Provider OAuth Application
Multi-Tenant SaaS Application
Expense Management (From Demo)
Security Best Practices
Use Auth Provider Mapper
For multi-provider authentication, use
authProviderMapper to map each security scheme to the correct auth provider. This provides LOW security risk.Never Hardcode Credentials
Always store credentials in environment variables or secrets manager. Never commit credentials to source control.
Avoid includeSecurityInInput
Setting
generateOptions.includeSecurityInInput: true exposes auth fields to MCP clients (HIGH risk). Only use
for development/testing.Validate User Context
Always validate that
authInfo.user contains the expected fields before extracting tokens. Handle missing tokens gracefully.Security Risk Levels
The adapter automatically validates your security configuration and assigns a risk score:| Risk Level | Configuration | Description |
|---|---|---|
| LOW ✅ | authProviderMapper or securityResolver | Auth resolved from user context, not exposed to clients |
| MEDIUM ⚠️ | staticAuth, additionalHeaders, or default | Static credentials or default behavior |
| HIGH 🚨 | generateOptions.includeSecurityInInput: true | Auth fields exposed to MCP clients (not recommended) |
Troubleshooting
Error: Missing auth provider mappings
Error: Missing auth provider mappings
Cause: Your OpenAPI spec defines security schemes that aren’t mapped in
authProviderMapper.Solution: Add all required security schemes to authProviderMapper:Error: Authentication required but no auth configuration found
Error: Authentication required but no auth configuration found
Cause: The tool requires authentication but no auth configuration was provided.Solution: Choose one of the authentication strategies:
- Add
authProviderMapper(recommended for multi-provider) - Add
securityResolver(for custom logic) - Add
staticAuth(for server-to-server) - Add
additionalHeaders(for static API keys)
Tools not appearing
Tools not appearing
Cause: Tools may be filtered out by
filterFn or excludeOperationIds.Solution: Check your filter configuration or remove filters to include all operations.Request fails with 401 Unauthorized
Request fails with 401 Unauthorized
TypeScript errors with OpenAPI spec
TypeScript errors with OpenAPI spec
Cause: OpenAPI spec may not be typed correctly.Solution: Cast the spec to
OpenAPIV3.Document:API Reference
OpenapiAdapter.init(options)
Creates a new OpenAPI adapter instance. Parameters:options: OpenApiAdapterOptions— Adapter configuration
@App({ adapters: [...] })

