Overview
This page is the detailed reference for the financial tools your AI assistant can call through the AI2Fin MCP server. For a high-level catalog grouped by category, see the Tools Overview. To get connected, start with the Quickstart. Every tool listed here is registered in the server’s tool registry (src/mcp/tools/index.ts → allTools). If a name does not appear on this page, an assistant cannot call it.
How the consolidated tools work
The MCP surface is deliberately small: related operations fold into a single tool with a mode parameter rather than shipping one tool per operation. Three parameter names carry that dispatch, and which one a tool uses tells you what kind of tool it is:
Parameters are shared across the whole tool, so most are optional and only meaningful for particular views or actions. Each tool below notes which is which. Tools that take an
action require it; tools that take a view default to their most common one.
Execution & safety
- Every tool requires authentication and is scoped to your account only.
- Read operations return data instantly. Write operations return a confirmation step first on clients other than Meta Muse (which asks the user itself before each write), so nothing changes until the call is repeated with the
confirmToken. - Every response follows the same envelope:
{ success: true, data: { ... } }on success,{ success: false, error: "..." }on failure. - Some tools are plan-gated.
query_lens/manage_lensneed Elite+ or Auto+, as do the category-set and audit-history views; the tax-filing, asset and place write-off tools need thetax_filingfeature. A gated call fails withtool_failedanddata.requiredPlansplus anupgradeUrlrather than throwing — the plan-to-tool table is on Account, plans and feature access.
Bank-connected data. Transaction-reading tools return everything in your 2Fin ledger: manual entries, CSV imports, API-created records and transactions synced from bank accounts you have connected. Account numbers, card numbers and similar identifiers are stripped before a result leaves the server.
Transactions (4 tools)
query_transactions
Retrieve transactions by filter, or search them by meaning.
view—filter(default) orintelligence- Parameters (
filterview):{ startDate?, endDate?, merchant?, q?, isTaxDeductible?, categoryId?, minAmount?, maxAmount?, amountEquals?, placeIds[]?, limit?, page?, pageSize? }—pageSizedefaults to 50; filter rows carryplace({ id, name, part, inherited }ornull) - Parameters (
intelligenceview):{ keywords[], transactionTypes[], categories[], startDate?, endDate?, includeTotals?, includeAnalytics? } - Returns:
{ success, data: { transactions, count, totalCount, pagination: { page, pageSize, totalPages, hasNextPage, hasPreviousPage }, filters } } - Usage: Use
filterfor anything expressible as a field match. Useintelligencefor fuzzy intent — “travel-related”, “marketing spend” — where the category may not be set.transactionTypesacceptsexpense,income,transfer.
analyze_spending
Five spending analyses behind one tool.
view—analytics(default),by_category,top_merchants,compare_periods,outlook- Common parameters:
{ startDate?, endDate?, period?, limit? }—periodaccepts the presetsthis_month,last_month,this_year,last_year,this_quarter,last_quarter,this_fy,last_fy,ytd,all_time. - Parameters (
analyticsview):{ transactionTypes[]?, categories[]?, isTaxDeductible?, hasReceipt?, gstIncluded?, minBusinessUse?, maxBusinessUse?, minAmount?, maxAmount?, merchantContains?, descriptionContains?, search? } - Parameters (
compare_periodsview):{ period1Start, period1End, period2Start, period2End, groupBy? }—groupByiscategory(default),merchant, ortotal - Parameters (
outlookview):{ includeActual?, includeProjected?, includeOverdue? } - Returns (
outlookview): - Usage:
outlookanswers “what will I owe in the next 60 days?” by blending settled expenses with upcoming bill occurrences, without double-counting transactions already linked to a bill.
get_tax_summary
- Parameters:
{ startDate?, endDate?, period?, includeConfidenceAnalysis?, includeGSTBreakdown?, compareWithPreviousPeriod? } - Returns:
{ success, data: { totalCount, totalAmount, byCategory, dateRange } }plus confidence and GST/VAT blocks when requested. - Usage: “What’s my tax-deductible percentage?”, “How much can I claim this FY?” Pass
period: "last_fy"instead of computing date bounds yourself.
create_transaction
- Parameters:
{ description, amount, date?, merchant?, categoryId?, type? }—descriptionandamountare required.datedefaults to now;type(debitorcredit) is inferred from the sign ofamountwhen omitted. - Returns:
{ success, data: { transaction }, rulesApplied, message } - Usage: Your custom rules run against the new transaction, and
rulesAppliedreports which ones matched.
Transaction operations (2 tools)
modify_transactions
action(required) —update,categorize,apply_analysis,set_splits,tag,untag- Parameters (
update):{ transactionIds[], updates: { categoryId?, isTaxDeductible?, businessUsePercentage?, notes?, placeId?, placeUse?, expenseType?, businessPurpose?, attendees[]? } }—placeUseisshared,rental,businessorprivate - Parameters (
categorize):{ categoryId, transactionIds[]?, filterByMerchant?, filterStartDate?, filterEndDate? } - Parameters (
apply_analysis):{ transactionId, categoryId?, categoryName?, isTaxDeductible?, businessUsePercentage?, gstIncluded?, gstAmount? } - Parameters (
set_splits):{ transactionId, lines[] }— each line carries its own category, place and tax flags; amounts must add up to the transaction’s amount, and[]clears the split - Parameters (
tag/untag):{ categoryId, transactionIds[]? | startDate? + endDate?, expensesOnly? }— adds or removes an extra category (a trip, client or project from a project/client lens) while keeping each transaction’s main category - Returns:
{ success, data: { updatedCount, ... , message } } - Usage:
categorizecan work by merchant instead of by ID — “categorize everything from Officeworks as Office Expenses” needs no lookup pass first.apply_analysissaves the values you accepted fromanalyze_transactions; GST is calculated and filled in for you.tagby date range answers “everything on my card in Sydney Mon–Fri is the Acme trip”. Nothing here deletes.
analyze_transactions
action(required) —categorize,tax,bulk_tax,smart_categorize,find_duplicates- Parameters (
categorize):{ transactionId, merchant?, description?, amount? } - Parameters (
tax):{ transactionId } - Parameters (
bulk_tax):{ transactionIds[]?, filterByCategory?, filterStartDate?, filterEndDate?, limit? } - Parameters (
find_duplicates):{ startDate, endDate, toleranceHours?, amountTolerance? }— defaults are 72 hours and 0.01 - Returns (
categorize): - Returns (
tax): - Usage: These actions suggest; they don’t save. Feed what the user accepts back through
modify_transactionswithaction: "apply_analysis". Thetaxresult includes a GST/VAT breakdown based on your region and preferences.
The
smart_categorize action is registered but not yet served over MCP — it returns a not-available response. Use action: "categorize" for per-transaction suggestions in the meantime.Bills (4 tools)
query_bills
view—patterns(default),upcoming,overdue,occurrences,summary,financial,transactions- Parameters (
patterns):{ active? }→{ success, data: { bills, count } } - Parameters (
upcoming):{ days?, includeOverdue? }— defaults 30 days, overdue excluded →{ success, data: { occurrences, count, daysAhead } } - Parameters (
occurrences):{ isPaid?, startDate?, endDate?, merchantName?, billPatternId?, limit? }→{ success, data: { occurrences, count, totalAmount, filters } } - Parameters (
summary): none →{ success, data: { totalBills, monthlyTotal, byFrequency, bills } } - Parameters (
financial):{ billPatternId? | merchantName?, period, startDate?, endDate?, includeProjections? }—periodis one offinancial_year,year_to_date,calendar_year,all_time,custom - Parameters (
transactions):{ billPatternId }— payment history for one bill - Usage: The
financialview identifies the pattern by eitherbillPatternIdormerchantName, so “how much have I paid Telstra this FY?” resolves in one call.
manage_bill_pattern
action(required) —create,update,delete,set_splits- Parameters (
create):{ merchantName, amount, firstDueDate, frequency, description?, categoryId?, isTaxDeductible?, businessUsePercentage?, autoPayEnabled?, notes?, patternType? }—frequencyisWEEKLY,FORTNIGHTLY,MONTHLY,QUARTERLY, orYEARLY;patternType: "recurring_income"makes it money in (rent received, salary) rather than a bill - Parameters (
update):{ billPatternId, ...any create field, isActive? } - Parameters (
delete):{ billPatternId } - Parameters (
set_splits):{ billPatternId, lines[] }— a percent-line template applied to every future payment that has no lines of its own; percents must sum to 100 (2–50 lines),[]clears it - Usage: Pausing a bill is an update with
isActive: false— there’s no separate toggle tool.deletepermanently removes the pattern and its scheduled payments; its bank transactions are kept, unlinked.
manage_bill_payment
action(required) —pay,create,update,delete,batch_update,bulk_pay,attach_receipt- Parameters (
pay):{ occurrenceId, paidDate?, actualAmount?, transactionId?, createTransaction?, notes? } - Parameters (
create):{ billPatternId, dueDate, amount, isPaid? } - Parameters (
update):{ occurrenceId, amount?, dueDate?, status? }—statusispendingorpaid - Parameters (
batch_update):{ updates[] }— each entry is an object of{ id, amount?, status?, dueDate? } - Parameters (
bulk_pay):{ occurrenceIds[], createTransactions? } - Parameters (
attach_receipt):{ occurrenceId, receiptUrl, receiptFileName?, notes? } - Usage: On
pay, passtransactionIdto link an existing transaction as the payment. Leave it out and a transaction is created for you unless you setcreateTransaction: false.
link_bills
action(required) —link,unlink,auto_link,suggest_patterns- Parameters (
link):{ transactionId, occurrenceId? | billPatternId?, autoDetect? } - Parameters (
unlink):{ occurrenceId } - Parameters (
auto_link):{ limit?, dryRun? }— defaults to 100 transactions, changes applied - Parameters (
suggest_patterns):{ minOccurrences?, lookbackDays? }— defaults 3 occurrences over 365 days - Usage: Run
auto_linkwithdryRun: trueto preview matches before committing them.suggest_patternsreads your transaction history and proposes recurring bills you haven’t set up yet.
Categories (3 tools)
query_categories
view—categories(default),sets,active_set,all- Parameters:
{ categorySetId?, isActive?, type?, includeInactive?, includeCategories? }—typeisexpenseorincome - Usage:
allreturns categories and sets together as{ categories, categorySets }, which saves a round trip when an assistant is building a picker.
manage_category
action(required) —create,update,delete,move_to_set- Parameters:
{ categoryId?, name?, color?, emoji?, icon?, description?, type?, categorySetId?, isActive?, targetSetId? } - Usage: Archiving is
action: "update"withisActive: false.move_to_setand assigningcategorySetIdon create require Elite+.
manage_category_set
action(required) —create,update,delete,set_active,duplicate- Parameters:
{ setId?, name?, description?, color?, icon?, isActive?, migrateToSetId?, newName? } - Usage: Elite+ only. On
delete, categories move tomigrateToSetIdif given, otherwise to the default set — they aren’t deleted with the set.
Tax filing (6 tools)
query_tax_filing
view—jurisdictions(default),statements,statement,audit,auto_populate- Parameters:
{ jurisdictionId?, statementId?, periodStart?, periodEnd? } - Usage: BAS/VAT/GST retrieval.
auto_populatecomputes draft figures for a period from your transactions;auditreturns the change trail for a statement.
manage_tax_filing
action(required) —create_jurisdiction,update_jurisdiction,delete_jurisdiction,create_statement,update_statement,delete_statement,submit_statement,mark_lodged,start_amendment,mark_exported- Jurisdiction fields:
{ jurisdictionId?, countryCode?, stateProvince?, businessName?, taxIdentifier?, taxIdentifierType?, filingFrequency?, accountingBasis?, isSimplifiedBAS?, isPrimary?, isActive?, customFormSchema? }—filingFrequencyismonthly,quarterly, orannual;accountingBasisisaccrualorcash - Statement fields:
{ statementId?, periodStart?, periodEnd?, periodLabel?, formVersion?, autoPopulatedValues?, finalValues?, calculatedTotals?, manualOverrides?, customFieldValues?, status?, notes? }—statusisdraft,review, orfinal - Submit/lodge/export fields:
{ submittedRef?, lodgedAt?, format? } - Usage:
submit_statementandmark_lodgedrecord that you lodged a final statement yourself (with the accepted declaration and the date) and store the authority’s reference;start_amendmentopens an amendment of a lodged statement. Nothing is sent to any tax authority. This is a sensitive write — Muse asks the user before every call and is not offered it over MCP.
get_tax_filing_guidance
- Parameters:
{ countryCode?, frequency?, fiscalYear?, includeSchema?, includeOfficialCountries?, question? }—countryCodedefaults toAU - Usage: Returns the filing authority, portal links, valid frequencies, exact period start/end dates, and export formats for a country. Pass
questionto get back only the form fields relevant to what was asked.
query_tax_estimators
view—overview(default),student_loan,superannuation- Parameters:
{ countryCode?, taxYear?, repaymentIncome?, ordinaryEarnings?, salarySacrifice?, personalDeductible?, otherTaxableIncome? }—taxYeartakes a label like"2025-26"; both default to the user’s profile country and the year active today - Usage:
student_loanestimates compulsory study/training-loan repayments (AU HELP/HECS) fromrepaymentIncome.superannuationestimates mandatory retirement contributions fromordinaryEarnings. Figures come from officially published rates and are indicative general information, not personal tax or financial advice.
lookup_tax_reference
- Parameters:
{ question, countryCode?, verify? }—questionis the user’s tax question in plain words;countryCodedefaults to the profile country (curated references for AU, GB, US, NZ, CA and IN, the authority on record elsewhere);verifylive-checks each URL (default true) - Returns: the tax authority, matching official pages with a verification status and last-verified date, a fallback search URL on the authority’s site, and the disclaimer to show
- Usage: The one tool that reads the open web (
openWorldHint: true) — use it when the user asks about a tax rule and wants a citable source. Read-only, every plan, 20 calls a minute. General information only, not personal advice.
get_tax_estimate
- Parameters: none
- Returns: the current-year income tax estimate as the app shows it — income by type, deductions, tax, tax already withheld, refund or amount owing, notes on what is not counted — plus
invoicesOwed(money still owed to the user, never counted in the estimate) with an optional what-if if it were paid by year end - Usage: The estimate is on every plan; the write-offs inside it need the
tax_filingfeature (Elite+, Auto+). It is built from your transactions, including connected bank accounts.
Receipts (2 tools)
process_receipt
mode—smart(default),analyze_only,commit,upload_file,suggest_splits- Parameters (receipt modes):
{ assetUrl, mimeType, size, sha256? } - Parameters (
suggest_splits):{ transactionId }— proposes a split from the transaction’s matched receipt line items; read-only, apply it withmodify_transactionsset_splits - Parameters (
smart):{ autoLinkToBill?, autoCreateBill? }— both default true - Parameters (
commit):{ extracted?, action }—actiondescribes the outcome: link to an existing transaction, or create one - Parameters (
upload_file):{ fileUrl? | fileData?, fileName, columnMapping?, autoLinkToBills?, autoCategorize?, sheetIndex?, bankName? } - Returns (
analyze_only):{ success, data: { extracted, candidates, asset } } - Usage:
smartis the recommended path — it extracts the merchant, totals and GST, matches the receipt against your bills, and creates the transaction in one call. Useanalyze_onlythencommitwhen you want the user to confirm the extracted fields in between.upload_fileis the CSV/Excel import path, not a receipt path. Needs thereceipt_capturefeature (Pro, Elite+); 10 calls a minute.
get_receipt_upload_url
- Parameters:
{ mimeType, size, fileName?, sha256? }—mimeTypeis one ofimage/jpeg,image/png,image/heic,image/webp,application/pdf;sizeis the exact byte count, up to 10 MB - Returns:
- Usage: The
/mcprequest body is capped at 256 KB, so a phone photo or PDF can’t travel inline. Call this first,PUTthe raw bytes touploadUrlwith exactly the returned headers, then callprocess_receiptwith the returnedassetUrl(thenextblock is that call, ready to send). The URL lasts 10 minutes and no record changes untilprocess_receiptruns. Same plan gate and rate limit asprocess_receipt.
Travel (2 tools)
query_travel
view—trips(default),profile,vehicles,deduction_summary,trip_transactions- Parameters (
trips):{ from?, to?, vehicleId?, tripType?, limit? }—tripTypeisBUSINESSorEMPLOYEE, limit defaults to 200 - Parameters (
deduction_summary):{ year }→{ success, data: { countryCode, period: { from, to }, totalKm, byVehicle } } - Parameters (
trip_transactions):{ tripId, dateToleranceDays? } - Returns (
profile):{ success, data: { countryCode, currency, defaultMethod } }
manage_trip
action(required) —create,update,bulk_link_transactions- Parameters (
create):{ tripDate, purpose, distanceKm, tripType?, vehicleId?, startOdometer?, endOdometer?, startLocation?, endLocation?, categoryId?, isReturnJourney?, notes? }— givedistanceKm(odometer readings are optional);vehicleIddefaults to the user’s only vehicle;categoryIdgroups the trip under a trip/client/project category - Parameters (
update):{ id, ...any create field } - Parameters (
bulk_link_transactions):{ tripId?, transactionIds[]?, autoMatch?, dateToleranceDays? } - Usage: “Drove 45 km from home to the Acme office for a client meeting” is one
createcall withdistanceKm: 45,startLocation,endLocationandpurpose.bulk_link_transactionsmatches expenses to trips by date and returns the proposed pairings — the links are suggestions and are not persisted. Retry-safe: a repeated identicalcreatereturns the existing trip withalreadyExisted: true.
Rules (2 tools)
query_rules
- Parameters:
{ isActive?, name?, limit?, testConditions?, sampleLimit? } - Usage: Without
testConditionsthis lists your rules. WithtestConditionsit switches to a dry run, evaluating those conditions against recent transactions instead of listing anything:Returns{ success, data: { tested, matchedCount, sampleIds } }— sample size defaults to 200.
manage_rule
action(required) —create,update,delete- Parameters:
{ id?, name?, description?, isActive?, priority?, conditionLogic?, targetEntityType?, conditions?, actions? }—conditionLogicisANDorOR;targetEntityTypeistransaction,bill_pattern,bill_occurrence, orall; lowerpriorityruns first - Usage: Enabling and disabling is
action: "update"withisActive— there’s no separate enable tool. Dry-run a rule withquery_rulesbefore saving it.
User profile (2 tools)
get_user_info
view—all(default),profile,subscription,feature_access,quota- Parameters:
{ feature?, quotaFeature?, amount? }—quotaFeatureis one ofai_transactions,bank_imports,exports,custom_rules - Returns (
profile): - Usage:
allreturns{ profile, subscription }together. Usefeature_accesswithfeatureto check one gated capability, andquotato read usage limits — omitquotaFeaturefor overall usage.
set_user_preferences
- Parameters (any subset):
{ countryCode?, businessType?, industry?, profession?, aiContextInput?, hasStudyLoan? } - Returns:
{ success, data: { userId, updated: [] } }—updatedlists the field names that changed - Usage:
countryCodeis an ISO code;businessTypeisINDIVIDUAL,SOLE_TRADER,COMPANY, and so on. SethasStudyLoan: trueto include compulsory study/training-loan repayments in the tax forecast, ornullto clear it back to unknown.
Entities (1 tool)
get_entity_details
view—relationships(default),receipts,history,field_history,all- Parameters:
{ transactionId?, entityType?, entityId?, fieldName? }—entityTypeistransaction,expense,bill, orbillPattern - Usage:
relationshipsreturns the bills, trips, receipts and rules attached to a transaction;alladds the receipt files. Thehistoryandfield_historyviews return the change audit trail and require Elite+.
Smart suggestions (2 tools)
get_suggestions
type(required) —budgets,rules,tax_deductions- Parameters (
budgets):{ lookbackMonths?, categories[]? }— defaults to 6 months - Parameters (
rules):{ lookbackDays?, minOccurrences? }— defaults 90 days and 3 occurrences - Parameters (
tax_deductions):{ period?, minAmount? }—perioddefaults tothis_year,minAmountto 10 - Usage: Suggestions only; nothing is created.
budgetsproposes realistic amounts from your spending,rulesspots categorization patterns worth automating, andtax_deductionssurfaces claims you may have missed.
create_expense
- Parameters:
{ description, amount, date, merchant?, categoryId?, isTaxDeductible?, businessUsePercentage? }—description,amountanddateare required, andamountis positive - Usage: Manual expense entry. Your custom rules run against it automatically. Use
create_transactioninstead when you’re recording a bank-style debit or credit.
Lenses (2 tools)
A lens is a category set promoted to a switchable organising axis — Tax, Project, Department, Client, or Custom. Both tools require Elite+ or Auto+.query_lens
- Parameters: none
- Returns:
{ success, data: { hasAccess, tier, count, lenses: [{ id, name, lensType, isPrimary, isActive, categoryCount }], accessNote } } - Usage: Answers “what lenses do I have?” and tells the assistant whether the plan includes the feature at all, so it can explain rather than fail.
manage_lens
action(required) —set_primary,update- Parameters:
{ lensId, lensType?, isActive? }—lensIdis required and comes fromquery_lens;lensTypeistax,project,department,client, orcustom - Usage:
set_primarychooses the lens the app opens with. Creating and deleting lenses is done on the Categories page, not through MCP. Without the plan, calls returnsuccess: falsewitherror: "feature_locked".
Budgets (2 tools)
query_budget
- Parameters:
{ detail?, goals?, startDate?, endDate? } - Usage: Answers “am I on budget?” or “how much do I have left?” Set
detail: truefor a full per-category breakdown — budgeted vs. actual, % used, RAG status — alongside income and savings context and what is still to come this cycle (committedbills andexpectedIncome). Setgoals: truefor savings goals (“how much a week to save $5,000 by June?”): each goal’s target, saved, remaining, deadline, percent andperWeekNeeded/perMonthNeeded. Figures are per currency. Returns setup guidance if there’s no budget yet.
manage_budget
action(required) —create_budget,set_limit,update_limit,delete_limit,set_income_target,create_goal,update_goal,contribute_goal,withdraw_goal- Parameters (
create_budget):{ name, currency?, periodType?, startDay? }— name is 1–100 characters and unique; currency defaults to AUD, period to monthly, start day to 1 - Parameters (
set_limit):{ budgetId?, categoryId? | categorySetId?, limitAmount, frequency? }— exactly one ofcategoryIdorcategorySetId;budgetIddefaults to the active budget - Parameters (
update_limit/delete_limit):{ itemId, limitAmount?, frequency? } - Parameters (
set_income_target):{ budgetId?, monthlyIncomeTarget }— 0 or omitted clears the target - Parameters (
create_goal):{ name, targetAmount, deadline?, budgetId? }—deadlineis an ISO date; name is 1–100 characters - Parameters (
update_goal):{ goalId, name?, targetAmount?, deadline?, isActive? }—deadline: nullclears it - Parameters (
contribute_goal/withdraw_goal):{ goalId, amount, note? }—amountis positive; a withdrawal cannot exceed the goal’s balance - Usage: Reading status and goal pace is
query_budget; this tool only writes, and always confirms the change with you first. Goals cannot be deleted here — deactivate withupdate_goalandisActive: false. Retry-safe:create_goalwith an existing name returns that goal (alreadyExisted: true), and an identicalcontribute_goalwithin 10 minutes does not move the money twice.
get_suggestions with type: "budgets".
Income & insights (2 tools)
query_income
- Parameters: none
- Returns:
{ success, data: { monthlyTotal, source, streams } }when recurring income streams are detected, otherwise{ success, data: { monthlyTotal, source: "transactions", breakdown, note } } - Usage: “What’s my income?”, “How much do I earn a month?” When no salary or regular-deposit stream has been detected, the figure is estimated from the last three months of income transactions and
sourcesays so — surface that caveat rather than quoting the number flat.
query_insights
view—cashflow(default) orbudget- Parameters:
{ startDate?, endDate? }— cashflow only; defaults to the last 90 days - Returns (
cashflow):{ success, data: { period, income, expenses, net, savingsRatePct, topExpenseCategories } } - Returns (
budget):{ success, data: { hasBudget, onTrack, overallUtilization, overBudgetCategories } } - Usage: “How am I doing?”, “Where’s my money going?”, “What’s my savings rate?” Transfers are excluded from cashflow so internal moves between your own accounts don’t read as income or spending.
Vehicles (1 tool)
manage_vehicle
action(required) —create,update,delete- Parameters (
create):{ registration, description, ownership?, vehicleType? }— bothregistrationanddescriptionare required;ownershipisOWNED(default),LEASED, orHIRE_PURCHASE;vehicleTypeisCAR(default),MOTORCYCLE,VAN, orTRUCK - Parameters (
update):{ id, registration?, description?, ownership?, vehicleType?, isActive? } - Parameters (
delete):{ id } - Usage: Write-only — reading your vehicles is
query_travelwithview: "vehicles". Deletion is confirmed with you first.
Assets (2 tools)
The depreciating-asset register. Both tools need Elite+ and thetax_filing feature (Elite+, Auto+).
query_assets
view—register(default),asset,unregistered,depreciation_schedule,tpar,profit_loss,explainer- Parameters:
{ assetId?, includeInactive?, includeDisposed?, limit?, financialYear?, fyStart?, fyEnd?, countryCode?, basis? }—basisisgst_inclusiveorgst_exclusive; report views takefinancialYearor an explicitfyStart/fyEnd - Usage:
unregisteredlists capital purchases in the bank feed that aren’t on the register yet;depreciation_schedulegives the decline in value per asset for one income year;tparis Australia only;explainersays what depreciation means in the user’s country, which methods apply and the write-off threshold.
manage_asset
action(required) —create,update,dispose,delete,register_from_transaction,dismiss_unregistered,undismiss- Parameters:
{ assetId?, transactionId?, bankTransactionId?, name?, description?, categoryKey?, acquisitionDate?, cost?, secondElementCost?, method?, effectiveLifeYears?, taxableUsePercent?, openingAdjustableValue?, disposalDate?, terminationValue?, notes?, isActive?, placeId?, placeUse? }—createneedsname,acquisitionDate,costandmethod;disposeneedsdisposalDateandterminationValue - Usage:
register_from_transactionseeds an asset from a bank purchase (name, date, cost and property come from the transaction; you supplymethodandeffectiveLifeYears). A sensitive write — it changes the depreciation the user claims, so Muse asks before every call and is never offereddispose,delete,dismiss_unregisteredorundismiss.
Places (2 tools)
A place is a property — home, rental, vehicle, business premises — and a second axis beside the category: a repair at a rental is still “Repairs”.query_places
view—list(default),summary,write_offs- Parameters:
{ placeId? | name?, from?, to?, financialYear?, includeArchived? }— pick a property by id or name; period isfrom/to(YYYY-MM-DD) orfinancialYear, none means everything on record - Usage:
listreturns every property with its kind, ownership, rented and business shares, and cash spent or received.summaryis one property’s cash picture — totals, the split between rented, business and private parts, net rental cash, spend by category, its bills and assets, and for a home the treatment of its answers.write_offs(Elite+,tax_filing) adds depreciation and capital works and where they’re reported.
manage_place
action(required) —create,update,archive,restore,assign_transactions,assign_bill,clear- Parameters:
{ placeId? | placeName?, name?, kind?, reference?, notes?, ownershipPercent?, rentalPercent?, businessPercent?, acquiredOn?, isNewBuild?, transactionIds[]?, billPatternId?, placeUse? }—kindishome,rental,vehicle,businessorother; rented + business shares ≤ 100, the rest is private;placeUseisshared,rental,businessorprivate - Usage: Free on every plan.
assign_billputs a recurring bill at a property, so every payment it matched — past and future — is there too;cleartakes transactions or a bill off their property. Deleting a property is only possible in the app.
Expected income and upcoming money (3 tools)
2Fin does not create or send invoices. These tools track what you are owed and what is coming up, so an assistant can draft an invoice in your own invoicing tool and answer “what do I owe before payday?”query_expected_income
view—open(default),by_payer,work_done- Parameters:
{ payer?, status?, startDate?, endDate? }—statusisopen(default: expected, partly paid and overdue),expected,partly_paid,overdue,paid,written_offorall;by_payerandwork_donedefault to the last 90 days - Usage:
openlists money still owed with client, invoice number, amount, due date, received and outstanding.by_payeris income received per client over a period.work_doneis the work activities and hours recorded at your places plus business trips from the logbook — “what should I invoice for last month?”
record_expected_income
- Parameters:
{ payerName, amount, dueDate, reference?, gstAmount?, currency?, categoryId?, placeId?, frequency?, kind?, notes? }—payerName,amount(GST included, positive) anddueDate(YYYY-MM-DD) are required;referenceis the invoice number from your tool;kindisinvoice(default),rent,pay,other_income,refund,repaymentorsale - Usage: “I invoiced Acme $2,400 due 15 Oct” — records what is owed and matches the payment when it arrives.
refund,repaymentandsaleare filed as money coming back, never as earnings. Sends nothing to anyone.
get_upcoming_money
- Parameters:
{ days?, direction?, placeId?, includeEstimates? }—daysdefaults to 14;directionisin,out,move(your own money moving — transfers, investments) orall;includeEstimates(default true) adds estimated pay days from your employers - Returns:
{ success, data: { window: { from, to, days }, reportingCurrency, totals, rows: [{ direction, certainty, status, stillToCome, ... }], truncated, note } }—certaintyisscheduledorestimated;statusisupcoming,due_today,overdue,partly_receivedand so on; totals are per currency - Usage: Bills due, expected income, later dates of recurring income and estimated pay days in one feed — “what’s coming up this fortnight?”, “when is rent due?”. Expected money is not received money.
Renamed and consolidated tools
If you have prompts or scripts referencing older tool names, these are where they went. The names in the left column are no longer registered and cannot be called.Tool Count Summary
Counted from the tool registry itself (src/mcp/tools/index.ts → allTools), not maintained by hand:
Why 44 and not a bigger number. The MCP surface was deliberately consolidated: rather than one tool per operation, related operations fold into a single tool with a mode parameter (
query_transactions, manage_bill_pattern, and so on). Fewer, broader tools fit inside an assistant’s tool-selection budget and are easier for a model to pick between correctly. Of the 44, 23 only read, 19 write your own records and 2 are sensitive writes (manage_asset, manage_tax_filing). The same catalogue is published as JSON at https://api.ai2fin.com/.well-known/mcp-server/tools.json. An in-app assistant sees 45 — these 44 plus a request_more_tools escape hatch added at the orchestrator layer.request_more_tools
The one tool on this page that isn’t in allTools. The chat orchestrator adds it to every request so the model is never stuck: if none of the tools it was given can serve the request, it calls this with a short reason and the orchestrator widens the tool set and retries.
- Parameters:
{ reason }— a brief description of the capability needed - Usage: You never call this yourself. It exists so that trimming the tool list for a given turn can’t silently cost you a capability.
