<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Kyle Fuehri</title>
    <description>The latest articles on DEV Community by Kyle Fuehri (@work90210).</description>
    <link>https://dev.to/work90210</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837996%2F656d5160-fe17-4d6a-a077-d915bc126bf5.jpeg</url>
      <title>DEV Community: Kyle Fuehri</title>
      <link>https://dev.to/work90210</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/work90210"/>
    <language>en</language>
    <item>
      <title>I replaced 2,000 lines of MCP boilerplate with one CLI command</title>
      <dc:creator>Kyle Fuehri</dc:creator>
      <pubDate>Sat, 04 Apr 2026 18:40:19 +0000</pubDate>
      <link>https://dev.to/work90210/i-replaced-2000-lines-of-mcp-boilerplate-with-one-cli-command-m77</link>
      <guid>https://dev.to/work90210/i-replaced-2000-lines-of-mcp-boilerplate-with-one-cli-command-m77</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;If you've ever wanted Claude, Cursor, or Copilot to talk to a REST API via MCP, you know the drill: write a transport layer, define tool schemas, handle OAuth, manage credentials, wrap errors... ~200 lines of boilerplate. Per API.&lt;/p&gt;

&lt;p&gt;Want Claude to talk to Stripe AND GitHub AND Slack? That's 600+ lines before you've done anything useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Tried
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual MCP servers&lt;/strong&gt; — works, but painful at scale&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosted MCP platforms&lt;/strong&gt; — vendor lock-in, pricing concerns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code generation&lt;/strong&gt; — still need to maintain the output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I had a realization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Insight: OpenAPI Specs Already Have Everything
&lt;/h2&gt;

&lt;p&gt;Stripe's OpenAPI spec is 50,000 lines. It describes every endpoint, parameter, auth scheme, and response shape. An MCP server needs exactly this information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Endpoints (paths + methods) → MCP tools&lt;/li&gt;
&lt;li&gt;Parameters (request schemas) → tool input schemas
&lt;/li&gt;
&lt;li&gt;Auth (securitySchemes) → OAuth/API key config&lt;/li&gt;
&lt;li&gt;Base URLs (servers) → request routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why are we rewriting this by hand?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How APIFold Works
&lt;/h2&gt;

&lt;p&gt;Point it at any OpenAPI or Swagger spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx apifold serve stripe-openapi.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. 30 seconds later you have a production-ready MCP server. Claude, Cursor, or Copilot connect directly and make real HTTP calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens under the hood:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Parses&lt;/strong&gt; OpenAPI 3.0/3.1 or Swagger 2.0&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generates&lt;/strong&gt; MCP tool definitions from each endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Handles auth&lt;/strong&gt; — OAuth 2.0 with PKCE, API keys, Bearer tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Encrypts credentials&lt;/strong&gt; in an AES-256-GCM vault&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serves&lt;/strong&gt; via SSE or Streamable HTTP transport&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Registry
&lt;/h3&gt;

&lt;p&gt;Pre-built configs for APIs you actually use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stripe&lt;/li&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;Notion&lt;/li&gt;
&lt;li&gt;HubSpot&lt;/li&gt;
&lt;li&gt;Twilio&lt;/li&gt;
&lt;li&gt;OpenAI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Growing weekly — submit a PR to add your API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;p&gt;This isn't a toy. Production features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OAuth 2.0 with PKCE&lt;/strong&gt; — full authorization code flow with automatic token refresh&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AES-256-GCM credential vault&lt;/strong&gt; — credentials encrypted at rest&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-request credential injection&lt;/strong&gt; — keys never leak into tool definitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Input validation&lt;/strong&gt; — JSON Schema validation before every API call&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;p&gt;APIFold is open source:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core transformer&lt;/strong&gt;: MIT-licensed on npm&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full platform&lt;/strong&gt;: AGPL-3.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/Work90210/APIFold" rel="noopener noreferrer"&gt;github.com/Work90210/APIFold&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Registry expansion (community-driven)&lt;/li&gt;
&lt;li&gt;Hosted version for teams&lt;/li&gt;
&lt;li&gt;Webhook support for event-driven workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx apifold serve your-api-spec.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Website: &lt;a href="https://apifold.dev" rel="noopener noreferrer"&gt;apifold.dev&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear: &lt;strong&gt;what APIs are you trying to connect your AI agents to?&lt;/strong&gt; I'll add them to the registry.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>opensource</category>
      <category>devtools</category>
    </item>
    <item>
      <title>I Built an Open-Source Tool That Turns Any REST API into an MCP Server — No Code Required</title>
      <dc:creator>Kyle Fuehri</dc:creator>
      <pubDate>Sun, 22 Mar 2026 06:28:33 +0000</pubDate>
      <link>https://dev.to/work90210/i-built-an-open-source-tool-that-turns-any-rest-api-into-an-mcp-server-no-code-required-2ele</link>
      <guid>https://dev.to/work90210/i-built-an-open-source-tool-that-turns-any-rest-api-into-an-mcp-server-no-code-required-2ele</guid>
      <description>&lt;p&gt;Every AI agent builder hits the same wall.&lt;/p&gt;

&lt;p&gt;You want Claude, Cursor, or Copilot to call the Stripe API. Or the GitHub API. Or your company's internal API. So you sit down and write an MCP server — a bridge between your agent and the REST endpoint.&lt;/p&gt;

&lt;p&gt;You write the tool definitions by hand. You map every parameter. You handle auth, rate limiting, error codes. You write tests. And then you do it all over again for the next API.&lt;/p&gt;

&lt;p&gt;I got tired of writing glue code. So I built &lt;strong&gt;APIFold&lt;/strong&gt; — an open-source platform that takes any OpenAPI spec and turns it into a live, production-ready MCP server endpoint. No code required.&lt;/p&gt;

&lt;p&gt;Paste a spec URL. Get a working MCP server. Connect your agent.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem in 30 Seconds
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP (Model Context Protocol)&lt;/a&gt; is how AI agents talk to external tools. It's a great standard — but connecting a REST API to MCP today means:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reading the API docs&lt;/li&gt;
&lt;li&gt;Manually defining every tool (endpoint) with its parameters&lt;/li&gt;
&lt;li&gt;Writing the HTTP proxy logic&lt;/li&gt;
&lt;li&gt;Handling authentication injection&lt;/li&gt;
&lt;li&gt;Adding rate limiting, circuit breakers, error handling&lt;/li&gt;
&lt;li&gt;Deploying and maintaining the server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For &lt;strong&gt;one&lt;/strong&gt; API, that's a weekend project. For &lt;strong&gt;ten&lt;/strong&gt; APIs, it's a full-time job.&lt;/p&gt;




&lt;h2&gt;
  
  
  What APIFold Does
&lt;/h2&gt;

&lt;p&gt;APIFold automates every step:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Self-hosted: one command&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt;

&lt;span class="c"&gt;# Or use the hosted version at apifold.dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What Happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1. Import&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paste your OpenAPI/Swagger spec URL or upload a file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2. Transform&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;APIFold parses every operation, resolves &lt;code&gt;$ref&lt;/code&gt; chains, handles &lt;code&gt;allOf&lt;/code&gt;/&lt;code&gt;oneOf&lt;/code&gt;/&lt;code&gt;anyOf&lt;/code&gt; composition, and generates MCP tool definitions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3. Connect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You get a live SSE endpoint — point Claude Desktop, Cursor, or any MCP client at it&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's it. Your agent can now call every endpoint in the API.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Under the Hood
&lt;/h2&gt;

&lt;p&gt;APIFold is a TypeScript monorepo with four components:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Transformer (&lt;code&gt;@apifold/transformer&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;The core engine is an &lt;strong&gt;MIT-licensed&lt;/strong&gt; npm package. It's a pure function — no side effects, no network calls, no runtime dependencies. Feed it an OpenAPI 3.0/3.1 spec, get back MCP tool definitions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;parseSpec&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@apifold/transformer&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;spec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.example.com/openapi.json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tools&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;parseSpec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// → Array of MCP tool definitions with inputSchema,&lt;/span&gt;
&lt;span class="c1"&gt;//   parameter mapping, and metadata&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It handles the gnarly stuff:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Circular &lt;code&gt;$ref&lt;/code&gt; resolution&lt;/strong&gt; with cycle detection&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Schema composition&lt;/strong&gt; (&lt;code&gt;allOf&lt;/code&gt;, &lt;code&gt;oneOf&lt;/code&gt;, &lt;code&gt;anyOf&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operation name sanitization&lt;/strong&gt; and collision deduplication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parameter mapping&lt;/strong&gt; across path, query, header, and request body&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tested against &lt;strong&gt;10+ real-world API specs&lt;/strong&gt; (Stripe, GitHub, Twilio, OpenAI, and more) with &lt;strong&gt;95%+ coverage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can use the transformer standalone — it's MIT licensed and works in browsers, Node, edge runtimes, wherever.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The MCP Runtime
&lt;/h3&gt;

&lt;p&gt;An Express server that hosts live MCP endpoints. For each server you create, you get:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET  /mcp/my-stripe-server/sse          # SSE connection
POST /mcp/my-stripe-server/sse/message  # Tool calls
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What it handles for you:&lt;/strong&gt; credential injection, per-server rate limiting (Redis-backed sliding window), circuit breakers for upstream resilience, and hot-reload via Redis pub/sub — no restarts needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Internally, it uses a tiered context loading architecture: L0 in-memory registry for hot servers, L1 tool cache, L2 credential cache. This keeps memory predictable even at scale.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Dashboard
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;Next.js 15&lt;/strong&gt; app where you manage everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Import specs&lt;/strong&gt; from URL or file&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configure servers&lt;/strong&gt; — auth mode, base URL, rate limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable/disable individual tools&lt;/strong&gt; per server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test tool calls&lt;/strong&gt; in an interactive console with JSON Schema form generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View request logs&lt;/strong&gt; with filtering and syntax highlighting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export standalone code&lt;/strong&gt; — generate a self-contained TypeScript MCP server you can deploy anywhere&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Security Built In
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;How It's Handled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Credentials&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;AES-256-GCM encryption at rest (PBKDF2-derived keys)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SSRF&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;DNS resolution checks + private IP blocking on spec URL fetching&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQL Injection&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Parameterized queries via Drizzle ORM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access Control&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Row-level filtering by &lt;code&gt;userId&lt;/code&gt; on every query&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rate Limiting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dual-layer — nginx (per-IP) + application (per-server)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scanning&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Trivy, gitleaks, and npm audit in CI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Framework&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Next.js 15 (App Router) + Express&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL 16 + Drizzle ORM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cache / PubSub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Redis 7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Auth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Clerk&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Billing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;UI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shadcn/UI + Tailwind&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fumadocs (MDX, integrated at &lt;code&gt;/docs&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Testing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Vitest + Playwright (55+ E2E tests)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CI/CD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GitHub Actions + Docker + GHCR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deploy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Docker Compose + nginx (SSE-optimized)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Self-Host or Use the Cloud
&lt;/h2&gt;

&lt;p&gt;APIFold runs on a single &lt;strong&gt;~$5/month&lt;/strong&gt; VPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# docker-compose.yml (simplified)&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;web&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/work90210/apifold-web:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3000:3000"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghcr.io/work90210/apifold-runtime:latest&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;4000:4000"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="na"&gt;postgres&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;postgres:16-alpine&lt;/span&gt;

  &lt;span class="na"&gt;redis&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;redis:7-alpine&lt;/span&gt;

  &lt;span class="na"&gt;nginx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:alpine&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;80:80"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;443:443"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One &lt;code&gt;docker compose up -d&lt;/code&gt; and you own the entire stack. No vendor lock-in, no data leaving your infrastructure.&lt;/p&gt;

&lt;p&gt;Or use the hosted version:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Servers&lt;/th&gt;
&lt;th&gt;Requests/mo&lt;/th&gt;
&lt;th&gt;Log Retention&lt;/th&gt;
&lt;th&gt;Price&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Free&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;7 days&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Starter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;50,000&lt;/td&gt;
&lt;td&gt;30 days&lt;/td&gt;
&lt;td&gt;$9/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;500,000&lt;/td&gt;
&lt;td&gt;90 days&lt;/td&gt;
&lt;td&gt;$49/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Enterprise&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;Contact us&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  What's Coming Next
&lt;/h2&gt;

&lt;p&gt;The v1 launch covers the full loop: &lt;strong&gt;import &amp;gt; configure &amp;gt; connect &amp;gt; test &amp;gt; export&lt;/strong&gt;. But the roadmap has &lt;strong&gt;10 more features&lt;/strong&gt; planned:&lt;/p&gt;

&lt;h3&gt;
  
  
  CLI Tool
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Zero-config quick start — no dashboard needed&lt;/span&gt;
npx apifold serve ./stripe-openapi.yaml

&lt;span class="c"&gt;# With options&lt;/span&gt;
apifold serve ./spec.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--port&lt;/span&gt; 3001 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--base-url&lt;/span&gt; https://api.stripe.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--auth-header&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$STRIPE_KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--filter-tags&lt;/span&gt; payments,customers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A lightweight local MCP server that runs from a spec file. No database, no Redis — just the transformer and an Express server. Available via &lt;strong&gt;npm&lt;/strong&gt;, &lt;strong&gt;Homebrew&lt;/strong&gt;, and &lt;strong&gt;standalone binaries&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  OAuth 2.0 Support
&lt;/h3&gt;

&lt;p&gt;Today APIFold handles API keys and bearer tokens. OAuth 2.0 is next — with &lt;strong&gt;PKCE&lt;/strong&gt;, &lt;strong&gt;automatic token refresh&lt;/strong&gt;, and &lt;strong&gt;pre-configured presets&lt;/strong&gt; for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Google | Slack | GitHub | Salesforce | HubSpot | Microsoft Graph | Notion | Spotify&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You supply your client ID/secret. APIFold handles the dance.&lt;/p&gt;




&lt;h3&gt;
  
  
  Spec Registry
&lt;/h3&gt;

&lt;p&gt;A curated catalog of pre-validated API specs. Browse a grid of API cards, click &lt;strong&gt;"Deploy Stripe"&lt;/strong&gt;, enter your API key, and have a live MCP server in &lt;strong&gt;under 30 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Community contributions welcome.&lt;/p&gt;




&lt;h3&gt;
  
  
  Analytics Dashboard
&lt;/h3&gt;

&lt;p&gt;The data is already being collected. The analytics dashboard will surface it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time-series charts&lt;/strong&gt; — call volume over 24h / 7d / 30d&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Latency percentiles&lt;/strong&gt; — p50, p95, p99&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error explorer&lt;/strong&gt; — filter by error code, inspect failed requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-tool breakdown&lt;/strong&gt; — which tools get called most, which are slow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSV export&lt;/strong&gt; — bring your own BI tools&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Webhook-to-MCP Bridge
&lt;/h3&gt;

&lt;p&gt;This is the feature I'm most excited about.&lt;/p&gt;

&lt;p&gt;Many APIs are event-driven — Stripe webhooks, GitHub push events, Slack messages. APIFold will map &lt;strong&gt;OpenAPI 3.1 &lt;code&gt;webhooks&lt;/code&gt;&lt;/strong&gt; to &lt;strong&gt;MCP resources and notifications&lt;/strong&gt;. Your agent will be able to &lt;em&gt;subscribe to real-time events&lt;/em&gt;, not just make requests.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Agent receives real-time notification when a payment succeeds
webhook://stripe/payment_intent.succeeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Per-provider signature validation included (Stripe, GitHub, Slack).&lt;/p&gt;




&lt;h3&gt;
  
  
  Multi-Spec Composition
&lt;/h3&gt;

&lt;p&gt;A "CRM agent" needs HubSpot + Slack + your internal API. Today, that's three separate MCP connections. &lt;strong&gt;Composite servers&lt;/strong&gt; merge tools from multiple specs into a single endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# One MCP endpoint. One connection. All your APIs.
stripe_getCustomer
stripe_listInvoices
hubspot_getContacts
hubspot_getDeals
slack_postMessage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drag-and-drop builder in the dashboard. Each tool retains its own upstream URL and credentials.&lt;/p&gt;




&lt;h3&gt;
  
  
  More on the Roadmap
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Swagger 2.0 auto-conversion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paste a Swagger 2.0 spec — it auto-converts transparently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Access control profiles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Read Only" shows only GET tools, "Billing" shows only charges + invoices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Response schema mapping&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tools include return type metadata for better agent chaining&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Streamable HTTP transport&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stateless JSON-RPC endpoint for serverless deployment (Vercel, Lambda)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;transformer&lt;/strong&gt; is MIT — use it anywhere, no strings attached.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;platform&lt;/strong&gt; is AGPL-3 — self-host freely, but you can't build a closed-source competing SaaS on top of it. A commercial license is available for orgs that need proprietary modifications.&lt;/p&gt;

&lt;p&gt;I believe the best developer tools are open source. You can read every line of code, audit the security model, run it on your own infrastructure, and contribute improvements back.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/Work90210/APIFold" rel="noopener noreferrer"&gt;github.com/Work90210/APIFold&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;npm&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;npm install @apifold/transformer&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Self-host&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker compose up -d&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Docs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Available at &lt;code&gt;/docs&lt;/code&gt; in any running instance&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're building AI agents and tired of writing MCP servers by hand, give APIFold a try. Star the repo if it's useful — it helps more than you'd think.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Which upcoming feature matters most to you?&lt;/strong&gt; Drop a comment below — it directly influences what I build next.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
