Hundo
Server Details
Read your accounts, budgets and net worth, and draft changes you confirm.
- Status
- Healthy
- Uptime
- 100.0% over the last 24 hours
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 24 tools
Most tools target a clearly distinct resource+action (get_accounts, get_budget, propose_transfer, propose_asset_trade), and the descriptions explicitly steer away from ambiguous choices (e.g. use get_net_worth/get_assets instead of run_read_query, use run_insight_query for ad-hoc vs propose_saved_insight for pinning). The main blur zones are the three insight tools and the general run_read_query versus the many dedicated read tools, but cross-references resolve them in practice. The propose_* family is noisy at 12 members but each maps to a distinct mutation.
Names are uniformly snake_case with recognizable verb prefixes: get_*, list_*, propose_*, confirm_*, run_*, search_*. There is minor drift in the propose family's ordering — propose_delete_budget / propose_delete_transaction put the verb after the noun, while propose_budget_upsert, propose_asset_trade, and propose_collectibles_add vary between <noun>_<verb> and <noun>_<noun>_<verb> — which slightly weakens predictability.
24 tools sits at the upper edge, but the domain is genuinely broad: accounts, net worth, budgets, categories, IOUs, assets, collectibles, saved insights, and raw SQL. Each read tool covers a distinct resource and the propose/confirm split doubles the mutation surface, so the count is defensible rather than padded. It is still heavier than ideal for an agent to hold in working memory.
Transaction, transfer, budget, asset trade, and collectible lifecycles are well covered (create/edit/delete plus confirm), and read coverage of net worth, budgets, IOUs, and yesterday's digest is thorough. Notable gaps: IOUs are read-only (get_ious with no propose counterpart), accounts and categories cannot be created or edited, and transfers and asset trades cannot be edited or deleted via tools. Those dead ends are at least documented with an explicit pointer to the UI pages, so agents can route users rather than fail.
Available Tools
24 toolsconfirm_proposalADestructiveInspect
Commit a pending proposal (created by a propose_* tool) to the user's finances. In this MCP context this is the ONLY way a proposal is recorded - there is no Hundo UI button. Call this with the proposalId returned by a propose_* tool (or from list_pending_proposals) once the user has approved the change in the conversation. Only call after the user has explicitly approved this exact proposal.
Inputs: proposalId (required).
get_accountsARead-onlyInspect
List the user's financial accounts. Use this to resolve an account name mentioned in an email (e.g., 'BCA ***1234') to an accountId before calling propose- tools. If no confident match, omit accountId on the proposal - the user will pick on review. addedOn is given only for an account the user started from its real balance: it is the day they added the account to Hundo (YYYY-MM-DD, their calendar), and the balance they typed that day already held every payment made up to it. An account with no addedOn was added with no balance, so every entry on it moves the balance.
Inputs: nameLike.
get_assetsARead-onlyInspect
List the user's assets (crypto, stocks, real estate, vehicles, trading cards, etc.) with quantity, purchase price, latest market valuation, and P&L - the same numbers the app's net-worth page shows. costBasis, pnl, realizedPnl, and avgCostPerUnit are in the user's base currency; costBasis is the blended total cost (per-trade history included) and avgCostPerUnit is costBasis/quantity - use avgCostPerUnit for any 'average cost per share' question, NOT purchasePrice (which is only the fallback for units without recorded trades). purchasePrice and latestValuation.value are per-unit in the asset's own currency. All monetary fields are in major units. pnl is null only when no market price/valuation or exchange rate is available for the asset. Name an asset by displaySymbol when it has one; for a trading card (type 'collectible') symbol is an internal key, never a name to show.
Inputs: type.
get_budgetARead-onlyInspect
Get the user's budgets for a specific month, with budgeted/spent/remaining for each. Use for questions about budget status, overspending, or remaining budget balances. Month must be 'YYYY-MM'.
Inputs: month (required).
get_categoriesARead-onlyInspect
List the user's transaction categories. Call it before proposing an income or expense, and give each one the categoryId of the category that best matches what was bought or paid (a child over its parent); omit categoryId only when nothing reasonably fits. Never invent an id. Also use it to resolve a category the user names, for a transaction or an asset trade. If the result is truncated, call again with a more specific nameLike.
Inputs: nameLike.
get_iousARead-onlyInspect
Get the user's IOU/debt ledger: who owes the user and whom the user owes, across all counterparties (or one, via counterpartyId). Each entry is a single transfer against a per-counterparty virtual account, labeled with a direction - 'lend' (user gave money, receivable grows), 'collect' (user was paid back, receivable shrinks), 'borrow' (user received money, payable grows), or 'settle' (user paid back, payable shrinks). virtualAccount.type is 'receivable' (they owe the user) or 'payable' (the user owes them); virtualAccount.currency is the debt's currency. amount is in major units. Use this for any question about who owes whom, outstanding debts, or IOU history - this data is not visible via run_read_query.
Inputs: counterpartyId.
get_net_worthARead-onlyInspect
Get the user's current net worth in their base currency, with a breakdown by account and asset. Each asset also carries costBasis, pnl (both in the base currency, major units), and pnlPercent - the same numbers the net-worth page shows. Use this for any question about total wealth, total assets, total liabilities, or how rich/poor the user is.
Inputs: no named parameters.
get_saved_insightsARead-onlyInspect
List the user's pinned dashboard insights (Saved Insights tab): id, title, viz spec, and sort order. Does not recompute current data for each one - pass an insight's spec to run_insight_query if you need fresh numbers. Use this to see what's already pinned before proposing a new one, or to find an insight's id/spec to edit or rerun.
Inputs: id.
get_yesterday_summaryARead-onlyInspect
Get yesterday's morning briefing: net-worth change, budget alerts (envelopes at >= 80% utilization), and yesterday's transaction/transfer/asset activity, plus a single prioritized headline (insight) summarizing what matters most. All monetary values are in major units. Use this for 'what happened yesterday' / daily-digest style questions instead of composing it from run_read_query - the alert thresholds and headline priority are not simple SQL.
Inputs: no named parameters.
list_pending_proposalsARead-onlyInspect
List your currently-pending proposals (proposals you've made that the user hasn't confirmed or cancelled yet). Use this when the user asks to change one of several pending proposals so you only re-propose the affected one. Returns up to 20 most-recent pending proposals. Amounts in summaries are in MAJOR units - pass them through to the propose tools as-is for relative edits.
Inputs: no named parameters.
propose_asset_convertAInspect
Propose converting one asset into another (a cashless swap, e.g. spend SOL to acquire a new coin). Records a sell of the source and a buy of the destination at one shared value, moving no cash account. When the user does not hold the destination yet, pass newDestAsset instead of destAssetId: confirming creates it. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Validates the user holds enough of the source. Pass the trade value in the user's base currency, or omit it to auto-derive from the source's market price. Always include a short user-supplied description.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: date (required), description (required), destQuantity (required), sourceAssetId (required), +5 more.
propose_asset_tradeAInspect
Propose a buy or sell trade for an asset. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). To buy an asset the user does not hold yet, pass newAsset instead of assetId: confirming creates the asset and records the buy together. For sells, validates the user holds enough quantity. The cash account currency must match priceCurrency. Always include a short user-supplied description; optionally include a categoryId.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: date (required), action (required), quantity (required), description (required), +8 more.
propose_budget_upsertAInspect
Propose creating a new budget or updating an existing one. For create: provide name, allocated, currency. For update: provide envelopeId, allocated; the name and currency are kept from the existing budget. A budget resets weekly or monthly (period, default monthly) and tracks spending one of two ways: trackingMode 'category' counts the linked categories, and ONE budget can cover MANY: pass every category in categoryIds (e.g. rent + groceries + transport + utilities for a single 'Needs' budget); trackingMode 'manual' links no categories and the user tracks it by hand. On update, categoryIds replaces the current list, so pass the whole list. Look category ids up first and never invent them. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context).
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: currency (required), allocated (required), name, period, +6 more.
propose_collectible_editAInspect
Propose a change to one trading card in the user's collection: its condition or grade (a regrade), its notes, where its value comes from (the market price, the user's own value, or one seller's price), or the print a card added by hand really is. Give only what changes. Returns a proposal id and a preview of each change, before and after; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). To add copies use propose_collectibles_add; to sell copies use propose_asset_trade.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: assetId (required), grade, notes, value, +5 more.
propose_collectibles_addAInspect
Propose adding trading cards to the user's collection: cards bought as singles, pulled from a booster box or packs, received as a gift, or received in a trade. Find each card's variantId with search_cards first. Returns a proposal id and a preview with each card's market value and what it will cost; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Show the user the cards, their conditions and the money before they approve. Copies of a print the user already holds in the same condition join that card.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: date (required), cards (required), box, given, +4 more.
propose_delete_budgetAInspect
Propose deleting an existing budget (envelope). Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Look the budget up with the budget tool first and pass its id. Transactions already assigned to the budget are kept - only the budget itself is removed.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: envelopeId (required), editsProposalId.
propose_delete_transactionAInspect
Propose deleting an existing income or expense transaction. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Look the target up with the read-query tool first and pass its id. Transfers, buys and sells can't be deleted here - tell the user to delete those on the Transactions page. Neither can IOUs, which are transfers to a virtual receivable/payable account - tell the user to manage those on the IOUs page. The preview states the full effect - relay it to the user before they confirm.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: transactionId (required), editsProposalId.
propose_saved_insightAInspect
Propose pinning a filtered insight to the user's Saved Insights tab. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context).
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: spec (required), title (required), editsProposalId.
propose_transactionAInspect
Propose a new income or expense transaction. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Validate account exists and is owned by the user before calling.
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: date (required), type (required), amount (required), currency (required), +7 more.
propose_transaction_editAInspect
Propose an edit to an existing past income or expense transaction. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context). Only works on income/expense transactions - transfers and asset trades (buy/sell) must be edited on the Transactions page. ONLY pass the fields the user explicitly asked to change; omit the rest so they keep their current value. Pass null for an optional field only when the user explicitly asks to clear that field (e.g. 'remove the category').
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: transactionId (required), date, type, notes, +6 more.
propose_transferAInspect
Propose a transfer between two of the user's accounts. Same-currency transfers move the amount as-is; cross-currency transfers use the user-supplied exchangeRate or fall back to the exchange rate in force on the transfer date (the latest stored rate when the history does not reach back that far). Always include a short user-supplied description; optionally include a fee, recorded as a separate expense on the source account, or on the destination account when feeCurrency is the destination's currency. Returns a proposal id; to record it, call the confirm_proposal tool with the returned proposalId after the user approves (there is no UI button or proposal card to click in this context).
MCP note: this tool only CREATES a pending proposal; nothing is recorded until confirm_proposal is called.
Inputs: date (required), amount (required), description (required), fee, +7 more.
run_insight_queryARead-onlyInspect
Compute an analytics insight (a single value, a comparison, a breakdown, or a time-series) over a filtered period of transactions, from an ad-hoc spec, WITHOUT saving it. Use this to answer one-off analytical questions like 'how much did I spend on Dining last month' or 'compare income vs expense this year'. If the user wants to keep the result pinned on their dashboard, use propose_saved_insight instead.
Inputs: spec (required).
run_read_queryARead-onlyInspect
Run a single Postgres SELECT against the user's data. The database automatically scopes results to the current user - do NOT add WHERE user_id clauses. For net worth, budget, or asset valuation use the dedicated tools instead. Provide a one-line rationale explaining the query.
IMPORTANT - money units: columns the schema below marks as minor units (the marker reads roughly "[minor units - divide by 100]") are stored as INTEGER minor units - the real amount x 100, for ALL currencies including IDR with no decimal places (e.g. Rp 2,500,000 is stored as 250000000). Divide ONLY those marked columns by 100.0 in your SELECT projection to get real amounts, e.g. SELECT SUM(amount) / 100.0 AS total. Do NOT divide columns that are already in major units - in particular the v_chat_transaction view's amount_major and signed_amount are already real major-unit amounts, so use them directly (they are the easiest correct way to sum spend/income). Never multiply by 100.
asset
purchase_price is the per-unit purchase price in purchase_currency rows with deleted_at IS NOT NULL are soft-deleted; exclude them for per-asset P&L questions the getAssets tool already returns cost basis, P&L, and P&L % in the user's base currency; prefer it over hand-rolled SQL
id: string
user_id: string
account_id: string (nullable)
type: string [enum: crypto | stock | real_estate | vehicle | commodity | bond | other | collectible]
symbol: string (nullable)
display_symbol: string (nullable)
quantity: string
unit: string (nullable)
purchase_price: number (nullable) [minor units - divide by 100]
purchase_currency: string (nullable)
valuation_mode: string [enum: auto | manual]
created_at: date
updated_at: date
deleted_at: date (nullable)
asset_split
id: string
asset_id: string
effective_date: string
ratio_from: number
ratio_to: number
source: string [enum: manual | yahoo]
status: string [enum: pending | applied | dismissed]
cache_applied: boolean
created_at: date
updated_at: date
asset_transaction
per-trade buy/sell record for an asset; join transaction on transaction_id for date, type (buy | sell), currency, and soft-delete status (exclude deleted_at IS NOT NULL) price_per_unit is in the joined transaction's currency an asset conversion (swap of one asset for another) appears as a paired sell + buy on the same date whose transactions have account_id IS NULL; they move no cash (v_chat_transaction reports them as neutral with signed_amount 0)
id: string
transaction_id: string
asset_id: string
quantity: string
price_per_unit: number [minor units - divide by 100]
created_at: date
category
id: string
user_id: string
name: string
icon: string (nullable)
parent_id: string (nullable)
created_at: date
updated_at: date
deleted_at: date (nullable)
collectible_acquisition
copies of a card added without a trade (with what was paid, not paid from an account): one row per time copies were added, dated acquired_on; join asset on asset_id (exclude soft-deleted assets) price_per_unit is what one copy cost, in currency; both are null when the user did not say what they paid a card's cost comes from these rows plus its buy trades in asset_transaction, never from asset.purchase_price; the getAssets tool already combines them into costBasis and P&L copies from a booster box or packs opened together have opening_id set: the box's price is split over them by market value (opening_weight), so price_per_unit is their share
id: string
asset_id: string
quantity: number
price_per_unit: number (nullable) [minor units - divide by 100]
currency: string (nullable)
acquired_on: string
opening_id: string (nullable)
opening_weight: number (nullable)
share_fixed: boolean
created_at: date
collectible_disposal
copies of a card that left the collection without a sale: reason 'removed' (taken out by the user) or 'traded' (given in a trade); join asset on asset_id (exclude soft-deleted assets) they leave at their average cost, so they realise no profit or loss; a sale is a sell trade in asset_transaction instead
id: string
asset_id: string
quantity: number
disposed_on: string
reason: string
created_at: date
collectible_holding
one row per trading card position: the asset (type = 'collectible') it belongs to, the exact print (variant_id) and how the card is held join asset on asset_id for quantity and deleted_at (exclude soft-deleted assets); join collectible_item_cache on variant_id for the card's name, set, number and language grading is 'raw' (then condition is nm | lp | mp | hp | dmg) or 'graded' (then grader is psa | bgs | cgc | sgc | tag | ace | ars | other and grade runs 1 to 10) a card's value: when asset.valuation_mode = 'auto' it is the market price, the price row with type 'collectible' and symbol = asset.symbol (collectible_price_meta on the same symbol says how it was built); when 'manual' it is the user's own latest valuation row, or, when source_pin is set, the price of that one pinned source, written into valuation each time it changes for value and P&L questions the getAssets tool (type 'collectible') already returns them in the user's base currency; prefer it
asset_id: string
variant_id: string
grading: string
condition: string (nullable)
grader: string (nullable)
grade: string (nullable)
grade_label: string (nullable)
source_pin: string (nullable)
notes: string (nullable)
created_at: date
updated_at: date
collectible_item_cache
one row per card print (global, no user data): game (pokemon, the only game Hundo supports for now), language (en | ja | id ...), set_code, set_name, card_number, card_name card_name is as printed (Japanese cards in Japanese); card_name_en holds the English name when there is one
variant_id: string
game: string
language: string
set_code: string
set_name: string
card_number: string
card_name: string
card_name_en: string (nullable)
finish: string
finish_label: string (nullable)
rarity: string (nullable)
image_url: string (nullable)
has_official_image: boolean
is_secret: boolean
status: string
synced_at: date
collectible_price_meta
one row per card market price (global, no user data), keyed by symbol = asset.symbol for a card ('ctg:<variant_id>:'); the price itself is in price (type 'collectible', same symbol), in the currency the source quotes basis: market (one card market's recent sales price alone: TCGplayer in USD first, else Cardmarket in EUR), single_seller (1 shop or eBay seller), thin (the lower of 2), median (trimmed median of 3 or more); source_count: how many sources the price is built from; observed_on: the day the newest evidence was seen stale = true or status <> 'priced' means the price is old: the source marked it stale, or no source prices the card any more and the last price is kept; estimate = true means a played copy priced from near mint times factor sources is a JSON array of {seller, platform, kind ('ask' = a shop's or an eBay seller's asking price, 'sold' = a real sale), price, currency, observedOn, counted}; price there is in minor units - divide by 100; counted = false means the source is listed but the price is not built from it (a market's sale beats the shops' asks); a missing counted means true
symbol: string
variant_id: string
condition_key: string
status: string
basis: string (nullable)
source_count: number
observed_on: string (nullable)
stale: boolean
estimate: boolean
derived_from: string (nullable)
factor: number (nullable)
sources: json
computed_at: date (nullable)
synced_at: date
history_synced_at: date (nullable)
counterparty
id: string
user_id: string
name: string
notes: string (nullable)
created_at: date
updated_at: date
deleted_at: date (nullable)
envelope
this table represents what the user calls a 'budget' - the DB table is named
envelopefor historical reasons, but always say 'budget' in user-facing replies budgets are buckets that group categories - a user mentioning a budget by name (e.g., 'dating', 'vacation') almost always means a row here, not a category v_chat_transaction.envelope_name resolves the (transaction → budget) link for you; prefer that over joining envelope_category yourself
id: string
user_id: string
name: string
budgeted_amount: number [minor units - divide by 100]
currency: string
period: string [enum: weekly | monthly]
tracking_mode: string [enum: category | manual]
include_investments: boolean
category_id: string (nullable)
created_at: date
updated_at: date
deleted_at: date (nullable)
envelope_category
junction table linking categories to budgets; v_chat_transaction.envelope_name already follows this path, so you rarely need to query envelope_category directly
id: string
envelope_id: string
category_id: string
exchange_rate
stored one direction per pair (typically from_currency = USD); for the reverse direction, use 1/rate from the existing row rather than expecting an explicit inverse row use the latest row per (from_currency, to_currency) pair (order by fetched_at DESC, limit 1)
id: string
from_currency: string
to_currency: string
rate: string
fetched_at: date
checked_at: date
financial_account
balance_cache is the live balance in minor units balance_cache = initial_balance + the sum of the account's transactions, so initial_balance is the balance before the first transaction, not always the balance the user typed when adding the account rows with deleted_at IS NOT NULL are soft-deleted; exclude them
id: string
user_id: string
name: string
type: string [enum: checking | savings | credit_card | cash | investment | crypto | loan | mortgage | property | vehicle | receivable | payable]
currency: string
institution: string (nullable)
icon: string (nullable)
is_liability: boolean
initial_balance: number [minor units - divide by 100]
balance_cache: number [minor units - divide by 100]
credit_limit: number (nullable) [minor units - divide by 100]
is_active: boolean
is_virtual: boolean
counterparty_id: string (nullable)
created_at: date
updated_at: date
deleted_at: date (nullable)
net_worth_snapshot
id: string
user_id: string
total_assets: number [minor units - divide by 100]
total_liabilities: number [minor units - divide by 100]
net_worth: number [minor units - divide by 100]
currency: string
breakdown_json: json (nullable)
snapshot_date: string
created_at: date
price
cached market price per unit of the asset, keyed by (type, symbol); join asset on both columns use the latest row per (type, symbol) (order by fetched_at DESC, limit 1) for commodities the price is per troy ounce regardless of asset.unit; convert before comparing to per-unit purchase prices
id: string
type: string [enum: crypto | stock | real_estate | vehicle | commodity | bond | other | collectible]
symbol: string
price: number [minor units - divide by 100]
currency: string
fetched_at: date
transaction
amount is always non-negative; direction lives in type for spend/income totals, prefer the v_chat_transaction view rows with deleted_at IS NOT NULL are soft-deleted; exclude them in_opening_balance = true marks a payment the user logged as already inside the balance they typed when adding the account; it is real spending on its date, but it changed initial_balance, not balance_cache
id: string
user_id: string
account_id: string (nullable)
type: string [enum: income | expense | transfer | buy | sell]
amount: number [minor units - divide by 100]
currency: string
exchange_rate: string (nullable)
date: string
description: string (nullable)
category_id: string (nullable)
envelope_id: string (nullable)
notes: string (nullable)
receipt_image_url: string (nullable)
in_opening_balance: boolean
created_at: date
updated_at: date
deleted_at: date (nullable)
valuation
one row per asset per day; latest row is the current value
id: string
asset_id: string
value: number [minor units - divide by 100]
currency: string
fetched_at: date
v_chat_transaction (view)
Presentation view over transaction. Soft-deleted rows already excluded. Prefer this over the raw transaction table for any spend/income question.
id: string
user_id: string
date: date
type: string [enum: income | expense | transfer | buy | sell]
description: string (nullable)
currency: string
amount_major: numeric (always >= 0; major units, e.g. dollars not cents)
signed_amount: numeric (negative for expense and buy; positive for income and sell; zero for transfer and for cashless asset-conversion legs)
direction: string [enum: outflow | inflow | neutral]
account_id: string (nullable; null on the cashless legs of an asset conversion, which move no cash)
category_id: string (nullable)
category_name: string (nullable, joined from category)
envelope_id: string (nullable; direct budget assignment, often null)
envelope_name: string (nullable; the user's budget label, resolved via direct envelope_id OR via the envelope_category junction on category_id - match this when the user names a budget like "Dating")
Inputs: sql (required), rationale (required).
search_cardsARead-onlyInspect
Find trading cards (Pokémon) in Hundo's card catalog, to add them to the user's collection with propose_collectibles_add or to link a card with propose_collectible_edit. Returns candidate prints, each with the variantId those tools need. A card's price belongs to its exact print, and the same card printed in another language, with another number or another finish is a different print with a different price: pick the print that matches the card the user holds (language included), and ask the user when two results could be it. 'held' lists copies of a print the user already holds, with their assetId.
Inputs: query (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
Related MCP Connectors
Ask your AI about your own accounts, debts, budgets and goals. OAuth sign-in, read-only by default.
Read-only personal finance for AI agents: budgets, receipts, net worth, bills. OAuth 2.1.
Chat with your bank data: balances, transactions, budgets, bills. Reads only, never moves money.
Personal finance by conversation: expenses, receipts, statement import, budgets, net worth.
Related MCP Servers
- AlicenseAqualityFmaintenanceEnables users to connect their own YNAB account via OAuth and work with their budgets through natural language — reviewing plans, months, accounts, categories, payees, transactions, scheduled transactions, and money movements, plus writing changes such as creating, approving, recategorizing, or deleting transactions, assigning funds to categories, and moving money between them. It also adds read-only summaries for catching unapproved transactions and overspending, analyzing spending, tracking goal funding, and forecasting cash flow.35MIT
- AlicenseNot gradedqualityCmaintenanceEnables natural-language access to personal finance data, including consolidated balances, monthly overviews, transaction search, credit card invoices, recurring bills, budgets, category/tag reports, cash flow forecasts, and Open Finance status, with optional read/write tools.MIT
- AlicenseAqualityCmaintenanceEnables read-only access to YNAB budgets, accounts, categories, payees, and transactions, plus safe addition of unapproved transactions with dry-run and duplicate pre-check for reconciliation workflows.6MIT
- AlicenseNot gradedqualityNot gradedmaintenanceEnables Claude to inspect budgets, accounts, categories, transactions, and payees, and optionally create transactions or adjust budgeted amounts through secure OAuth-backed remote tools.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.