Skip to main content
Ask your AI assistant about your money and it answers from your real accounts. Balances, recent activity, payments. There is no credential to paste into the chat. You sign in on Payman’s own pages, your bank credential goes on Payman’s own pages, and nothing moves without your approval there.
Building a product for your customers? You want the SDK instead. One app key, your own UI, forUser(id) per customer.

Set it up

Use the hosted Streamable HTTP MCP server:
This is the working endpoint on the current Railway staging deployment. The hostname includes production because of Railway’s service naming; it does not mean a separate production launch. Do not use api.payman.ai or api.paygent.payman.ai for this integration.
Run /mcp inside Claude Code, select payman, and authenticate. If you already added a server called payman with an old URL, remove that entry with claude mcp remove payman before adding it again. This replaces the client’s saved configuration, so authenticate again afterwards.Or put this in your project’s .mcp.json:
See Claude Code’s MCP setup guide for configuration scopes and authentication.
The hosted endpoint requires no npm installation. The local @paymanai/connect-mcp package is not currently available on the public npm registry; use hosted MCP instead of an npx configuration.

If sign-in returns to localhost

A callback such as http://localhost:54507/callback belongs to the MCP client running on your computer. It is not the API address. Start authentication from the MCP client, keep that process running, and complete sign-in in a browser on the same computer. A client running on a remote machine needs its own supported callback or forwarding setup. If the callback cannot connect, restart authentication from the client. Codes are short-lived and single-use; reopening an old callback URL does not restart sign-in. Never paste the callback code into chat or change its host to Railway.

If a harness calls the HTTP API directly

Use https://paygent-cloud-server-production.up.railway.app as the base URL. For an existing SDK installation, set PAYMAN_BASE_URL to that origin and restart the process. Keep your existing app key and grant credentials; changing the URL does not reconnect or delete banks. GET /health returns 200 without credentials. An unauthenticated request to /mcp returns 401 with OAuth discovery information; that is the sign-in challenge, not an outage.

Then ask

what’s my balance?
The first money question opens Payman’s consent page. Sign in, pick what to connect, and the answer arrives in the same turn. You never ask twice.

Your accounts

Tick every account you have already connected. One approval can hand a host your bank, your card platform and your wallet together. An account that still needs setting up is connected on its own, because it has its own credentials or its own trip to the bank, and that does not fit in a list. Add one later from Connected apps in your Payman account, with Add a provider on the host’s row. Nothing changes on the host’s side: the connection it already holds reaches one more account on its next request. Expect a question once a connection reaches more than one account. An instruction that does not say which account it means comes back naming your options, rather than being carried out against a guess. Say which one, and the follow-ups stay there until you say otherwise.

What it can do

These are the default money-task tools. What your accounts can do differs by provider. Structured data uses a separate scope and the read tools below.

Structured records for your own agent

On an environment running the financial-data release with structured reads enabled, request OAuth scope financial_data:read and reauthorize. A read-only grant exposes payman_read_data and payman_read_result, alongside payman_connection_status, and omits money and approval tools. Request interact financial_data:read if both permissions are needed. The financial-data guide shows connection discovery, account selection, typed transaction reads, polling, and native Plaid sync. Hosted MCP input uses deploymentId. Changing the requested scope requires new consent; asking for raw records in chat cannot upgrade an existing grant. The read tools advertise optional intent by default. Include the known intent.purpose, optionally a shared taskId and caller-reported requestedBy label, for record keeping. Omit it or use null when unknown; no extra user question is needed. Job responses return the saved intent, or null, for their 24-hour lifetime. Compatible runtimes also save Studio traces for each provider-page attempt under the read job’s session, using separate execution retention and the agent’s trace storage settings. See recording intent for longer-term storage and retry rules. For clients that cannot select hosted OAuth scopes, build the local stdio package from the matching SDK release:
Point your MCP host at that build:
Replace the paths and API origin for your enabled environment. This defaults to the sandbox app. Set PAYMAN_ENVIRONMENT=live when connecting real institutions. Restart the process and call payman_connect. Local discovery is payman_data_connections and local read input uses connectionId; hosted MCP uses payman_connection_status and deploymentId. The other read operations and result pagination are the same. Node 22.5 or newer is required.

When money moves

It stops, every time.
1

The operation freezes

A one-time code is emailed to you.
2

You get a link

To Payman’s approval page. Open it yourself.
3

You approve there

Then say so in the chat, or ask for the approval status.
Payman then finishes the frozen operation, never a rebuilt one.
No assistant can ask you for that code, and Payman refuses it from anyone but you. An assistant that asks for it is wrong.

Details

A secret shipped to consumers is not a secret. It would be one shared credential for every install.So both ways in authenticate as public clients, using OAuth 2.1 with PKCE, the same mechanism as a mobile banking app. A fresh random verifier is minted per authorization and never leaves the client, so an intercepted code cannot be redeemed.The desktop server ships a published client id. A hosted chat registers its own on first contact. Either way, every connection still passes the consent page you approve.
Nothing is required. These apply to @paymanai/connect-mcp only.Ports 8899 to 8903 are registered, and the server takes the first one free, so several assistants on one machine do not fight. A port outside that set is refused unless you registered it yourself.--app-key switches to your own registered Connect app instead. It cannot be combined with the public client: a client that has a secret must use it.