<?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: Quinn</title>
    <description>The latest articles on DEV Community by Quinn (@quinn_854b15f517d8632ed4f).</description>
    <link>https://dev.to/quinn_854b15f517d8632ed4f</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4148138%2Faa0ab823-d61a-4ab9-bb2d-d38d4acc1e86.png</url>
      <title>DEV Community: Quinn</title>
      <link>https://dev.to/quinn_854b15f517d8632ed4f</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quinn_854b15f517d8632ed4f"/>
    <language>en</language>
    <item>
      <title>x402 vs AP2 vs ACP: Which Agent Payment Protocol Should You Build On? (2026)</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Tue, 29 Sep 2026 11:42:31 +0000</pubDate>
      <link>https://dev.to/quinn_854b15f517d8632ed4f/x402-vs-ap2-vs-acp-which-agent-payment-protocol-should-you-build-on-2026-fij</link>
      <guid>https://dev.to/quinn_854b15f517d8632ed4f/x402-vs-ap2-vs-acp-which-agent-payment-protocol-should-you-build-on-2026-fij</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I work on distribution for PinkWallet, which is building an agentic payments product (mentioned once near the end, honestly, as one option in early access). Every claim about a protocol below links to that protocol's own docs, spec repo, or announcement, checked today.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; Don't pick one protocol as "the" agent payment standard — pick based on what your agent is actually doing. If it's paying another service per API call or per piece of data, look at &lt;strong&gt;x402&lt;/strong&gt; (or &lt;strong&gt;MPP&lt;/strong&gt;, a newer entrant covering the same layer). If it needs to prove what a human actually authorized before money moves, look at &lt;strong&gt;AP2&lt;/strong&gt;. If it's checking out with a merchant inside a chat interface, look at &lt;strong&gt;ACP&lt;/strong&gt; (or &lt;strong&gt;UCP&lt;/strong&gt; on Google's surfaces). Most real systems end up combining more than one, because they answer different questions: &lt;em&gt;how does the payment settle&lt;/em&gt;, &lt;em&gt;who authorized it&lt;/em&gt;, and &lt;em&gt;how does checkout happen&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is a companion to our longer &lt;a href="https://pinkwallet.com/agentic/learn/x402-vs-ap2-vs-acp/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=protocols-guide" rel="noopener noreferrer"&gt;side-by-side comparison&lt;/a&gt;, written as a decision guide: find your situation below, then follow the link to the actual spec.&lt;/p&gt;

&lt;h2&gt;
  
  
  Find your situation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. My agent pays another service per API call, per dataset, or per piece of content
&lt;/h3&gt;

&lt;p&gt;This is the HTTP-402 layer. Two protocols standardize it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;x402&lt;/strong&gt;: "an open‑source protocol that turns the dormant HTTP &lt;code&gt;402 Payment Required&lt;/code&gt; status code into a fully‑featured, onchain payment layer for APIs, websites, and autonomous agents" (&lt;a href="https://docs.x402.org/faq" rel="noopener noreferrer"&gt;x402 docs&lt;/a&gt;). Settlement is on-chain today — "any ERC-20 token" on Base (mainnet and Sepolia testnet) or "any SPL token or Token-2022 token" on Solana (mainnet and testnet), fee-free (&lt;a href="https://docs.x402.org/faq" rel="noopener noreferrer"&gt;x402 docs&lt;/a&gt;). The spec's own README describes it as "network, token, and currency agnostic" and open to future networks, "both crypto and fiat" (&lt;a href="https://github.com/x402-foundation/x402" rel="noopener noreferrer"&gt;x402-foundation/x402&lt;/a&gt;). You do &lt;strong&gt;not&lt;/strong&gt; need a Coinbase account — it's an open protocol under Apache-2.0 (&lt;a href="https://docs.x402.org/faq" rel="noopener noreferrer"&gt;x402 docs&lt;/a&gt;).

&lt;ul&gt;
&lt;li&gt;First step: &lt;a href="https://docs.x402.org/getting-started/quickstart-for-buyers" rel="noopener noreferrer"&gt;quickstart for buyers&lt;/a&gt; if your agent is the one paying, or &lt;a href="https://docs.x402.org/getting-started/quickstart-for-sellers" rel="noopener noreferrer"&gt;quickstart for sellers&lt;/a&gt; if your API is the one charging. SDKs exist for TypeScript, Python and Go.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MPP (Machine Payments Protocol)&lt;/strong&gt;, announced by Stripe on March 18, 2026 as an open standard "co-authored by Tempo and Stripe" (&lt;a href="https://stripe.com/blog/machine-payments-protocol" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;), describes itself as "the open standard for machine-to-machine payments via HTTP 402" (&lt;a href="https://mpp.dev/" rel="noopener noreferrer"&gt;mpp.dev&lt;/a&gt;) — the same layer as x402, but with more rails out of the box: Stripe says it lets businesses "accept payments directly from agents, in stablecoins as well as fiat with cards and buy now, pay later payment methods via Shared Payment Tokens (SPTs)" (&lt;a href="https://stripe.com/blog/machine-payments-protocol" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;). mpp.dev also lists Bitcoin (Lightning), Solana, XRP Ledger, Stellar, Monad and NEAR among supported rails.

&lt;ul&gt;
&lt;li&gt;First step: &lt;a href="https://mpp.dev/quickstart/" rel="noopener noreferrer"&gt;MPP quickstart&lt;/a&gt; — "Get started with MPP in minutes." SDKs in TypeScript, Python, Rust, Go and Ruby.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pick x402&lt;/strong&gt; if you're already stablecoin-native and want the protocol with the longer track record and Linux Foundation governance. &lt;strong&gt;Pick MPP&lt;/strong&gt; if you need card or fiat fallback in the same integration without bolting on a second protocol.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. My agent shops for a person, inside a chat interface
&lt;/h3&gt;

&lt;p&gt;This is checkout, not raw payment settlement.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ACP (Agentic Commerce Protocol)&lt;/strong&gt; is "a new open standard codeveloped by Stripe and OpenAI that enables programmatic commerce flows between buyers, AI agents, and businesses" (&lt;a href="https://stripe.com/blog/developing-an-open-standard-for-agentic-commerce" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;). The buyer approves in the chat; the business stays "merchant of record, retaining control over which products can be sold, how they're presented, how transactions are processed, and how orders are fulfilled" (same source). ACP "can connect with any commerce backend and payments infrastructure" — it's not Stripe-exclusive.

&lt;ul&gt;
&lt;li&gt;First step: the spec lives at &lt;a href="https://agenticcommerce.dev" rel="noopener noreferrer"&gt;agenticcommerce.dev&lt;/a&gt; and on &lt;a href="https://github.com/agentic-commerce-protocol/agentic-commerce-protocol" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; (OpenAPI + JSON Schema under &lt;code&gt;spec/&lt;/code&gt;). For the agent side, see &lt;a href="https://developers.openai.com/commerce/" rel="noopener noreferrer"&gt;OpenAI's commerce docs&lt;/a&gt;; for the payment side, &lt;a href="https://docs.stripe.com/agentic-commerce" rel="noopener noreferrer"&gt;Stripe's agentic commerce docs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;If you're building specifically for &lt;strong&gt;Google's AI surfaces&lt;/strong&gt; (AI Mode, Gemini), the equivalent is &lt;strong&gt;UCP&lt;/strong&gt; — see situation 3.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Underneath either, you may still want &lt;strong&gt;AP2&lt;/strong&gt; for the authorization record — see situation 4.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. I'm a merchant and I want AI agents to be able to buy from me
&lt;/h3&gt;

&lt;p&gt;Two paths, depending on where your customers' agents run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ACP&lt;/strong&gt;, as above — get listed as purchasable inside ChatGPT (or another ACP-compatible agent surface) via Stripe. First step: &lt;a href="https://docs.stripe.com/agentic-commerce" rel="noopener noreferrer"&gt;docs.stripe.com/agentic-commerce&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UCP (Universal Commerce Protocol)&lt;/strong&gt;, announced January 11, 2026, is "an open-source standard designed to power the next generation of agentic commerce," developed by Google "in collaboration with industry leaders including Shopify, Etsy, Wayfair, Target, and Walmart" (&lt;a href="https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/" rel="noopener noreferrer"&gt;Google Developers Blog&lt;/a&gt;). It's "compatible with Agent Payments Protocol (AP2)" (same source) — so a UCP integration can carry AP2 mandates for authorization. As a merchant you need an active Merchant Center account and to follow "the Google integration guide to setup your Merchant Center account and complete a merchant interest form" (same source).

&lt;ul&gt;
&lt;li&gt;First step: &lt;a href="https://developers.google.com/merchant/ucp" rel="noopener noreferrer"&gt;Google's merchant integration guide&lt;/a&gt;; spec and Python samples at &lt;a href="https://github.com/universal-commerce-protocol/ucp" rel="noopener noreferrer"&gt;github.com/universal-commerce-protocol/ucp&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you sell through both ChatGPT and Google's AI surfaces, expect to implement both — they're not interchangeable, even though both sit at the "merchant checkout" layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. I need a signed record of exactly what the user authorized, for enterprise audit or compliance
&lt;/h3&gt;

&lt;p&gt;This is what &lt;strong&gt;AP2&lt;/strong&gt; is for, and none of the others do it.&lt;/p&gt;

&lt;p&gt;AP2 uses "Mandates — tamper-proof, cryptographically-signed digital contracts that serve as verifiable proof of a user's instructions," signed by verifiable credentials (&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt;). Concretely: an initial instruction ("find me new white running shoes") is captured in an &lt;strong&gt;Intent Mandate&lt;/strong&gt;, which "provides the auditable context for the entire interaction." When the agent presents a cart and the user approves it, that approval signs a &lt;strong&gt;Cart Mandate&lt;/strong&gt;, which "creates a secure, unchangeable record of the exact items and price" (same source). That's your audit trail — not a general ledger, but a signed record of what was asked for and what was approved, independent of which rail actually moves the money.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First step: &lt;a href="https://github.com/google-agentic-commerce/AP2" rel="noopener noreferrer"&gt;github.com/google-agentic-commerce/AP2&lt;/a&gt; (Apache-2.0). Install with &lt;code&gt;uv pip install git+https://github.com/google-agentic-commerce/AP2.git@main&lt;/code&gt;, or clone the repo and run a sample scenario directly, e.g. &lt;code&gt;bash code/samples/python/scenarios/a2a/human-present/cards/run.sh&lt;/code&gt;. Reference implementations exist in Python, Go and Android.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AP2 itself doesn't move money — it hands off to a rail. Google's own extension wires it to x402 for stablecoin payments (see "How they combine," below), and it also covers cards and real-time bank transfers.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. My agent has to pay with cards or fiat, not crypto
&lt;/h3&gt;

&lt;p&gt;x402's published SDKs settle on-chain only today — every current package is chain-specific (EVM, Solana, Aptos, Stellar, and others). Its own README says the protocol "aims to support all networks (both crypto &amp;amp; fiat)" (&lt;a href="https://github.com/x402-foundation/x402" rel="noopener noreferrer"&gt;x402-foundation/x402&lt;/a&gt;), but that's a stated direction, not a shipped fiat rail. Three options if you need cards or fiat now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AP2&lt;/strong&gt;: rail-agnostic by design — "it also supports different payment types – from credit and debit cards to stablecoins and real-time bank transfers" and "establishes a payment-agnostic framework for users, merchants, and payments providers to transact with confidence across all types of payment methods" (&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt;). Use this if you also need the mandate/audit trail from situation 4.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ACP&lt;/strong&gt;: card rails through existing processors, merchant stays merchant of record (situation 2/3).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MPP&lt;/strong&gt;: explicitly supports "fiat with cards and buy now, pay later payment methods" alongside stablecoins in a single integration (&lt;a href="https://stripe.com/blog/machine-payments-protocol" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;) — closest thing to "x402's HTTP-402 model, but with a card option built in."&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Side-by-side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;x402&lt;/th&gt;
&lt;th&gt;AP2&lt;/th&gt;
&lt;th&gt;ACP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backed by&lt;/td&gt;
&lt;td&gt;x402 Foundation under the Linux Foundation; originally built by Coinbase&lt;/td&gt;
&lt;td&gt;Google; donated to the FIDO Alliance&lt;/td&gt;
&lt;td&gt;OpenAI and Stripe&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What it standardizes&lt;/td&gt;
&lt;td&gt;Requesting and settling a payment for an HTTP resource (HTTP 402)&lt;/td&gt;
&lt;td&gt;Cryptographically-signed proof of what the user authorized (Intent + Cart Mandates)&lt;/td&gt;
&lt;td&gt;Agent-to-merchant checkout inside a chat/agent surface&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rails&lt;/td&gt;
&lt;td&gt;On-chain: any ERC-20 token on EVM chains, any SPL/Token-2022 token on Solana; spec describes itself as network/token/currency agnostic&lt;/td&gt;
&lt;td&gt;"Credit and debit cards to stablecoins and real-time bank transfers" — rail-agnostic&lt;/td&gt;
&lt;td&gt;Card rails via existing payment processors; "any compatible payment provider"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status per own docs (checked 2026-09-29)&lt;/td&gt;
&lt;td&gt;Operational under Linux Foundation governance since July 14, 2026 — "40 organizations have joined as members," including Premier members Adyen, AWS, American Express, Circle, Coinbase, Google, Mastercard, Shopify, Stripe and Visa among others (&lt;a href="https://www.linuxfoundation.org/press/linux-foundation-announces-operational-launch-of-x402-foundation-to-standardize-internet-native-payments-for-ai-agents-and-applications" rel="noopener noreferrer"&gt;Linux Foundation&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;Donated to FIDO Alliance April 28, 2026, to "remain platform-agnostic and community-led" (&lt;a href="https://blog.google/products-and-platforms/platforms/google-pay/agent-payments-protocol-fido-alliance/" rel="noopener noreferrer"&gt;Google&lt;/a&gt;)&lt;/td&gt;
&lt;td&gt;"Open source, Apache 2.0 licensed, and community-designed" (&lt;a href="https://stripe.com/blog/developing-an-open-standard-for-agentic-commerce" rel="noopener noreferrer"&gt;Stripe&lt;/a&gt;); repo badge marks it "currently in &lt;code&gt;beta&lt;/code&gt;" (&lt;a href="https://github.com/agentic-commerce-protocol/agentic-commerce-protocol" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;td&gt;Apache-2.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec / code&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/x402-foundation/x402" rel="noopener noreferrer"&gt;github.com/x402-foundation/x402&lt;/a&gt;, &lt;a href="https://docs.x402.org/faq" rel="noopener noreferrer"&gt;docs.x402.org&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/google-agentic-commerce/AP2" rel="noopener noreferrer"&gt;github.com/google-agentic-commerce/AP2&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://agenticcommerce.dev" rel="noopener noreferrer"&gt;agenticcommerce.dev&lt;/a&gt;, &lt;a href="https://github.com/agentic-commerce-protocol/agentic-commerce-protocol" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Note: the original &lt;code&gt;coinbase/x402&lt;/code&gt; GitHub repo is now a fork; the maintained repo has moved to &lt;code&gt;x402-foundation/x402&lt;/code&gt; under the new foundation's governance, confirmed by checking the repo directly today.&lt;/p&gt;

&lt;h2&gt;
  
  
  How they combine
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AP2 + x402.&lt;/strong&gt; Google built the A2A x402 extension "in collaboration with Coinbase, Ethereum Foundation, MetaMask and other leading organizations," extending AP2's core constructs to x402 for stablecoin settlement — "a production-ready solution for agent-based crypto payments" (&lt;a href="https://cloud.google.com/blog/products/ai-machine-learning/announcing-agents-to-payments-ap2-protocol" rel="noopener noreferrer"&gt;Google Cloud&lt;/a&gt;), at &lt;a href="https://github.com/google-a2a/a2a-x402" rel="noopener noreferrer"&gt;github.com/google-a2a/a2a-x402&lt;/a&gt;. AP2 answers "was this authorized"; x402 moves the money.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UCP + AP2.&lt;/strong&gt; Google states UCP is "compatible with Agent Payments Protocol (AP2)" for the authorization layer (&lt;a href="https://developers.googleblog.com/under-the-hood-universal-commerce-protocol-ucp/" rel="noopener noreferrer"&gt;Google Developers Blog&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One provider, multiple protocols.&lt;/strong&gt; Stripe ships integrations for both ACP and MPP, and is a Premier member of the x402 Foundation — a payments provider isn't limited to backing one of these.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What none of them solve for you: spending limits
&lt;/h2&gt;

&lt;p&gt;x402 settles a payment. AP2 proves a human authorized a purchase. ACP and UCP run a checkout. None of the three gives you a &lt;em&gt;budget&lt;/em&gt; at the protocol level. Nothing in these specs by itself stops an agent from making 500 individually-valid x402 payments in an hour, or from having an AP2 Intent Mandate that's scoped too broadly, or from checking out via ACP for more than your finance team is comfortable with. Per-agent spending caps, merchant allowlists, and approval thresholds are a layer you (or your wallet/platform provider) still have to build on top. MPP's docs say this directly: "By building spending controls on top of MPP, agents can pay in the background while staying within the budget, time window, and tools you intended" — and point to rail-level tools such as Tempo access keys, which set token spending limits and recipient restrictions (&lt;a href="https://mpp.dev/guides/managing-agent-spend" rel="noopener noreferrer"&gt;mpp.dev&lt;/a&gt;). See our deeper writeup on &lt;a href="https://pinkwallet.com/agentic/learn/ai-agent-spending-controls/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=protocols-guide" rel="noopener noreferrer"&gt;AI agent spending controls&lt;/a&gt; if you haven't built that layer yet.&lt;/p&gt;

&lt;p&gt;Pink Agentic AI Payment (early access, from PinkWallet) is being built to enforce per-agent spending caps at the MCP layer, before a payment executes. It's in early access (waitlist), not something you can sign up for and use today.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Can I use more than one of these protocols in the same system?&lt;/strong&gt;&lt;br&gt;
Yes, and the interop section above describes real examples of it — AP2 for authorization plus x402 for settlement is the combination Google explicitly built and documented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need blockchain experience to integrate x402?&lt;/strong&gt;&lt;br&gt;
You need a wallet that can sign a payment and, on the server side, a facilitator to verify and settle it — x402's own FAQ states you don't need any Coinbase-specific product to use the protocol, since it's open under Apache-2.0.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is MCP one of these payment protocols?&lt;/strong&gt;&lt;br&gt;
No. The Model Context Protocol is how an agent discovers and calls tools — including a payment tool — not a payment protocol itself. It sits one layer up from all three protocols covered here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which protocol should I default to if I'm not sure yet?&lt;/strong&gt;&lt;br&gt;
Match it to what your code actually does this week, using the five situations above, rather than betting on which protocol "wins" — multiple of these are governed by different organizations (Linux Foundation, FIDO Alliance, OpenAI/Stripe) and are still evolving quickly enough that a wrong bet is cheap to unwind if you keep the payment logic behind your own interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pinkwallet.com/agentic/learn/x402-vs-ap2-vs-acp/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=protocols-guide" rel="noopener noreferrer"&gt;x402 vs AP2 vs ACP: the full comparison, with adoption data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pinkwallet.com/agentic/learn/agentic-commerce-protocol/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=protocols-guide" rel="noopener noreferrer"&gt;What is the Agentic Commerce Protocol (ACP)?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://pinkwallet.com/agentic/research/agentic-payments-readiness-report-2026/?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=protocols-guide" rel="noopener noreferrer"&gt;Agentic Payments Readiness Report 2026&lt;/a&gt; — which of 13 payment providers self-describe support for each protocol, in their own docs&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>payments</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How to Give an AI Agent a Spending Limit (and Actually Enforce It Before It Pays)</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Mon, 28 Sep 2026 23:08:36 +0000</pubDate>
      <link>https://dev.to/quinn_854b15f517d8632ed4f/how-to-give-an-ai-agent-a-spending-limit-and-actually-enforce-it-before-it-pays-17nh</link>
      <guid>https://dev.to/quinn_854b15f517d8632ed4f/how-to-give-an-ai-agent-a-spending-limit-and-actually-enforce-it-before-it-pays-17nh</guid>
      <description>&lt;p&gt;&lt;em&gt;Disclosure: I work on distribution for PinkWallet, which is building an agentic payments product (mentioned once near the end, honestly, as one option in early access). Every third-party claim below links to that vendor's own docs, checked on the date noted.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; A spending limit only counts if it's enforced somewhere the agent can't talk its way around — which in practice means a policy check that runs in code, outside the model's context, before a payment tool call is allowed to execute. Telling the agent its budget in the system prompt is not a spending limit; it's a suggestion the model can forget, get talked out of, or have overridden by a prompt injection. Below: where a limit can actually live, the specific controls you need, a runnable policy-check wrapper you can paste and run, and how today's payment providers handle (or don't handle) this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where a limit can actually be enforced
&lt;/h2&gt;

&lt;p&gt;There are five places a "don't spend more than X" rule can live. Only some of them are enforcement; the rest are advice.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;What it can enforce&lt;/th&gt;
&lt;th&gt;Bypassable by the model?&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;The system prompt&lt;/td&gt;
&lt;td&gt;Nothing, technically — it's a request&lt;/td&gt;
&lt;td&gt;Yes, trivially (bad instruction-following, prompt injection, or the model just being wrong)&lt;/td&gt;
&lt;td&gt;"You may spend up to $50" in a system message&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent framework / tool wrapper&lt;/td&gt;
&lt;td&gt;A code-level check before the tool function runs&lt;/td&gt;
&lt;td&gt;No, &lt;em&gt;if&lt;/em&gt; the agent has no other path to the underlying payment call&lt;/td&gt;
&lt;td&gt;A custom &lt;code&gt;pay()&lt;/code&gt; wrapper like the one below; LangChain/LlamaIndex tool middleware you write yourself&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server / tool layer&lt;/td&gt;
&lt;td&gt;Whatever the server's own tool implementation checks before calling the payment API&lt;/td&gt;
&lt;td&gt;No, if the server is the only credentialed path — yes, if the agent also has direct API access&lt;/td&gt;
&lt;td&gt;Stripe's MCP server requires human confirmation before certain &lt;code&gt;stripe_api_write&lt;/code&gt; actions such as refunds and outbound payments (&lt;a href="https://docs.stripe.com/mcp.md" rel="noopener noreferrer"&gt;Stripe MCP docs&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payment provider&lt;/td&gt;
&lt;td&gt;Caps, allowlists, or scopes tied to the credential itself, independent of any code you write&lt;/td&gt;
&lt;td&gt;No — this is the hard floor even if your own code has a bug&lt;/td&gt;
&lt;td&gt;Circle Agent Wallets expose per-transaction/daily/weekly/monthly spending limits and address allow/blocklists (&lt;a href="https://github.com/circlefin/skills" rel="noopener noreferrer"&gt;Circle, GitHub&lt;/a&gt;); Coinbase's Agentic Wallet documents configurable per-session and per-transaction caps (&lt;a href="https://docs.cdp.coinbase.com/agentic-wallet/cli/welcome" rel="noopener noreferrer"&gt;Coinbase docs&lt;/a&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Card network / bank rail&lt;/td&gt;
&lt;td&gt;Whatever the issuing bank or network allows on that specific card or account&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;A virtual card with a hard limit set by the issuer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical rule: &lt;strong&gt;the system prompt is not a control, it's documentation.&lt;/strong&gt; Real enforcement starts at the tool-wrapper layer and gets stronger the closer it sits to the actual money movement. The MCP landscape is uneven here — most payment-capable MCP servers we checked ship write tools (refunds, payouts, order creation) that execute immediately once a credential is configured, with the spend limit left entirely to whatever scope you put on that credential, not to a purpose-built budget feature inside the MCP server itself. Stripe and Airwallex were the two exceptions we found with a built-in confirmation gate: Airwallex's agent tools "do not initiate money-out actions (transfers, FX conversions, or payouts)" by default and prompt for confirmation on write actions (&lt;a href="https://www.airwallex.com/docs/developer-tools/ai/agentos" rel="noopener noreferrer"&gt;Airwallex AgentOS docs&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That's why you generally want at least two of these layers active at once: a code-level check you control (fast to change, but only as strong as your code), plus a provider- or network-level cap (slower to change, but holds even if your code has a bug).&lt;/p&gt;

&lt;h2&gt;
  
  
  The policy primitives
&lt;/h2&gt;

&lt;p&gt;These are the individual controls a real policy is made of. Mix and match based on what the agent actually needs to do — a research agent buying API credits and a procurement agent paying SaaS invoices don't need the same numbers.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Per-transaction cap&lt;/strong&gt; — the hard ceiling on any single payment. Set it to the price of the largest legitimate item the agent buys, not a round number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rolling budget&lt;/strong&gt; — a daily/weekly/monthly total, separate from the per-transaction cap, so an agent can't stay under the per-transaction limit while still spending unbounded amounts over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merchant/endpoint allowlist&lt;/strong&gt; — constrains &lt;em&gt;who&lt;/em&gt; gets paid, not just how much. A cap alone doesn't stop the right amount going to the wrong party.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category blocks&lt;/strong&gt; — a second-layer blocklist for things that should never be payable regardless of amount (payroll, gift cards, crypto exchanges), because an allowlist alone can't anticipate every bad actor you'd want to exclude by category.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Human-approval thresholds&lt;/strong&gt; — not a hard block: it routes the transaction to a human for a yes/no before it executes. Lower than the per-transaction cap, so mid-size or novel purchases still get a look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Velocity limits&lt;/strong&gt; — caps the &lt;em&gt;rate&lt;/em&gt; of spending (transactions per hour/day), independent of size. A per-transaction cap doesn't stop 200 small, individually-legitimate-looking payments in an hour.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kill switch&lt;/strong&gt; — an immediate way to stop an agent from transacting at all, separate from normal credential rotation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit log&lt;/strong&gt; — a record, per transaction, of which agent acted, under what policy, for how much, to whom, and with what approval — the thing you need after something goes wrong.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Velocity limits and dedicated kill-switch workflows are the two controls we found least documented among payment providers as of this writing — most leave both to you to build at the policy layer. (Full source list in the &lt;a href="https://pinkwallet.com/agentic/learn/ai-agent-spending-policy-template/" rel="noopener noreferrer"&gt;spending policy template&lt;/a&gt;.)&lt;/p&gt;

&lt;h2&gt;
  
  
  A runnable example
&lt;/h2&gt;

&lt;p&gt;This is a minimal, provider-agnostic policy check in plain Node.js — no SDK, no network calls. The pattern is what matters: the agent's "pay" tool is never the raw payment call, it's a wrapper that checks policy first and only calls the real function if the check passes.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;policy.js&lt;/code&gt; — the check itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deny&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;non-positive amount&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="c1"&gt;// A retried request with the same key must not be treated as a new charge.&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;alreadyProcessed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;idempotencyKey&lt;/span&gt;&lt;span class="p"&gt;))&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deny&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;duplicate idempotency key — already processed today&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merchant&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;merchant&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toLowerCase&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;merchantAllowlist&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;merchant&lt;/span&gt;&lt;span class="p"&gt;))&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deny&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`merchant "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;merchant&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;" is not on the allowlist`&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTransactionCapUsd&lt;/span&gt;&lt;span class="p"&gt;)&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deny&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`amount $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; exceeds per-transaction cap $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTransactionCapUsd&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="p"&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;projectedTotal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spentTodayUsd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;projectedTotal&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dailyCapUsd&lt;/span&gt;&lt;span class="p"&gt;)&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deny&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`would bring today's total to $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;projectedTotal&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, over daily cap $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;dailyCapUsd&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="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;approvalThresholdUsd&lt;/span&gt;&lt;span class="p"&gt;)&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;require_approval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`amount $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is &amp;gt;= approval threshold $&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;approvalThresholdUsd&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="p"&gt;};&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;decision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;allow&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;within cap, allowlisted, below approval threshold&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;&lt;code&gt;pay-tool.js&lt;/code&gt; — the wrapper the agent actually calls. Note there's no code path from the agent to &lt;code&gt;executePaymentUnsafe&lt;/code&gt; that skips &lt;code&gt;checkPolicy&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;pay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;onApprovalNeeded&lt;/span&gt;&lt;span class="p"&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;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;checkPolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;deny&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="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;denied&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;decision&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;require_approval&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;onApprovalNeeded&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&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;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;pending_approval&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt; &lt;span class="p"&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;executed&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;executePaymentUnsafe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;ledger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;record&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agentId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;idempotencyKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amountUsd&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;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;allowed&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reason&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;executed&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;Running eight scenarios against one agent (per-transaction cap $50, daily cap $90, allowlist of three vendors, approval threshold $40) against this wrapper, on Node v22.21.0:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Normal purchase, allowlisted, under threshold: allowed — within cap, allowlisted, below approval threshold
2. Same amount again but new key (should still be allowed, under daily cap): allowed — within cap, allowlisted, below approval threshold
3. Retry with the SAME idempotency key as #1 (simulates a network-retry double-charge attempt): denied — duplicate idempotency key — already processed today
4. Amount above per-transaction cap: denied — amount $75 exceeds per-transaction cap $50
  -&amp;gt; [approval channel] would notify a human about: $45 to aws.amazon.com
5. Amount at/above approval threshold but under per-transaction cap: pending_approval — amount $45 is &amp;gt;= approval threshold $40
6. Merchant not on the allowlist (simulates a prompt-injected redirect): denied — merchant "totally-not-a-scam.example" is not on the allowlist
7. Another normal purchase (brings today's total to $75 of the $90 daily cap): allowed — within cap, allowlisted, below approval threshold
8. Legitimate small purchase that would push the daily total over the cap: denied — would bring today's total to $105, over daily cap $90

Total spent today for research-agent-01: $75
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the real output from running &lt;code&gt;node demo.js&lt;/code&gt; locally. The full source (&lt;code&gt;policy.js&lt;/code&gt;, &lt;code&gt;pay-tool.js&lt;/code&gt;, &lt;code&gt;demo.js&lt;/code&gt;) and a README are in &lt;a href="https://github.com/Pink-Agentic-Payments/agent-spending-limit-example" rel="noopener noreferrer"&gt;agent-spending-limit-example&lt;/a&gt; (MIT). The &lt;code&gt;SpendLedger&lt;/code&gt; here is an in-memory &lt;code&gt;Map&lt;/code&gt;, which is fine for a demo and &lt;em&gt;not&lt;/em&gt; fine for production — see the race-condition note below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common failure modes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection → spend.&lt;/strong&gt; A tool result, a scraped webpage, or a document the agent reads can contain text instructing it to make a purchase. The system prompt telling the agent "only buy from the allowlist" doesn't stop this — the allowlist check has to live in code the injected text can't reach, which is exactly why the wrapper pattern above puts the check outside the model's context entirely.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retries → double charges.&lt;/strong&gt; Network timeouts and agent retry loops are common; if your "did this succeed?" check happens after a timeout, the agent (or your own retry logic) may call &lt;code&gt;pay&lt;/code&gt; again for the same intent. An idempotency key checked &lt;em&gt;before&lt;/em&gt; execution (scenario 3 above) is the fix — first-class API-level idempotency keys are a common feature (see &lt;a href="https://docs.stripe.com/api/idempotent_requests" rel="noopener noreferrer"&gt;Stripe's idempotent requests&lt;/a&gt;), but you need your policy layer to honor them too, not just the payment API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Currency confusion.&lt;/strong&gt; A cap defined as "50" without a currency is a bug waiting to happen the first time an agent operates against a non-USD price or a stablecoin quoted in a different denomination. Every cap and log entry needs an explicit currency field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Budget race conditions.&lt;/strong&gt; If two payment requests for the same agent are checked concurrently, both can read the same "spent so far" total, both pass the daily-cap check, and both execute — busting the cap. The in-memory &lt;code&gt;Map&lt;/code&gt; in the demo above is illustrative only; a real ledger needs an atomic increment-and-check (a database transaction, a single-writer queue, or a provider that enforces the cap itself as a second line of defense).&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What today's providers actually let you enforce
&lt;/h2&gt;

&lt;p&gt;Verified against each vendor's own docs (checked 2026-09-27/28; not re-verified since):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Circle Agent Wallets&lt;/strong&gt; document per-transaction/daily/weekly/monthly spending limits and address allow/blocklists, and gate limit changes behind an OTP the agent never sees directly ("the agent hands the user a verbatim command to run in their own terminal so the OTP never passes through agent storage") — &lt;a href="https://github.com/circlefin/skills" rel="noopener noreferrer"&gt;github.com/circlefin/skills&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coinbase's Agentic Wallet&lt;/strong&gt; documents configurable caps per session and per transaction — &lt;a href="https://docs.cdp.coinbase.com/agentic-wallet/cli/welcome" rel="noopener noreferrer"&gt;Coinbase docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe's MCP server&lt;/strong&gt; requires human confirmation before certain write actions like refunds and outbound payments, via a link that expires after 24 hours if unconfirmed; starting October 31, 2026, it also stops accepting full-access secret keys or restricted keys without an Agent tag (&lt;a href="https://docs.stripe.com/mcp.md" rel="noopener noreferrer"&gt;Stripe MCP docs&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crossmint&lt;/strong&gt; describes agent credentials as "scoped, explicit, and revocable," using one-time or encrypted credentials rather than a raw card number — &lt;a href="https://docs.crossmint.com/agents/overview" rel="noopener noreferrer"&gt;Crossmint docs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skyfire&lt;/strong&gt; lets you set spending limits per agent at the wallet/dashboard level — &lt;a href="https://skyfire.xyz/product/" rel="noopener noreferrer"&gt;Skyfire product page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;x402&lt;/strong&gt; (the pay-per-request HTTP protocol) settles one payment per request and doesn't itself carry a budget concept — any per-agent cap has to be enforced by whatever signs the payment on the agent's behalf, one layer above the protocol (&lt;a href="https://docs.x402.org/faq" rel="noopener noreferrer"&gt;x402 FAQ&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most traditional processors we checked&lt;/strong&gt; — Adyen, PayPal, Square, Checkout.com, Razorpay — inherit spend control from the merchant's existing API-key or dashboard-role permissions, which were designed for human developers, not for bounding one autonomous agent's spend. None of the pages we checked for those five described a per-agent budget feature.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where this leaves you: provider-level caps (Circle, Coinbase) are the hard floor that holds even if your own code breaks, but they're not universal across vendors yet, and velocity limits and dedicated kill switches are thin on the ground industry-wide. That's the gap a code-level policy wrapper like the one above is for.&lt;/p&gt;

&lt;p&gt;PinkWallet is building &lt;strong&gt;Pink Agentic AI Payment&lt;/strong&gt;, an MCP server plus a console for defining exactly this kind of rule — per-agent caps, allowlists, and approval thresholds enforced at the MCP layer before a payment executes. It's &lt;a href="https://pinkwallet.com/agentic/?utm_source=devto&amp;amp;utm_campaign=spending-limits#early-access" rel="noopener noreferrer"&gt;in early access&lt;/a&gt; — not live yet, no claims otherwise — alongside the other options named above.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is putting the limit in the system prompt good enough for a low-stakes agent?&lt;/strong&gt;&lt;br&gt;
No, for the same reason input validation belongs in code, not in a comment telling users to behave. Even a "low-stakes" agent can be redirected by a prompt injection it reads from a tool result; a system-prompt limit has no mechanism to stop that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do I need both a provider-level cap and my own policy code?&lt;/strong&gt;&lt;br&gt;
Where you can get both, yes. The provider-level cap (Circle's or Coinbase's, for example) is the floor that holds even if your policy code has a bug; your own policy layer is what lets you apply consistent rules — allowlists, approval routing, velocity limits — across multiple providers and agents, which no single provider's cap will do for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the difference between a cap and an approval threshold?&lt;/strong&gt;&lt;br&gt;
A cap is a hard limit the agent cannot exceed. A threshold is lower and doesn't block anything — it routes the transaction to a human for a decision before it executes. Most real policies need both, at different amounts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can velocity limits be enforced by the payment provider instead of my own code?&lt;/strong&gt;&lt;br&gt;
Not reliably today — velocity limits were the least-documented control among the payment providers checked for this article. Plan to implement rate limiting for agent spend at your own policy/orchestration layer rather than assuming a provider handles it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does an MCP server automatically give me spending controls?&lt;/strong&gt;&lt;br&gt;
No. Most payment-capable MCP servers we checked ship write tools that execute immediately once a credential is configured; the spend limit comes from how narrowly you scope that credential and whether you've added your own policy check in front of the tool call, not from the MCP protocol itself.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>payments</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Payment MCP Servers Compared (2026): Which Providers Let AI Agents Move Money</title>
      <dc:creator>Quinn</dc:creator>
      <pubDate>Mon, 28 Sep 2026 22:32:25 +0000</pubDate>
      <link>https://dev.to/quinn_854b15f517d8632ed4f/payment-mcp-servers-compared-2026-which-providers-let-ai-agents-move-money-1ahc</link>
      <guid>https://dev.to/quinn_854b15f517d8632ed4f/payment-mcp-servers-compared-2026-which-providers-let-ai-agents-move-money-1ahc</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Disclosure: I'm the founder of PinkWallet, which is building Pink Agentic AI Payment — an MCP server plus a policy engine for AI agent payments — so I'm not a neutral party in this space. Every claim below is tied to a verbatim quote from each vendor's own docs or official GitHub org (sources linked inline); the full dataset is open under CC BY 4.0 if you want to check or dispute a row.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Of 16 major payment companies checked, 13 publish an official MCP server or agent SDK on their own domain or GitHub org that can be opened and read directly; two others (Visa, Mastercard) publish documentation-style MCP servers plus separate agent-commerce programs (Trusted Agent Protocol, Agent Pay) that are not themselves money-moving MCP servers. The dominant pattern among the 13: most ship money-moving tools (refunds, payouts, orders, payment links) live by default, with control inherited from ordinary API-key or OAuth scopes rather than a purpose-built per-agent spending limit. At the MCP-server layer itself, only two vendors in this set, Stripe and Airwallex, document an explicit agent-specific control (a human-confirmation gate and a default-deny-on-money-out design, respectively). Per-agent budgets do exist elsewhere, mainly in crypto-native agent wallets (Circle, Coinbase, Skyfire), but they sit outside the MCP server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison table
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;Official MCP?&lt;/th&gt;
&lt;th&gt;Hosted/local&lt;/th&gt;
&lt;th&gt;Auth&lt;/th&gt;
&lt;th&gt;Can move money by default&lt;/th&gt;
&lt;th&gt;Built-in spending controls&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Stripe&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Both (hosted + local config)&lt;/td&gt;
&lt;td&gt;OAuth or Agent API key&lt;/td&gt;
&lt;td&gt;Yes, via &lt;code&gt;stripe_api_write&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Human-confirmation gate on sensitive writes; agent-tagged keys required from Oct 31, 2026&lt;/td&gt;
&lt;td&gt;GA (some sub-tools Preview)&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.stripe.com/mcp" rel="noopener noreferrer"&gt;docs.stripe.com/mcp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PayPal&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;Access token (sandbox/production)&lt;/td&gt;
&lt;td&gt;Yes (&lt;code&gt;create_order&lt;/code&gt;, &lt;code&gt;create_refund&lt;/code&gt; live)&lt;/td&gt;
&lt;td&gt;None found in official docs opened&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://paypal.gitbook.com/agent-toolkit-and-mcp-server" rel="noopener noreferrer"&gt;PayPal GitBook&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adyen&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Local only&lt;/td&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;Yes (example prompt: execute a refund)&lt;/td&gt;
&lt;td&gt;None found&lt;/td&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.adyen.com/development-resources/mcp-server" rel="noopener noreferrer"&gt;docs.adyen.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Square (Block)&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Both&lt;/td&gt;
&lt;td&gt;OAuth (remote) / access token (local)&lt;/td&gt;
&lt;td&gt;Not explicitly named as a default tool in the page opened&lt;/td&gt;
&lt;td&gt;Client allowlist (which apps may connect — not a spend control)&lt;/td&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developer.squareup.com/docs/mcp" rel="noopener noreferrer"&gt;developer.squareup.com/docs/mcp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coinbase (CDP)&lt;/td&gt;
&lt;td&gt;Not a documented hosted MCP; CLI/SDK (Agentic Wallet, AgentKit, x402)&lt;/td&gt;
&lt;td&gt;CLI/SDK&lt;/td&gt;
&lt;td&gt;CDP API keys&lt;/td&gt;
&lt;td&gt;Yes (USDC wallet)&lt;/td&gt;
&lt;td&gt;Per-session/per-transaction caps; OFAC sanctions screening&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.cdp.coinbase.com/agentic-wallet/cli/welcome" rel="noopener noreferrer"&gt;docs.cdp.coinbase.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Circle&lt;/td&gt;
&lt;td&gt;MCP is docs/codegen only; money controls live in separate Agent Wallets&lt;/td&gt;
&lt;td&gt;MCP: remote; Agent Wallets: CLI/SDK&lt;/td&gt;
&lt;td&gt;Not fully specified&lt;/td&gt;
&lt;td&gt;Agent Wallets: yes, within policy&lt;/td&gt;
&lt;td&gt;Time-bound spending limits; wallet/contract allow-blocklists; sanctions screening&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://developers.circle.com/agent-stack" rel="noopener noreferrer"&gt;developers.circle.com/agent-stack&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Skyfire&lt;/td&gt;
&lt;td&gt;Token protocol in front of sellers' own MCP/API, not one hosted MCP&lt;/td&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;Signed JWT (&lt;code&gt;kya&lt;/code&gt;/&lt;code&gt;pay&lt;/code&gt;/&lt;code&gt;kya-pay&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Yes, via pay/kya-pay tokens&lt;/td&gt;
&lt;td&gt;User-funded wallet; no explicit per-transaction cap language found&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.skyfire.xyz/docs/developer-documentation" rel="noopener noreferrer"&gt;docs.skyfire.xyz&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Payman&lt;/td&gt;
&lt;td&gt;Partially — official GitHub org has a narrower Genie MCP bridge; primary docs site inaccessible&lt;/td&gt;
&lt;td&gt;Genie: remote server + local stdio bridge&lt;/td&gt;
&lt;td&gt;OAuth 2.0 + PKCE&lt;/td&gt;
&lt;td&gt;Not verified (README describes &lt;code&gt;ask_genie&lt;/code&gt; and account-management tools, not itemized payment tools)&lt;/td&gt;
&lt;td&gt;None found in the official &lt;code&gt;genie-mcp-stdio&lt;/code&gt; README&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/PaymanAI/genie-mcp-stdio" rel="noopener noreferrer"&gt;github.com/PaymanAI/genie-mcp-stdio&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crossmint&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Remote&lt;/td&gt;
&lt;td&gt;API key&lt;/td&gt;
&lt;td&gt;Yes, real purchases once &lt;code&gt;ENV=prod&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;None found in README/docs&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.crossmint.com/agents/overview" rel="noopener noreferrer"&gt;docs.crossmint.com/agents/overview&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Airwallex&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Remote (+ CLI)&lt;/td&gt;
&lt;td&gt;OAuth&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;No, not by default&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Explicit default-deny on money-out, write-tool confirmation prompts, OAuth scoping&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.airwallex.com/docs/developer-tools/ai/agentos" rel="noopener noreferrer"&gt;airwallex.com/docs .../agentos&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visa&lt;/td&gt;
&lt;td&gt;Documentation MCP server only (VIC/VDP integration guides + tool definitions, &lt;a href="https://github.com/visa/mcp" rel="noopener noreferrer"&gt;github.com/visa/mcp&lt;/a&gt;); Trusted Agent Protocol is a separate merchant-side signature/trust standard&lt;/td&gt;
&lt;td&gt;Remote (docs MCP)&lt;/td&gt;
&lt;td&gt;JWE token (docs MCP)&lt;/td&gt;
&lt;td&gt;Not confirmed for the MCP; TAP itself does not move money&lt;/td&gt;
&lt;td&gt;Not applicable (identity/trust, not spend limits)&lt;/td&gt;
&lt;td&gt;TAP announced Oct 14, 2025&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://github.com/visa/mcp" rel="noopener noreferrer"&gt;github.com/visa/mcp&lt;/a&gt;, &lt;a href="https://usa.visa.com/about-visa/newsroom/press-releases.releaseId.21716.html" rel="noopener noreferrer"&gt;Visa newsroom&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mastercard&lt;/td&gt;
&lt;td&gt;Public MCP is a docs-search assistant; Agent Pay (the money-moving program) is separate and not itself an MCP server&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;Not applicable to the MCP&lt;/td&gt;
&lt;td&gt;Agent Pay requires explicit consumer authorization; no default automatic movement&lt;/td&gt;
&lt;td&gt;Registration/verification of agents, tokenization, consumer purchase controls, dispute resolution; no numeric limit published&lt;/td&gt;
&lt;td&gt;Announced Apr 29, 2025&lt;/td&gt;
&lt;td&gt;&lt;a href="https://newsroom.mastercard.com/news/press/2025/april/mastercard-unveils-agent-pay-pioneering-agentic-payments-technology-to-power-commerce-in-the-age-of-ai" rel="noopener noreferrer"&gt;Mastercard Newsroom&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout.com&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Remote/hosted&lt;/td&gt;
&lt;td&gt;Dashboard account credentials&lt;/td&gt;
&lt;td&gt;Yes for payment-adjacent actions (voids, payment links)&lt;/td&gt;
&lt;td&gt;Permissions tied to the Dashboard user's existing role&lt;/td&gt;
&lt;td&gt;"Production-ready"&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.checkout.com/docs/developer-resources/checkout-com-mcp-server" rel="noopener noreferrer"&gt;checkout.com/docs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mollie&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Remote (proxy for public API)&lt;/td&gt;
&lt;td&gt;OAuth 2.0 via browser redirect&lt;/td&gt;
&lt;td&gt;Likely, given Payments/Settlements/Mandates tool coverage; no tool explicitly labeled as default-on&lt;/td&gt;
&lt;td&gt;None found on the official docs page&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://docs.mollie.com/docs/mollie-mcp-server" rel="noopener noreferrer"&gt;docs.mollie.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Razorpay&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Both (hosted recommended; self-hosted via Docker)&lt;/td&gt;
&lt;td&gt;API key (OAuth also mentioned)&lt;/td&gt;
&lt;td&gt;Yes by default&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;READ_ONLY&lt;/code&gt; flag; 3 write tools disabled on the hosted/remote server specifically&lt;/td&gt;
&lt;td&gt;Not labeled&lt;/td&gt;
&lt;td&gt;&lt;a href="https://razorpay.com/docs/developer-tools/mcp-server/" rel="noopener noreferrer"&gt;razorpay.com/docs&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plaid&lt;/td&gt;
&lt;td&gt;Yes, but not a payment-execution tool&lt;/td&gt;
&lt;td&gt;Both (Dashboard MCP remote; coding-toolkit MCP local)&lt;/td&gt;
&lt;td&gt;OAuth 2.0, &lt;code&gt;client_credentials&lt;/code&gt; grant&lt;/td&gt;
&lt;td&gt;No — Plaid doesn't move money&lt;/td&gt;
&lt;td&gt;Not applicable (diagnostics/dev-tooling only)&lt;/td&gt;
&lt;td&gt;Active development, limited support&lt;/td&gt;
&lt;td&gt;&lt;a href="https://plaid.com/docs/resources/mcp/" rel="noopener noreferrer"&gt;plaid.com/docs/resources/mcp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What we found
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Money-out-by-default is the norm, not the exception.&lt;/strong&gt; Adyen, PayPal, Razorpay, and Crossmint all ship refund/order/payment-link write tools that execute immediately once an API key or access token is configured, with no purpose-built spend cap, allowlist, or approval step documented in the pages we opened. Stripe and Airwallex are the two exceptions, and both use a confirmation-based mechanism rather than a numeric limit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"Allowlist" means different things to different vendors.&lt;/strong&gt; Square's allowlist governs which MCP &lt;em&gt;client applications&lt;/em&gt; may connect to its remote server — it does not limit what a connected agent can spend. Circle's and Coinbase's allow/blocklists instead govern &lt;em&gt;wallet or contract addresses&lt;/em&gt; an agent can pay. We found no vendor combining a client allowlist with a spend-target allowlist in the same product.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Per-agent budgets are concentrated in the crypto-native and "banking for agents" corner of the market&lt;/strong&gt;, not among traditional card/payments processors. Circle (time-bound spending limits), Coinbase (per-session/per-transaction caps), and Skyfire (per-agent funded wallet) all describe agent-specific budget constructs. Among the traditional processors we verified (Adyen, PayPal, Square, Checkout.com, Razorpay, Mollie), none described a per-agent spend cap; control is inherited from the merchant's existing API-key or Dashboard-role permission system, which was built for human developers rather than for bounding an autonomous agent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Airwallex is the only vendor in this set with money-out disabled by default at the MCP layer&lt;/strong&gt;, paired with an explicit written warning about the operational risk of adding a write-capable agent to a shared/multi-user channel. That default-deny-plus-warning combination was not found stated as explicitly by any other vendor checked.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Several "MCP servers" in this space are not payment-execution tools at all.&lt;/strong&gt; Mastercard's public MCP and half of Circle's MCP offering are documentation/codegen assistants; Plaid's two MCPs are diagnostics and developer tooling; Visa's public MCP is a documentation server for its Intelligent Commerce and Developer Platform APIs, and its Trusted Agent Protocol is a merchant-side trust/signature standard, not an MCP or a money-mover. Anyone counting "payment MCP servers" should filter these out, or the count of servers that can actually move money will be overstated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;A dated compliance change is coming to the most widely used server in this set.&lt;/strong&gt; Stripe's own documentation states: "Beginning October 31, 2026, Stripe MCP no longer accepts full-access secret keys or restricted API keys without the Agent tag" (&lt;a href="https://docs.stripe.com/mcp" rel="noopener noreferrer"&gt;docs.stripe.com/mcp&lt;/a&gt;, read 2026-09-28). Any integration still using a plain restricted key will need an Agent-tagged key before that date.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;We could not verify Payman's spending-control features on a first-party documentation page.&lt;/strong&gt; Its documentation site, docs.paymanai.com, returned an HTTP 526 error on every attempt across two research sessions, so its row is marked "not verified" rather than "absent". The official GitHub org (github.com/PaymanAI) does host a narrower product — a "Genie" MCP bridge — whose README describes a single natural-language tool (&lt;code&gt;ask_genie&lt;/code&gt;) plus account-management tools, with no spending-limit language present. Descriptions of per-transaction caps and recipient allowlists appear in third-party MCP directories; we will update this row once Payman's documentation is reachable or Payman sends a correction.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to choose a payment MCP server: a safeguards checklist
&lt;/h2&gt;

&lt;p&gt;None of this is an endorsement of one vendor over another — it's a checklist for reading any vendor's own docs before wiring an agent to a payment MCP server.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Use scoped keys, not full-access ones.&lt;/strong&gt; Several vendors (Stripe, Coinbase, Circle) explicitly support restricted or agent-tagged credentials distinct from a full-access account key. Use the narrowest scope that the tool needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Turn on human confirmation for write actions if the vendor offers it.&lt;/strong&gt; Stripe's confirmation-URL gate and Airwallex's "require manual approval for tool calls" are both documented, vendor-native ways to add a checkpoint before money moves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check whether money-out is on or off by default.&lt;/strong&gt; Airwallex is the one vendor in this set that ships with money-out disabled until explicitly enabled; every other vendor we could verify ships write tools live once credentials are configured.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't rely on a "client allowlist" as a spending control.&lt;/strong&gt; As found above, a client allowlist (Square) restricts which apps can connect — it says nothing about how much a connected agent can spend. Look specifically for a transaction cap, time-bound limit, or wallet/contract allowlist (Circle, Coinbase) if that's the control you need.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Avoid adding a write-capable payment agent to a shared or multi-user channel.&lt;/strong&gt; Airwallex's own documentation warns that "anyone who can prompt the agent may perform Airwallex actions with your privileges" — a risk that applies to any MCP server with live write tools, not just Airwallex's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Don't mix an untrusted MCP server into the same session as a payment MCP server.&lt;/strong&gt; Prompt injection from an unrelated tool's output (a webpage, a document, another MCP server's response) can attempt to trigger a payment tool call; keeping payment tools isolated to a single, trusted MCP session reduces that surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set a budget limit outside the MCP layer if the vendor doesn't offer one inside it.&lt;/strong&gt; For the majority of vendors here, no purpose-built per-agent budget exists in the MCP tool itself — treat the underlying account's own spend limits, alerts, or approval workflows as the actual backstop.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Methodology
&lt;/h2&gt;

&lt;p&gt;We checked 16 companies against one criterion: does the company publish, on its own domain or official GitHub org, an MCP server or agent toolkit that can touch payments? For each, we opened the vendor's own documentation, developer site, or official GitHub repository directly and recorded the exact tool names, authentication method, and any spending-control language found — with verbatim quotes kept in the accompanying dataset. We did not rely on search-engine summaries or third-party MCP directory listings for any claim that appears in the comparison table above; where a claim comes only from a WebSearch summary or a third-party source, the table says so explicitly (Payman's caps/whitelist claim; Mastercard's separate public-MCP characterization) rather than presenting it as confirmed.&lt;/p&gt;

&lt;p&gt;All pages were accessed 2026-09-27, with five previously unverified rows (Payman, Visa, Mastercard, Mollie, Plaid) independently re-fetched and confirmed on official pages on 2026-09-28. Full verbatim quotes, URLs, and per-row notes are in the accompanying dataset (&lt;code&gt;payment-mcp-landscape-v2.csv&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;This is a snapshot, not a permanent ranking — MCP servers and agent-payment products in this space are changing quickly (Stripe's own key-format change on Oct 31, 2026 is one example already scheduled). If you work at one of these companies and a row is wrong or out of date, or you know a first-party page that resolves one of the open items (Payman's primary docs site, Circle's MCP tool-level names), corrections are welcome — cite the specific official page and we will re-verify and update.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;How many payment companies have an official MCP server that can move money?&lt;/strong&gt;&lt;br&gt;
Of the 16 companies checked, 12 have a verifiable, first-party MCP server or agent SDK that can move money, which we could open and read directly on the vendor's own domain or GitHub org (Stripe, PayPal, Adyen, Square, Coinbase, Circle's Agent Wallets, Skyfire, Crossmint, Airwallex, Checkout.com, Mollie, and Razorpay). Two more (Visa's Trusted Agent Protocol, Mastercard's Agent Pay) are adjacent agent-commerce programs rather than MCP servers themselves. Plaid's official MCPs and Circle's docs/codegen MCP do not move money. Payman's specific spending-control claims remain unverified on a Payman-owned page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which payment MCP servers have spending controls built for AI agents specifically?&lt;/strong&gt;&lt;br&gt;
Circle's Agent Wallets (time-bound spending limits, wallet/contract allow-blocklists, sanctions screening) and Coinbase's Agentic Wallet (per-session/per-transaction caps, OFAC screening) are the clearest examples of purpose-built, per-agent budget features found in official documentation. Stripe (human-confirmation gate) and Airwallex (money-out disabled by default) take a different approach: a checkpoint or default-deny design rather than a numeric limit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Stripe's MCP server let an agent spend money without approval?&lt;/strong&gt;&lt;br&gt;
By default, &lt;code&gt;stripe_api_write&lt;/code&gt; covers refunds and outbound payments, but Stripe's own documentation states that sensitive write actions require human confirmation via a URL, and that an unapproved action "expires" after 24 hours. Separately, from October 31, 2026, Stripe MCP will stop accepting full-access or non-Agent-tagged restricted API keys (docs.stripe.com/mcp, read 2026-09-28).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is Visa's Trusted Agent Protocol or Mastercard's Agent Pay an MCP server?&lt;/strong&gt;&lt;br&gt;
No. Visa's Trusted Agent Protocol (announced October 14, 2025) is a cryptographic message-signing standard that lets merchants verify an AI agent's identity at checkout; it does not itself execute payments (Visa separately publishes a documentation MCP server at github.com/visa/mcp). Mastercard's Agent Pay (announced April 29, 2025) is a tokenization-based payments program requiring explicit consumer authorization; Mastercard's separately published public MCP is a documentation-search assistant, not the thing that moves money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why doesn't this article confirm Payman's spending-control claims?&lt;/strong&gt;&lt;br&gt;
Payman's primary documentation site, docs.paymanai.com, returned an HTTP 526 server error on every attempt across two research sessions (2026-09-27 and 2026-09-28), so we could not read the page ourselves. The specific "per-transaction/daily caps and recipient whitelist" claim circulating about Payman appears in third-party MCP directories and in Payman's own marketing copy, not on a Payman-owned documentation page we could open. Payman's official GitHub org does host a different, narrower product (a "Genie" MCP bridge) whose README contains no spending-control language.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corrections
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;2026-09-28:&lt;/strong&gt; The Visa row originally said "Not an MCP." Visa does publish an official documentation MCP server (github.com/visa/mcp: "AI tools, examples, and integrations for the Visa Developer Platform"), so the row, summary and FAQ now say so. Whether any Visa MCP tool moves money is not confirmed.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>payments</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
