APIFold
APIFold reads an OpenAPI 3.x or Swagger 2.x specification and generates a live, production-ready MCP server endpoint. AI agents — Claude, Cursor, Copilot, or any MCP-compatible client — can connect immediately. Tool calls execute real HTTP requests to real upstream APIs with securely stored credentials. No stubs, no mocks, no glue code.
Quick Start
CLI (fastest)
npx apifold serve ./your-openapi-spec.yaml --base-url https://api.example.comOne command. Your spec becomes a running MCP server with SSE transport on localhost:3000. Connect Claude or Cursor immediately.
From the API Registry
npx apifold serve --registry stripe --base-url https://api.stripe.comShips with 8 pre-configured API specs: Stripe, GitHub, Slack, HubSpot, Twilio, OpenAI, Notion, and Petstore.
Hosted Platform
Sign up at apifold.dev
Import a spec (URL, file upload, or browse the registry)
Copy the connection snippet into Claude Desktop or Cursor
Your MCP server is live with a unique endpoint URL
Related MCP server: api-to-mcp
Features
OpenAPI 3.x + Swagger 2.0 — auto-converts Swagger 2.0 specs transparently
CLI tool —
npx apifold servefor zero-config local MCP serversAPI registry — one-click deploy from 8 curated API specs
OAuth 2.0 — Authorization Code (PKCE), Client Credentials, 8 provider presets, auto token refresh
Access profiles — tool-level permissions (Read Only / Read-Write / Full Access)
Analytics — call volume, latency percentiles, error breakdown, usage quotas
Custom domains — use
mcp.yourcompany.comwith DNS verificationUnique endpoint IDs — cryptographic, unguessable URLs per server
SSE + Streamable HTTP — both MCP transport modes supported
Vault encryption — AES-256-GCM for all stored credentials
SSRF protection — DNS pinning, redirect blocking, private IP rejection
CLI
npm install -g @apifold/cliCommand | Description |
| Start an MCP server from an OpenAPI spec |
| Start from a registry spec |
| Output MCP tool definitions as JSON |
| Parse-only validation with warnings |
| Generate an |
Config file
# apifold.config.yaml
spec: ./openapi/stripe.yaml
port: 3001
transport: sse
baseUrl: https://api.stripe.com
auth:
type: bearer
token: ${STRIPE_API_KEY}
filters:
tags: [payments, customers]
methods: [get, post]Self-Hosting
Development
git clone https://github.com/Work90210/APIFold.git
cd APIFold
pnpm install
cp .env.example .env
docker compose -f infra/docker-compose.dev.yml up -d
pnpm devOpen http://localhost:3000 to access the dashboard.
Production
cp .env.example .env
# Edit .env with your production values
docker compose -f infra/docker-compose.yml up -dUsing the Transformer Library
The core conversion logic is a standalone MIT-licensed npm package:
npm install @apifold/transformerimport { parseSpec, transformSpec, autoConvert } from "@apifold/transformer";
// Auto-convert Swagger 2.0 if needed
const { spec } = await autoConvert(rawSpec);
// Parse and transform
const parsed = parseSpec({ spec });
const { tools } = transformSpec({ spec: parsed.spec });
// tools = MCPToolDefinition[] ready for any MCP serverArchitecture
graph LR
Spec["OpenAPI / Swagger\nSpec"] --> Transformer
subgraph MT["APIFold"]
Transformer["Transformer\n(MIT lib)"]
Transformer --> Runtime["Runtime\nExpress + SSE"]
Web["Web App\nNext.js"] --> DB["Postgres 16\nRedis 7"]
Runtime --> DB
CLI["CLI Tool\nnpx apifold"]
Registry["API Registry\n8 specs"]
end
Runtime --> Upstream["Upstream API\n(Stripe, GitHub, etc.)"]
Agent["AI Agent\nClaude, Cursor,\nCopilot, etc."] -- "MCP / SSE" --> RuntimeComponent | Path | Description |
Transformer | OpenAPI to MCP conversion. Pure functions. MIT licensed. | |
Runtime | Express MCP server with SSE/HTTP, OAuth token refresh, access profiles. | |
Web App | Next.js dashboard. Import specs, manage credentials, analytics, custom domains. | |
CLI | Standalone CLI tool. | |
Registry | Curated catalog of 8 validated API specs with one-click deploy. | |
Types | Shared TypeScript type definitions. | |
UI | Design system and component library. |
Available Commands
Command | Description |
| Start all services with hot-reload |
| Build all packages |
| Run tests |
| Lint all packages |
| Type-check all packages |
| Format all files with Prettier |
| Run database migrations |
| Open Drizzle Studio |
Contributing
All code contributions must go through a pull request and be approved before merging. See the contribution guide.
Want to add an API to the registry? See packages/registry/CONTRIBUTING.md.
Security
For security issues, please refer to our security policy. Do not post security vulnerabilities as public GitHub issues.
License
Everything else — GNU Affero General Public License v3.0
Available Tools
2 toolsget_server_endpointB
Get the SSE endpoint URL for a specific APIFold MCP server by slug.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The server slug (e.g. github, stripe, slack, openai, notion) | |
| userKey | Yes | Your APIFold user key |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. It mentions what is retrieved (SSE endpoint URL) but omits error handling (e.g., invalid slug), side effects, caching behavior, or whether this operation incurs costs or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the action verb. There is no redundant or wasted text; every word contributes to understanding the tool's function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
While adequate for a simple two-parameter lookup tool, the description lacks information about the return value format (critical given no output schema exists) and error conditions. It meets minimum viability but leaves operational gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, the schema already comprehensively documents both parameters (including examples for 'slug'). The description adds no additional parameter semantics beyond implying the 'slug' parameter via 'by slug', so it meets the baseline expectation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Get') and resource ('SSE endpoint URL') and clearly scopes the operation to a specific server identified 'by slug'. This effectively distinguishes it from sibling tool 'list_servers' (which presumably enumerates servers rather than retrieving a specific endpoint).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It fails to mention that 'list_servers' should likely be used first to discover valid slugs, or under what circumstances an agent should call this endpoint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_serversA
List all 18 free hosted APIFold MCP servers (GitHub, Stripe, Slack, OpenAI, Notion, and more). Each server proxies a REST API — bring your own API key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It successfully reveals critical ecosystem constraints: the servers are 'free hosted,' 'proxy a REST API,' and require users to 'bring your own API key.' However, it omits details about response format, caching, or rate limiting.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description consists of two highly efficient sentences. The first front-loads the core deliverable (the 18 specific servers), while the second adds essential context about the REST proxy architecture and API key requirements. No words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity (zero parameters, no nested objects) and lack of output schema, the description adequately explains what the tool returns (inventory of 18 servers) and their operational model. It could be improved by hinting at the return structure (e.g., array of server objects), but it is sufficiently complete for agent selection.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Per the evaluation rules, tools with zero parameters receive a baseline score of 4. The input schema is an empty object with no parameters to describe, and the description appropriately focuses on the return value rather than non-existent inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool 'List[s] all 18 free hosted APIFold MCP servers' with specific examples (GitHub, Stripe, Slack, etc.). The plural 'servers' and enumeration of all 18 naturally distinguishes it from sibling 'get_server_endpoint' (singular), making the scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies this is a discovery/initialization tool ('List all'), but provides no explicit guidance on when to use this versus 'get_server_endpoint' or prerequisites for using the listed servers. The usage context is inferred from the verb 'List' but not stated explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
The two tools have clearly distinct purposes: one lists all available servers (discovery), while the other retrieves a specific connection endpoint (retrieval). No functional overlap exists between listing a catalog and fetching a specific URL.
Both tools follow a consistent verb_noun pattern using snake_case (get_server_endpoint, list_servers). The verb choices ('get' vs 'list') accurately reflect the read operations and maintain predictable conventions.
With only 2 tools, the surface feels minimal/thin despite the server connecting to 18 different API proxies. While functional for pure discovery (list + get), the count is borderline for the implied richness of the domain.
Covers the core read-only lifecycle for a directory service: discovery (list) and connection (get endpoint). Minor gap in filtering/search capabilities for the 18 servers, though listing all is acceptable at this scale.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
9 remote MCP servers on Cloudflare Workers for AI agents. Free tier + Pro API keys.
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Hosted MCP server to manage a restaurant menu from AI agents - 39 tools over the DuckHub API.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceTurns any OpenAPI specification into a fully working MCP server with a single command, enabling AI agents to call APIs without writing any glue code.13MIT
- AlicenseNot gradedqualityDmaintenanceTurns any OpenAPI REST or GraphQL API into an MCP server, allowing AI assistants like Claude to interact with APIs without writing code.165MIT
- AlicenseAqualityDmaintenanceTurn any data source into an MCP server in 5 minutes. Build knowledge bases that AI assistants like Claude and Cursor can query directly.22823MIT
- AlicenseNot gradedqualityCmaintenanceFree, minimal REST API wrapper as an MCP server that lets your AI agent call any API.MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Work90210/APIFold'
If you have feedback or need assistance with the MCP directory API, please join our Discord server