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. Accepts typed documents or plain objects from JSON imports. 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 request context. Access
ctx.authInfo, ctx.sessionId, ctx.traceContext, etc. Headers set here are hidden from MCP clients.Function to transform or augment the request body before sending. Access
ctx.authInfo, ctx.sessionId, etc. 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.
Hide inputs from the schema and inject values at request time. Supports global, per-tool, and generator-based transforms. See Input Schema Transforms.
Customize generated tools with annotations, tags, descriptions, and more. Supports global, per-tool, and generator-based transforms. See Tool Transforms.
How to generate tool descriptions from OpenAPI operations. Default:
'summaryOnly'.Logger instance for adapter diagnostics. When using
OpenapiAdapter.init() within a FrontMCP app, the SDK automatically provides the logger via setLogger(). For standalone usage, you can optionally provide a logger implementing the FrontMcpLogger interface; if omitted, a console-based logger is created automatically.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
ctx.authInfo - Applies the token to the request
Security Risk: LOW — Authentication is resolved from the request context, not exposed to MCP clients.
The
ctx parameter in authProviderMapper, headersMapper, bodyMapper, and securityResolver
callbacks is the FrontMcpContext containing authInfo, sessionId, traceContext, and more. By the time your tool executes,
authentication has been verified and auth fields are populated.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 request 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.Input Schema Transforms
Hide inputs from AI/users and inject values server-side at request time. This is more powerful thaninputSchemaMapper as it provides access to the authentication context.
Security Benefit: Sensitive inputs like tenant IDs and user IDs are injected server-side, never exposed to MCP clients.
Tool Transforms
Customize generated tools with annotations, tags, descriptions, and more.| Property | Type | Description |
|---|---|---|
name | string | function | Override or transform the tool name |
description | string | function | Override or transform the tool description |
annotations | ToolAnnotations | MCP tool behavior hints |
tags | string[] | Categorization tags |
examples | ToolExample[] | Usage examples |
hideFromDiscovery | boolean | Hide tool from listing |
ui | ToolUIConfig | UI configuration for tool forms |
x-frontmcp OpenAPI Extension
Configure tool behavior directly in your OpenAPI spec using thex-frontmcp extension:
openapi.yaml
| Property | Type | Description |
|---|---|---|
annotations | object | Tool behavior hints (readOnlyHint, destructiveHint, idempotentHint, openWorldHint, title) |
cache | object | Cache config: ttl (seconds), slideWindow (boolean) |
codecall | object | CodeCall config: enabledInCodeCall, visibleInListTools |
tags | string[] | Categorization tags |
hideFromDiscovery | boolean | Hide from tool listing |
examples | array | Usage examples with input/output |
Description Mode
Control how tool descriptions are generated from OpenAPI operations:| Mode | Description |
|---|---|
'summaryOnly' | Use only the OpenAPI summary (default) |
'descriptionOnly' | Use only the OpenAPI description |
'combined' | Summary followed by description |
'full' | Summary, description, and operation details |
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) |
Built-in Security Protections
Beyond authentication, the adapter includes defense-in-depth protections:| Protection | Description |
|---|---|
| SSRF Prevention | Validates server URLs, blocks dangerous protocols (file://, javascript://, data:) |
| Header Injection | Rejects control characters (\r, \n, \x00, \f, \v) in header values |
| Prototype Pollution | Blocks reserved JS keys (__proto__, constructor, prototype) in input transforms |
| Request Size Limits | Content-Length validation with integer overflow protection |
| Query Param Collision | Detects conflicts between security and user input parameters |
jwt, API Key → apiKey, Basic → basic, OAuth2 → oauth2Token).
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: [...] })

