Skip to main content
MyTruv MCP exposes ten read tools and three write tools. Read tools return data from your connected accounts. Write tools update how transactions are labeled and categorized - your AI assistant calls them automatically when you ask it to fix a category or rename a merchant, and they are also available to any authorized MCP client.
ToolWhat it does
accountBalancesCurrent balances across all connected accounts
balanceHistoryAssets, liabilities, and net worth over time
connectedAccountsLookupList all connected links with status
transactionHistoryTransactions from connected bank accounts
searchTransactionsSearch and filter by text, amount, category, date
recurringTransactionsSubscriptions, bills, and recurring income
spendingAnalysisSpending by category, merchant, or time period
incomeReportAll income sources from payroll and bank data
getPayrollIncomePay stub history for a specific employer
getBankIncomeBank-derived income analysis for a specific account
recategorizeTransactionChange a transaction’s category, merchant name, or visibility
bulkRecategorizeTransactionsApply the same change to up to 200 transactions at once
createCategorizationRuleCreate a standing rule for a merchant that applies going forward

accountBalances

Returns a snapshot of every connected account with individual balances and aggregated totals grouped by account type. Parameters: none. Response fields:
FieldTypeDescription
total_accountsintegerNumber of connected accounts
accounts[].idstringAccount ID - pass to account_ids in other tools
accounts[].typestringCHECKING, SAVINGS, CREDIT_CARD, INVESTMENT, LOAN, etc.
accounts[].subtypestring | nulle.g. BROKERAGE, ROTH_IRA for investment accounts
accounts[].maskstringMasked account number
accounts[].nicknamestringAccount display name
accounts[].balances.balancestringCurrent balance
accounts[].balances.available_balancestring | nullAvailable balance
accounts[].balances.credit_limitstring | nullCredit limit (credit cards only)
accounts[].providerobjectInstitution {id, name, logo_url}
aggregated_balances[]arrayTotals grouped by type + currency_code, with account_count
Example prompt: “What’s my current balance across all accounts?” Related: REST - Balances

balanceHistory

Returns historical balances across all connected accounts. Aggregates by default - filter with account_ids for specific accounts. Parameters:
ParameterTypeRequiredDefaultDescription
date_rangestringNo3M1M, 3M, 6M, 1Y, or ALL
account_idsstringNoAllComma-separated account IDs
Response fields:
FieldTypeDescription
time_series[].datestringYYYY-MM-DD
time_series[].assetsstringTotal asset value
time_series[].liabilitiesstringTotal liability value
time_series[].net_worthstringAssets minus liabilities
start_date / end_datestringRange of the series
Example prompt: “Show me my net worth trend over the last 6 months.” Related: REST - Balance History

connectedAccountsLookup

Lists every account link (connection) with provider and status.
This returns id for each link. To get the link_id value used by getPayrollIncome and getBankIncome, call incomeReport and use employments[].link_id from there - that field is curated for the income flow.
Parameters: none. Response fields:
FieldTypeDescription
results[].idstringUnique link identifier
results[].providerobjectProvider {id, name, logo_url}
results[].data_sourcestringpayroll or financial_accounts
results[].statusstringdone, session_expired, etc.
results[].initial_product_typestringProduct the link was originally created for
results[].created_at / updated_at / deleted_atstringTimestamps
Example prompt: “What accounts do I have connected?” Related: REST - Account Links

transactionHistory

Fetches transactions from all connected bank accounts and combines them into a single report. Descriptions are anonymized for privacy. Parameters:
ParameterTypeRequiredDefaultDescription
daysintegerNo30Number of days to retrieve (max 365)
categoriesstringNoAllComma-separated category names
Response fields:
FieldTypeDescription
countintegerTotal number of transactions
accounts[]arrayBank accounts with balances (same shape as accountBalances.accounts[])
transactions[].idstringTransaction ID
transactions[].account_idstringSource account ID
transactions[].amountstringTransaction amount
transactions[].currency_codestringe.g. USD
transactions[].categoriesarrayDisplay category names (e.g. ["Food & Dining", "Restaurants"])
transactions[].category_slugsarraySnake-case slugs for the same categories
transactions[].descriptionstringDescription (personal names anonymized, e.g. R***a K*****a)
transactions[].merchant_namestring | nullCleaned-up merchant name
transactions[].memostring | nullMemo line if present
transactions[].statusstringPOSTED or PENDING
transactions[].typestringCREDIT (money in) or DEBIT (money out)
transactions[].posted_atstring | nullWhen the transaction posted (null while pending)
transactions[].transacted_atstringWhen the purchase actually happened
Example prompt: “Show me all my grocery transactions from the last 2 weeks.” Related: REST - Transactions

searchTransactions

More powerful than transactionHistory for targeted lookups. Supports text search, amount ranges, type filtering, and pagination. Parameters:
ParameterTypeRequiredDefaultDescription
querystringNo-Text in descriptions and memos (case-insensitive)
min_amountnumberNo-Minimum absolute amount
max_amountnumberNo-Maximum absolute amount
transaction_typestringNoAllDEBIT or CREDIT
categoriesstringNoAllComma-separated category names
daysintegerNo90Days to look back (max 365)
sort_bystringNodatedate or amount
sort_orderstringNodescdesc or asc
limitintegerNo20Results per page (max 50)
offsetintegerNo0Pagination offset
Response fields:
FieldTypeDescription
total_matchesintegerTotal matching transactions before pagination
transactions[]arraySame shape as transactionHistory.transactions[]
Example prompts:
  • “Find all transactions over $500 in the last 90 days.”
  • “How much did I spend at coffee shops?“

recurringTransactions

Detects recurring patterns from bank data and splits them into inflows (income) and outflows (expenses). Parameters:
ParameterTypeRequiredDefaultDescription
statusstringNoactiveactive, inactive, irregular, or all
Top-level shape: {recurring_transactions: {outflows: [...], inflows: [...]}} . Outflow fields:
FieldTypeDescription
source_id / source_namestringStable ID and human label for the recurring source
account_idstringAccount the recurring transaction posts to
categoriesarrayDisplay category names
descriptionstringRepresentative description
frequencystringW weekly, BW biweekly, SM semi-monthly, M monthly, Q quarterly, Y yearly
average_amount / median_amount / last_amountstringStats across detected occurrences
statusstringactive, inactive, or irregular
first_detected / last_transaction_date / next_expected_datestringDetection window and forecast
logo_urlstring | nullBrand logo when MyTruv has one
historical_transactions[]arrayThe individual transactions used to detect this stream
Inflow fields: same shape as outflow plus income_type (e.g. PAYCHECK). Example prompt: “Show me all my active subscriptions.”

spendingAnalysis

Spending breakdowns grouped by category, merchant, or time period, with trend comparisons. Parameters:
ParameterTypeRequiredDefaultDescription
group_bystringYes-category, merchant, or time_period
time_periodstringYes-day, week, month, quarter, or year
start_datestringNo3 periods backStart date (YYYY-MM-DD)
end_datestringNoTodayEnd date (YYYY-MM-DD)
account_idsstringNoAllComma-separated account IDs
categoriesstringNoAllComma-separated category names
link_idstringNoAll linksFilter to a specific link
min_total_amountnumberNo50.00Group amounts below this threshold as Other
secondary_group_bystringNo-Only when group_by=time_period: nest a top-10 category or merchant breakdown inside each time bucket
INVESTMENT-type accounts (brokerage, crypto, IRA) are always excluded - stock buys, reinvestments, and margin interest are not personal spending.
Response fields (only the field matching group_by is populated; the other two stay null):
FieldTypeDescription
spending.by_category[].categorystringCategory name
spending.by_category[].total_amountstringTotal spent in the category
spending.by_category[].transaction_countintegerNumber of transactions
spending.by_category[].percentage_of_totalstringShare of total spending
spending.by_category[].trendstring | null% change vs prior period
spending.by_category[].subcategories[]arrayNested {name, amount, count} (>= min_total_amount)
spending.by_category[].time_series[]arrayPer-period {start_date, end_date, amount, count}
spending.by_category[].largest_transactionobjectThe biggest single transaction in this group
spending.by_merchant[]arraySame shape but keyed on merchant_name
spending.by_time_period[]arraySame shape but keyed on period_start / period_end
summary.total_spendingstringTotal across range
summary.average_daily_spendingstringAverage per day
summary.average_monthly_spendingstringAverage per month
summary.total_transactionsintegerTransactions analyzed
summary.unique_merchantsintegerDistinct merchants in range
summary.top_category / top_merchantstringHighest-spending category and merchant
request_idstringRequest identifier (useful for debugging)
created_atstringISO timestamp the analysis was run
Example prompts:
  • “Break down my spending by category this month.”
  • “Compare my spending month over month for the last quarter.”
Related: REST - Spending

incomeReport

Aggregates income from all connected sources and deduplicates entries that appear in both payroll and bank data. Returns one record per employer or income source. Parameters: none. Response fields:
FieldTypeDescription
employments[].link_idstringUse with getPayrollIncome or getBankIncome
employments[].data_sourcestringpayroll or financial_accounts
employments[].providerstringProvider slug (e.g. rippling, chase_bank)
employments[].companyobject{name, address, phone, ein} for payroll; {name} for bank-derived
employments[].incomestringIncome amount
employments[].income_unitstringYEARLY, MONTHLY, etc.
employments[].pay_ratestringPer-pay-period amount
employments[].pay_frequencystringW weekly, BW biweekly, SM semi-monthly, M monthly
employments[].is_activebooleanCurrently active
employments[].job_title / job_typestringTitle and F (full-time) / P (part-time) etc.
employments[].start_date / end_datestring | nullEmployment range
employments[].bank_income_categorystring | nullSet when data_source=financial_accounts
employments[].statement_countintegerPay statements available (payroll only)
summaryobject{total_employments, payroll_sources, bank_sources, deduplicated_bank_sources, connected_bank_links}
Example prompt: “What are my income sources?” Related: REST - Income

getPayrollIncome

Full payroll income report with pay stub history for a single connected payroll account - earnings, deductions, and year-to-date totals for the last 90 days.
Use the link_id from incomeReport - do not guess this value.
Parameters:
ParameterTypeRequiredDefaultDescription
link_idstringYes-link_id from incomeReport
Response fields:
FieldTypeDescription
statusstringdone when the report is ready
provider / data_sourcestringProvider slug, always payroll
employments[].companyobject{name, address, phone, ein}
employments[].is_active / job_title / job_typevariousRole status and metadata
employments[].start_date / end_date / employed_in_rolestringEmployment timeline
employments[].statements[].pay_datestringPayment date
employments[].statements[].period_start / period_endstringPay period covered
employments[].statements[].gross_pay / net_paystring | nullPer-statement totals (older statements may be null)
employments[].statements[].gross_pay_ytd / net_pay_ytdstring | nullYear-to-date totals
employments[].statements[].regular / overtime / bonus / commission / other_paystring | nullEarnings breakdown
employments[].statements[].earnings[]array{name, amount, category, rate, units} line items
employments[].statements[].deductions[]array{name, amount, category} (taxes, retirement, benefits)
employments[].annual_income_summary[]arrayPer-year {year, regular, bonus, commission, overtime, other_pay, net_pay, gross_pay}
Example prompt: “Show me my recent pay stubs from Acme Corp.”

getBankIncome

Income analysis derived from bank transactions for a single connected account. Identifies income streams with historical averages, pay frequency, and the transactions used for detection.
Use the link_id from incomeReport - do not guess this value.
Parameters:
ParameterTypeRequiredDefaultDescription
link_idstringYes-link_id from incomeReport
Response fields:
FieldTypeDescription
income_sources[].namestringSource name (e.g. employer)
income_sources[].categorystringIncome category
income_sources[].average_amountstringHistorical average per payment
income_sources[].frequencystringDetected frequency
income_sources[].transaction_countintegerTransactions analyzed
income_sources[].transactions[]arrayIndividual transactions used for detection
Example prompt: “Analyze the income deposits in my Chase checking account.”

recategorizeTransaction

Applies an override to a single transaction. Changes the category, renames the merchant as it appears in MyTruv, hides it from spending totals, or flags it as recurring or an internal transfer. Only the fields you pass are changed. After writing, the response surfaces similar transactions from the same merchant so you can optionally extend the change.
Pass confirmed=false (or omit it) on your first call when the user names only a merchant without pointing to a specific transaction. The tool returns candidates without writing. Once the user confirms which transaction they mean, call again with confirmed=true.
Parameters:
ParameterTypeRequiredDefaultDescription
transaction_idstringYes-ID from searchTransactions or transactionHistory
categorystring | nullNo-Display name (e.g. "Groceries") or slug (e.g. "groceries")
merchant_namestring | nullNo-Rename the merchant on this transaction
hidebool | nullNo-true hides from spending; false un-hides
mark_recurringbool | nullNo-true flags as a recurring bill or subscription
mark_internal_transferbool | nullNo-true flags as a transfer between your own accounts
confirmedboolNofalseSet true only after the user has confirmed which transaction they mean
allow_customboolNofalseSet true only if the user insists on a category name that does not exist in the catalog
Response (write succeeded):
FieldTypeDescription
overrideobjectThe merged override state applied to the transaction
merchant_namestringThe merchant matched
similar_transactions[]arrayUp to 20 other transactions from the same merchant (last 90 days)
total_similarintegerTotal count of other matching transactions
preview_truncatedbooltrue if there are more than 20 similar transactions
rule_existsboolWhether a standing rule already exists for this merchant
next_actions[]arraySuggested follow-up calls (e.g. bulkRecategorizeTransactions, createCategorizationRule)
Response (confirmation required):
FieldTypeDescription
statusstring"confirmation_required"
merchant_namestringThe merchant matched
similar_transactions[]arrayCandidate transactions to show the user
total_similarintegerTotal count
messagestringInstructions to present candidates and ask the user to confirm
Example prompts:
  • “Change the category on that Costco charge to Groceries.”
  • “Rename that AMZN MKTPL transaction to Amazon.”
  • “Hide this transfer from my spending.”

bulkRecategorizeTransactions

Applies the same override to multiple transactions at once. Intended as a follow-up to recategorizeTransaction when the user agrees to extend the change to similar past transactions. Accepts up to 200 transaction IDs. For applying a change to all future transactions from a merchant, use createCategorizationRule instead. All IDs are verified as belonging to the authenticated user before any writes are made. If any ID is not found, the entire call fails with an error. Parameters:
ParameterTypeRequiredDefaultDescription
transaction_idsstringYes-Comma-separated transaction IDs (max 200)
categorystring | nullNo-Display name or slug (same semantics as recategorizeTransaction)
merchant_namestring | nullNo-Rename the merchant on all listed transactions
hidebool | nullNo-Hide or un-hide the transactions
mark_recurringbool | nullNo-Flag or un-flag as recurring
mark_internal_transferbool | nullNo-Flag or un-flag as an internal transfer
allow_customboolNofalseSame semantics as recategorizeTransaction
At least one of category, merchant_name, hide, mark_recurring, or mark_internal_transfer must be provided. Response:
FieldTypeDescription
applied_countintegerNumber of transactions successfully updated
transaction_ids[]arrayThe input IDs echoed back
Example prompt: “Apply that same Groceries category to the other Costco transactions you found.”

createCategorizationRule

Creates a standing rule so that future transactions from a merchant are automatically categorized. By default the rule also applies retroactively to all past transactions from that merchant. Use this as a follow-up after recategorizeTransaction when the user wants the change to stick permanently. If a rule already exists for the merchant, the tool returns an error with the existing rule ID. Rules can be managed in MyTruv settings; editing or deleting a rule via the MCP is not yet supported. Parameters:
ParameterTypeRequiredDefaultDescription
merchant_namestringYes-The merchant to match (case-insensitive, max 500 characters)
categorystring | nullNo-Display name or slug to apply to matching transactions
custom_merchant_namestring | nullNo-Rename the merchant across all matching transactions
hidebool | nullNo-Hide matching transactions from spending views
mark_recurringbool | nullNo-Mark matching transactions as recurring
mark_internal_transferbool | nullNo-Mark matching transactions as internal transfers
apply_to_pastboolNotruetrue applies retroactively to all existing transactions; false applies only to transactions dated after the rule is created
allow_customboolNofalseSame semantics as recategorizeTransaction
At least one of category, custom_merchant_name, hide, mark_recurring, or mark_internal_transfer must be provided. Response:
FieldTypeDescription
rule.rule_idstringUUID of the new rule
rule.match_merchant_namestringThe merchant name being matched
rule.custom_categorystring | nullCategory applied by the rule
rule.custom_merchant_namestring | nullMerchant rename applied by the rule
rule.is_hiddenbool | nullWhether matching transactions are hidden
rule.is_recurringbool | nullWhether matching transactions are flagged recurring
rule.is_internal_transferbool | nullWhether matching transactions are flagged as transfers
rule.scopestringALL (retroactive) or FORWARD_ONLY
rule.created_at / updated_atstringISO timestamps
Example prompts:
  • “Always put Costco in Groceries going forward.”
  • “Set a rule so all Venmo transactions are marked as internal transfers.”

Next steps

Try these prompts

Ready-to-use prompts that exercise these tools.

REST API

Programmatic access without an AI assistant.