<?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: FlashMCP</title>
    <description>The latest articles on DEV Community by FlashMCP (@flash_mcp).</description>
    <link>https://dev.to/flash_mcp</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%2F3812048%2F5f18ea9f-db37-4919-99e6-415532435675.png</url>
      <title>DEV Community: FlashMCP</title>
      <link>https://dev.to/flash_mcp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/flash_mcp"/>
    <language>en</language>
    <item>
      <title>How I Turned 100,000+ APIs into MCP Servers with a Cloudflare Worker</title>
      <dc:creator>FlashMCP</dc:creator>
      <pubDate>Sat, 07 Mar 2026 19:31:24 +0000</pubDate>
      <link>https://dev.to/flash_mcp/how-i-turned-100000-apis-into-mcp-servers-with-a-cloudflare-worker-238i</link>
      <guid>https://dev.to/flash_mcp/how-i-turned-100000-apis-into-mcp-servers-with-a-cloudflare-worker-238i</guid>
      <description>&lt;p&gt;I built &lt;a href="https://flashmcp.dev" rel="noopener noreferrer"&gt;FlashMCP&lt;/a&gt;, a gateway that turns any REST API into an MCP server on the fly. Here's how the architecture works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The request flow
&lt;/h2&gt;

&lt;p&gt;When a POST hits &lt;code&gt;flashmcp.dev/api.stripe.com&lt;/code&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;URL parsing&lt;/strong&gt; — Extract target host (&lt;code&gt;api.stripe.com&lt;/code&gt;), base path, and optional &lt;code&gt;?spec=&lt;/code&gt; parameter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short-circuit&lt;/strong&gt; — &lt;code&gt;initialize&lt;/code&gt; and &lt;code&gt;ping&lt;/code&gt; don't need a spec. Return immediately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spec resolution&lt;/strong&gt; — Check Cloudflare Cache API → fetch explicit &lt;code&gt;?spec=&lt;/code&gt; URL → auto-discover&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool mapping&lt;/strong&gt; — Parse OpenAPI spec, map all endpoints to MCP tool definitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-RPC dispatch&lt;/strong&gt; — Route &lt;code&gt;tools/list&lt;/code&gt; or &lt;code&gt;tools/call&lt;/code&gt; to the right handler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Upstream proxy&lt;/strong&gt; — Build request, forward auth headers, call the real API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Response formatting&lt;/strong&gt; — JSON → text, images → base64 content blocks, 204 → confirmation message&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All in a single Cloudflare Worker. No containers, no state, no cold starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Auto-discovery: finding the spec
&lt;/h2&gt;

&lt;p&gt;Most APIs don't tell you where their OpenAPI spec is. FlashMCP uses a 3-phase discovery system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1: apis.guru&lt;/strong&gt; — A community directory of 2,500+ API specs. We check if the target host has an entry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2: HTTP Link header&lt;/strong&gt; — Per RFC 8631, APIs can advertise their spec via:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Link: &amp;lt;/openapi.json&amp;gt;; rel="service-desc"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Phase 3: .well-known/api-catalog&lt;/strong&gt; — Per RFC 9727, fetch &lt;code&gt;https://target/.well-known/api-catalog&lt;/code&gt; for a JSON catalog of API descriptions.&lt;/p&gt;

&lt;p&gt;Total: max 3-4 HTTP requests. Results cached for 5 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The $ref problem
&lt;/h2&gt;

&lt;p&gt;OpenAPI specs use JSON &lt;code&gt;$ref&lt;/code&gt; pointers for schema reuse. A pet store spec might have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"Pet"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"$ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#/components/schemas/Category"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"tags"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"$ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#/components/schemas/Tag"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple, right? Until you hit circular references:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"TreeNode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"properties"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"children"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"items"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"$ref"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"#/components/schemas/TreeNode"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;FlashMCP's &lt;code&gt;resolveSchemaRefs()&lt;/code&gt; tracks visited references and replaces circular refs with &lt;code&gt;{ type: "object", description: "(circular reference)" }&lt;/code&gt;. No external dependencies — just recursive descent with a Set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Body flattening
&lt;/h2&gt;

&lt;p&gt;LLMs are bad at nesting. When an API expects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/pets&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Rex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"available"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A naive MCP server would define the tool as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createPet({ body: { name: "Rex", status: "available" } })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LLMs frequently forget the &lt;code&gt;body&lt;/code&gt; wrapper. FlashMCP flattens body fields into the top-level schema:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;createPet({ name: "Rex", status: "available" })
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then reconstructs the body from non-parameter arguments at call time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pagination for large APIs
&lt;/h2&gt;

&lt;p&gt;Some APIs have 500+ endpoints. Dumping all tools in one response overwhelms LLMs. FlashMCP uses cursor-based pagination — 50 tools per page, with a &lt;code&gt;nextCursor&lt;/code&gt; for more.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KV TTL minimum is 60 seconds&lt;/strong&gt; — Cloudflare KV throws a 400 if you set &lt;code&gt;expirationTtl&lt;/code&gt; below 60. This surfaces as a generic 1101 error to clients.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;new URL(path, base)&lt;/code&gt; strips base paths&lt;/strong&gt; — &lt;code&gt;new URL("/pets", "https://api.com/v3")&lt;/code&gt; gives &lt;code&gt;https://api.com/pets&lt;/code&gt;, not &lt;code&gt;https://api.com/v3/pets&lt;/code&gt;. Use string concatenation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Stateless is enough&lt;/strong&gt; — MCP supports sessions, but for a proxy gateway, stateless works perfectly. Each request is independent.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Try it: &lt;a href="https://flashmcp.dev" rel="noopener noreferrer"&gt;flashmcp.dev&lt;/a&gt; | &lt;a href="https://flashmcp.dev/playground/" rel="noopener noreferrer"&gt;Playground&lt;/a&gt; | &lt;a href="https://flashmcp.dev/gallery/" rel="noopener noreferrer"&gt;Gallery&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>mcp</category>
      <category>openapi</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Stop Building MCP Servers. Use a URL Instead.</title>
      <dc:creator>FlashMCP</dc:creator>
      <pubDate>Sat, 07 Mar 2026 19:27:46 +0000</pubDate>
      <link>https://dev.to/flash_mcp/stop-building-mcp-servers-use-a-url-instead-2m3a</link>
      <guid>https://dev.to/flash_mcp/stop-building-mcp-servers-use-a-url-instead-2m3a</guid>
      <description>&lt;p&gt;Every time you want your LLM to interact with an external API via MCP, you write something like this:&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;McpServer&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="s2"&gt;@modelcontextprotocol/sdk/server/mcp.js&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;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my-api&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;listUsers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;List all users&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="na"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;res&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="s2"&gt;`https://api.example.com/users?page=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// ... repeat for every endpoint&lt;/span&gt;
&lt;span class="c1"&gt;// ... handle auth forwarding&lt;/span&gt;
&lt;span class="c1"&gt;// ... deploy somewhere&lt;/span&gt;
&lt;span class="c1"&gt;// ... maintain forever&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For ONE API. Now multiply that by every API you want to connect.&lt;/p&gt;

&lt;h2&gt;
  
  
  There's a better way
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://flashmcp.dev" rel="noopener noreferrer"&gt;FlashMCP&lt;/a&gt; is a hosted gateway that does all of this automatically. Your entire config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"my-api"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://flashmcp.dev/api.example.com"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Done. FlashMCP:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Auto-discovers&lt;/strong&gt; the OpenAPI spec (via apis.guru, HTTP &lt;code&gt;Link&lt;/code&gt; headers, or &lt;code&gt;.well-known/api-catalog&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parses&lt;/strong&gt; every endpoint into MCP tool definitions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resolves&lt;/strong&gt; complex &lt;code&gt;$ref&lt;/code&gt; chains (including circular references)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxies&lt;/strong&gt; your calls to the upstream API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Returns&lt;/strong&gt; properly typed MCP content blocks (text, images, audio)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Try it in 60 seconds
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option A: Playground (no signup)
&lt;/h3&gt;

&lt;p&gt;Go to &lt;a href="https://flashmcp.dev/playground/" rel="noopener noreferrer"&gt;flashmcp.dev/playground&lt;/a&gt; and try any API interactively.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Add this to your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"petstore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://flashmcp.dev/petstore3.swagger.io/api/v3?spec=/api/v3/openapi.json"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Claude Desktop. Ask: &lt;em&gt;"What tools do you have for the pet store?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It just works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option C: Cursor
&lt;/h3&gt;

&lt;p&gt;Same config in your Cursor MCP settings. Every endpoint becomes a tool your AI can call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting authenticated APIs
&lt;/h2&gt;

&lt;p&gt;FlashMCP forwards standard auth headers to the upstream API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://flashmcp.dev/api.github.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer ghp_your_token"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your LLM can now create repos, open issues, merge PRs — whatever the GitHub API supports.&lt;/p&gt;

&lt;h2&gt;
  
  
  100,000+ APIs ready to go
&lt;/h2&gt;

&lt;p&gt;Browse the full gallery at &lt;a href="https://flashmcp.dev/gallery/" rel="noopener noreferrer"&gt;flashmcp.dev/gallery&lt;/a&gt;. Stripe, Twilio, Shopify, Notion, Discord, Slack — if it has an OpenAPI spec, it's there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Free:&lt;/strong&gt; 1,000 requests/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paid:&lt;/strong&gt; $1 per 1,000 requests (prepaid credits, no subscription)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only actual tool calls (API requests) count. Protocol messages like &lt;code&gt;initialize&lt;/code&gt; and &lt;code&gt;tools/list&lt;/code&gt; are always free.&lt;/p&gt;




&lt;p&gt;&lt;a href="https://flashmcp.dev" rel="noopener noreferrer"&gt;FlashMCP&lt;/a&gt; | &lt;a href="https://flashmcp.dev/playground/" rel="noopener noreferrer"&gt;Playground&lt;/a&gt; | &lt;a href="https://flashmcp.dev/gallery/" rel="noopener noreferrer"&gt;Gallery&lt;/a&gt; | &lt;a href="https://flashmcp.dev/docs/" rel="noopener noreferrer"&gt;Docs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>claude</category>
      <category>api</category>
    </item>
  </channel>
</rss>
