Tool tree
gradeNot graded
loan_listAnswer
List every loan in the user's profile with its EMI, outstanding balance, months remaining and interest still to be paid. Call this first whenever a question involves debt, and before calling any other loan_* tool, so you know which loan ids exist.
View tool JSON
{
"name": "loan_list",
"kind": "answer",
"impl": "imperative",
"description": "List every loan in the user's profile with its EMI, outstanding balance, months remaining and interest still to be paid. Call this first whenever a question involves debt, and before calling any other loan_* tool, so you know which loan ids exist.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}loan_addAction
Add a new loan to the user's profile. Use this when the user describes a debt they hold. Returns the computed EMI and the new loan's id.
View tool JSON
{
"name": "loan_add",
"kind": "act",
"impl": "imperative",
"description": "Add a new loan to the user's profile. Use this when the user describes a debt they hold. Returns the computed EMI and the new loan's id.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Human label, e.g. \"Home loan - Sector 62 flat\"."
},
"principal": {
"type": "number",
"description": "Original sanctioned principal amount."
},
"annualRatePct": {
"type": "number",
"description": "Nominal annual interest rate as a percentage, e.g. 8.6."
},
"termMonths": {
"type": "number",
"description": "Original tenure in months."
},
"kind": {
"type": "string",
"enum": [
"home",
"auto",
"education",
"personal",
"credit_card",
"other"
],
"description": "Category of loan."
},
"monthsPaid": {
"type": "number",
"description": "How many EMIs have already been paid. Defaults to 0."
}
},
"required": [
"name",
"principal",
"annualRatePct",
"termMonths"
],
"additionalProperties": false
}
}loan_removeAction
Remove a loan from the profile by its id. Use when a loan was entered by mistake or has been closed.
View tool JSON
{
"name": "loan_remove",
"kind": "act",
"impl": "imperative",
"description": "Remove a loan from the profile by its id. Use when a loan was entered by mistake or has been closed.",
"inputSchema": {
"type": "object",
"properties": {
"loanId": {
"type": "string",
"description": "The loan's id, from loan_list."
}
},
"required": [
"loanId"
],
"additionalProperties": false
}
}loan_emi_calculatorAction
Compute the EMI, total interest and total repayment for hypothetical loan terms, without touching the user's profile. Use for 'what would the EMI be if...' questions.
View tool JSON
{
"name": "loan_emi_calculator",
"kind": "act",
"impl": "imperative",
"description": "Compute the EMI, total interest and total repayment for hypothetical loan terms, without touching the user's profile. Use for 'what would the EMI be if...' questions.",
"inputSchema": {
"type": "object",
"properties": {
"principal": {
"type": "number",
"description": "Loan amount."
},
"annualRatePct": {
"type": "number",
"description": "Annual interest rate as a percentage."
},
"termMonths": {
"type": "number",
"description": "Tenure in months."
}
},
"required": [
"principal",
"annualRatePct",
"termMonths"
],
"additionalProperties": false
}
}loan_amortisationAction
Show the month-by-month interest/principal split for a loan already in the profile. Use to explain where the money is actually going.
View tool JSON
{
"name": "loan_amortisation",
"kind": "act",
"impl": "imperative",
"description": "Show the month-by-month interest/principal split for a loan already in the profile. Use to explain where the money is actually going.",
"inputSchema": {
"type": "object",
"properties": {
"loanId": {
"type": "string",
"description": "The loan's id, from loan_list."
},
"months": {
"type": "number",
"description": "How many months to show. Defaults to 12, maximum 60."
},
"fromMonth": {
"type": "number",
"description": "Offset from today in months. Defaults to 0."
}
},
"required": [
"loanId"
],
"additionalProperties": false
}
}loan_simulate_prepaymentAction
Simulate paying a lump sum and/or a permanent extra monthly amount into a loan, holding the EMI constant. Returns months saved and interest saved. This only simulates -- it does not change anything. To actually apply it, call loan_propose_prepayment.
View tool JSON
{
"name": "loan_simulate_prepayment",
"kind": "act",
"impl": "imperative",
"description": "Simulate paying a lump sum and/or a permanent extra monthly amount into a loan, holding the EMI constant. Returns months saved and interest saved. This only simulates -- it does not change anything. To actually apply it, call loan_propose_prepayment.",
"inputSchema": {
"type": "object",
"properties": {
"loanId": {
"type": "string",
"description": "The loan's id, from loan_list."
},
"lumpSum": {
"type": "number",
"description": "One-off amount paid now. Defaults to 0."
},
"extraMonthly": {
"type": "number",
"description": "Permanent monthly top-up on top of the EMI. Defaults to 0."
}
},
"required": [
"loanId"
],
"additionalProperties": false
}
}loan_propose_prepaymentAction
Propose actually applying a prepayment to the user's profile. This does NOT take effect immediately: it creates a proposal card the human must approve or reject in the app. Use this after loan_simulate_prepayment when the user agrees they want to go ahead.
View tool JSON
{
"name": "loan_propose_prepayment",
"kind": "act",
"impl": "imperative",
"description": "Propose actually applying a prepayment to the user's profile. This does NOT take effect immediately: it creates a proposal card the human must approve or reject in the app. Use this after loan_simulate_prepayment when the user agrees they want to go ahead.",
"inputSchema": {
"type": "object",
"properties": {
"loanId": {
"type": "string",
"description": "The loan's id, from loan_list."
},
"lumpSum": {
"type": "number",
"description": "One-off amount to pay against the principal."
},
"reason": {
"type": "string",
"description": "One sentence explaining why this is the right move, shown to the human on the approval card."
}
},
"required": [
"loanId",
"lumpSum"
],
"additionalProperties": false
}
}loan_compare_offersAction
Compare two or more loan offers on total cost including processing fees, and identify the cheapest. Use when the user is shopping for a loan or considering a refinance.
View tool JSON
{
"name": "loan_compare_offers",
"kind": "act",
"impl": "imperative",
"description": "Compare two or more loan offers on total cost including processing fees, and identify the cheapest. Use when the user is shopping for a loan or considering a refinance.",
"inputSchema": {
"type": "object",
"properties": {
"offers": {
"type": "array",
"items": {
"type": "object",
"properties": {
"label": {
"type": "string",
"description": "Name of the lender or offer."
},
"principal": {
"type": "number",
"description": "Loan amount."
},
"annualRatePct": {
"type": "number",
"description": "Annual interest rate as a percentage."
},
"termMonths": {
"type": "number",
"description": "Tenure in months."
},
"processingFee": {
"type": "number",
"description": "One-off fee. Defaults to 0."
}
},
"required": [
"label",
"principal",
"annualRatePct",
"termMonths"
],
"additionalProperties": false
},
"description": "Two or more offers to compare."
}
},
"required": [
"offers"
],
"additionalProperties": false
}
}portfolio_listAction
List every investment holding with its units, price, current value and asset class. Call this before any other portfolio_* tool so you know which holding ids exist.
View tool JSON
{
"name": "portfolio_list",
"kind": "act",
"impl": "imperative",
"description": "List every investment holding with its units, price, current value and asset class. Call this before any other portfolio_* tool so you know which holding ids exist.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}portfolio_add_holdingAction
Add an investment holding to the portfolio. Use when the user tells you about something they own, so allocation and risk maths include it.
View tool JSON
{
"name": "portfolio_add_holding",
"kind": "act",
"impl": "imperative",
"description": "Add an investment holding to the portfolio. Use when the user tells you about something they own, so allocation and risk maths include it.",
"inputSchema": {
"type": "object",
"properties": {
"symbol": {
"type": "string",
"description": "Ticker or short code."
},
"name": {
"type": "string",
"description": "Full name of the instrument."
},
"assetClass": {
"type": "string",
"enum": [
"equity",
"debt",
"gold",
"cash",
"crypto",
"real_estate"
],
"description": "Which asset class this belongs to."
},
"units": {
"type": "number",
"description": "Number of units held."
},
"price": {
"type": "number",
"description": "Current price per unit."
}
},
"required": [
"symbol",
"name",
"assetClass",
"units",
"price"
],
"additionalProperties": false
}
}portfolio_remove_holdingAction
Remove a holding from the portfolio by id or ticker symbol. Use when the user has sold a position or entered it in error.
View tool JSON
{
"name": "portfolio_remove_holding",
"kind": "act",
"impl": "imperative",
"description": "Remove a holding from the portfolio by id or ticker symbol. Use when the user has sold a position or entered it in error.",
"inputSchema": {
"type": "object",
"properties": {
"holdingId": {
"type": "string",
"description": "Holding id or ticker symbol."
}
},
"required": [
"holdingId"
],
"additionalProperties": false
}
}portfolio_allocationAction
Break the portfolio down by asset class, with the weight of each, the blended expected return, the volatility and a 0-100 risk score. Use this to answer 'how is my portfolio positioned' or before recommending a rebalance.
View tool JSON
{
"name": "portfolio_allocation",
"kind": "act",
"impl": "imperative",
"description": "Break the portfolio down by asset class, with the weight of each, the blended expected return, the volatility and a 0-100 risk score. Use this to answer 'how is my portfolio positioned' or before recommending a rebalance.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}portfolio_plan_rebalanceAction
Compute the buys and sells needed to move the portfolio to a target allocation by asset class. Targets are normalised, so they need not sum to 100. This only plans -- call portfolio_propose_rebalance to actually apply it.
View tool JSON
{
"name": "portfolio_plan_rebalance",
"kind": "act",
"impl": "imperative",
"description": "Compute the buys and sells needed to move the portfolio to a target allocation by asset class. Targets are normalised, so they need not sum to 100. This only plans -- call portfolio_propose_rebalance to actually apply it.",
"inputSchema": {
"type": "object",
"properties": {
"target": {
"type": "object",
"properties": {
"equity": {
"type": "number",
"description": "Target percentage for Equity."
},
"debt": {
"type": "number",
"description": "Target percentage for Debt."
},
"gold": {
"type": "number",
"description": "Target percentage for Gold."
},
"cash": {
"type": "number",
"description": "Target percentage for Cash."
},
"crypto": {
"type": "number",
"description": "Target percentage for Crypto."
},
"real_estate": {
"type": "number",
"description": "Target percentage for Real estate."
}
},
"required": [],
"additionalProperties": false
}
},
"required": [
"target"
],
"additionalProperties": false
}
}portfolio_propose_rebalanceAction
Propose actually rebalancing the portfolio to a target allocation. This does NOT take effect immediately: it creates a proposal card the human must approve or reject. Use after portfolio_plan_rebalance when the user agrees.
View tool JSON
{
"name": "portfolio_propose_rebalance",
"kind": "act",
"impl": "imperative",
"description": "Propose actually rebalancing the portfolio to a target allocation. This does NOT take effect immediately: it creates a proposal card the human must approve or reject. Use after portfolio_plan_rebalance when the user agrees.",
"inputSchema": {
"type": "object",
"properties": {
"target": {
"type": "object",
"properties": {
"equity": {
"type": "number",
"description": "Target percentage for Equity."
},
"debt": {
"type": "number",
"description": "Target percentage for Debt."
},
"gold": {
"type": "number",
"description": "Target percentage for Gold."
},
"cash": {
"type": "number",
"description": "Target percentage for Cash."
},
"crypto": {
"type": "number",
"description": "Target percentage for Crypto."
},
"real_estate": {
"type": "number",
"description": "Target percentage for Real estate."
}
},
"required": [],
"additionalProperties": false
},
"reason": {
"type": "string",
"description": "One sentence explaining the rationale, shown to the human on the approval card."
}
},
"required": [
"target"
],
"additionalProperties": false
}
}portfolio_simulate_market_eventAction
Simulate a named market event (equity crash, rate spike, crypto winter, broad risk-off, gold rally) against the portfolio and report the damage per holding. Read-only.
View tool JSON
{
"name": "portfolio_simulate_market_event",
"kind": "act",
"impl": "imperative",
"description": "Simulate a named market event (equity crash, rate spike, crypto winter, broad risk-off, gold rally) against the portfolio and report the damage per holding. Read-only.",
"inputSchema": {
"type": "object",
"properties": {
"event": {
"type": "string",
"enum": [
"equity_crash",
"rate_spike",
"crypto_winter",
"broad_selloff",
"gold_rally"
],
"description": "Which market event to simulate."
}
},
"required": [
"event"
],
"additionalProperties": false
}
}portfolio_add_real_assetAction
Record a non-investable asset such as a self-occupied home. It counts towards net worth but is deliberately excluded from allocation, rebalancing and concentration risk, because you cannot sell a third of the house you live in. Use this when the user mentions property they own.
View tool JSON
{
"name": "portfolio_add_real_asset",
"kind": "act",
"impl": "imperative",
"description": "Record a non-investable asset such as a self-occupied home. It counts towards net worth but is deliberately excluded from allocation, rebalancing and concentration risk, because you cannot sell a third of the house you live in. Use this when the user mentions property they own.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "What the asset is."
},
"value": {
"type": "number",
"description": "Current market value."
}
},
"required": [
"name",
"value"
],
"additionalProperties": false
}
}portfolio_update_priceAction
Update the current price of a holding, for example to reflect a live quote the user gives you.
View tool JSON
{
"name": "portfolio_update_price",
"kind": "act",
"impl": "imperative",
"description": "Update the current price of a holding, for example to reflect a live quote the user gives you.",
"inputSchema": {
"type": "object",
"properties": {
"holdingId": {
"type": "string",
"description": "Holding id or ticker symbol."
},
"price": {
"type": "number",
"description": "New price per unit."
}
},
"required": [
"holdingId",
"price"
],
"additionalProperties": false
}
}budget_summaryAction
Show monthly income, essential and discretionary spending, total EMI outflow, the resulting surplus, the savings rate and how many months of emergency runway the cash reserve buys. Call this for any question about affordability, spare cash or monthly capacity.
View tool JSON
{
"name": "budget_summary",
"kind": "act",
"impl": "imperative",
"description": "Show monthly income, essential and discretionary spending, total EMI outflow, the resulting surplus, the savings rate and how many months of emergency runway the cash reserve buys. Call this for any question about affordability, spare cash or monthly capacity.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}budget_set_incomeAction
Set the user's monthly take-home income. Everything downstream -- surplus, savings rate, debt-service ratio and goal feasibility -- is derived from this, so set it before giving cashflow advice.
View tool JSON
{
"name": "budget_set_income",
"kind": "act",
"impl": "imperative",
"description": "Set the user's monthly take-home income. Everything downstream -- surplus, savings rate, debt-service ratio and goal feasibility -- is derived from this, so set it before giving cashflow advice.",
"inputSchema": {
"type": "object",
"properties": {
"monthlyIncome": {
"type": "number",
"description": "Monthly take-home income."
}
},
"required": [
"monthlyIncome"
],
"additionalProperties": false
}
}budget_set_cash_reserveSensitive Action
Set the liquid cash the user holds outside their investments. This is what funds prepayments and emergencies.
View tool JSON
{
"name": "budget_set_cash_reserve",
"kind": "transact",
"impl": "imperative",
"description": "Set the liquid cash the user holds outside their investments. This is what funds prepayments and emergencies.",
"inputSchema": {
"type": "object",
"properties": {
"cashReserve": {
"type": "number",
"description": "Liquid cash available."
}
},
"required": [
"cashReserve"
],
"additionalProperties": false
}
}budget_add_expenseAction
Add a recurring monthly expense. Mark it essential if it cannot be cut in a crisis.
View tool JSON
{
"name": "budget_add_expense",
"kind": "act",
"impl": "imperative",
"description": "Add a recurring monthly expense. Mark it essential if it cannot be cut in a crisis.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "What the expense is."
},
"amount": {
"type": "number",
"description": "Monthly amount."
},
"essential": {
"type": "boolean",
"description": "True if this cannot be cut during an income shock. Defaults to true."
}
},
"required": [
"name",
"amount"
],
"additionalProperties": false
}
}budget_remove_expenseAction
Remove a recurring expense by id or name. Use when the user stops paying for something, which frees up monthly surplus.
View tool JSON
{
"name": "budget_remove_expense",
"kind": "act",
"impl": "imperative",
"description": "Remove a recurring expense by id or name. Use when the user stops paying for something, which frees up monthly surplus.",
"inputSchema": {
"type": "object",
"properties": {
"expenseId": {
"type": "string",
"description": "Expense id or exact name."
}
},
"required": [
"expenseId"
],
"additionalProperties": false
}
}budget_add_goalAction
Add a savings goal with a target amount and a deadline in months.
View tool JSON
{
"name": "budget_add_goal",
"kind": "act",
"impl": "imperative",
"description": "Add a savings goal with a target amount and a deadline in months.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "What the goal is for."
},
"targetAmount": {
"type": "number",
"description": "Amount needed."
},
"targetMonths": {
"type": "number",
"description": "Months from now by which it is needed."
},
"savedSoFar": {
"type": "number",
"description": "Already set aside for this goal. Defaults to 0."
}
},
"required": [
"name",
"targetAmount",
"targetMonths"
],
"additionalProperties": false
}
}budget_remove_goalAction
Remove a savings goal by id or name. Use when a goal has been met, abandoned, or was entered in error.
View tool JSON
{
"name": "budget_remove_goal",
"kind": "act",
"impl": "imperative",
"description": "Remove a savings goal by id or name. Use when a goal has been met, abandoned, or was entered in error.",
"inputSchema": {
"type": "object",
"properties": {
"goalId": {
"type": "string",
"description": "Goal id or exact name."
}
},
"required": [
"goalId"
],
"additionalProperties": false
}
}budget_goal_feasibilityAction
Assess whether the user's savings goals are actually reachable given their current monthly surplus, and flag which ones collide. Use when the user asks whether they can afford a goal, or before recommending they commit spare cash elsewhere.
View tool JSON
{
"name": "budget_goal_feasibility",
"kind": "act",
"impl": "imperative",
"description": "Assess whether the user's savings goals are actually reachable given their current monthly surplus, and flag which ones collide. Use when the user asks whether they can afford a goal, or before recommending they commit spare cash elsewhere.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}budget_set_expected_returnAction
Set the assumed long-run annual portfolio return used by goal and prepay-vs-invest maths. Use when the user wants to test a more or less optimistic assumption.
View tool JSON
{
"name": "budget_set_expected_return",
"kind": "act",
"impl": "imperative",
"description": "Set the assumed long-run annual portfolio return used by goal and prepay-vs-invest maths. Use when the user wants to test a more or less optimistic assumption.",
"inputSchema": {
"type": "object",
"properties": {
"expectedReturnPct": {
"type": "number",
"description": "Assumed nominal annual return as a percentage, e.g. 11."
}
},
"required": [
"expectedReturnPct"
],
"additionalProperties": false
}
}advisor_net_positionAnswer
Give the whole balance sheet at once: investable portfolio, non-investable real assets such as a home, cash, total debt, net worth, debt-to-assets, monthly EMI and monthly surplus. The fastest way to orient yourself before answering any cross-domain question.
View tool JSON
{
"name": "advisor_net_position",
"kind": "answer",
"impl": "imperative",
"description": "Give the whole balance sheet at once: investable portfolio, non-investable real assets such as a home, cash, total debt, net worth, debt-to-assets, monthly EMI and monthly surplus. The fastest way to orient yourself before answering any cross-domain question.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}advisor_prepay_vs_investAction
THE cross-domain question: should a given amount of spare cash go towards prepaying a loan or into the portfolio? Compares every active loan against the assumed portfolio return by simulating both paths month by month with identical cash outflow, and ranks them. Call this whenever the user asks what to do with spare money, a bonus, or a windfall.
View tool JSON
{
"name": "advisor_prepay_vs_invest",
"kind": "act",
"impl": "imperative",
"description": "THE cross-domain question: should a given amount of spare cash go towards prepaying a loan or into the portfolio? Compares every active loan against the assumed portfolio return by simulating both paths month by month with identical cash outflow, and ranks them. Call this whenever the user asks what to do with spare money, a bonus, or a windfall.",
"inputSchema": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "The spare cash to deploy."
},
"horizonMonths": {
"type": "number",
"description": "How far ahead to compare, in months. Defaults to 60."
}
},
"required": [
"amount"
],
"additionalProperties": false
}
}advisor_risk_exposureAction
Score the user's overall financial fragility out of 100 by combining debt service burden, leverage, emergency runway, portfolio risk and savings rate. Reads loans, portfolio and budget together. Use when asked 'how exposed am I' or 'is my position safe'.
View tool JSON
{
"name": "advisor_risk_exposure",
"kind": "act",
"impl": "imperative",
"description": "Score the user's overall financial fragility out of 100 by combining debt service burden, leverage, emergency runway, portfolio risk and savings rate. Reads loans, portfolio and budget together. Use when asked 'how exposed am I' or 'is my position safe'.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}advisor_stress_testAction
Stress-test the entire financial picture against a combined shock: months without income, a named market event, and/or an interest rate rise, all at once. Reports whether the plan breaks and at what point. Use for 'what if I lose my job' or 'what if the market crashes' questions.
View tool JSON
{
"name": "advisor_stress_test",
"kind": "act",
"impl": "imperative",
"description": "Stress-test the entire financial picture against a combined shock: months without income, a named market event, and/or an interest rate rise, all at once. Reports whether the plan breaks and at what point. Use for 'what if I lose my job' or 'what if the market crashes' questions.",
"inputSchema": {
"type": "object",
"properties": {
"jobLossMonths": {
"type": "number",
"description": "Months with no income. Defaults to 0."
},
"marketShock": {
"type": "string",
"enum": [
"equity_crash",
"rate_spike",
"crypto_winter",
"broad_selloff",
"gold_rally"
],
"description": "A simultaneous market event, if any."
},
"rateHikeBps": {
"type": "number",
"description": "Interest rate rise in basis points applied to every loan, e.g. 200 for +2%."
}
},
"required": [],
"additionalProperties": false
}
}advisor_recommendationsAction
Generate a prioritised action list synthesised across loans, portfolio and budget, each item citing which tools produced its evidence and what the impact would be. Use to answer 'what should I do' or to close out an advisory conversation.
View tool JSON
{
"name": "advisor_recommendations",
"kind": "act",
"impl": "imperative",
"description": "Generate a prioritised action list synthesised across loans, portfolio and budget, each item citing which tools produced its evidence and what the impact would be. Use to answer 'what should I do' or to close out an advisory conversation.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}advisor_assumptionsAnswer
List every planning assumption the app uses -- expected returns and volatility per asset class, and the user's assumed portfolio return. Call this when the user asks why a number is what it is, or before presenting any recommendation as fact.
View tool JSON
{
"name": "advisor_assumptions",
"kind": "answer",
"impl": "imperative",
"description": "List every planning assumption the app uses -- expected returns and volatility per asset class, and the user's assumed portfolio return. Call this when the user asks why a number is what it is, or before presenting any recommendation as fact.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}advisor_begin_whatifAction
Open a sandboxed what-if branch. While a branch is open, every write tool changes only the sandbox, never the user's real profile, so you can explore freely -- apply prepayments, rebalance, reprice holdings -- and then discard it. Always pair with advisor_end_whatif. Use this before exploring a hypothetical the user has not committed to.
View tool JSON
{
"name": "advisor_begin_whatif",
"kind": "act",
"impl": "imperative",
"description": "Open a sandboxed what-if branch. While a branch is open, every write tool changes only the sandbox, never the user's real profile, so you can explore freely -- apply prepayments, rebalance, reprice holdings -- and then discard it. Always pair with advisor_end_whatif. Use this before exploring a hypothetical the user has not committed to.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "What you are exploring, e.g. \"Clear the credit card first\"."
}
},
"required": [
"name"
],
"additionalProperties": false
}
}advisor_save_scenarioAction
Snapshot the current financial picture under a name so it can be compared against others later. Use to capture a branch worth remembering before discarding it.
View tool JSON
{
"name": "advisor_save_scenario",
"kind": "act",
"impl": "imperative",
"description": "Snapshot the current financial picture under a name so it can be compared against others later. Use to capture a branch worth remembering before discarding it.",
"inputSchema": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Short label for this snapshot."
},
"note": {
"type": "string",
"description": "One line on what makes this scenario different."
}
},
"required": [
"name"
],
"additionalProperties": false
}
}advisor_explain_numberAction
Explain how a specific headline figure was derived, showing the inputs and the formula. Supported figures: net_worth, surplus, emi_burden, risk_score, emergency_runway. Use when the user challenges or asks about a number you quoted.
View tool JSON
{
"name": "advisor_explain_number",
"kind": "act",
"impl": "imperative",
"description": "Explain how a specific headline figure was derived, showing the inputs and the formula. Supported figures: net_worth, surplus, emi_burden, risk_score, emergency_runway. Use when the user challenges or asks about a number you quoted.",
"inputSchema": {
"type": "object",
"properties": {
"figure": {
"type": "string",
"enum": [
"net_worth",
"surplus",
"emi_burden",
"risk_score",
"emergency_runway"
],
"description": "Which figure to explain."
}
},
"required": [
"figure"
],
"additionalProperties": false
}
}advisor_horizon_projectionAction
Project net worth forward over a horizon, showing how debt runs down and investments compound under current behaviour. Use to make a recommendation concrete.
View tool JSON
{
"name": "advisor_horizon_projection",
"kind": "act",
"impl": "imperative",
"description": "Project net worth forward over a horizon, showing how debt runs down and investments compound under current behaviour. Use to make a recommendation concrete.",
"inputSchema": {
"type": "object",
"properties": {
"horizonMonths": {
"type": "number",
"description": "Months to project forward. Defaults to 60, maximum 360."
}
},
"required": [],
"additionalProperties": false
}
}advisor_create_handoff_linkAction
Package the user's entire financial position into a shareable link so another person's AI agent can pick it up and continue the analysis in their own browser session. Use when the user wants a second opinion from a partner, a friend or a financial advisor. The position travels inside the URL fragment, so it is never sent to any server. Give the user the returned URL verbatim.
View tool JSON
{
"name": "advisor_create_handoff_link",
"kind": "act",
"impl": "imperative",
"description": "Package the user's entire financial position into a shareable link so another person's AI agent can pick it up and continue the analysis in their own browser session. Use when the user wants a second opinion from a partner, a friend or a financial advisor. The position travels inside the URL fragment, so it is never sent to any server. Give the user the returned URL verbatim.",
"inputSchema": {
"type": "object",
"properties": {
"from": {
"type": "string",
"description": "Who is sharing, e.g. \"Nikunj\". Shown to whoever opens the link."
},
"note": {
"type": "string",
"description": "A short message to the receiving agent explaining what you want them to look at."
}
},
"required": [
"from"
],
"additionalProperties": false
}
}advisor_load_handoff_linkAction
Load a financial position that someone else shared with you as a handoff link. Paste the whole URL. This replaces the profile currently on screen with theirs, so you can analyse their numbers instead of your own.
View tool JSON
{
"name": "advisor_load_handoff_link",
"kind": "act",
"impl": "imperative",
"description": "Load a financial position that someone else shared with you as a handoff link. Paste the whole URL. This replaces the profile currently on screen with theirs, so you can analyse their numbers instead of your own.",
"inputSchema": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "The full handoff URL that was shared with you."
}
},
"required": [
"url"
],
"additionalProperties": false
}
}advisor_second_opinionAction
Run the same decision through two deliberately different advisors -- a growth stance assuming 13% returns and a capital-preservation stance assuming 7% -- and report where they agree, where they diverge, and the exact assumption the disagreement turns on. Use when the user asks what the counter-argument is, wants a second opinion, or when you want to be honest that a recommendation depends on assumptions rather than arithmetic.
View tool JSON
{
"name": "advisor_second_opinion",
"kind": "act",
"impl": "imperative",
"description": "Run the same decision through two deliberately different advisors -- a growth stance assuming 13% returns and a capital-preservation stance assuming 7% -- and report where they agree, where they diverge, and the exact assumption the disagreement turns on. Use when the user asks what the counter-argument is, wants a second opinion, or when you want to be honest that a recommendation depends on assumptions rather than arithmetic.",
"inputSchema": {
"type": "object",
"properties": {
"amount": {
"type": "number",
"description": "The spare cash the decision is about."
},
"horizonMonths": {
"type": "number",
"description": "Comparison horizon in months. Defaults to 60."
}
},
"required": [
"amount"
],
"additionalProperties": false
}
}advisor_argue_asAction
Get the strongest honest case one specific stance would make, so you can voice that side of a debate. Stances are 'growth' (assumes 13% returns, treats cheap debt as leverage) and 'preservation' (assumes 7%, prices certainty above expectation). Use to role-play a disagreement between two advisors, or to steelman the option the user is leaning against.
View tool JSON
{
"name": "advisor_argue_as",
"kind": "act",
"impl": "imperative",
"description": "Get the strongest honest case one specific stance would make, so you can voice that side of a debate. Stances are 'growth' (assumes 13% returns, treats cheap debt as leverage) and 'preservation' (assumes 7%, prices certainty above expectation). Use to role-play a disagreement between two advisors, or to steelman the option the user is leaning against.",
"inputSchema": {
"type": "object",
"properties": {
"stance": {
"type": "string",
"enum": [
"growth",
"preservation"
],
"description": "Which stance to argue from."
},
"amount": {
"type": "number",
"description": "The spare cash the decision is about."
},
"horizonMonths": {
"type": "number",
"description": "Comparison horizon in months. Defaults to 60."
}
},
"required": [
"stance",
"amount"
],
"additionalProperties": false
}
}advisor_list_stancesAnswer
List the advisor stances available for a second opinion and the assumptions each one holds. Call this if you need to know what positions can be argued before staging a debate.
View tool JSON
{
"name": "advisor_list_stances",
"kind": "answer",
"impl": "imperative",
"description": "List the advisor stances available for a second opinion and the assumptions each one holds. Call this if you need to know what positions can be argued before staging a debate.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}advisor_shared_position_infoAnswer
Report whether the position currently loaded came from someone else's handoff link, who shared it and what note they attached. Call this at the start of a session so you know whose finances you are actually looking at.
View tool JSON
{
"name": "advisor_shared_position_info",
"kind": "answer",
"impl": "imperative",
"description": "Report whether the position currently loaded came from someone else's handoff link, who shared it and what note they attached. Call this at the start of a session so you know whose finances you are actually looking at.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}market_research_briefAction
Get a research brief telling you exactly what market news to go and look up for THIS user's holdings, ranked by how much each exposure actually matters to them. The page holds no market data and fetches nothing — use your own web search to find the news, then bring what you found back through market_apply_conditions. Call this first whenever the user asks about market conditions, the news, or how current events affect them.
View tool JSON
{
"name": "market_research_brief",
"kind": "act",
"impl": "imperative",
"description": "Get a research brief telling you exactly what market news to go and look up for THIS user's holdings, ranked by how much each exposure actually matters to them. The page holds no market data and fetches nothing — use your own web search to find the news, then bring what you found back through market_apply_conditions. Call this first whenever the user asks about market conditions, the news, or how current events affect them.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}market_apply_conditionsAction
Take what you found in your research and work out what it means for this specific person — every aspect of it. Give one entry per asset class with the percentage move you observed and a short note on why. Returns the impact on portfolio value, each holding, allocation, risk, volatility, expected return, net worth, goals, and whether the prepay-versus-invest recommendation flips. It deliberately also reports what did NOT move. This is a what-if: it changes nothing in the app.
View tool JSON
{
"name": "market_apply_conditions",
"kind": "act",
"impl": "imperative",
"description": "Take what you found in your research and work out what it means for this specific person — every aspect of it. Give one entry per asset class with the percentage move you observed and a short note on why. Returns the impact on portfolio value, each holding, allocation, risk, volatility, expected return, net worth, goals, and whether the prepay-versus-invest recommendation flips. It deliberately also reports what did NOT move. This is a what-if: it changes nothing in the app.",
"inputSchema": {
"type": "object",
"properties": {
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"assetClass": {
"type": "string",
"enum": [
"equity",
"debt",
"gold",
"cash",
"crypto",
"real_estate"
],
"description": "Which asset class this observation is about."
},
"changePct": {
"type": "number",
"description": "The move you observed, as a percentage. Negative for a fall, e.g. -12.5."
},
"note": {
"type": "string",
"description": "One line on what you read and why it moved."
},
"source": {
"type": "string",
"description": "Where you read it."
}
},
"required": [
"assetClass",
"changePct",
"note"
],
"additionalProperties": false
},
"description": "One entry per asset class you researched."
}
},
"required": [
"conditions"
],
"additionalProperties": false
}
}market_last_readAnswer
Report the market conditions most recently applied in this session, if any — what was observed, when, and the resulting move. Use it to avoid re-researching something you already looked up a few minutes ago.
View tool JSON
{
"name": "market_last_read",
"kind": "answer",
"impl": "imperative",
"description": "Report the market conditions most recently applied in this session, if any — what was observed, when, and the resulting move. Use it to avoid re-researching something you already looked up a few minutes ago.",
"inputSchema": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}