get_organization_info), skip setup, make one read-only call to confirm, and go to the journey you need.
The credential decides the tools
Infinite runs one MCP server. Sign-in clients usehttps://bot.api.infinite.dev/mcp (Streamable HTTP, no key, production, acts as the signed-in user). API-key clients use https://bot.api.infinite.dev/mcp/sse (SSE). What you can do depends on how the session connects:
Sandbox keys contain
sandbox; production keys contain live. Start in sandbox. Never use a production key unless the user explicitly asks for production.
BYO org vs Infinite Connect (platform)
Platform Connect MCP requires
bind_session_customer before customer-scoped tools. Operator sessions for net-new onboarding should show org_connect in get_organization_info — not org_infinite. End users must not join org_connect in Auth Kit or configure the shared platform org API key: those credentials are org-wide on /v1, while MCP binding only scopes bot tools. Customers already on org_infinite remain unchanged.
Organization-key tools
Agent-key tools
Core rules (always apply)
- Start read-only when the request is unspecified. When the user says “try it”, verify the connection, then read (
get_agent,get_balance,list_payees, orlist_accounts). Do not move money until the user gives the details and confirms. - Confirm before money moves. Call
create_transferwithoutconfirm, show the user the returned summary (amount, currency, payee, rail), and callsubmit_transferonly after an explicit yes. Passconfirm: trueonly when the user already approved that exact payment. - MCP amounts are exact decimal strings in the agent’s limit currency:
"40.00", not40,4000,"$40", or"40.0001". If the user’s amount can’t be represented exactly, ask; never round for them. The REST API uses integer minor units ("4000"= $40.00); never mix the two. - One
operationIdper payment, reused on every retry. Generate a UUID v4 once for a business event (for example, invoice SD-1042), keep it, and pass the same value if you retry. A new value creates a second payment. - A denial is an answer, not an error to route around.
submit_transferreturns{ denial: { code, window, limit, used, remaining, attemptedAmount, currency } }— amounts are decimal strings like every other agent tool — with a hint. A per-transfer denial (window: "perTransaction") has noused/remaining;limitis the most one payment can be. Explain it to the user. Do not retry with a different payee, split the payment, or switch keys to get past a limit. Whensubmit_transferis denied for a limit, the draft staysDRAFT, moves no money, and doesn’t count toward limits; leave it and create a new draft if the user picks a smaller amount. A deniedcreate_transferwithconfirm: truesaves nothing. Onagent_paused/agent_revoked, stop. - Do not claim Infinite is connected until a read-only call succeeds (
get_organization_info). A config entry is not proof. - Business verification is a human step. Send the
start_verificationlink to the user; never collect identity documents or tax IDs in chat when a hosted link is available. In production, review takes hours to days. - Prefer MCP tools. When no tool covers a step, use the REST API with the same key and check
get_endpoint_schemafirst instead of guessing request shapes. - Do not log full account numbers, keys, or tax IDs.
Talking to the user
- Say what you are doing in plain terms: “I’ll check your balance and budget, then draft the payment for you to approve.”
- Before anything moves, show the exact amount, payee, and rail, and ask.
- If something isn’t available (a rail, a currency, a capability the customer doesn’t have yet), say so and offer the supported path. Don’t overstate what the account can do.
Denial codes
Setup
Get a key from the user first: an organization key to onboard and administer, an agent key to pay. Keys are issued in the console (https://console.infinite.dev) or with POST /v1/agents/{id}/keys for agent keys. Keep keys out of chat history and committed files where you can; prefer an environment variable.
The key goes in the Authorization header as Bearer <key>. Use the host’s native header support when it has one; otherwise bridge with mcp-remote and pass the key with --header (setting only an environment variable does not send it).
To operate as an agent alongside the organization, add a second server named
infinite-agent with the agent key, and use only that server for payments. A signed-in session is the user, not an agent, and it uses production. Sandbox stays on an API key.
If the tools don’t show up
- Reload or restart the host so it picks up the new server (Claude Code: start a new session and run
/mcp; Cursor: refresh MCP tools in Settings). - Call
get_organization_info. Only a successful call proves the tools are usable. 401 Unauthorizedmeans the header didn’t arrive or the key is wrong or revoked; check the header, not the URL.- After a reload, never re-run a payment automatically. Confirm with the user first.
Journeys
Onboard a business
Use a BYO org key when the business already has an Infinite organization. For net-new Connect, work with Infinite operators on a trusted host — do not use end-user Auth Kit membership inorg_connect or the shared platform org API key in personal MCP config.
create_business_customerwith the legal name, email, and country, and a new UUID v4operationId. Keep the returnedcontinuationToken.request_capabilitiesfor what they need (for exampleUSD_BALANCE,USD_ACH_PAYOUT) before verification — a customer can only be updated while it’sDRAFTorNEED_ACTIONS.- For API KYB (host already has facts/files):
search_industry_codesthenupdate_business_detailsto save business fields without submitting; upload docs and finish withsubmit_customer_verification. Preferstart_verificationwhen a human can complete hosted KYB. - Poll
get_customeruntilACTIVE, thenget_capabilitiesuntil the ones you need areREADY. ensure_balance_account, thenget_deposit_instructionsso the user can fund it.
customerId on each customer tool; no binding is needed. On a platform session (get_organization_info doesn’t say byo), the session must be bound to one customer: if the connection drops mid-onboarding, call bind_session_customer with the customer ID and the saved continuationToken before any other customer tool.
In sandbox, skip the human steps: sandbox_approve_customer with the capabilities you need replaces both request_capabilities and verification (related capabilities may turn READY too), and sandbox_fund_account replaces the bank transfer.
Add a payee draft (organization key, platform sessions)
To add a payee an agent will pay, usecreate_payee when it’s offered. create_payee_draft is for platform sessions, where create_payee isn’t available. Confirm the details with the user, then create_payee_draft with a new UUID v4 operationId. It returns a draftId (eba_…), starts IN_REVIEW, and runs existing account screening. Poll get_payee_draft for status. This does not enable payout — transfer approve/execute are separate steps. On BYO (non-platform) org keys, create_payee still creates a payee that becomes payable once ACTIVE for the agent-allowlist path.
Create a transfer draft (organization key, platform sessions)
After the user confirms amount, currency, payee, and rail, callcreate_transfer_draft with a new UUID v4 operationId. Optionally call get_quote first for an indicative rate. It returns a draftId (tdraft_…) and stores amount/rail/payee/customer/actor metadata for audit. It registers the draft for platform approval and does not call POST /v1/transfers or move money — Infinite human approve/reject and execute are separate steps. Poll with get_transfer_draft.
Create an agent (organization key)
No MCP tool yet — use REST with the organization key. Limits are minor units (cents for USD) as strings;perTransaction is required, and perDay / perMonth can be omitted for no cap. allowedDestinationAccountIds restricts who the agent may pay (up to 50); omit it to allow any of the customer’s approved payees.
GET /v1/agents before retrying so you don’t create a second one. Then issue its key with POST /v1/agents/{id}/keys and body {"name": "…"}. The secret is returned once — hand it to the user or the runtime and don’t repeat it in chat. See Agents.
Pay an invoice (agent key)
get_agent,get_balance, andlist_payeesto confirm budget, funds, and the payee.create_transferwith the payee’sdestinationAccountId, the exact decimalamount, apaymentReason(usuallyPAYMENT_FOR_GOODS_AND_SERVICES), a UUID v4operationIdyou keep for this invoice, and the invoice number asreference. The reference is always kept on the transfer (referenceinget_transfer) and sent to the payee on ACH, wire, SWIFT, and RTP (not on other rails); ACH allows only 10 letters/digits, soINV-77goes out asINV77. The summary tells you exactly what the payee sees.- Show the returned summary and wait for approval.
submit_transfer. On success report the status (PENDING, thenCOMPLETED); on a denial, explain it using the table above.wait_for_transferto follow it to a final status (it returnstimedOut: trueif still in flight — call it again; never resubmit). Operators receivetransfer.*webhooks, each carrying theagentId.
sandbox_complete_transfer. Sandbox caps a single transfer at $500.
Check budget, balance, or status (agent key)
get_agent for limits and remaining spend, get_balance for funds, get_transfer / list_transfers for payments.
Related
- Agents: the model, limits, and webhooks
- MCP: server details and per-host configuration
- API reference and the OpenAPI spec