<?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: patchbay</title>
    <description>The latest articles on DEV Community by patchbay (@patchbay).</description>
    <link>https://dev.to/patchbay</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%2F3847990%2F5851efc3-2184-4b21-bac9-85a809f7dca5.jpeg</url>
      <title>DEV Community: patchbay</title>
      <link>https://dev.to/patchbay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patchbay"/>
    <language>en</language>
    <item>
      <title>I built an MCP server for my API directory. Here's why.</title>
      <dc:creator>patchbay</dc:creator>
      <pubDate>Sun, 29 Mar 2026 17:32:03 +0000</pubDate>
      <link>https://dev.to/patchbay/i-built-an-mcp-server-for-my-api-directory-heres-why-3d46</link>
      <guid>https://dev.to/patchbay/i-built-an-mcp-server-for-my-api-directory-heres-why-3d46</guid>
      <description>&lt;p&gt;A few weeks ago I launched patchBay, an API directory with 3,100+ entries. Think ProgrammableWeb but not dead.&lt;/p&gt;

&lt;p&gt;The SEO play is obvious: good content, structured data, wait for Google to compound. But there's a second distribution channel that&lt;br&gt;
   didn't exist two years ago: AI coding assistants. When a developer asks Claude Code or Cursor "what's the best geocoding API with&lt;br&gt;
  a free tier," something has to answer that question. I wanted it to be patchBay.&lt;/p&gt;

&lt;p&gt;That's where MCP comes in.&lt;/p&gt;

&lt;p&gt;What MCP actually is&lt;/p&gt;

&lt;p&gt;MCP (Model Context Protocol) is the standard that lets AI assistants call external tools mid-conversation. When you ask Claude Code&lt;br&gt;
   to help you pick a library and it goes off and checks something, that's MCP. It's how you wire your own data into the conversation&lt;br&gt;
   context of tools like Claude, Cursor, and Cline.&lt;/p&gt;

&lt;p&gt;For patchBay, this meant: instead of waiting for a developer to Google "best free weather API" and maybe find my site, their AI&lt;br&gt;
  assistant could query patchBay directly and return a real, structured answer.&lt;/p&gt;

&lt;p&gt;What I built&lt;/p&gt;

&lt;p&gt;A standalone Node.js MCP server, separate from the Next.js app, exposing four tools:&lt;/p&gt;

&lt;p&gt;search_apis - keyword search across names and descriptions, with optional category filter. The bread and butter.&lt;/p&gt;

&lt;p&gt;get_api - full detail lookup by slug or name, for when the assistant wants to dig into a specific entry.&lt;/p&gt;

&lt;p&gt;list_categories - returns all 56 categories with counts, useful for narrowing a vague query.&lt;/p&gt;

&lt;p&gt;filter_apis - structured filtering by category, auth type, HTTPS support, CORS, no-auth requirement. Useful when a developer has&lt;br&gt;
  specific constraints.&lt;/p&gt;

&lt;p&gt;All queries go straight to Supabase. No duplication of data access logic, no separate DB.&lt;/p&gt;

&lt;p&gt;The setup&lt;/p&gt;

&lt;p&gt;I used the official @modelcontextprotocol/sdk package. The server runs over stdio locally, which is what Claude Code and Cursor&lt;br&gt;
  expect for local MCP servers.&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&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/stdio.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;patchbay&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.0&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each tool is registered with a Zod schema for input validation:&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="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;registerTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;search_apis&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;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search the patchBay directory for APIs by keyword&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;query&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;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Search term&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;category&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;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Filter by category slug&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;limit&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="nf"&gt;optional&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;category&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;limit&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="c1"&gt;// Supabase query here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To connect it in Claude Code, you add it to your MCP settings with the Supabase env vars:&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="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;"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;"patchbay"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"args"&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="s2"&gt;"/path/to/patchbay/mcp/dist/server.js"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"SUPABASE_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;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"SUPABASE_ANON_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;After that, you can ask Claude Code "what are the best free weather APIs?" and it queries patchBay in real time to answer.&lt;/p&gt;

&lt;p&gt;Why this matters more than SEO&lt;/p&gt;

&lt;p&gt;SEO compounds over 12 to 18 months. An MCP server works the moment a developer installs it. These are different distribution&lt;br&gt;
  channels with different timelines.&lt;/p&gt;

&lt;p&gt;More importantly: a developer who has patchBay wired into their AI assistant will query it every time they need an API. That's not&lt;br&gt;
  a page view, that's a dependency. The stickiness is completely different.&lt;/p&gt;

&lt;p&gt;The ecosystem is still early. Most directories and data sources have not built MCP servers yet. That gap closes quickly.&lt;/p&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;The server is live and documented at &lt;a href="https://patchbay.cc/developers" rel="noopener noreferrer"&gt;https://patchbay.cc/developers&lt;/a&gt;. Install instructions for Claude Code and Cursor are in the&lt;br&gt;
  &lt;a href="https://github.com/jeremieLouvaert/patchbay" rel="noopener noreferrer"&gt;https://github.com/jeremieLouvaert/patchbay&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you build something with it, or find APIs missing from the directory, &lt;a href="https://patchbay.cc/submit" rel="noopener noreferrer"&gt;https://patchbay.cc/submit&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I built the API directory ProgrammableWeb should have been</title>
      <dc:creator>patchbay</dc:creator>
      <pubDate>Sat, 28 Mar 2026 16:51:32 +0000</pubDate>
      <link>https://dev.to/patchbay/i-built-the-api-directory-programmableweb-should-have-been-4oia</link>
      <guid>https://dev.to/patchbay/i-built-the-api-directory-programmableweb-should-have-been-4oia</guid>
      <description>&lt;p&gt;Every time I started a new project, I'd end up in the same loop: googling "best weather API," opening six tabs, finding three dead&lt;br&gt;
  links, one behind a paywall, and two with docs from 2019. The public API landscape is massive and fragmented. No single place puts&lt;br&gt;
  it all together in a way that actually helps you pick.&lt;/p&gt;

&lt;p&gt;ProgrammableWeb was the closest thing to that place. It shut down in 2023. Nobody replaced it properly.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://patchbay.cc" rel="noopener noreferrer"&gt;https://patchbay.cc&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What makes it different&lt;/p&gt;

&lt;p&gt;3,100+ public APIs across 56 categories: geocoding, machine learning, finance, crypto, sports, and everything in between. Every API&lt;br&gt;
   is tagged with auth type, HTTPS support, and CORS compatibility so you can filter to what actually works for your stack before you&lt;br&gt;
   open a single tab.&lt;/p&gt;

&lt;p&gt;But the catalog isn't the interesting part.&lt;/p&gt;

&lt;p&gt;The technical decisions&lt;/p&gt;

&lt;p&gt;Liveness checking. APIs die quietly. patchBay runs automated checks that detect dead links, domain moves, auth changes, and HTTPS&lt;br&gt;
  downgrades. 67 APIs are already flagged as dead. You won't waste an afternoon integrating something that 404s.&lt;/p&gt;

&lt;p&gt;OpenAPI discovery. A weekly cron job searches GitHub for new OpenAPI/Swagger specs, parses them, deduplicates against the existing&lt;br&gt;
  catalog, and auto-imports. The directory grows without manual curation.&lt;/p&gt;

&lt;p&gt;Semantic search. Embeddings-powered. Searching "send emails programmatically" finds email APIs even when the query doesn't match&lt;br&gt;
  any name or tag directly.&lt;/p&gt;

&lt;p&gt;Best-of pages. Category rankings like &lt;a href="https://patchbay.cc/best/machine-learning" rel="noopener noreferrer"&gt;https://patchbay.cc/best/machine-learning&lt;/a&gt; and &lt;a href="https://patchbay.cc/alternatives/stripe-api" rel="noopener noreferrer"&gt;https://patchbay.cc/alternatives/stripe-api&lt;/a&gt;.&lt;br&gt;
  The comparisons I wished existed when I was evaluating options.&lt;/p&gt;

&lt;p&gt;The stack is Next.js + Supabase + Vercel if that's useful context.&lt;/p&gt;

&lt;p&gt;What's next&lt;/p&gt;

&lt;p&gt;The catalog is solid. The discoverability layer is what I'm focused on now: making it genuinely faster to go from "I need an API&lt;br&gt;
  that does X" to actually integrating one. Changelog detection is running. Richer comparison data is in progress.&lt;/p&gt;

&lt;p&gt;If you want to dig in&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://patchbay.cc" rel="noopener noreferrer"&gt;https://patchbay.cc&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your API is listed and needs updating, claiming is free. If you know of something missing, &lt;a href="https://patchbay.cc/submit" rel="noopener noreferrer"&gt;https://patchbay.cc/submit&lt;/a&gt;. And if&lt;br&gt;
  you want to build on top of the catalog, there's a &lt;a href="https://patchbay.cc/developers" rel="noopener noreferrer"&gt;https://patchbay.cc/developers&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>api</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
