Skip to main content
Glama

Hundo

Server Details

Read your accounts, budgets and net worth, and draft changes you confirm.

Ownership verified
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

A4.2/5.0

Scored across 24 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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 tools
confirm_proposalA
Destructive
Inspect

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_accountsA
Read-only
Inspect

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_assetsA
Read-only
Inspect

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_budgetA
Read-only
Inspect

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_categoriesA
Read-only
Inspect

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_iousA
Read-only
Inspect

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_worthA
Read-only
Inspect

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_insightsA
Read-only
Inspect

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_summaryA
Read-only
Inspect

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_proposalsA
Read-only
Inspect

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_queryA
Read-only
Inspect

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_queryA
Read-only
Inspect

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 envelope for 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_cardsA
Read-only
Inspect

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

    Related MCP Servers

    • A
      license
      A
      quality
      F
      maintenance
      Enables 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.
      35
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables 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
    • A
      license
      A
      quality
      C
      maintenance
      Enables 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.
      6
      MIT
    • A
      license
      Not graded
      quality
      Not graded
      maintenance
      Enables Claude to inspect budgets, accounts, categories, transactions, and payees, and optionally create transactions or adjust budgeted amounts through secure OAuth-backed remote tools.
      MIT
    Try in Browser

    Glama MCP Gateway

    Add one secure layer between your agents and this server.

    Resources