com.moneda/mcp · v0.3.0 · finance-and-payments
Moneda is healthy: it completed an MCP handshake in 1311 ms and exposes 138 tools.
Financial intelligence for AI: manage balances, transactions, payments, and more
Endpoint: https://mcp.moneda.com/api/mcp (streamable-http)
Repository · Website · JSON · Add to my inventory
| Users (last 30 days) | 0 |
| Handshake | Healthy |
| Auth needed | None |
| Tool count | 138 |
| Latency | 1311 ms |
| Last checked (UTC) | 2026-10-27T18:20:20.911Z |
| Checked (UTC) | Status | Latency | Error |
|---|---|---|---|
| 2026-10-27T18:20:20.911Z | Healthy | 1311 |
health | Check the health and status of the Moneda MCP server |
search_knowledge | Search the Moneda knowledge base (FAQ) for answers to questions about Moneda's features, fees, security, accounts, earnings, deposits, withdrawals, legal info, and more. Use this whenever a user asks about how Moneda works. |
list_faq_categories | List the FAQ table of contents: every category (slug, name) with each item's id and question. Use an id with get_faq_item for the full answer. |
get_faq_category | Get all FAQ items in a specific category. Use the moneda://knowledge resource to discover available category slugs. |
get_faq_item | Get a specific FAQ item by ID, including its full answer and resolved related questions. Use this after search_knowledge or get_faq_category to drill into a specific question. |
get_balance | Get the user's account balances (USD Account, EUR Account, CHF Account, CAD Account, MXN Account, USD Earnings, EUR Earnings, USD Smart Earnings, EUR Smart Earnings), optionally filtered by currency. CHF, CAD, and MXN rows only appear for users in their staged rollouts (gated by ENABLE_CHFAU, ENABLE |
get_wallet | Get the user's Moneda smart wallet address on Base network. IMPORTANT: Only supports USDC, EURC, CHFAU, CADD, and MXNB on Base — other tokens or chains will result in permanent loss of funds. For Moneda-to-Moneda transfers, prefer sharing @username (instant, feeless). |
get_transactions | Get transaction history including card programme activity. Standard format returns JSON; tax_export returns a compact CSV with full unmasked addresses, token contracts, vault tokens, sender/recipient details, and tax labels (Koinly/CoinTracker/TaxBit compatible). Use year for annual tax exports (up |
get_spending_by_type_group | Get spending grouped by transaction type group (transfer, exchange, deposit, withdrawal, earnings, topup, offramp) for a 7/30/90-day window. Includes period-over-period comparison. For finer breakdowns by user-assigned category, contact, or merchant, use get_spending_by_category / get_spending_by_co |
get_exchange_rate | Get the current exchange rate between two currencies |
get_lifetime_savings | Get your lifetime accumulated savings from using Moneda — total fees Moneda covered on your behalf (sponsored network fees + on/off-ramp fees) plus your plan's fee discount vs the Standard plan. This is NOT a balance: never answer "how much have I saved" from wallet or vault amounts. Returns the tot |
list_bills | List the user's bills (AP queue), ordered 'due-soon first' (dueDate ASC NULLS LAST, id DESC). Filter by `status[]` — defaults to `['PENDING']`. Cursor-paginated; pass `nextCursor` from the previous page back as `cursor` to advance. Each row carries the extracted merchant, total, currency, invoice nu |
get_bill | Fetch a single bill by id with full extracted detail — merchant (name, taxId, address), total, currency, due date, invoice number, vendor IBAN/BIC/routing/account, payment status, and a presigned `downloadUrl` valid for ~15 minutes. |
get_apy_rates | Get the current APY (Annual Percentage Yield) rates for Moneda earnings products. Morpho Earnings is a DeFi lending vault and YO Smart Earnings is a higher-yield vault. USD and EUR have both Morpho and YO vaults; MXN has a Morpho-only vault (no YO). CHF and CAD are accepted at the parameter boundary |
get_earnings_time_series | Get a daily time series of earnings and vault balance for a Morpho or YO vault account. Returns up to one year of UTC-day data points (timestamp, earnings, balance) plus totalEarnings and netDeposits summaries. |
update_display_name | Update the authenticated user's display name |
set_passkey_label | Rename a passkey so it is recognisable in the security screen (e.g. 'Work laptop'). Pass the passkey id from get_passkeys. Cosmetic only — it cannot add, remove, or weaken a credential. Send an empty label to clear it back to the provider name. |
set_help_improve_moneda | Set whether the user's conversations with Moneda AI may be used to train Moneda's own models (the Settings > Privacy toggle). enabled=false turns it off; enabled=true turns it back on. The choice applies to what the user sends from then on: messages sent while objected stay excluded even if it is tu |
update_settings | Change the user's decimal separator (DOT = 1,234.56, COMMA = 1.234,56), or opt in or out of marketing and product-update emails and push notifications. Pass only what the user asked to change; at least one field. Security and transactional messages always send and cannot be turned off. Only call thi |
get_points_balance | Get the user's current points balance from the rewards program |
get_points_activity | Get the user's points activity history showing what actions earned or spent points |
get_referral_code | Get the user's unique referral code and referral count |
get_referees | Get the list of users this user has referred to Moneda |
get_virtual_accounts | Get the user's virtual bank account details (IBAN and ACH), payment capabilities, and activation status. Minimum transfer: €1 for EUR (IBAN/SEPA) and $1 for USD (ACH). |
get_virtual_account_limits | Get how much of the user's Iron virtual-account spending limit is left, per direction (deposit = money in, withdrawal = money out), on a rolling 52-week window. Also reports whether Iron is currently requesting enhanced due diligence (EDD). Crossing a limit does NOT reject the transfer: Iron PAUSES |
get_information_requests | List the compliance information requests (RFIs) Iron/MoonPay has sent the user about their virtual account: status, the open round's questions and any requested documents. Read-only. MoonPay requires the user to answer personally, so NEVER answer on their behalf or draft answers for them to paste: t |
get_settlement_estimate | Get the date a US bank (ACH) transfer would actually settle. Accounts for Iron's 3:00 PM ET same-day cutoff, weekends, AND US federal bank holidays — a transfer sent the afternoon before Thanksgiving does not arrive the next day. Use this to answer 'when will my money arrive?' instead of saying 'nex |
get_contacts | Get the user's contacts: Moneda users they interact with, saved external wallets, and saved bank accounts. Each wallet and bank entry has a contactAccountId field — pass it as the contactAccountId parameter to initiate_payment (transfer_contact_bank / transfer_contact_wallet). Use the contact's user |
get_settings | Get the user's app settings and preferences: language, currency, country, theme, notifications, biometrics, and display options. |
get_recovery_contacts | Get the user's recovery contacts and the people who have you as their recovery contact (guardian). |
get_passkeys | Get the user's passkeys (security keys). target='WALLET' (default) lists the smart-account signing keys — id, label, provider, status, masked wallet address, creation date, kind ('primary' = the key from signup, 'backup' = an extra key added later as a second Safe owner), and onchainStatus (a 'pendi |
get_my_accounts | Get the user's saved external wallets and bank accounts for withdrawals/off-ramping. Each entry has an accountId field — pass it as the accountId parameter to initiate_payment (transfer_account). These are NOT the user's Moneda wallet — use get_wallet instead to get the user's actual Moneda smart wa |
update_transaction_category | Assign a spending category to a transaction. Identify the transaction by its transactionHash from get_transactions. |
add_transaction_note | Add or update a personal note on a transaction. Identify the transaction by its transactionHash from get_transactions. Maximum 140 characters. |
batch_update_transaction_categories | Assign spending categories to multiple transactions at once. Accepts up to 25 items. Each item maps a transactionHash to a category. Returns per-item results. Use with get_transactions hasCategory=false to find uncategorized transactions first. |
batch_add_transaction_notes | Add or update notes on multiple transactions at once. Accepts up to 25 items. Each item maps a transactionHash to a note (max 140 chars). Returns per-item results. Use with get_transactions hasNote=false to find unannotated transactions first. |
add_wallet | Add a crypto wallet to the user's saved external accounts. IMPORTANT: The wallet must support USDC, EURC, CHFAU, CADD, and MXNB on the Base network. Sending other tokens or using other chains will result in permanent loss of funds. The user MUST confirm they understand this before the wallet is save |
add_bank | Add a bank account to the user's saved accounts. For EU: provide IBAN (and optionally BIC). For US: provide accountNumber, routingNumber, and accountType (CHECKING or SAVINGS). US banks support ACH transfers only. Bank capability is verified before saving. |
add_contact_external | Register an external (non-Moneda) contact with their details. EU Travel Rule requires first name, last name, and country of residence. At least one wallet address or bank account must be provided. For wallets, the user must confirm Base network USDC/EURC/CHFAU/CADD/MXNB support before saving. |
add_contact_moneda | Add a Moneda user to your contacts by their username. If the contact already exists but was deactivated, it will be reactivated. |
search_users | Search for Moneda users by username, display name, full email, or phone number. Respects user privacy settings — users who have disabled search visibility for specific fields will not appear in results matching those fields. Returns username and display name for matching users. |
list_banks_for_country | List the banks Koywe supports for a LATAM country, used when registering a third-party or first-party bank account that requires an explicit bank code (Colombia/PSE, Chile/CLP_BANK, Bolivia/BOB_BANK). Each bank entry has: name (human label), value (Koywe entity code — pass back as bankCode), and dom |
list_supported_destinations | List the country, currency, and rail combinations Moneda can pay out to. Each entry includes the required fields you'll need to collect from the user before calling add_bank, add_contact_external, or initiate_payment. The output is provider-agnostic — don't branch on which underlying processor handl |
get_payment_quote | Preview the cost, FX rate, and final amount for moving money between two currencies. Provide exactly one of `amountIn` (what the user sends) or `amountOut` (what they want to receive). Returns the quote ID, exchange rate, fee, and how long the quote stays valid. Use this BEFORE initiate_payment so t |
initiate_payment | Send money to someone else (a Moneda user, a contact, or an external bank/wallet). Creates a payment request that requires user approval in the Moneda mobile app. Not for converting between the user's own currencies: use initiate_currency_exchange for that. Look up the recipient first via search_use |
initiate_currency_exchange | Convert money between two of the user's own currency accounts (e.g. USD to EUR). Nothing leaves the user; to pay or send to anyone, use initiate_payment instead. Creates a request the user approves in the Moneda mobile app; the destination is the user's own account in toCurrency. Check balance with |
propose_scheduled_payment | Propose a RECURRING payment (e.g. $50 monthly to a Moneda user or a contact's Base wallet). Creates a draft the user reviews, approves and signs with their passkey in the Moneda mobile app; nothing is sent until then and you never schedule or move funds yourself. Not for one-off payments: use initia |
initiate_crypto_trade | Buy or sell a crypto asset (e.g. cbBTC for Bitcoin, WETH for Ethereum) with the user's own balance. Not for sending money (use initiate_payment) or converting between currencies (use initiate_currency_exchange). The route/venue is chosen by the server. Creates a request the user reviews at the live |
initiate_token_buy | Buy a Base token that is not in initiate_crypto_trade's catalogue, by contract address, spending the user's own USD, EUR, CHF or MXN balance. Use initiate_crypto_trade for catalogue assets (cbBTC, WETH, …). The token must be tradeable on Base via LiFi. Creates a request the user reviews at the live |
initiate_earnings_move | Move the user's own money into or out of an earnings vault: DEPOSIT from a currency account into Earnings (MORPHO) or Smart Earnings (YO), WITHDRAW back out. Not for sending money (use initiate_payment), converting currencies (use initiate_currency_exchange) or trading (use initiate_crypto_trade). Y |
get_payment_status | Check the current status of a payment request. Use this to poll for approval after calling initiate_payment. Terminal statuses: COMPLETED, FAILED, EXPIRED, REJECTED. |
pay_x402 | Pay for a resource using the x402 protocol (HTTP 402 Payment Required). When an API returns HTTP 402 with x402 paymentRequirements, use this tool to initiate the payment. The payment requires user approval in the Moneda app before it executes. Parameters map to x402 paymentRequirements fields: - p |
list_sendable_crypto | List the crypto held in a Safe that can be sent out: balance (in the token's smallest unit), decimals, USD value where one can be found, and whether the token is allowlisted or merely discovered on LiFi's Base list. Covers the main account, vaults and joint accounts. Pass the returned contract addre |
initiate_crypto_send | Send crypto out of a Safe — the main account, a vault or a joint account — to a Moneda contact or a raw Base address, for any token the account holds. Not for selling a token (use initiate_crypto_trade), buying one (initiate_token_buy) or sending money (initiate_payment). Amounts are in the token's |
list_sub_accounts | List the user's sub-accounts (vaults / nested Safes). Excludes CLOSED vaults by default; pass includeClosed: true to see archived ones too. Returns id, name, status, type, and the on-chain child Safe address. |
get_sub_account | Get one sub-account by id with full detail — name, status, type, members, parent + child Safe addresses, deployment index, close timestamp. |
get_sub_account_balance | Read on-chain balances for a sub-account's child Safe. Pass currency (USDC / EURC / CHFAU / CADD / MXNB) to filter to a single token; omit to get every enabled token. Balances are returned as raw bigint strings — 6 decimals for USDC/EURC/CHFAU/MXNB, 18 for CADD. |
get_total_wealth | Aggregate wealth across the user's main account + every live vault. Returns per-leg breakdown (wallet + Morpho + YO for main; wallet-only for vaults) plus per-currency totals (USDC, EURC, CHFAU, CADD, MXNB) and combined totalUsd/totalEur grand totals. USDC/EURC are cross-converted using the on-chain |
list_sub_account_proposals | List the OPEN spend / withdraw / membership / threshold requests on a joint account that needs multiple approvals (M-of-N). Returns each request's type, status, amount, how many approvals it has out of the threshold, and who proposed it. Read-only: voting and executing need the user's passkey on the |
get_sub_account_proposal | Get one joint-account request by id, including the per-member approval list (who approved, who rejected, and when). Read-only. |
propose_sub_account_top_up | Move money from the user's main account INTO one of their sub-accounts. Not for paying someone (use initiate_payment) or converting currencies (use initiate_currency_exchange). Creates a request the user approves in the Moneda mobile app; nothing happens until then. After calling, poll get_payment_s |
propose_sub_account_withdraw | Move money from a sub-account back to the user's own main account. Not for paying someone from a sub-account (use initiate_payment with source.kind=sub_account). Single-signature sub-accounts only; for a joint account use propose_sub_account_multisig_proposal. Creates a request the user approves in |
propose_sub_account_swap | Swap inside a sub-account between a currency (USD, EUR, CHF, CAD, MXN) and a crypto asset (e.g. cbBTC), or between two currencies. Funds stay in the sub-account. Not for the main account (use initiate_crypto_trade or initiate_currency_exchange). Creates a request the user approves in the Moneda mobi |
propose_sub_account_freeze | Freeze a sub-account the user created, blocking its spending. Unfreezing can only be done in the app. Creates a request the user approves in the Moneda mobile app; nothing happens until then. After calling, poll get_payment_status. |
propose_sub_account_multisig_proposal | Open a SPEND or WITHDRAW proposal on a joint account that needs more than one approval. This only creates the proposal; co-owners still approve and execute it in the Moneda app. For single-signature sub-accounts use propose_sub_account_withdraw or initiate_payment with source.kind=sub_account. Creat |
get_current_subscription | Get the user's CURRENT subscription plan and how it is billed. Returns hasLiveSubscription, status (TRIALING/PENDING_FIRST_CHARGE/ACTIVE/PAST_DUE/CANCELLED), planType (STANDARD/PREMIUM/ULTRA), billingProvider (ONCHAIN/STRIPE/APP_STORE/PLAY_STORE), billedTo ('balance' | 'card' | 'app_store'; app_stor |
list_subscription_charges | List the user's subscription charge history (SUBSCRIPTION_CHARGE rows from the keeper cron), newest first. Cursor-paginated — pass `nextCursor` from the previous page back as `cursor` to advance. Each row carries the plan tier, billing period (MONTHLY/ANNUAL), amount (lower-units string), currency, |
get_subscription_invoice | Generate (idempotently) the ZUGFeRD plan invoice PDF for a single subscription charge and return a 1-hour presigned download URL. First call allocates the invoice number (YYYY-NNNNNN), renders the PDF/A-3 with embedded EN 16931 XML, and uploads to S3; subsequent calls return a fresh presigned URL fo |
list_notifications | List the user's in-app notifications, newest first. Pass filter='unread' to scope to unread items (use this to answer 'do I have any new notifications?'). Each notification has a `type`, an optional `deepLink`, and a `metadata` JSON blob whose shape varies by type. Returns up to `limit` items (defau |
get_unread_notification_count | Number of unread in-app notifications for the user. Cheaper than list_notifications when the agent only needs the count to answer 'do I have anything new?'. |
get_moneda_message | Read one message from Moneda (a notification with type MONEDA_MESSAGE, id from list_notifications): title, body, tone, optional button, attached documents (by index), and `reply`, which is null when no reply is asked for, else says whether a document is none/optional/required. `repliedAt` is set onc |
get_moneda_message_attachment_url | Get a download link (valid 10 minutes) for a document Moneda attached to a message. `index` comes from the message's `attachments` list in get_moneda_message. |
list_message_replies | List the replies the user sent to messages from Moneda, newest first: text, the message title, and the attached document's name if any. Returns up to `limit` items (default 20, max 50) with a `nextCursor` for pagination. |
request_message_reply_upload | Step 1 of 2 for attaching a document to a reply to a message from Moneda (only when get_moneda_message shows `reply.attachment` optional or required). Returns a presigned S3 PUT URL (`uploadUrl`), a signed `uploadKey` and a literal `curlCommand` to run in your code sandbox; the file bytes go straigh |
reply_to_moneda_message | Send the user's reply to a message from Moneda that asks for one. The reply is delivered to the Moneda team, so only send text the user wrote or explicitly approved word for word, never text you composed on your own, and show it to the user before sending. One reply per message (max 600 characters); |
undo_message_reply | Undo a reply the user just sent to a message from Moneda. Only call this when the user asks to undo, and only within 10 seconds of sending (until the reply's `undoableUntil`); afterwards it fails with "too late". The reply and its document are deleted and the message asks for a reply again. |
list_receipts | List the user's transaction receipts (PDFs, images, structured invoices), newest first. Each entry carries extracted summary fields (merchant, total, date, currency) plus the linked transactionId when attached. Use `transactionHash` (from `get_transactions`) to scope to one transaction, `needsReview |
get_receipt | Fetch a single receipt by id with full extracted fields (merchant, total, currency, tax breakdown, line-item count) plus a presigned `downloadUrl` valid for ~15 minutes. Use this when the user asks about a specific receipt or to surface the file URL to the LLM context. |
get_receipt_line_items | List the parsed line items on a receipt — description, quantity, unitPrice, totalPrice, taxRate, and category. Useful for spend-by-product breakdowns or itemized review of an invoice. |
search_receipt_line_items | Search across every parsed line item the user has uploaded (case-insensitive substring on description + normalized description). Returns matching items, total count, and aggregate spend grouped by currency. Optional `category`, `startDate`, and `endDate` further narrow the window. Use this for quest |
list_bewirtungsbelege | List German hospitality-receipt (Bewirtungsbeleg) overlays attached to the user's transactions. Each row carries the underlying transactionId, date, location, occasion, total/tip/subtotal split, deductible vs non-deductible amounts, and signing state. Pass `transactionHash` (from `get_transactions`) |
list_eigenbelege | List self-issued substitute receipts (Eigenbeleg) — used when the original receipt for a transaction was lost or never issued. Each row carries the linked transactionId, recipientName, amount, reason, and signing state. Pass `transactionHash` (from `get_transactions`) to scope to one transaction. De |
request_receipt_upload | Step 1 of 2 for uploading a local receipt file. Returns a presigned S3 PUT URL (`uploadUrl`), a signed `uploadKey`, and a literal `curlCommand` to execute in your code sandbox to stage the file. The file bytes are sent directly to S3 — they never enter the conversation context. After the curl PUT su |
finalize_receipt_upload | Step 2 of 2 for uploading a local receipt file. Pass the `uploadKey` returned from `request_receipt_upload` AFTER you've executed the `curlCommand` to PUT the file to S3. Validates the staged file, runs OCR + LLM extraction, attempts to auto-match to an existing transaction, and persists line items. |
import_receipt_from_url | Import a receipt directly from an https:// URL (S3, Drive shared link, public file host, etc.). The server fetches the file behind an SSRF guard (rejects private IPs, Moneda infra, and non-https), validates it, then runs OCR + matching. Single tool call, no sandbox needed. Use this when the receipt |
reparse_receipt | Re-run the OCR / LLM extraction pipeline on an existing receipt and return the refreshed fields. Use this when the user reports incorrect extraction or after a model upgrade. Refuses DELETED rows and rows without a stored file. Synchronous — the response carries the post-extraction snapshot. |
delete_receipt | Permanently delete a receipt and its stored file. This is a HARD delete — the row, its line items, and any Bewirtungsbeleg/Eigenbeleg overlay go with it, and there is no undo and no recycle bin. Confirm with the user before calling. To move a receipt to a different transaction use detach_receipt + a |
mark_receipt_partial_payment | Mark a receipt as a partial payment: the document covers more than this one payment (a deposit or instalment against a larger invoice), so its total differing from the transaction amount is expected. Replaces the `amount_mismatch` review reason with `partial_payment` so the receipt stops warning; th |
update_receipt_amounts | Correct a receipt's top-line amounts when the scan read them wrong: total, subtotal, tax amount, tax rate and tip. Each field is optional: omit it to leave it unchanged, pass null to clear it. At least one field is required. taxRateValue is a percentage (19 for 19%, not 0.19). Only the stored amount |
attach_receipt | File an unattached receipt against a transaction. A transaction holds at most ONE receipt, so this returns a conflict if another is already attached — detach that one first. Also clears any pending match suggestion, since the user has now decided. |
detach_receipt | Unlink a receipt from its transaction, leaving the receipt itself intact as an orphan. Use this to correct a wrong match, or to free a transaction so a different receipt can be attached. Does NOT delete anything. |
confirm_receipt_suggestion | Accept the matcher's suggested transaction for a receipt, promoting the soft suggestion to a real attachment. Suggestions exist when the match score was too low to attach automatically — read `suggestedTransactionId` / `suggestedMatchScore` from get_receipt and check the suggestion with the user bef |
reject_receipt_suggestion | Dismiss the matcher's suggested transaction for a receipt. The receipt stays an unattached orphan and stops being offered against that transaction. Use attach_receipt afterwards if you know the correct one. |
list_recovery_emails | List the email addresses set up for ZK email-based account recovery. Returns id, email, weight, status (pending/invited/accepted/declined/removed), and timestamps. Defaults to the user's main account when accountId is omitted. |
get_recovery_email | Get one recovery email's full detail by id — email, weight, status, timestamps, notes, and the on-chain account address it protects. |
get_recovery_config | Get the recovery configuration for an account: accepted recovery emails, total weight, and the threshold required to approve a recovery. The threshold is a fixed number that must match the on-chain Universal Email Recovery Module config. |
get_recovery_status | Get the most recent ZK email recovery request snapshot for an account. Returns hasActiveRecovery: false when no recovery exists or the latest is in a terminal state (cancelled/completed/expired); otherwise returns recovery details including approved/pending recovery emails (anonymized as a***@domain |
get_daily_spending | Get daily spending totals for a stablecoin over a window. Returns one data point per UTC day with non-zero spending. Amounts are in currency units (26.5 means 26.50), like `get_transactions`. |
get_spending_by_category | Get spending grouped by user-assigned transaction category over a window. Transactions without a category land in an 'UNCATEGORIZED' bucket. Amounts are in currency units (26.5 means 26.50), like `get_transactions`. |
get_spending_by_contact | Get the total amount sent to a single recipient (Moneda user, external bank, or external wallet) over a window. Identify the recipient by their account ID (recipientAccountId). Amounts are in currency units (26.5 means 26.50), like `get_transactions`. |