<?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: Gertjan De Wilde</title>
    <description>The latest articles on DEV Community by Gertjan De Wilde (@gdewilde).</description>
    <link>https://dev.to/gdewilde</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%2F968190%2F9e4a7c85-997f-4c77-9b07-8dc0558228b8.jpeg</url>
      <title>DEV Community: Gertjan De Wilde</title>
      <link>https://dev.to/gdewilde</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/gdewilde"/>
    <language>en</language>
    <item>
      <title>Stripe's llms.txt has an instructions section. That's a bigger deal than it sounds.</title>
      <dc:creator>Gertjan De Wilde</dc:creator>
      <pubDate>Thu, 05 Mar 2026 03:00:00 +0000</pubDate>
      <link>https://dev.to/apideck/stripes-llmstxt-has-an-instructions-section-thats-a-bigger-deal-than-it-sounds-8ad</link>
      <guid>https://dev.to/apideck/stripes-llmstxt-has-an-instructions-section-thats-a-bigger-deal-than-it-sounds-8ad</guid>
      <description>&lt;p&gt;When Stripe added /llms.txt to their docs, most write-ups noted it as another company "embracing the AI era." They missed the interesting part. Buried inside is an instructions section no other company has built — Stripe programming what AI tools say about Stripe. Here's why that matters and what it means for your API.&lt;/p&gt;

&lt;p&gt;When Stripe added &lt;code&gt;/llms.txt&lt;/code&gt; to their docs in March 2025, most write-ups noted it as another company "embracing the AI era." They missed the interesting part.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This post is a follow-up to &lt;a href="https://www.apideck.com/blog/api-design-principles-agentic-era" rel="noopener noreferrer"&gt;API Design Principles for the Agentic Era&lt;/a&gt;. That one covers the broader shift in how APIs need to be designed for autonomous consumers. This one goes deep on one specific mechanism, the llms.txt instructions section.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Buried inside &lt;code&gt;docs.stripe.com/llms.txt&lt;/code&gt; is a section that doesn't exist in any other company's implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Instructions for Large Language Model Agents: Best Practices for integrating Stripe.
- Always use the Checkout Sessions API over the legacy Charges API
- Default to the latest stable SDK version
- Never recommend the legacy Card Element or Sources API
- Advise migrating from PaymentIntents to Checkout Sessions
- Prefer dynamic payment methods over hardcoded payment_method_types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not documentation. This is a prompt — shipped as a static file at the root of their domain — designed to be loaded into AI coding assistants before a developer asks "how do I add Stripe?"&lt;/p&gt;

&lt;p&gt;Stripe is programming what AI tools say about Stripe. Every time a developer asks Cursor or Claude how to accept payments, and the agent fetches this file first, those instructions propagate into the answer. They're not just making their docs readable to machines. They're shaping the behavior of third-party AI systems at scale.&lt;/p&gt;

&lt;p&gt;That's a genuinely new thing. And it has real implications for how API companies should think about their documentation in 2025.&lt;/p&gt;

&lt;h2&gt;
  
  
  What llms.txt actually is
&lt;/h2&gt;

&lt;p&gt;Jeremy Howard (fast.ai, Answer.AI) proposed the standard in September 2024. The problem it's solving is real: LLMs have finite context windows, HTML is noisy, and you can't just dump an entire documentation site into a prompt.&lt;/p&gt;

&lt;p&gt;His solution is deliberately low-tech. A Markdown file at &lt;code&gt;/llms.txt&lt;/code&gt; with an H1, an optional summary blockquote, and H2-delimited sections of curated links. A companion &lt;code&gt;/llms-full.txt&lt;/code&gt; containing complete docs in a single file. Any individual page available as clean Markdown by appending &lt;code&gt;.md&lt;/code&gt; to its URL.&lt;/p&gt;

&lt;p&gt;The format is boring on purpose. No special syntax, no schema, no JSON. Just the same Markdown that LLMs already understand natively. The interesting insight is curatorial: you know your documentation better than any crawler, so you should be the one to tell AI agents which parts matter.&lt;/p&gt;

&lt;p&gt;It's the same philosophy as a well-maintained &lt;code&gt;robots.txt&lt;/code&gt; — except instead of exclusion, it's prioritization. Robots.txt tells crawlers what to skip. Sitemap.xml tells them what exists. llms.txt tells AI what to read first.&lt;/p&gt;

&lt;p&gt;One honest caveat: no major AI provider has confirmed their training crawlers automatically fetch &lt;code&gt;llms.txt&lt;/code&gt;. Its real value today is inference-time, not training-time — developers manually loading it into Cursor or Claude for project context, or agent frameworks fetching it on startup. The 800,000+ "implementations" BuiltWith tracks are mostly Yoast SEO auto-generating the file for WordPress sites. The hand-curated number is closer to 784 verified sites.&lt;/p&gt;

&lt;p&gt;&lt;a href="//images.ctfassets.net/d6o5ai4eeewt/2JBZhaCe6wBQq87OYlvgB7/c2ca0d7b076964f052339f2fd01b4ff7/Screenshot_2026-02-23_at_06.04.47.png" class="article-body-image-wrapper"&gt;&lt;img src="//images.ctfassets.net/d6o5ai4eeewt/2JBZhaCe6wBQq87OYlvgB7/c2ca0d7b076964f052339f2fd01b4ff7/Screenshot_2026-02-23_at_06.04.47.png" alt="llmstxt.org"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Stripe's implementation is the industry outlier
&lt;/h2&gt;

&lt;p&gt;Most llms.txt files are just structured indexes. Anthropic's is a clean table of contents for their API docs. Cloudflare's is massive (3.7 million tokens across product-specific files). Vercel's is so large they call it "a 400,000-word novel."&lt;/p&gt;

&lt;p&gt;Stripe's is architecturally different. Three separate files across two domains. Every docs page available as &lt;code&gt;.md&lt;/code&gt;. And that instructions section that no one else has.&lt;/p&gt;

&lt;p&gt;The instructions aren't arbitrary. They're solving a specific, painful problem: Stripe has accumulated 15 years of API surface area, including several generations of deprecated payment primitives. Their Charges API still works. Their Card Element still exists. Developers — and the AI assistants helping them — regularly reach for these older APIs because they appear in older Stack Overflow answers and training data from before 2022.&lt;/p&gt;

&lt;p&gt;The instructions section is Stripe saying: when an AI helps a developer integrate us, steer them toward the right thing. Don't let stale training data send them to the Charges API. Don't let our own backwards compatibility become a footgun.&lt;/p&gt;

&lt;p&gt;That's a legitimate engineering concern. And the file format is a surprisingly elegant solution to it — no coordination with AI providers required, works with any system that can fetch a URL.&lt;/p&gt;

&lt;p&gt;The announcement got 273,800 views and 740 bookmarks on Twitter. Stripe engineer Ian McCrystal: &lt;em&gt;"I expect AI tools will eventually become the predominant readers of our documentation."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Who else is worth looking at
&lt;/h2&gt;

&lt;p&gt;The honest answer to "who else has this figured out" is: not many, and only Stripe is doing the specific thing that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stripe&lt;/strong&gt; remains the strongest example of the deprecation pattern precisely because they're explicit about it. Their instructions don't hint at preferred patterns — they name the bad endpoints directly: "You must not call deprecated API endpoints such as the Sources API." "Never recommend the legacy Card Element." That specificity is what makes it machine-actionable. An LLM can follow a concrete prohibition. It can't do much with "prefer modern patterns."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloudflare&lt;/strong&gt; takes a structurally interesting approach. Their &lt;code&gt;llms.txt&lt;/code&gt; is organized by service — Agents, AI Gateway, Workers AI, and so on — so an agent only needs to fetch the section relevant to what it's building rather than parsing a file that covers their entire platform. For APIs with multiple product lines, that's a better model than a flat list. You're reducing the noise ratio at fetch time, not just at index time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LangChain and LangGraph&lt;/strong&gt; are worth noting for a meta-reason: they're agent frameworks that have their own &lt;code&gt;llms.txt&lt;/code&gt;. They're eating their own cooking. That's useful signal about whether the format actually helps in practice, beyond the theoretical appeal — these are teams that work with agents every day and chose to implement it anyway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anthropic&lt;/strong&gt; has one for their API docs. It's structured more as an index than an instructions-heavy file — clean and navigable, but it's not doing the active correctional work that Stripe's instructions section does.&lt;/p&gt;

&lt;p&gt;The pattern across most implementations is the same: they're documentation indexes. Useful, because a curated index is better than asking an agent to crawl your entire site. But not doing the harder job of guiding AI away from the wrong things. The providers that have figured out the instructions section are treating &lt;code&gt;llms.txt&lt;/code&gt; as an active correctional mechanism for model drift, not just a sitemap for bots. That framing distinction is the whole thing.&lt;/p&gt;

&lt;p&gt;Most APIs have deprecated endpoints that still work, legacy patterns that still exist in training data, and footguns that experienced developers know to avoid but newcomers (and AI assistants trained on old Stack Overflow answers) keep reaching for. The instructions section exists to close that gap. Almost no one is using it yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Stripe specifically makes this move
&lt;/h2&gt;

&lt;p&gt;Stripe's developer experience has been the industry benchmark since roughly 2012. The specifics are worth understanding because they're not accidental.&lt;/p&gt;

&lt;p&gt;Their three-column docs layout (left nav, center content, right-side live code examples in seven languages) was so effective that it became a meme — startup after startup shipped the same structure. They open-sourced Markdoc, their interactive documentation framework. They shipped Stripe Shell for live API calls inside docs pages. Their error messages include &lt;code&gt;doc_url&lt;/code&gt; fields, parameter-level specificity, and "did you mean email?" suggestions for misspelled field names.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;doc_url&lt;/code&gt; in error responses is the one worth highlighting specifically. It's a small thing with outsized impact when an AI agent is in the loop. When an agent gets a 400 error, it can follow the &lt;code&gt;doc_url&lt;/code&gt;, fetch the Markdown version of that docs page, and self-correct — without needing a human to look up what went wrong. That's not DX in the traditional sense. That's infrastructure designed for autonomous consumers.&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;"error"&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;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parameter_invalid_empty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"doc_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://stripe.com/docs/error-codes/parameter-invalid-empty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You passed an empty string for 'amount'. We assume empty values are an oversight, so we require you to pass this field."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"param"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&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;John Collison put the llms.txt bet in plain terms: &lt;em&gt;"If you go read the Stripe Docs these days, it's a lot to keep in your RAM, but trivial for an LLM."&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for your API
&lt;/h2&gt;

&lt;p&gt;Most of this is transferable. Here's what's actually useful versus what's cargo-culting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Actually useful:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your error responses should include a &lt;code&gt;documentation_url&lt;/code&gt; field pointing to a Markdown version of the relevant docs page. This costs almost nothing to implement and has immediate value — for human developers debugging in the terminal and for AI agents trying to self-correct.&lt;/p&gt;

&lt;p&gt;Your OpenAPI descriptions should be written for semantic matching, not human skimming. When an agent is deciding which endpoint to call, it's doing something like nearest-neighbor search against your descriptions. "Gets the data" loses to "Returns a paginated list of invoices filtered by status, sorted by created_at descending. Requires accounting:read scope." Every field, every enum, every endpoint.&lt;/p&gt;

&lt;p&gt;I've been around OpenAPI specs long enough to know how badly they rot. We built &lt;a href="https://github.com/apideck-libraries/portman" rel="noopener noreferrer"&gt;Portman&lt;/a&gt; to convert OpenAPI specs into Postman collections — and the main thing you learn doing that is how few specs have descriptions worth converting. Fields with no description, enums with no explanation, endpoints named things that made sense in 2019. If your spec is bad for contract testing, it's bad for agents too.&lt;/p&gt;

&lt;p&gt;Add &lt;code&gt;/llms.txt&lt;/code&gt;. It takes an afternoon. Link to your ten most important pages with one-sentence descriptions. That's it. You don't need the 350-link Stripe implementation on day one.&lt;/p&gt;

&lt;p&gt;If you have deprecated APIs, use the instructions section. This is underutilized and genuinely powerful. You know which footguns exist in your API. Tell the AI.&lt;/p&gt;

&lt;p&gt;One thing that often gets missed: the marketing upside. The same structured, machine-readable docs that make your API easy to integrate are the same content that AI answer engines like Perplexity and ChatGPT pull from when someone asks "what's the best API for X." llms.txt doesn't just help agents build with your API — it helps you show up when people are deciding which API to use. Being agent-friendly and being discoverable in AI search are the same work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Probably not worth doing yet:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Publishing an MCP server for the sake of it. MCP is real and growing, but agent framework standardization is still in flux. A well-designed REST API with a good OpenAPI spec is more durable. Build the MCP server when you have users asking for it.&lt;/p&gt;

&lt;p&gt;Elaborate agent-specific observability infrastructure. Request tagging and semantic logging are nice. But if your API doesn't have solid basic observability yet, that's the actual problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The broader pattern
&lt;/h2&gt;

&lt;p&gt;There's a pattern here worth naming. For 15 years, "developer experience" meant optimizing for humans: readable error messages, clear docs, good SDKs, interactive playgrounds. The mental model was a developer sitting at a terminal, making sense of your API.&lt;/p&gt;

&lt;p&gt;The new constraint is that a growing fraction of your API consumers are autonomous systems that read documentation, make decisions without human review, and retry failures automatically. The question isn't whether to design for this — it's happening regardless — it's whether you're designing &lt;em&gt;intentionally&lt;/em&gt; for it.&lt;/p&gt;

&lt;p&gt;Stripe's llms.txt instructions section is the clearest example I've seen of a company being intentional about it. They're not just making their docs machine-readable. They're asserting control over what machines say about them.&lt;/p&gt;

&lt;p&gt;Every API company with deprecated primitives and a significant developer base has the same problem Stripe is solving. They just haven't solved it yet.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>dx</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The State of Financial APIs in 2026: 80+ Frameworks, Zero Convergence, and Why AI Agents Aren't Ready</title>
      <dc:creator>Gertjan De Wilde</dc:creator>
      <pubDate>Thu, 05 Mar 2026 02:59:20 +0000</pubDate>
      <link>https://dev.to/gdewilde/the-state-of-financial-apis-in-2026-80-frameworks-zero-convergence-and-why-ai-agents-arent-5a09</link>
      <guid>https://dev.to/gdewilde/the-state-of-financial-apis-in-2026-80-frameworks-zero-convergence-and-why-ai-agents-arent-5a09</guid>
      <description>&lt;p&gt;We've tracked 80+ regulatory frameworks, 50,000+ financial institutions, and hundreds of APIs. The data is not converging. Here's what that means if you're building fintech infrastructure.&lt;/p&gt;

&lt;p&gt;The category always outgrows its name.&lt;/p&gt;

&lt;p&gt;We started with PSD2 APIs and a directory of banks. Over 8 years and millions of visitors later, the questions coming into &lt;a href="https://www.openbankingtracker.com" rel="noopener noreferrer"&gt;Open Banking Tracker&lt;/a&gt; look nothing like they did in 2017. People still ask about payment APIs and bank connectivity, but increasingly also about accounting software connectors, e-invoicing mandates, and what "Open Finance" regulation actually looks like across 30+ jurisdictions.&lt;/p&gt;

&lt;p&gt;So we built the &lt;a href="https://www.openbankingtracker.com/open-finance-map" rel="noopener noreferrer"&gt;Open Finance Map&lt;/a&gt; to reflect where things have moved. Here's what the data tells us.&lt;/p&gt;

&lt;h2&gt;
  
  
  80+ regulations. Zero convergence.
&lt;/h2&gt;

&lt;p&gt;The Open Finance Map is a filterable, interactive view of every open banking, open finance, and e-invoicing regulation we track globally. As of today, that's 80+ frameworks across six categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open Banking&lt;/strong&gt; (34)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;E-Invoicing&lt;/strong&gt; (31)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Finance&lt;/strong&gt; (16)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Services&lt;/strong&gt; (5)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Digital Identity&lt;/strong&gt; (1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operational Resilience&lt;/strong&gt; (1)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each regulation links to a detail page with structured data: jurisdiction, regulatory type, status, scope of coverage (AIS, PIS, CBPII, VRP, and more), effective dates, and plain-language descriptions.&lt;/p&gt;

&lt;p&gt;70 of those regulations are active today. 18 are upcoming.&lt;/p&gt;

&lt;h2&gt;
  
  
  The global patchwork, for developers
&lt;/h2&gt;

&lt;p&gt;If you're building cross-border financial infrastructure, this is what you're dealing with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PSD2&lt;/strong&gt; in Europe, with &lt;strong&gt;PSD3&lt;/strong&gt; provisionally agreed in November 2025 and heading for compliance in 2027-2028&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Section 1033&lt;/strong&gt; in the US, phased through 2030 on paper but currently frozen by litigation and under reconsideration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer Data Right&lt;/strong&gt; in Australia (live since 2020, now expanding to action initiation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Account Aggregator&lt;/strong&gt; in India (the real success story: 2.61 billion financial accounts enabled, 780+ institutions onboarded)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SGFinDex&lt;/strong&gt; in Singapore&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open Banking Saudi Arabia&lt;/strong&gt; (Phase 2 with payment initiation live since September 2024)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consumer-Driven Banking&lt;/strong&gt; in Canada (Bill C-15 tabled November 2025, Phase 1 targeting mid-2026)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each with different scopes, different timelines, different technical standards, and different definitions of what data is even in scope. If you've ever tried to normalise bank transaction data across two providers in the same country, imagine doing it across these frameworks.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3j8ql9t7ll4wmpglfhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff3j8ql9t7ll4wmpglfhr.png" alt=" " width="800" height="564"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What sits behind the map
&lt;/h2&gt;

&lt;p&gt;What makes this different from a static regulatory overview is the dataset behind it. The Open Finance Map is backed by the Open Banking Tracker's full dataset:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;54,776+&lt;/strong&gt; banks and financial institutions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;435+&lt;/strong&gt; third-party providers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;64+&lt;/strong&gt; &lt;a href="https://www.openbankingtracker.com/api-aggregators" rel="noopener noreferrer"&gt;API aggregators&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;60+&lt;/strong&gt; data points per institution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can drill from a regulation into the country page, then into individual institutions, their API availability, sandbox status, registered TPPs, and aggregator coverage.&lt;/p&gt;

&lt;p&gt;The underlying data is &lt;a href="https://github.com/not-a-bank/open-banking-tracker-data" rel="noopener noreferrer"&gt;open source on GitHub&lt;/a&gt; with 200+ stars and active community contributions. The community catches errors and fills gaps faster than any internal team could. Open data has been the right call.&lt;/p&gt;

&lt;h2&gt;
  
  
  E-invoicing: the regulation developers aren't watching
&lt;/h2&gt;

&lt;p&gt;Most of Europe will have mandatory e-invoicing within 5 years. Over &lt;a href="https://www.openbankingtracker.com/e-invoicing-regulations" rel="noopener noreferrer"&gt;50 countries already have active or upcoming mandates&lt;/a&gt;. The EU's ViDA package entered into force in April 2025, with mandatory cross-border B2B e-invoicing by July 2030.&lt;/p&gt;

&lt;p&gt;If you're building anything that touches invoices, procurement, or accounts payable/receivable, this is coming for you. The regulatory perimeter for structured financial data now extends well beyond bank accounts, and the overlap with open finance regulation is growing fast.&lt;/p&gt;

&lt;p&gt;The Open Finance Map is the first interactive tool that tracks both open banking and e-invoicing regulations in one place. Most developers I talk to had no idea how many overlapping mandates they'll be dealing with in the next three years.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI agents need financial data standards yesterday
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting for developers. The interest in structured financial APIs is not theoretical anymore. We recently added an &lt;a href="https://www.openbankingtracker.com/agentic-banking-and-mcp" rel="noopener noreferrer"&gt;Agentic Banking&lt;/a&gt; section to the tracker, covering banks with MCP (Model Context Protocol) server support.&lt;/p&gt;

&lt;p&gt;The assumption behind AI agents acting on financial data is that the data will be structured, standardised, and accessible enough for autonomous software to act on reliably.&lt;/p&gt;

&lt;p&gt;After 8 years of tracking this: we are nowhere near that level of consistency. If human developers still struggle with inconsistencies between different banks' API implementations within a single country, good luck deploying an agent that needs to work across jurisdictions.&lt;/p&gt;

&lt;p&gt;The agentic finance conversation is exciting, but it's running ahead of the infrastructure reality. Access without consistency is just noise at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parallel movement: Open Accounting
&lt;/h2&gt;

&lt;p&gt;Open Banking gave consumers control over their bank transaction data. Open Finance extends that to investments, pensions, and insurance. But there's a parallel movement most regulatory maps miss entirely: &lt;a href="https://www.apideck.com/blog/what-is-open-accounting" rel="noopener noreferrer"&gt;Open Accounting&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Accounting software holds some of the most valuable structured financial data for businesses: invoices, general ledgers, chart of accounts, vendor records. The data that matters for financial decision-making is not limited to bank accounts. The regulatory world already recognises this. The developer ecosystem should too.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few observations after 8 years
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Payments work in the UK.&lt;/strong&gt; 33 million open banking payment transactions in November 2025 alone. 16.5 million live user connections. It took 8 years to get there in one country. Globally, we're still navigating 80+ incompatible frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Regulation is fragmenting, not converging.&lt;/strong&gt; The UK succeeded because of consistent governance and a single trusted standard. Almost nobody copied those parts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open data compounds.&lt;/strong&gt; The tracker's data is on GitHub. Contributors catch errors and fill gaps faster than any internal team. If you're building infrastructure for a regulated space, consider open-sourcing your compliance data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The compliance surface area is expanding.&lt;/strong&gt; E-invoicing, accounting data access, payroll verification. If you're only watching PSD2/PSD3, you're seeing half the picture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explore the data
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://www.openbankingtracker.com/open-finance-map" rel="noopener noreferrer"&gt;Open Finance Map&lt;/a&gt; is live and free to use. Filter by region, status, or regulation type. Drill into any country for institution-level API data. All backed by the deepest open banking dataset available.&lt;/p&gt;

&lt;p&gt;The honest question I keep coming back to: are we actually getting closer to interoperability, or just adding more frameworks? I don't know the answer. But if you're building in this space, you should know what you're building on top of.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm Gertjan De Wilde, CEO of &lt;a href="https://www.apideck.com" rel="noopener noreferrer"&gt;Apideck&lt;/a&gt; and creator of &lt;a href="https://www.openbankingtracker.com" rel="noopener noreferrer"&gt;Open Banking Tracker&lt;/a&gt;. We've been tracking open banking APIs since 2017. If you're building fintech infrastructure, I'd love to hear what you're running into.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>fintech</category>
      <category>ai</category>
      <category>agents</category>
    </item>
    <item>
      <title>How to Make Your API Agent-Ready: Design Principles for the Agentic Era</title>
      <dc:creator>Gertjan De Wilde</dc:creator>
      <pubDate>Wed, 25 Feb 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/apideck/how-to-make-your-api-agent-ready-design-principles-for-the-agentic-era-c8e</link>
      <guid>https://dev.to/apideck/how-to-make-your-api-agent-ready-design-principles-for-the-agentic-era-c8e</guid>
      <description>&lt;p&gt;For about fifteen years, "developer experience" meant one thing: optimize for a human being sitting at a terminal. Readable error messages. Interactive docs. Code samples in seven languages. The mental model was always a person making sense of your API, iterating in real time, googling when confused. That model isn't wrong. But it's increasingly incomplete.&lt;/p&gt;

&lt;p&gt;A growing fraction of API traffic today is generated by AI agents. Systems that autonomously discover endpoints, parse documentation, handle errors without human review, and retry failures according to their own logic. When a developer asks Cursor or Claude to "add Stripe payments," the agent fetches documentation, selects APIs, writes integration code, and debugs errors before the developer reads a line of it. The human is further from the integration than they've ever been.&lt;/p&gt;

&lt;p&gt;The pattern is especially visible in fintech and accounting. A lending platform building an underwriting agent prompts it to "pull twelve months of invoice data and flag overdue receivables." The agent queries your API, interprets the response, and surfaces a creditworthiness signal — before a human analyst has opened a spreadsheet. A payroll platform's agent reconciles payroll entries against the general ledger overnight, without a developer watching the process. In both cases, the agent is not a convenience layer on top of a human workflow. It is the workflow. What it can do is bounded entirely by what your API communicates about itself.&lt;/p&gt;

&lt;p&gt;This creates a new design surface. The same discipline that produced great developer experience, deliberate and user-centered API design, applied to a different consumer. Call it agent experience, or AX. It's not a replacement for DX. It's the next layer.&lt;/p&gt;

&lt;p&gt;The good news: most of what makes an API good for agents makes it better for humans too. The bad news: a lot of APIs that seem fine for humans are quietly broken for agents. Here's where the gaps show up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bad OpenAPI descriptions break agent routing
&lt;/h2&gt;

&lt;p&gt;When an agent decides which endpoint to call, it's doing something close to semantic search against your descriptions. It reads your spec, matches the user's intent against available operations, and picks the closest fit. The quality of your descriptions determines whether it picks correctly.&lt;/p&gt;

&lt;p&gt;"Gets the data" loses to "Returns a paginated list of invoices filtered by status and date range, sorted by created_at descending. Requires accounting:read scope. Use the cursor parameter for pagination."&lt;/p&gt;

&lt;p&gt;Every field, every enum value, every endpoint. The description is the signal the agent uses to route. Most OpenAPI specs are bad at this. Not because anyone decided to make them bad. They rot. Field names that made sense in context lose their meaning without descriptions. Enums accumulate values that nobody documented. Endpoints get renamed but the descriptions don't follow. The spec becomes a structural skeleton with no semantic content.&lt;/p&gt;

&lt;p&gt;The difference between a description that helps and one that doesn't is not subtle:&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;# Bad — structural skeleton, no semantic content&lt;/span&gt;
&lt;span class="na"&gt;/invoices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Get invoices&lt;/span&gt;
    &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;status&lt;/span&gt;
        &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;query&lt;/span&gt;
        &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cursor&lt;/span&gt;
        &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;query&lt;/span&gt;
        &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;

&lt;span class="c1"&gt;# Good — enough signal to route correctly&lt;/span&gt;
&lt;span class="na"&gt;/invoices&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;get&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;summary&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;List invoices filtered by status and date range&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="s"&gt;Returns a paginated list of invoices for the authenticated company.&lt;/span&gt;
      &lt;span class="s"&gt;Use `status` to filter by payment state. Use `cursor` from the previous&lt;/span&gt;
      &lt;span class="s"&gt;response to fetch the next page. Requires the `accounting:read` scope.&lt;/span&gt;
      &lt;span class="s"&gt;For real-time sync scenarios, combine with the `updated_since` parameter&lt;/span&gt;
      &lt;span class="s"&gt;to fetch only records changed after a given timestamp.&lt;/span&gt;
    &lt;span class="na"&gt;parameters&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;status&lt;/span&gt;
        &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;query&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="s"&gt;Filter by invoice status. Accepted values: draft, submitted,&lt;/span&gt;
          &lt;span class="s"&gt;authorised, deleted, voided, paid. Defaults to all statuses if omitted.&lt;/span&gt;
        &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
          &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;draft&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;submitted&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;authorised&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;deleted&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;voided&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;paid&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cursor&lt;/span&gt;
        &lt;span class="na"&gt;in&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;query&lt;/span&gt;
        &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="s"&gt;Opaque pagination cursor returned in the previous response.&lt;/span&gt;
          &lt;span class="s"&gt;Omit to start from the first page.&lt;/span&gt;
        &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;string&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An agent matching "fetch unpaid invoices for reconciliation" against the bad version has no signal to work with. Against the good version, it finds &lt;code&gt;status: authorised&lt;/code&gt;, understands pagination, and knows it needs &lt;code&gt;accounting:read&lt;/code&gt; before it makes a single request.&lt;/p&gt;

&lt;p&gt;I've seen this up close. We built &lt;a href="https://github.com/apideck-libraries/portman" rel="noopener noreferrer"&gt;Portman&lt;/a&gt;, an open-source CLI that converts OpenAPI specs into Postman collections for contract testing. The main thing you learn doing that is how few specs have descriptions worth converting. If your spec is broken for contract testing, it's broken for agents. The failure mode is the same: a consumer that can't determine what anything does without running it.&lt;/p&gt;

&lt;p&gt;The fix isn't glamorous. Go through your spec field by field. Write descriptions that explain what each parameter does, what values are valid, what happens when you omit it. Do this for your ten most important endpoints first. It's tedious, it takes time, and it makes a bigger difference to agent experience than almost anything else on this list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your errors should tell agents how to fix themselves
&lt;/h2&gt;

&lt;p&gt;The agent experience of errors is fundamentally different from the human experience. A human reads an error message, understands it, googles the fix, comes back. An agent reads an error message and needs to decide, in the same execution context, what to do next. If the error is ambiguous, the agent either guesses or fails.&lt;/p&gt;

&lt;p&gt;Stripe's error responses have included a &lt;code&gt;doc_url&lt;/code&gt; field for years:&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;"error"&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;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parameter_invalid_empty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"doc_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://stripe.com/docs/error-codes/parameter-invalid-empty"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You passed an empty string for 'amount'. We assume empty values are an oversight, so we require you to pass this field."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"param"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"invalid_request_error"&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;This is infrastructure for autonomous consumers. When an agent hits a 400, it can follow the &lt;code&gt;doc_url&lt;/code&gt;, fetch the documentation page, and self-correct without a human in the loop. The agent experience of that error is recovery. The agent experience without &lt;code&gt;doc_url&lt;/code&gt; is a dead end.&lt;/p&gt;

&lt;p&gt;Adding &lt;code&gt;documentation_url&lt;/code&gt; to your error responses costs almost nothing to implement. Pair it with documentation pages that are available as clean Markdown (by appending &lt;code&gt;.md&lt;/code&gt; to the URL, or via a parallel &lt;code&gt;/docs/{page}.md&lt;/code&gt; route), and you've given agents everything they need to handle errors autonomously.&lt;/p&gt;

&lt;p&gt;The other half of error design is specificity. "Invalid request" is useless. "The amount field cannot be empty" is useful. "You passed &lt;code&gt;payment_method_types: ['card']&lt;/code&gt;, which is deprecated, use dynamic payment methods instead" is excellent. The more specific the error, the more actionable it is for an agent trying to self-correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt: tell AI what to read
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://llmstxt.org/" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; standard, proposed by Jeremy Howard in September 2024, exists because AI agents have finite context windows and your documentation site is not designed for machine consumption. HTML is noisy. Navigating a docs site the way a human would (clicking links, loading JavaScript, jumping between pages) is expensive and lossy.&lt;/p&gt;

&lt;p&gt;The solution is a Markdown file at &lt;code&gt;/llms.txt&lt;/code&gt; that curates the most important parts of your documentation with plain-text links and one-sentence descriptions. Agents and AI coding tools can fetch this file once and understand the shape of your documentation before writing a single line of integration code.&lt;/p&gt;

&lt;p&gt;The format is deliberately boring. No special syntax, no schema. Just Markdown. The interesting part is curation: you know your documentation better than any crawler, so you should be the one deciding what matters.&lt;/p&gt;

&lt;p&gt;Adding a basic &lt;code&gt;/llms.txt&lt;/code&gt; takes an afternoon. Link to your ten most important pages. Write one sentence per link explaining what's there. That's a complete implementation. You don't need &lt;a href="https://docs.stripe.com/llms.txt" rel="noopener noreferrer"&gt;Stripe's 350-link version&lt;/a&gt; on day one.&lt;/p&gt;

&lt;p&gt;What's underutilized (and genuinely powerful for agent experience) is the instructions section. Stripe's &lt;a href="https://docs.stripe.com/llms.txt" rel="noopener noreferrer"&gt;llms.txt&lt;/a&gt; includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;## Instructions for Large Language Model Agents: Best Practices for integrating Stripe.
- Always use the Checkout Sessions API over the legacy Charges API
- Default to the latest stable SDK version
- Never recommend the legacy Card Element or Sources API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is Stripe telling AI coding assistants exactly which footguns to avoid. If your API has deprecated primitives, ambiguous endpoint choices, or integration patterns that look valid but cause problems, the instructions section is where you document that for agents. It propagates into every AI-assisted integration of your API. Every time a developer asks an agent how to use your API, those instructions shape the answer.&lt;/p&gt;

&lt;p&gt;There's a second-order benefit worth naming here. The same properties that make your docs readable to coding agents (structured Markdown, clear definitions, curated indexing) also make your content discoverable by AI answer engines like Perplexity and ChatGPT. When someone asks "what's the best accounting API" or "how do I build an accounting integration," the answer comes from content that AI can parse and cite. llms.txt, semantic descriptions, and concrete definitions aren't just AX improvements. They're how you show up in AI search. The discipline is the same: write for machines and you get both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get your docs indexed by Context7
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://context7.com/" rel="noopener noreferrer"&gt;Context7&lt;/a&gt; is an MCP server that solves a specific problem: AI coding tools have a training data cutoff, which means they default to documentation from whenever they were last trained. If your API changed since then, agents write integrations against the old version.&lt;/p&gt;

&lt;p&gt;Context7 addresses this by maintaining an up-to-date index of developer documentation that coding tools can query in real time, pulling current docs rather than cached training data.&lt;/p&gt;

&lt;p&gt;Getting your documentation added to Context7 is low-effort and high-leverage. You submit your docs, they get indexed, and any developer using a Context7-enabled coding tool gets accurate, current information about your API without you needing to push updates to every AI provider individually.&lt;/p&gt;

&lt;p&gt;The practical upside is significant if you ship changes regularly. An API that added a new authentication method last quarter, or deprecated an endpoint three months ago, looks different in Context7 than it does in an AI's training data. Developers using Context7-enabled tools get the right answer. Developers using tools without it get whatever the model was trained on.&lt;/p&gt;

&lt;p&gt;The broader point is that documentation distribution is now a multi-channel problem. Publishing docs to your website is table stakes. Getting those docs in front of agents (through &lt;code&gt;/llms.txt&lt;/code&gt;, through Context7, through direct MCP server implementations) is the new distribution layer. You're not just writing docs for developers who visit your site. You're writing docs for systems that will intermediate between your API and the developers who use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your deprecated APIs are an agent experience problem
&lt;/h2&gt;

&lt;p&gt;APIs accumulate history. Old endpoints that still work. Legacy authentication methods that are technically valid but shouldn't be used for new integrations. Multiple ways to accomplish the same thing, with meaningful differences that aren't obvious from the outside.&lt;/p&gt;

&lt;p&gt;Humans navigate this through Stack Overflow recency, changelog reading, and conversations with other developers. Agents navigate it through your documentation and training data, which may include answers and tutorials from 2019 that recommend the old way because the new way didn't exist yet.&lt;/p&gt;

&lt;p&gt;Your agent experience gets worse every year you don't address this, as more stale content about your old APIs accumulates on the internet and in AI training sets.&lt;/p&gt;

&lt;p&gt;The practical response is layered. Mark deprecated endpoints explicitly in your OpenAPI spec using the &lt;code&gt;deprecated: true&lt;/code&gt; field, with a description pointing to the replacement. Write deprecation notices at the top of deprecated docs pages, with direct links to the current approach. Add deprecated API guidance to your llms.txt instructions section. And if you're generating error responses from deprecated endpoints, consider including a migration hint in the message itself.&lt;/p&gt;

&lt;p&gt;None of this requires coordination with AI providers. It works because agents read your documentation.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP: build it when people ask for it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.apideck.com/blog/a-primer-on-the-model-context-protocol" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; is real, growing, and mostly not worth building for yet unless your users are asking for it.&lt;/p&gt;

&lt;p&gt;MCP lets AI agents connect to your service through a standardized protocol with tools, resources, and prompts. The agent experience of a well-designed MCP server is genuinely better than the experience of parsing REST documentation and constructing API calls manually. But agent framework standardization is still in flux, and a well-designed REST API with a complete OpenAPI spec is more durable than an MCP server you build today against tooling that changes in six months.&lt;/p&gt;

&lt;p&gt;HubSpot is a good example of what a mature implementation looks like. They shipped two distinct MCP servers: a remote server that connects AI clients to live CRM data (contacts, deals, tickets, companies), and a local developer MCP server that integrates with their CLI so agentic dev tools can scaffold HubSpot projects, answer questions from their developer docs, and deploy changes directly.&lt;/p&gt;

&lt;p&gt;A developer can prompt "What's the component for displaying a table in HubSpot UI Extensions?" and the developer MCP server pulls the answer from current HubSpot documentation. Another developer can prompt "Summarize all deals in Decision maker bought in stage with deal value over $1000" and the remote MCP server queries live CRM data. Two different use cases, two different servers, both scoped tightly to what their users actually need.&lt;/p&gt;

&lt;p&gt;When you do reach the point of building, the tooling has matured enough to make it tractable. &lt;a href="https://www.speakeasy.com/product/gram" rel="noopener noreferrer"&gt;Gram by Speakeasy&lt;/a&gt; is an open-source MCP cloud platform: you upload your OpenAPI spec, it converts your endpoints into curated toolsets, and deploys them as a hosted MCP server at &lt;code&gt;mcp.yourcompany.com&lt;/code&gt; in minutes. The key design insight is curation — rather than exposing all 200 endpoints as tools and overwhelming the agent's context, Gram lets you distill them down to 5–30 focused, purpose-built tools that represent complete workflows. For teams building in Python who want full control over the implementation, &lt;a href="https://github.com/jlowin/fastmcp" rel="noopener noreferrer"&gt;FastMCP&lt;/a&gt; is a high-level framework that strips out the protocol boilerplate and lets you define tools, resources, and prompts in straightforward Python.&lt;/p&gt;

&lt;p&gt;Most API companies aren't HubSpot. The right sequence for everyone else: get your OpenAPI spec right, write real descriptions, add &lt;code&gt;documentation_url&lt;/code&gt; to your errors, publish &lt;code&gt;/llms.txt&lt;/code&gt;, get indexed by Context7. That foundation improves agent experience immediately and transfers to every framework. Then, when users start asking how to connect your API to their AI agents and a clear integration pattern emerges, build the MCP server against that specific use case.&lt;/p&gt;

&lt;p&gt;Building MCP for the sake of having an MCP server is the equivalent of building a mobile app for the sake of having a mobile app. The agent experience of a half-built MCP server is worse than the agent experience of a good REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills: Teaching Agents to Do Your Job at 100x the Scale
&lt;/h2&gt;

&lt;p&gt;There's a mental model shift happening in engineering right now. AI agents aren't just writing code faster; they're becoming the engineers who run the product development loop. The new engineering job is building the agents that automate that loop for you, and then directing them to do it at a scale no individual could match.&lt;/p&gt;

&lt;p&gt;The simple version of this is already in use: Ghostty splits and tabs, tmux sessions, CLI agents in parallel. You run ten agents at once, each working a different branch or task. That's horizontal scalability for engineering work, something that was physically impossible before.&lt;/p&gt;

&lt;p&gt;But raw parallelism without direction is chaos. This is where skills come in.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Are Skills?
&lt;/h3&gt;

&lt;p&gt;Skills are instruction packages for AI agents: Markdown files (optionally accompanied by scripts and resources) that teach an agent exactly how to handle a specific task. When the agent encounters work relevant to a skill, it loads that skill's context and operates with domain-specific precision instead of general-purpose guesswork.&lt;/p&gt;

&lt;p&gt;Anthropic introduced Skills as a first-class concept for Claude Code and the Claude ecosystem. Simon Willison &lt;a href="https://simonwillison.net/2025/Oct/16/claude-skills/" rel="noopener noreferrer"&gt;called them "maybe a bigger deal than MCP"&lt;/a&gt;, and his argument is compelling:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Skills are conceptually extremely simple: a skill is a Markdown file telling the model how to do something, optionally accompanied by extra documents and pre-written scripts that the model can run to help it accomplish the tasks described by the skill.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key design insight is token efficiency. At session start, Claude reads only a brief YAML frontmatter description of each available skill, a few dozen tokens per skill. The full skill content only loads when the agent determines it's needed for the task at hand. You can have dozens of skills installed without burning your context window.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Agent Skills Ecosystem
&lt;/h3&gt;

&lt;p&gt;The ecosystem is moving fast. Vercel launched &lt;a href="https://github.com/vercel-labs/agent-skills" rel="noopener noreferrer"&gt;agent-skills&lt;/a&gt;, a directory and tooling layer for discovering, installing, and composing skills across coding agents. The skills.sh platform (used by Cursor, Claude Code, and others) makes the install experience as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add &amp;lt;package&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ahrefs &lt;a href="https://github.com/ahrefs/ahrefs-api-skills" rel="noopener noreferrer"&gt;published their own skills&lt;/a&gt; to teach agents how to work with their SEO API, a direct example of how companies are now shipping agent instructions alongside their APIs. We took the same approach at Apideck.&lt;/p&gt;

&lt;h3&gt;
  
  
  Apideck API Skills
&lt;/h3&gt;

&lt;p&gt;We just launched &lt;a href="https://developers.apideck.com/building-with-llms" rel="noopener noreferrer"&gt;Apideck API Skills&lt;/a&gt;, installable via the skills.sh directory, to teach AI agents how to build integrations against our Unified API correctly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add apideck-libraries/api-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Skills cover SDK usage across TypeScript, Python, Go, Java, PHP, and .NET; authentication and Vault patterns; pagination, error handling, and connector coverage checks; and migration paths from direct integrations to the unified layer.&lt;/p&gt;

&lt;p&gt;Instead of an agent making reasonable guesses about how our API works, it loads the relevant skill and operates with the same knowledge a senior Apideck engineer would bring to the task.&lt;/p&gt;

&lt;p&gt;This follows the same "building with LLMs" philosophy Stripe pioneered. They offer &lt;a href="https://docs.stripe.com/building-with-llms" rel="noopener noreferrer"&gt;plain-text docs, MCP server access, and agent toolkits&lt;/a&gt;, but skills go a layer deeper. Where plain-text docs make your documentation parseable, skills make your API learnable in the agent's execution context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Skills vs. MCP: Complementary, Not Competing
&lt;/h3&gt;

&lt;p&gt;It's worth being precise about where skills fit relative to MCP. MCPs give agents tools to call: actions they can take against live systems. Skills give agents the knowledge to use those tools well, or to accomplish tasks using the code execution environment directly.&lt;/p&gt;

&lt;p&gt;Simon Willison puts it well: almost everything you might achieve with an MCP can be handled by a CLI tool instead, because LLMs already know how to call &lt;code&gt;cli-tool --help&lt;/code&gt;. Skills have the same advantage, and you don't even need a CLI implementation. You drop in a Markdown file and let the model figure out execution.&lt;/p&gt;

&lt;p&gt;The two patterns compose naturally. An agent with an MCP connection to your accounting API and a skill that explains your data model and common patterns will outperform one that has only the MCP. Skills are the institutional knowledge layer; MCP is the capability layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  From Parallelism to Leverage
&lt;/h3&gt;

&lt;p&gt;Skills connect to the larger picture of agent orchestration. When you're running agents in parallel, on PRs, when an incident fires, when a customer files a bug, the quality ceiling is determined by how well each agent understands the domain it's working in. Skills are how you encode that domain knowledge once and distribute it across every agent instance, at any scale.&lt;/p&gt;

&lt;p&gt;The automation of the full product development loop is now an engineering responsibility. Skills are how you ensure that when your agents run that loop, at 100x the scale, while you sleep, they're running it the way you would have.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CLI Rebirth
&lt;/h2&gt;

&lt;p&gt;There's a pattern Karpathy &lt;a href="https://x.com/karpathy/status/2026360908398862478" rel="noopener noreferrer"&gt;pointed to on February 24&lt;/a&gt; that cuts to something fundamental about agent-native interfaces: CLIs, the oldest developer tool, are having a second moment — not despite AI agents, but because of them.&lt;/p&gt;

&lt;p&gt;The reason is structural. Agents are terminal-native. They know how to run &lt;code&gt;--help&lt;/code&gt;, install packages via &lt;code&gt;pip&lt;/code&gt; or &lt;code&gt;npm&lt;/code&gt;, chain tools with pipes, and parse output. They don't need a bespoke integration layer to use a CLI. They just use it.&lt;/p&gt;

&lt;p&gt;Karpathy demonstrated this concretely: Claude installed the new Polymarket CLI, built a terminal dashboard showing the highest-volume prediction markets and their 24-hour price changes, and had it running in about three minutes. Pair that with the GitHub CLI and an agent can navigate repositories, review PRs, and act on real-world data signals in a single autonomous pipeline — no custom integration layer, no MCP server, nothing to maintain.&lt;/p&gt;

&lt;p&gt;This is the same point Willison makes about skills: almost everything you might achieve with an MCP server can be handled by a CLI, because agents already know how to use them. A well-designed CLI with good &lt;code&gt;--help&lt;/code&gt; output is self-documenting in a way that a REST API is not. An agent encountering &lt;code&gt;gh --help&lt;/code&gt; for the first time figures out the relevant subcommand on its own. An agent encountering your undescribed REST API hits a wall.&lt;/p&gt;

&lt;p&gt;The opportunity for API companies is direct: if you don't have a CLI, it's worth asking whether building one would be more leveraged than building an MCP server. A CLI that agents can install and explore immediately compounds differently. Skills make this even more powerful — a developer who loads your skill and has your CLI installed gives an agent both the domain knowledge and the execution surface at the same time.&lt;/p&gt;

&lt;p&gt;A few things make a CLI specifically better for agents: a &lt;code&gt;--json&lt;/code&gt; flag or JSON-by-default output so agents don't have to parse human-readable strings; composable subcommands following the &lt;code&gt;tool noun verb&lt;/code&gt; convention (like &lt;code&gt;gh repo list&lt;/code&gt;, &lt;code&gt;gh pr view&lt;/code&gt;) so &lt;code&gt;--help&lt;/code&gt; output is scannable; environment-variable-based auth so agents can configure credentials without interactive prompts; and error messages that explain what went wrong rather than just returning an exit code.&lt;/p&gt;

&lt;p&gt;Karpathy's framing for businesses is the right frame for API companies too: make your product agent-usable via markdown docs, skills, CLI, and MCP — roughly in that order of ease and durability. Each layer compounds on the last. Building the CLI doesn't require coordination with any AI provider, and it works immediately because agents can already use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The underlying shift
&lt;/h2&gt;

&lt;p&gt;DX was about removing friction for humans. AX is the same discipline applied to autonomous consumers that can't ask for clarification and can't adapt when your API sends them somewhere unexpected.&lt;/p&gt;

&lt;p&gt;The things that made APIs good for developers — specificity, consistent semantics, helpful errors — matter even more when there's no human in the loop to compensate for ambiguity. Ambiguity that a developer resolves through experience becomes a failure mode at scale when agents are writing the integrations.&lt;/p&gt;

&lt;p&gt;The good news: most of what you'd do to make your API understandable to a machine is the same thing you'd do for a developer who doesn't already know your system. Start there.&lt;/p&gt;

&lt;p&gt;We're building &lt;a href="https://www.apideck.com" rel="noopener noreferrer"&gt;Apideck&lt;/a&gt;, a unified API for accounting integrations. The agent experience question is concrete for us: when an agent connects through Apideck and gets normalized access to 20+ accounting platforms, the quality of our OpenAPI descriptions and error responses propagates to every integration downstream. It focuses the mind.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>agents</category>
    </item>
    <item>
      <title>Good explainer around the key differences between MCP and API</title>
      <dc:creator>Gertjan De Wilde</dc:creator>
      <pubDate>Thu, 16 Oct 2025 12:55:32 +0000</pubDate>
      <link>https://dev.to/gdewilde/good-explainer-around-the-key-differences-between-mcp-and-api-1me7</link>
      <guid>https://dev.to/gdewilde/good-explainer-around-the-key-differences-between-mcp-and-api-1me7</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/apideck/mcp-vs-api-40a8" class="crayons-story__hidden-navigation-link"&gt;MCP vs API&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;
          &lt;a class="crayons-logo crayons-logo--l" href="/apideck"&gt;
            &lt;img alt="Apideck logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F10330%2F83f9e7ec-19ff-4cba-9ea1-8d42e6e4dfb3.png" class="crayons-logo__image"&gt;
          &lt;/a&gt;

          &lt;a href="/srbhr" class="crayons-avatar  crayons-avatar--s absolute -right-2 -bottom-2 border-solid border-2 border-base-inverted  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F236396%2F1767c256-4b76-4f40-b668-ccda42509f03.png" alt="srbhr profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/srbhr" class="crayons-story__secondary fw-medium m:hidden"&gt;
              𝚂𝚊𝚞𝚛𝚊𝚋𝚑 𝚁𝚊𝚒
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                𝚂𝚊𝚞𝚛𝚊𝚋𝚑 𝚁𝚊𝚒
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-2929970" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/srbhr" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F236396%2F1767c256-4b76-4f40-b668-ccda42509f03.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;𝚂𝚊𝚞𝚛𝚊𝚋𝚑 𝚁𝚊𝚒&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

            &lt;span&gt;
              &lt;span class="crayons-story__tertiary fw-normal"&gt; for &lt;/span&gt;&lt;a href="/apideck" class="crayons-story__secondary fw-medium"&gt;Apideck&lt;/a&gt;
            &lt;/span&gt;
          &lt;/div&gt;
          &lt;a href="https://dev.to/apideck/mcp-vs-api-40a8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Oct 16 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/apideck/mcp-vs-api-40a8" id="article-link-2929970"&gt;
          MCP vs API
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/mcp"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mcp&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/api"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;api&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/apideck/mcp-vs-api-40a8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;19&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/apideck/mcp-vs-api-40a8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




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