2026-07-28 and is stateless, so it works with every MCP client that can reach a URL: no session affinity, no SSE requirement. Clients on earlier revisions that still open with initialize are served too. The discovery record lives at https://laso.finance/.well-known/mcp/server-card.json.
The server is published in the official MCP Registry as finance.laso/laso-finance. The finance.laso/ namespace is verified against this domain, so the registry entry and laso.finance point at each other. It is also listed on Smithery as laso/laso-finance.
The tools are generated from the live OpenAPI
spec at runtime, not written by hand.
When the API gains a route or a parameter, the MCP server picks it up
automatically, so the tool set can never drift from the deployed x402
interface.
Connecting
Add the server by its URL. There is no key to paste:laso.finance/oauth/authorize. The human signs in to Laso (or creates an account in the same step) and approves the connection. The client stores the resulting credential and uses it from then on. In Claude Code, run /mcp and choose Authenticate if the tab does not open by itself.
This is standard MCP authorization (OAuth 2.1 with PKCE, dynamic client registration, and client ID metadata documents), so it works in any client that supports it, including Claude Code, Claude, Cursor, Hermes, and Smithery. The approved connection is an ordinary Laso API key labelled with the client’s name: it appears with your other keys on the agent dashboard, where you can revoke it.
Clients without OAuth
A client that cannot run OAuth can send a Laso credential in theAuthorization header instead: a lasoak_ API key (a human issues one at the agent dashboard, see the managed wallet guide) or a current id_token. A request with no credential at all gets a 401 that points at the OAuth metadata, so every tool requires one of the two.
What you get
The server also exposes the agent docs (
SKILL.md, llms.txt, llms-full.txt, openapi.json, auth.md, the docs-version beacon) as MCP resources, fetched live so they are never stale.
How paid tools settle
Tools whose description is markedPAID ROUTE correspond to the x402-paywalled routes (order_card, order_gift_card, order_intl_card, push_to_card, send_payment, send_bank_payment). Over MCP you never build a payment header: the server settles the route’s USDC price from your managed agent wallet, exactly as if you had called agentX402Pay yourself.
Before your first paid call:
get_agent_wallet— check the wallet exists and read its balance (create_agent_walletif it doesn’t).- Fund the wallet’s Solana address with USDC.
- Call the paid tool. The price (face value plus the route’s fee) is settled automatically and the route’s response comes back as the tool result.
Free tools and errors
Free routes (balances, card data, KYC status, webhooks, withdrawals, the gift card catalog) proxy directly with your bearer credential and return the route’s JSON as the tool result. Errors come back as tool errors carrying the route’s real error body, so the failure modes in error handling apply unchanged.Events
The server supports MCP events (protocol revision2026-07-28), so a client can be told when something happens on the account instead of polling. It advertises events in its server/discover capabilities and answers events/list, events/subscribe, and events/unsubscribe.
There is one event, notification.created. It fires for every notification the account owner receives (a deposit landing, a card issued or declined, a refund or withdrawal settling, a balance change) and carries the same title and text they see in the app, by SMS, and by push. Verification codes are the exception: they are never sent as events.
How a subscription behaves:
-
Credential. Subscribing needs an API key connection (OAuth, or a
lasoak_key). A subscription stops when the key that last subscribed it is revoked, so disconnecting the client in the Laso dashboard ends its events. - Limits. At most 10 subscriptions per account, and at most 10 callback verifications per hour.
-
Verification. Before storing it, the server POSTs a signed
{"type": "verification", "challenge": "..."}to your callback. Answer2xxwith the challenge echoed (as{"challenge": "..."}or the bare value). A failure returns JSON-RPC error-32015withdata.reason(challenge_failed,timeout,unreachable,http_error,invalid_url). A URL already verified for your account is not challenged again. -
Lifetime. Subscriptions last 7 days. Call
events/subscribeagain with the same arguments beforerefreshBeforeto extend it; a shorterttlMsis honored, and no-expiry is not granted. Re-subscribing with a newsecretrotates it. -
Delivery. One event per POST, signed per Standard Webhooks with your secret (
webhook-idis theeventId, pluswebhook-timestamp,webhook-signature, andX-MCP-Subscription-Id). Timeouts,429, and5xxare retried with backoff under the sameeventId, so deduplicate on it. Answering410removes the subscription. -
No replay. Notifications are not replayable:
cursoris alwaysnull.
Docs search with no account
Everything above is the product surface: it takes actions, so every tool needs a credential. There is a second, separate MCP server that covers the documentation, and it needs no account and no key:
Connect it the same way, under its own name:
https://laso.finance/mcp to make the call.
The product server also carries a
search_docs tool over the same content, so
a client that already holds a Laso credential does not strictly need both. The
docs server exists for the case that comes first: an agent evaluating Laso
before anyone has signed up.Staying in sync
The MCP surface inherits the docs-freshness machinery:- The tool set refreshes from the deployed
openapi.jsonwithin about ten minutes of a docs deploy. get_versionreturns the currentdocs_version; the beacon athttps://laso.finance/.well-known/docs-version.jsonis authoritative.