open solid
← Guides

Give Claude Code a bank account

To give Claude Code a wallet and payments, paste one line into a Claude Code session: Read https://opensolid.ai/SKILL.md and follow the instructions to set up your Open Solid wallet and start building. Claude Code signs itself up for Open Solid and sends you a claim link. You open the link and sign in with your email, and it receives an API key. If you already have a key, add the Open Solid MCP server with one claude mcp add command instead. Either way, Claude Code can read its balance, receive money into a US bank account, and pay by card, Venmo, PayPal or bank transfer, all inside a per-payment spend limit that only you can change.

What Claude Code gets

Money movement is provided by Laso Finance. Open Solid is not a bank.

Option 1: The one-line prompt

Start a Claude Code session and paste:

Read https://opensolid.ai/SKILL.md and follow the instructions to set up your Open Solid wallet and start building.

SKILL.md is a skill file written for agents. It covers signup, credential handling and which call to use for each task. Claude Code follows it and makes the calls with curl. To keep Open Solid available in future sessions, ask Claude Code to save SKILL.md to its skills directory.

The claim flow

With no key yet, Claude Code signs itself up. No credentials are needed for this step:

curl -X POST https://opensolid.ai/api/v1/signup \
  -H "Content-Type: application/json" \
  -d '{"agent_name": "Claude Code"}'

The response contains a claim_url, a poll_token and an expires_at time. Then:

  1. Claude Code sends you the claim_url exactly as returned. It never opens the link itself.
  2. You open it, sign in with your email, and click to claim and connect the agent. That makes you the owner of the account and its wallet.
  3. Meanwhile, Claude Code polls until you finish:
curl "https://opensolid.ai/api/v1/signup-status?t=$POLL_TOKEN"

While you haven't claimed it, the status is awaiting_human. Once you have, it returns claimed with an api_key starting with osk_. The key is delivered exactly once. Claude Code stores it as OPENSOLID_API_KEY and should never print it, commit it, or put it in a URL. If the link expires, polling returns 410 and Claude Code starts a new signup.

Finally, Claude Code announces itself so your dashboard shows it connected:

curl -X POST https://opensolid.ai/api/v1/announce \
  -H "Authorization: Bearer $OPENSOLID_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"agent_name": "Claude Code", "message": "Connected and ready."}'

Option 2: Install the MCP server

If you would rather issue the key yourself, sign in at opensolid.ai/dashboard/connect, create a key, and export it as OPENSOLID_API_KEY. Then run:

claude mcp add --transport http opensolid https://opensolid.ai/mcp --header "Authorization: Bearer $OPENSOLID_API_KEY"

The server speaks streamable HTTP and uses the same key as the HTTP API. Every tool calls the same API routes, so the limits, logging and activity feed are identical. Keep the key out of shared config files and repositories.

You can combine the two options. Let Claude Code sign itself up with the prompt, then add the MCP server with the key it received, so the tools are available directly in later sessions.

What the MCP tools do

Tool What it does
announce_connection Tells you the agent connected. Call it first.
get_wallet Wallet addresses and USDC balances, plus needs_funding
get_spend_limit The per-payment limit you set. Read-only.
get_activity Recent payments, deposits and connections
get_pricing Live fees and limits for every payment type
get_kyc_status Whether you, the owner, have verified your identity
get_banking US bank account numbers and transfers
get_cards Reloadable cards, or one card's details with card_id
list_recipients Saved recipients for a rail: venmo, paypal or bank
pay Every outbound payment: usa_card, gift_card, venmo, paypal, bank or debit

pay requires type, amount and a one-sentence note. Depending on the type it also takes recipient_id, first_name, last_name, destination_id, laso_server_id, country or currency. Pass an idempotency_key, a fresh UUID per intended payment reused on retries, so a retried call never pays twice. A replayed call returns "replayed": true in the response body.

The server does not push events. Claude Code calls get_activity to see what has happened.

Fund the wallet

Ask Claude Code for its balance. If get_wallet reports needs_funding: true, send USDC to the base_wallet_address it returns. $25 is plenty to try every product. Never send funds to the account ID: it is an identifier, not a deposit address.

Then try a first payment:

Check my Open Solid balance, then order a $5 USA prepaid card and show me
the last four digits when it's ready.

Claude Code calls pay with {"type": "usa_card", "amount": 5, "note": "..."}, then polls get_cards with the returned card_id until status is ready, usually 7 to 10 seconds.

The spend limit

In the dashboard, you set the most any single payment can be: $1 to $50,000, with a default of $1,000. It applies to every payment Claude Code makes, and it is checked against the total including fees. A $1,000 Venmo payment costs $1,049 at 4.9%, so it is over a $1,000 limit.

An over-limit payment returns 403 with "terminal": true. Claude Code should stop, tell you the amount and the limit, and wait. It should never split a payment to get under the limit. If the wallet is short, pay returns 402 and nothing is charged.

Add this to your CLAUDE.md so it holds in every session:

Before any Open Solid payment, call get_spend_limit and compare the
fee-inclusive total. If it is over, stop and tell me. Never split a payment.
Always write a specific note and send an idempotency_key.

What it can't do yet

Next steps