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 portal2. Endpoint
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
Cursor (.cursor/mcp.json)
Raw JSON-RPC (any language)
4. Tool reference
get_company_overview
Company profile, custodial wallet status and transaction count for this Keeve company.
| Argument | Type | Notes |
|---|---|---|
| company_id | string | Optional. 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.
| Argument | Type | Notes |
|---|---|---|
| search | string | Case-insensitive match on first name, last name, company name or email. |
| account_type | string | One of: Personal, Business. |
| kyc_status | string | Rain application status, e.g. 'approved', 'pending', 'denied'. |
| limit | integer | Max rows to return (1-200). Default: 50. |
| offset | integer | Rows to skip, for pagination. Default: 0. |
get_customer
Get one customer's profile, KYC/card status, smart-wallet addresses and recent card/payment transactions.
| Argument | Type | Notes |
|---|---|---|
| customer_id* | string | Keeve member ID. |
| reveal_contact | boolean | Return full email and phone instead of masked values. Default: false. |
| recent_transactions | integer | 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.
| Argument | Type | Notes |
|---|---|---|
| company_id | string | Optional. 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.
| Argument | Type | Notes |
|---|---|---|
| company_id | string | Optional. 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.
| Argument | Type | Notes |
|---|---|---|
| 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.
| Argument | Type | Notes |
|---|---|---|
| rain_id | string | |
| type | string | One of: spend, collateral, payment. |
| status | string | |
| from | string | Inclusive start date (YYYY-MM-DD). |
| to | string | Inclusive end date (YYYY-MM-DD). |
| limit | integer | Max rows to return (1-200). Default: 50. |
| offset | integer | Rows to skip, for pagination. Default: 0. |
get_transaction
One transaction by its transaction_id (Rain, Stripe or on-chain reference).
| Argument | Type | Notes |
|---|---|---|
| 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.
| Argument | Type | Notes |
|---|---|---|
| payment_type* | string | One of: domestic_bank_payout, international_bank_payout, manual_transfer, card_or_wallet_transaction. |
| id* | string | Payout row ID, manual transfer ID, or transaction_id. |
list_payouts
List bank payouts or manual transfers for this company, newest first, optionally by status.
| Argument | Type | Notes |
|---|---|---|
| payout_type* | string | One of: domestic_bank_payout, international_bank_payout, manual_transfer. |
| status | string | |
| limit | integer | Max rows to return (1-200). Default: 50. |
| offset | integer | Rows 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.
