Giving an AI Agent Your Payments API Is an Authorization Problem, Not an Integration Problem A fintech-focused writeup argues that exposing payment endpoints to AI agents via MCP is a quick integration task, but the real work is authorization: agents are non-deterministic, driven by untrusted input, and act for humans who never saw the specific payment, breaking the API-key-plus-role model. The recommended fix is a layer between the agent tool surface and the payment core that issues per-delegation short-lived OAuth 2.1 tokens with scoped permissions (using RFC 9396 Rich Authorization Requests for fields like maximum amount and permitted payees) and enforces policy server-side on every write, outside the model, to satisfy PSD2 strong customer authentication and DORA traceability requirements. Exposing payment endpoints through MCP takes a week. Deciding what an agent is allowed to do with them takes the real engineering. Created: 2026-11-12 | Status: Draft, pending partner review | Vertical: Fintech / B2B payments CMO intel 2026-11-12 A fintech with a clean REST API can wrap it in an MCP server in a few days. The tool list looks right, the demo works, and a customer's agent pays an invoice on the first try. Then the security review asks one question: when the agent calls create payment , whose authority is it using, and what stops it from paying the wrong supplier twice? Most teams discover they have no answer. Their API was built for a human behind a session or a backend service with an API key. Neither model describes software that acts on behalf of a user, makes its own decisions about what to call, and retries when it gets confused. A typical B2B payments API authenticates a company with a long-lived key and authorizes by role. Admin can create payments, read-only cannot. That works when the caller is a deterministic ERP integration that does the same thing every night. An agent breaks three assumptions at once. It is non-deterministic, so the same invoice may produce different call sequences on different days. It is driven by untrusted input, because the invoice PDF it reads may contain text that tries to steer it. And it acts for a human who never saw the specific payment, so the audit trail "key X called endpoint Y" is useless to a compliance officer asking who approved this. In the EU the regulatory context makes this concrete. PSD2's strong customer authentication rules require that the authentication code be dynamically linked to the amount and the payee Commission Delegated Regulation 2018/389, Article 5 . DORA has applied to financial entities since January 2025 and puts ICT third-party risk and incident traceability on the regulated firm, which includes the vendors it wires into its payment flow. "The agent decided" will not survive either regime. The pattern is consistent across fintech and payments-adjacent SaaS. The first version maps every endpoint to a tool, reuses the customer's existing API key, and relies on the model to behave. It passes demos. It fails in review, or worse, in the first week of production use, because there is no place in the system where "this payment needs a human" can be expressed. The fix is rarely a rewrite. It is a new layer between the agent-facing tool surface and the payment core, and it touches identity, policy, and the audit log. That is three areas, usually owned by three different people, which is why it stalls. The identity work sits with platform. The policy work sits with whoever owns risk. The audit work sits with whoever answers to the regulator. Nobody owns the seam, and the backend team that would build it is already committed to the roadmap. We recommend four pieces, built in this order. First, issue a separate credential per delegation, not per customer. Do not hand the agent the customer's API key. Issue a short-lived token that records the human principal, the agent identity, and a scope. MCP's HTTP transport already defines an OAuth 2.1 based authorization flow, so use it rather than inventing a header. For scoped, structured permissions, OAuth Rich Authorization Requests RFC 9396 let you carry fields such as maximum amount and permitted payees inside the token itself. Second, evaluate policy server-side on every write, outside the model. The MCP server must not trust the agent to respect limits it was told in a prompt. Put the check in code the model cannot reach: type Delegation = { principalId: string; agentId: string; maxAmountMinor: number; // per payment, in cents dailyCapMinor: number; allowedPayeeIds: Set