Documentation

Connect to Keeve over MCP

One HTTPS endpoint, one API key, 12 read-only tools over your own Keeve company data.

1. Get a key

Create a portal account, add a Keeve connection, and issue a key. We verify the credentials and lock the key to the company that user belongs to.

Which credentials? First create your MCP portal account. Then connect Keeve with the email and password you use to sign in to the Keeve dashboard. That login must belong to one company (platform admin accounts can't be used); every key you issue is locked to that company.

Open the portal

2. Endpoint

POST https://<this-site>/api/public/mcp Authorization: Bearer smp_live_... Content-Type: application/json

Transport is MCP Streamable HTTP (JSON-RPC 2.0, request/response — no SSE stream). Protocol version 2025-06-18. Rate limit: 120 requests per minute per key.

3. Client configuration

Claude Desktop / Claude Code

{ "mcpServers": { "keeve": { "type": "http", "url": "https://<this-site>/api/public/mcp", "headers": { "Authorization": "Bearer smp_live_..." } } } }

Cursor (.cursor/mcp.json)

{ "mcpServers": { "keeve": { "url": "https://<this-site>/api/public/mcp", "headers": { "Authorization": "Bearer smp_live_..." } } } }

Raw JSON-RPC (any language)

curl -X POST https://<this-site>/api/public/mcp \ -H "Authorization: Bearer $KEEVE_MCP_KEY" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call", "params":{"name":"list_customers","arguments":{"limit":10}}}'

4. Tool reference

get_company_overview

Company profile, custodial wallet status and transaction count for this Keeve company.

ArgumentTypeNotes
company_idstringOptional. Must match the company this API key is bound to.

list_customers

List Keeve customers (members) in this company. Contact details are masked. Filter by name/email search, account type, or KYC application status.

ArgumentTypeNotes
searchstringCase-insensitive match on first name, last name, company name or email.
account_typestring One of: Personal, Business.
kyc_statusstringRain application status, e.g. 'approved', 'pending', 'denied'.
limitintegerMax rows to return (1-200). Default: 50.
offsetintegerRows to skip, for pagination. Default: 0.

get_customer

Get one customer's profile, KYC/card status, smart-wallet addresses and recent card/payment transactions.

ArgumentTypeNotes
customer_id*stringKeeve member ID.
reveal_contactbooleanReturn full email and phone instead of masked values. Default: false.
recent_transactionsinteger Default: 10.

get_wallets

List the company's custodial (Portal MPC) wallet address and its whitelisted external wallets. Addresses are public; no keys or shares are ever returned.

ArgumentTypeNotes
company_idstringOptional. Must match the company this API key is bound to.

get_wallet_balance

Current balance of the company's custodial Portal wallet on Base (USDC) and Ethereum.

ArgumentTypeNotes
company_idstringOptional. Must match the company this API key is bound to.

get_card_balance

Rain card-issuing balances (credit limit, spend, collateral) for one customer, by rain_id.

ArgumentTypeNotes
rain_id*string

get_transactions

Transaction history for this company (card spend, collateral deposits, payments), newest first. Optionally filter by customer rain_id, type, status or date range.

ArgumentTypeNotes
rain_idstring
typestring One of: spend, collateral, payment.
statusstring
fromstringInclusive start date (YYYY-MM-DD).
tostringInclusive end date (YYYY-MM-DD).
limitintegerMax rows to return (1-200). Default: 50.
offsetintegerRows to skip, for pagination. Default: 0.

get_transaction

One transaction by its transaction_id (Rain, Stripe or on-chain reference).

ArgumentTypeNotes
transaction_id*string

get_payment_status

Status of a payment and where it is in the processing pipeline. payment_type: domestic_bank_payout (US ACH/RTP via Brale), international_bank_payout, manual_transfer, or card_or_wallet_transaction.

ArgumentTypeNotes
payment_type*string One of: domestic_bank_payout, international_bank_payout, manual_transfer, card_or_wallet_transaction.
id*stringPayout row ID, manual transfer ID, or transaction_id.

list_payouts

List bank payouts or manual transfers for this company, newest first, optionally by status.

ArgumentTypeNotes
payout_type*string One of: domestic_bank_payout, international_bank_payout, manual_transfer.
statusstring
limitintegerMax rows to return (1-200). Default: 50.
offsetintegerRows to skip, for pagination. Default: 0.

get_bank_accounts

Beneficiary bank accounts this company has paid out to (domestic and international), de-duplicated, with account numbers masked to the last 4 digits.

get_supported_assets

Stablecoins, blockchains, fiat rails and card issuing supported by Keeve, with USDC contract addresses.

5. What this endpoint will not do

Every tool is read-only. There is no tool to create a payout, approve a transfer, issue a card, change a customer, or read a private key, wallet share, password hash or national ID — those fields are stripped from responses even when the underlying API returns them.

Bank account numbers, IBANs, routing numbers, emails and phone numbers are masked. Setreveal_contact: true onget_customer when you need a full email or phone.

6. Errors

Invalid arguments and unknown tools come back as JSON-RPC errors. Everything else — a record outside your company, an expired Keeve credential, an upstream outage — comes back as a tool result with isError: true and a readable message, so an agent can recover on its own.

HTTP 401 means the key is missing, revoked or unknown. HTTP 429 means you exceeded 120 requests in a minute.