SmartFin
Server Details
Backtest S&P 500 stocks and ETFs on real prices, plus loan, savings, FIRE and retirement tools.
- Status
- Healthy
- Uptime
- 100.0% over 20 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 20 tools
Every description explicitly names the sibling tools it should not be confused with (e.g. future_value vs project_savings_growth vs missing_variable; investment_return vs compare_*) and states its own boundaries, which is unusually strong. However, real functional overlap remains within two families: single-amount growth math (future_value, present_value, simple_interest, missing_variable, project_savings_growth) and historical-equity tools (investment_return, compare_investment_strategies, compare_two_stocks, compare_time_periods), so an agent can still misselect without careful reading.
All 20 tools use the same smartfin_ prefix followed by a consistent verb_noun pattern: calculate_*, compare_*, get_*, and project_*. The verb reflects the operation type and the noun the domain object, with no casing or style drift.
20 tools is on the heavy side but each maps to a genuinely distinct calculator with a different input/output contract, so they largely earn their place rather than being redundant wrappers. It sits at the upper edge of the comfortable band but is defensible for a full financial-calculator suite.
The surface covers the major personal-finance lifecycles (loans/mortgage, savings growth, investing history and comparison, retirement drawdown and FIRE, rent vs buy, inflation, plus business ROI/margin) and includes an embed helper. Minor gaps: CAGR and Rule-of-72 calculators are referenced by name/URL inside descriptions and the embed list but are not exposed as tools, and loan products like car/student/refinance exist only implicitly through loan_payment.
Available Tools
20 toolssmartfin_calculate_down_paymentSave for a home down paymentARead-onlyIdempotentInspect
How long savings take to reach a home down payment, from what is saved so far plus the same amount each month growing at a fixed yearly rate, and, with reach_within_months, the monthly amount that reaches it by then, the way SmartFin's down payment calculator does. Returns the down payment, the loan amount it leaves, the months to reach it (within 50 years), the modeled savings split into saved so far, deposits and growth, and the monthly amount (rounded up to a whole currency unit) that reaches it within the chosen time. Use when someone asks how long it takes to save for a down payment, how much a month reaches one by a date, or what a percentage down is on a price. Do not use for how much to put down (it does not say), mortgage approval, closing costs (not included) or the mortgage payment (use smartfin_calculate_loan_payment). The growth rate is held constant, deposits are made at the end of each month and the home price stays the same. Amounts can be in any one currency; none is converted.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency for the amounts in the summary and the link. Default USD; amounts are never converted | |
| home_price | Yes | Price of the home. 1000 to 100000000 | |
| saved_so_far | No | Amount saved toward it today. Default 0. 0 to 100000000 | |
| growth_rate_pct | No | Yearly rate the savings grow at, with compounding included (a savings account's APY in the US, AER in the UK), held the same every year. Default 3, an example, not a current rate. 0 to 20 | |
| down_payment_pct | No | Down payment as % of the price. Give this or down_payment_amount. Default 20. 0 to 100 | |
| mortgage_rate_pct | No | Optional: the mortgage rate, % a year, with mortgage_term_years, to suggest the follow-up call for the payment on the loan amount | |
| saving_each_month | No | Amount added at the end of every month. Default 0. 0 to 10000000 | |
| down_payment_amount | No | Down payment as an amount instead of a %; at most the home price. Give this or down_payment_pct | |
| mortgage_term_years | No | Optional: the mortgage term in years, with mortgage_rate_pct | |
| reach_within_months | No | A time to reach it by, in months, for the monthly amount that does: 48 is 4 years. 0 or omitted for none. 0 to 600 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the read-only/idempotent/no-destruction profile, and the description goes further by disclosing modeling assumptions an agent could not infer: constant growth rate, deposits at end of each month, unchanging home price, and no currency conversion. These materially affect interpretation of the results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then caveats, and almost every clause carries information. The opening sentence is a dense run-on that takes effort to parse, and the enumerating of return fields is partly redundant given the output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and fully covered parameters, the remaining description burden is scope and assumptions, both addressed (exclusions, constant rate, end-of-month deposits, no conversion). Some return-field restatement is unnecessary but harmless; nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds role-level meaning beyond the schema: reach_within_months switches the tool into solving for the monthly amount, and down_payment_pct is framed as 'what a percentage down is on a price'. It does not add format/units detail beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation: time for savings (existing + monthly deposits at a fixed growth rate) to reach a down payment target, plus the reverse solve for a monthly amount given reach_within_months. It is clearly separable from sibling calculators, and it explicitly routes the mortgage-payment need to smartfin_calculate_loan_payment.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit triggers ('how long it takes to save for a down payment', 'how much a month reaches one by a date', 'what a percentage down is on a price') and explicit exclusions ('Do not use for how much to put down', mortgage approval, closing costs) with the named alternative for the mortgage payment case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_fire_numberFIRE number and years to reach itARead-onlyIdempotentInspect
Works the way SmartFin's FIRE calculator does. The FIRE number today is yearly expenses divided by a withdrawal-rate assumption. Each year savings grow at an assumed return with the yearly savings added, while expenses (and so the FIRE number) rise with inflation; FIRE is the first year savings reach that year's FIRE number, searched up to 60 years. Also gives the savings rate and, with a traditional retirement age, the Coast FIRE number. Use for early retirement / FIRE questions: "how much do I need to retire", "when can I retire", "what's my coast FIRE number". Do not use to test how long an existing balance lasts (use smartfin_calculate_retirement_withdrawal). Returns and inflation are assumptions; excludes taxes.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| current_age | No | For the age at FIRE and Coast FIRE. Default 30 | |
| inflation_pct | No | Yearly inflation in %, applied to expenses. Default 3 | |
| annual_savings | No | Added each year, in the currency chosen (12 x a monthly amount). Default 0 | |
| retirement_age | No | Optional: a traditional retirement age, for the Coast FIRE number | |
| annual_expenses | Yes | Yearly spending today, in the currency chosen | |
| current_savings | No | Invested today, in the currency chosen. Default 0 | |
| expected_return_pct | No | Assumed yearly return in %. Default 7 | |
| withdrawal_rate_pct | No | Withdrawal-rate assumption in %. Default 4 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, closed-world, non-destructive), and the description adds substantive behavior beyond them: the FIRE search is capped at 60 years, returns and inflation are user assumptions rather than facts, taxes are excluded, and the coast FIRE number only appears when a traditional retirement age is supplied. These are real computational limits an agent should know before answering.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the mechanism, then usage, then exclusion, then caveats, with no filler sentences. The algorithm walkthrough is somewhat long, but each clause carries information needed to interpret the result.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a nine-parameter calculation tool with an output schema and full annotation coverage, the description supplies the model, the search bound, the optional coast FIRE branch, the exclusion, and the assumption caveats. Nothing material is missing for correct invocation or interpretation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (currency, inflation, savings, withdrawal rate, retirement age) is already documented in the schema, and the description mostly restates that the withdrawal rate and return are assumptions. It adds no syntax or unit detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation (the FIRE number and the year it is reached) and explains the underlying model: expenses divided by a withdrawal rate, savings growth, inflation on expenses. It also names the sibling it is not (smartfin_calculate_retirement_withdrawal), so an agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit 'Use for early retirement / FIRE questions' with concrete user phrasings ('how much do I need to retire', 'when can I retire', 'what's my coast FIRE number'), plus a hard exclusion: 'Do not use to test how long an existing balance lasts (use smartfin_calculate_retirement_withdrawal).' Both the when and the when-not are present with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_future_valueFuture value of an amountARead-onlyIdempotentInspect
What a single present amount grows to at a fixed yearly rate with interest added to the balance at a chosen frequency, and the growth over the starting amount (FV = PV x (1 + r/n)^(n x t)). Use for questions about what a lump sum becomes after some years at an assumed rate, or the effect of compounding more often. Do not use for regular contributions (use smartfin_project_savings_growth), for what a real stock did (use smartfin_calculate_investment_return), or for a forecast: one fixed rate is an assumption. To find the starting amount, rate or time instead of the future value, use smartfin_calculate_missing_variable.
| Name | Required | Description | Default |
|---|---|---|---|
| years | Yes | Time in years; a part of a year is a decimal | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| present_value | Yes | Amount today in the currency chosen | |
| annual_rate_pct | Yes | Yearly rate in %, above -100, e.g. 6 | |
| compounding_frequency | Yes | Times a year interest is added: 1 annually, 2 semiannually, 4 quarterly, 12 monthly, 52 weekly, 365 daily |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the description's job is to add context beyond that. It does, by framing the output as an assumption-driven forecast rather than a real outcome ('one fixed rate is an assumption'), which is meaningful framing an agent should repeat to a user. It does not, however, mention constraints like the year cap or rate bounds, which the schema carries instead.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the operation and formula, then routing sentences, with zero filler. It is dense in places (three sibling redirects plus a forecast caveat), but each sentence earns its place by eliminating a specific mis-selection.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the description covers purpose, selection boundaries, and the interpretive caveat. For a five-parameter, fully documented calculation tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are documented inline, so the baseline is 3. The description restates the parameter roles ('fixed yearly rate', 'chosen frequency') and the formula clarifies how the four required inputs interact, but it adds no syntax, default, or boundary detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (what a single present amount grows to) and reinforces it with the exact formula FV = PV x (1 + r/n)^(n x t). It explicitly names the two closest siblings it is not (smartfin_project_savings_growth, smartfin_calculate_investment_return), so an agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use cases (a lump sum after some years, effect of compounding more often) and explicit when-not cases with named alternatives: regular contributions → project_savings_growth, actual stock performance → calculate_investment_return, and solving for another variable → calculate_missing_variable. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_inflation_impactInflation impact over timeARead-onlyIdempotentInspect
What an amount will be worth in today's money after years of inflation at a fixed yearly rate, and what something costing that amount today will cost then. Use for questions about buying power or future prices at an assumed inflation rate. Do not use for historical CPI lookups: this uses one fixed rate, not official index data.
| Name | Required | Description | Default |
|---|---|---|---|
| years | Yes | Number of years | |
| amount | Yes | Amount in the currency chosen | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| annual_inflation_pct | Yes | Yearly inflation rate in %, e.g. 3 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so safety is covered externally. The description adds genuine behavioral context the annotations cannot: the computation assumes one constant inflation rate rather than official index data, which bounds the trustworthiness of the result.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, zero filler: what it computes, when to reach for it, when not to. The use-case and the caveat are front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value detail is not the description's job, and annotations carry the safety profile. For a four-parameter calculator whose semantics are fully specified in the schema, the description supplies everything an agent needs to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with units, ranges and enum values all documented in the schema itself (e.g. annual_inflation_pct as "Yearly inflation rate in %, e.g. 3", currency as display-only and never converted). The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete computation in both directions (eroded value of a sum, and the future cost of today's price) plus the rate basis, so the resource is unambiguous. It never names the conceptually adjacent siblings (smartfin_calculate_future_value, smartfin_calculate_present_value), which is the only thing keeping it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger ("questions about buying power or future prices at an assumed inflation rate") and an explicit exclusion ("Do not use for historical CPI lookups: this uses one fixed rate, not official index data"). The when-not condition is exactly the kind of routing signal that separates this from index-based tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_investment_returnReturn of one investment strategyARead-onlyIdempotentInspect
What an amount invested in a US stock or index ETF became over a past period under one strategy: lump_sum (all on the first trading day), monthly (spread on the trading day nearest the 1st of each month) or buy_the_dip (bought after falls of a set % from the latest high), on real daily closing prices (adjusted for splits and reinvested dividends). Returns final value, total and yearly return, worst fall and Sharpe ratio. Use when the user asks about one specific approach, e.g. "what would $5,000 in Microsoft since 2015 be worth" (lump_sum) or "if I'd put money into SPY every month since 2010" (monthly). Do not use to compare strategies (use smartfin_compare_investment_strategies) or for future projections (use smartfin_project_savings_growth). Limits: US-listed S&P 500 companies and major index ETFs only, US dollars, month-level periods.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Total dollars invested over the period | |
| ticker | Yes | Stock or ETF symbol, not a company name: AAPL not Apple. Covers 508 symbols: the S&P 500 companies plus the index ETFs SPY, VOO, IVV, QQQ, DIA, IWM, VTI. | |
| strategy | Yes | Which way of investing | |
| end_month | No | Last month to include, YYYY-MM. Omit for the latest available month | |
| start_month | Yes | First month, YYYY-MM | |
| dip_threshold_pct | No | For buy_the_dip: trigger fall in %. Default 10 | |
| dip_percent_per_buy | No | For buy_the_dip: % of the amount per buy. Default 10 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, so safety is covered. The description adds real behavioral context beyond that: data coverage limits (508 US-listed symbols, USD only, month-level periods) and methodology (split-adjusted, dividend-reinvested daily closes). It does not discuss latency, pagination, or failure modes, which keeps it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and strategy definitions are front-loaded, then examples, then exclusions, then limits – a logical order. The opening sentence is long and parenthesis-heavy, but nearly every clause carries load-bearing constraint information, so waste is minimal.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with an output schema and full annotation coverage, the description supplies everything an agent needs: scope, strategy mechanics, exclusions against siblings, and domain limits. Return values are already covered by the output schema, so the brief return summary is sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks by defining each strategy enum value (lump_sum = all on first trading day, monthly = nearest trading day to the 1st, buy_the_dip = buys after a set % fall) and clarifying the adjusted-price basis. It does not add detail for dip_threshold_pct or dip_percent_per_buy beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource (what an amount invested became over a past period) and enumerates the three strategies it supports with their mechanics. It explicitly names the siblings it must not be confused with (compare_investment_strategies, project_savings_growth), so an agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete trigger examples ('what would $5,000 in Microsoft since 2015 be worth' -> lump_sum, 'if I'd put money into SPY every month since 2010' -> monthly) and explicit when-not routing to two named alternatives. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_loan_paymentLoan payment and total interestARead-onlyIdempotentInspect
Monthly payment, total interest and total paid for a fixed-rate loan with monthly payments: mortgage, car, student or personal loan. Give either loan_amount, or home_price with down_payment_pct for a mortgage. Use when the user asks what a loan costs per month or in total, or how the rate or term changes the cost. Do not use for variable-rate loans, interest-only loans, or credit cards. Excludes taxes, insurance and fees.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| loan_type | No | Type of loan; chooses the SmartFin calculator link. Default mortgage | |
| home_price | No | Mortgage only: home price, in the currency chosen, with down_payment_pct | |
| term_years | Yes | Loan term in years, e.g. 30 for a mortgage, 5 for a car loan | |
| loan_amount | No | Amount borrowed, in the currency chosen. Give this or home_price | |
| annual_rate_pct | Yes | Annual interest rate in %, e.g. 6.5 | |
| down_payment_pct | No | Mortgage only: down payment as % of home_price. Default 20 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful scope context that annotations cannot carry: what the figures exclude (taxes, insurance, fees) and which loan products are out of scope. It does not discuss rounding, payment timing, or amortization assumptions, which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four tight sentences, each load-bearing: what it computes, how to supply principal, when to invoke, when not to. The result and routing conditions are front-loaded with zero filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and annotations cover the safety profile. For a 7-parameter, 2-required calculation tool the description supplies everything an agent needs: output definition, input-mode rule, positive triggers, and hard exclusions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3, but the description adds cross-parameter meaning: the mutually exclusive loan_amount vs. home_price+down_payment_pct modes for mortgages, which is the main source of caller error. It does not add format or unit detail beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb-and-resource outcome (monthly payment, total interest, total paid) plus the exact loan class it covers, and names the distinction from siblings like mortgage_payoff and down_payment by scoping to fixed-rate amortizing loans. An agent can route correctly without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('user asks what a loan costs per month or in total, or how the rate or term changes the cost') and explicit exclusions (variable-rate, interest-only, credit cards). It also states the input-mode rule: 'Give either loan_amount, or home_price with down_payment_pct for a mortgage.' Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_missing_variableSolve for the missing number: future value, starting amount, rate or timeARead-onlyIdempotentInspect
Finds the one missing number among four that sit in the same equation, a single amount earning one fixed yearly rate with interest added at a chosen frequency (FV = PV x (1 + r/n)^(n x t)): the future value, the starting amount, the annual rate, or the time in years. Use when the user knows three of the four and wants the fourth, e.g. "what rate turns $10,000 into $20,000 in 10 years", "how many years until $10,000 reaches $20,000 at 6%", or "what do I need to start with to reach $50,000". Do not use for regular contributions (use smartfin_project_savings_growth), for what a real investment did (use smartfin_calculate_investment_return), or for a forecast: one fixed rate is an assumption, and a required rate is the arithmetic, not a return to expect. To only grow an amount forward use smartfin_calculate_future_value.
| Name | Required | Description | Default |
|---|---|---|---|
| years | No | Time in years; a part of a year is a decimal. Leave out when solving for years | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| solve_for | Yes | Which number to find: future_value, present_value (the starting amount), annual_rate_pct or years | |
| future_value | No | Amount at the end in the currency chosen. Leave out when solving for future_value | |
| present_value | No | Starting amount in the currency chosen. Leave out when solving for present_value | |
| annual_rate_pct | No | Yearly rate in %, above -100, e.g. 6. Leave out when solving for annual_rate_pct | |
| compounding_frequency | Yes | Times a year interest is added: 1 annually, 2 semiannually, 4 quarterly, 12 monthly, 52 weekly, 365 daily |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world, so the safety profile is covered. The description adds genuine interpretation context beyond that: one fixed rate is an assumption and a solved rate is arithmetic rather than an expected return. It does not discuss precision, rounding, or edge behavior when inputs are inconsistent, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose, formula, and usage trigger are front-loaded in the first two sentences. The exclusion sentence is a long run-on packing three alternatives plus a caveat, which slightly hurts scannability, but no sentence is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation. The description covers the operation, the equation, the trigger condition, examples, and the sibling tools to use instead — everything an agent needs to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters including enum meanings, bounds, and the 'leave out when solving for X' pattern. The description restates the four solvable quantities and maps present_value to 'the starting amount,' which is a marginal clarification rather than new information. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (finds the one missing number) and resource (the four variables of FV = PV x (1 + r/n)^(n x t)), and even spells out the equation being solved. It distinguishes itself from siblings by naming smartfin_project_savings_growth, smartfin_calculate_investment_return, and smartfin_calculate_future_value as the wrong tools for adjacent tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition ('Use when the user knows three of the four and wants the fourth') backed by three concrete natural-language examples. It also provides explicit exclusions with the replacement tool named for each, so routing decisions require no inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_mortgage_payoffPay off a mortgage sooner with extra paymentsARead-onlyIdempotentInspect
How much sooner a fixed-rate mortgage (or other fixed-rate loan paid monthly) ends with an extra amount every month, a one-off payment, or both, from today's balance, the way SmartFin's mortgage payoff calculator does. Give the time left (years_left) or the monthly payment from the statement (monthly_payment), not both. Returns the months on each schedule, how many sooner, the interest on the rest of the loan with and without the extra, the difference, the extra paid, the last payment, the smallest whole extra a month that ends the loan 5 years sooner (1 year sooner when 2 to 10 years are left), and what the loan without extra would still owe when the loan with extra is paid off. Use when someone asks how much sooner or with how much less interest extra payments or a lump sum pay off a mortgage, or how much extra a month ends it some years early. Do not use for the payment on a new loan (use smartfin_calculate_loan_payment), refinancing, adjustable-rate or interest-only loans, or whether to pay off early or invest: it does not compare the two. Principal and interest only; taxes, insurance, escrow and prepayment penalties are not included. Each extra payment is applied to principal on its payment date. Amounts can be in any one currency; none is converted.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency for the amounts in the summary and the link. Default USD; amounts are never converted | |
| lump_sum | No | A one-off extra payment, in the same currency. Default 0. 0 to 100000000 | |
| years_left | No | Time left on the loan in years (to the nearest month: 2.5 is 2 years 6 months). Give this or monthly_payment. 1 month to 40 | |
| extra_monthly | No | Extra paid with every monthly payment from the next one, in the same currency. Default 0. 0 to 1000000 | |
| lump_sum_month | No | Which payment the one-off amount is paid with: 1 = the next payment. Default 1. 1 to 480 | |
| annual_rate_pct | Yes | Yearly interest rate, % a year, fixed for the rest of the loan. 0 to 25 | |
| current_balance | Yes | What is still owed today, from the statement. 1 to 100000000 | |
| monthly_payment | No | The monthly payment from the statement, principal and interest only (no escrow). Give this or years_left. 0 to 100000000 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: principal and interest only, taxes/insurance/escrow/prepayment penalties excluded, each extra payment applied to principal on its payment date, and no currency conversion. It also discloses the derived outputs, notably the 5-year/1-year-sooner minimum-extra calculation, which is non-obvious behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and usage guidance are front-loaded and the exclusions are crisp, but the second sentence is a long run-on that enumerates every return value in detail even though a full output schema exists — that enumeration is largely redundant and bloats the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter financial calculator with an output schema, the description covers what is needed: input mode constraint, unit/currency handling, what is excluded from the calculation, and stated assumptions about when extra payments apply. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already carries ranges, defaults, and the years_left/monthly_payment either-or note, so the baseline is 3. The description reinforces the mutually exclusive constraint ('not both') and frames years_left as 'time left' and monthly_payment as 'principal and interest only (no escrow)', adding marginal interpretive value on top of the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: computes how much sooner a fixed-rate mortgage ends with extra monthly, lump sum, or both, from today's balance. It explicitly names the sibling it is not for ('Do not use for the payment on a new loan (use smartfin_calculate_loan_payment)'), so an agent can separate it from the other calculate_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit trigger conditions ('Use when someone asks how much sooner or with how much less interest extra payments or a lump sum pay off a mortgage'), explicit exclusions (refinancing, adjustable-rate/interest-only, pay-off-vs-invest), and the input rule 'Give the time left (years_left) or the monthly payment from the statement (monthly_payment), not both.' Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_present_valuePresent value of a future amountARead-onlyIdempotentInspect
What an amount due in the future is worth today at a fixed yearly discount rate, and the discount between the two (PV = FV / (1 + r/n)^(n x t)). Use for questions about the value today of money received later, at a discount rate the user supplies. Do not use to pick a discount rate (the tool has none of its own), for several payments over time, or for a market price: it discounts one amount at one fixed rate. For growth going forward use smartfin_calculate_future_value.
| Name | Required | Description | Default |
|---|---|---|---|
| years | Yes | Years until the amount is due; a part of a year is a decimal | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| future_value | Yes | Amount due later, in the currency chosen | |
| annual_rate_pct | Yes | Yearly discount rate in %, above -100, e.g. 6 | |
| compounding_frequency | Yes | Times a year the rate compounds: 1 annually, 2 semiannually, 4 quarterly, 12 monthly, 52 weekly, 365 daily |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description still adds real scope context beyond them: the tool holds no rate of its own and discounts exactly one amount at one fixed rate, which tells the agent this is a bounded single computation rather than a solver. It does not discuss precision or rounding, but the output schema is present.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the definition and formula, then when-to-use, then exclusions, then the alternative. Three tight sentences with no redundant restatement of the name or title, and every clause carries routing or scope information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only single-formula calculator with a full output schema and 100% parameter documentation, the description supplies everything an agent lacks: the mathematical relationship, the scope limit (one amount, one fixed rate), and the sibling to use for the opposite direction. Nothing needed to select or call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents future_value, annual_rate_pct, compounding_frequency, years and currency in detail. The description only echoes that the discount rate is user-supplied, adding no format or constraint detail beyond the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (discount to present value) and resource (a single future amount), and even gives the formula PV = FV / (1 + r/n)^(n x t). It is clearly separable from smartfin_calculate_future_value, which it explicitly names as the inverse operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use (questions about the value today of money received later, at a user-supplied rate), three explicit when-not cases (picking a rate, multiple payments, market price), and names the alternative sibling for forward growth. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_profit_marginProfit marginARead-onlyIdempotentInspect
The profit and the profit margin percentage from revenue and total costs (margin = (revenue - costs) / revenue x 100). A negative margin is a valid result. Use for questions about profit as a share of sales, from two figures for the same period. Do not use for return on money invested (use smartfin_calculate_roi), for taxes, or to say whether a margin is good: the tool reports the figure only. The cost figure is whatever the user supplies, so it says nothing about gross versus net unless they define it.
| Name | Required | Description | Default |
|---|---|---|---|
| revenue | Yes | Revenue for the period in the currency chosen, above 0 | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| total_costs | Yes | Total costs for the same period in the currency chosen; it can be above revenue |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the description wisely spends its budget on things annotations cannot convey: a negative margin is a valid result, the tool reports the figure without judging it, and the cost input is user-defined so gross vs net is undefined. It stops short of stating precision/rounding or failure behavior, so not a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The output and formula lead, then usage, then caveats – properly front-loaded with no filler sentences. It is fairly dense at four sentences, and the closing gross/net sentence could arguably fold into the same-period sentence, keeping it just short of 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and annotations carry the safety profile. The description covers the remaining gaps – scope ambiguity (gross vs net), negative results, currency not being converted per the schema note, and sibling routing – leaving nothing an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3 since the schema already documents revenue, total_costs and currency. The description still adds interpretation the schema lacks: both figures must cover the same period, and the cost figure's gross/net meaning depends entirely on the user, which changes how the result should be described.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (compute profit and margin %) and even spells out the formula, so the agent knows exactly what is produced. It explicitly contrasts itself with smartfin_calculate_roi, which is the closest sibling, and notes the required scope (two figures for the same period).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives positive triggers (questions about profit as a share of sales), explicit exclusions (ROI, taxes, judging whether a margin is good), and the period-alignment precondition. This is a genuine when/when-not/alternative routing block rather than vague context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_retirement_withdrawalRetirement withdrawals: how long or how muchARead-onlyIdempotentInspect
Works the way SmartFin's withdrawal calculator does, with withdrawals monthly, quarterly or annually and the balance earning a yearly return between them. how_long: how many years a balance lasts at a set withdrawal, optionally rising each year with inflation. how_much: the withdrawal that lasts a given number of years, or that never touches the principal (lasts_forever). Use for "how long will my savings last" or "how much can I withdraw". Do not use to find a savings target (use smartfin_calculate_fire_number). Returns are an assumption; excludes taxes and fees.
| Name | Required | Description | Default |
|---|---|---|---|
| years | No | For how_much: how many years the money should last | |
| balance | Yes | Starting balance, in the currency chosen | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| question | Yes | how_long needs withdrawal_amount; how_much needs years or lasts_forever | |
| frequency | No | How often money is withdrawn. Default monthly | |
| inflation_pct | No | For how_long, optional: the withdrawal rises by this % each year | |
| lasts_forever | No | For how_much: the withdrawal that never touches the principal. At a return of 0% or below no amount qualifies, and withdrawal_per_period is 0 | |
| withdrawal_amount | No | For how_long: each withdrawal, in the currency chosen, at the chosen frequency | |
| expected_return_pct | Yes | Assumed yearly return in % |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description still adds real behavioral context: compounding conventions (balance earns a yearly return between withdrawals), frequency options, the lasts_forever edge case where 0% return yields no qualifying amount, and the caveat that returns are an assumption and taxes/fees are excluded.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: mode definitions precede usage cues and exclusions, and the tax/fee caveat closes cleanly. The opening clause about mirroring SmartFin's calculator is mildly redundant framing, but nothing else is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Nine parameters and two branching modes are handled, an output schema exists so return values need no explanation, and alternatives plus assumptions are covered. An agent has everything needed to select the right mode and required arguments.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter meaning is already documented and the baseline would be 3. The description earns above baseline by explaining the cross-parameter dependency structure (how_long requires withdrawal_amount; how_much requires years or lasts_forever), which the individual property descriptions do not state as a whole.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (calculating retirement withdrawals) and enumerates its two modes, how_long and how_much, with a one-line definition of each. It also names the sibling it is not (smartfin_calculate_fire_number), so an agent can disambiguate without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit inclusion cues are given as quoted user phrasings ("how long will my savings last", "how much can I withdraw") plus an explicit exclusion routing to smartfin_calculate_fire_number. This is the when-to-use / when-not-to-use pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_roiReturn on investment (ROI)ARead-onlyIdempotentInspect
The profit or loss and the ROI percentage from an initial investment and a final value (ROI = (final - initial) / initial x 100). Negative results are valid. It is not annualized. Use for questions about the total percentage return on money put in, from two values. Do not use for a return per year (use the CAGR calculator at smartfin.fyi/cagr-calculator.html), for what a real stock returned (use smartfin_calculate_investment_return), or for fees and taxes: include them in the final value yourself.
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| final_value | Yes | Final value in the currency chosen; it can be below the initial amount | |
| initial_value | Yes | Initial investment in the currency chosen, above 0 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/closed-world, so the safety profile is covered. The description adds genuinely non-obvious behavior: negative results are valid, the figure is not annualized, and fees/taxes are the caller's responsibility to fold into final_value. Return format is left to the output schema, which exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Formula and the 'negative results are valid / not annualized' caveats are front-loaded, then usage boundaries, then the fees/taxes caveat last. Every sentence carries distinct information; nothing is redundant with the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-input calculator with a full output schema and complete annotation coverage, the description supplies everything an agent needs: formula, valid-input ranges implied by semantics, edge cases, and routing to alternatives. No material gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description adds interpretation value beyond the schema by clarifying that final_value may legitimately fall below initial_value and that fees/taxes must be embedded there, plus the non-conversion of currency.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb and resource (calculate ROI), gives the exact formula, and states scope boundaries: 'not annualized', 'two values'. It clearly distinguishes itself from siblings like smartfin_calculate_investment_return and the CAGR calculator without requiring the agent to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('questions about the total percentage return on money put in, from two values') and three explicit when-not-to-use cases, each with the correct alternative named (CAGR calculator link, smartfin_calculate_investment_return) plus handling guidance for fees/taxes. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_savings_vs_investingCompare saving and investing the same moneyARead-onlyIdempotentInspect
Compares the modeled balances of a savings account and of an investment after 1 to 50 years, from the same starting amount and the same monthly contribution, the way SmartFin's savings vs investing calculator does. You give the savings rate and the investment return; each is held the same every year. Optional: a yearly increase in the monthly contribution (or one that follows inflation), a yearly fee on investments, and tax on savings interest or investment gains. Returns both modeled balances, money put in, interest, growth, fees and taxes, the difference, the same figures in today's money, the investment return at which both end the same (when a fee or tax is given), and a fixed falling-returns case at −2% a year. Use for questions like "how do 10,000 in savings at 4% and the same amount invested at 7% compare after 20 years" or "how far apart do saving and investing end after 20 years". It reports two modeled balances and does not say which option to choose. Do not use it for historical stock or index returns (use smartfin_compare_investment_strategies) or for account types and their tax rules, which it does not model. Amounts can be in any one currency; none is converted.
| Name | Required | Description | Default |
|---|---|---|---|
| years | No | Years to compare, 1 to 50. A decimal is rounded to the nearest whole year. Default 10 | |
| currency | No | Currency for the amounts in the summary and the link. Default USD; amounts are never converted | |
| inflation_pct | No | Inflation, % a year. Used to show balances in today's money, and to set the yearly increase when step_up_matches_inflation is true. Default 3 | |
| starting_amount | No | Amount in the account at the start, in the currency chosen below; the same for both paths. Default 10000 | |
| savings_rate_pct | No | Savings account rate, % a year, with compounding included (APY in the US, AER in the UK). Held the same every year. Default 3 | |
| investment_fee_pct | No | Yearly fee on investments, % a year, subtracted from the return (6% with a 1% fee grows at 5%). Default 0 | |
| monthly_contribution | No | Amount added to both paths at the end of every month, in the same currency. Default 500 | |
| investment_return_pct | No | Investment return before any fee, % a year; may be negative. Held the same every year. Default 6 | |
| contribution_step_up_pct | No | Yearly increase in the monthly contribution, % a year. Year 1 is the amount given; each later year rises by this. Ignored when step_up_matches_inflation is true. Default 0 | |
| investment_gains_tax_pct | No | Tax on investment gains, % of the gains, taken once as if the investments were sold at the end of the years. A simplified assumption, not tax advice. Default 0 | |
| savings_interest_tax_pct | No | Tax on savings interest, % of the interest, taken as the interest is credited. A simplified assumption, not tax advice. Default 0 | |
| step_up_matches_inflation | No | True: each later year's monthly contribution changes by inflation_pct instead of contribution_step_up_pct. Default false |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish the safety profile (readOnly, idempotent, closed-world), and the description adds substantial modeling context beyond them: rates are held constant every year, tax is taken as a simplified one-time assumption, fees are subtracted from return, balances are also shown in today's money, a fixed −2%/year case is included, and no currency conversion occurs. For a pure calculator this is unusually rich disclosure of assumptions and limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and scope are front-loaded, and the paragraph follows a logical purpose -> inputs -> outputs -> examples -> exclusions order. It is somewhat long for a calculator, and the detailed enumeration of returned figures ('both modeled balances, money put in, interest, growth, fees and taxes...') partly duplicates the output schema, which costs a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 12-parameter tool with an output schema, the description covers everything an agent needs: modeling assumptions, which parameters are optional, the constant-rate simplification, the no-conversion currency rule, sibling alternatives, and the fact that it does not give a recommendation. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already defines every parameter; baseline is 3. The description adds value by grouping the inputs into core (savings rate, investment return, both held constant) versus optional features (contribution step-up or inflation-linked, investment fee, interest/gains tax), which helps an agent understand how the 12 parameters interact before diving into the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Compares the modeled balances of a savings account and of an investment') plus scope (1-50 years, same starting amount and contribution), and explicitly distinguishes itself from siblings by naming smartfin_compare_investment_strategies for historical returns. It also clarifies what it does not do ('does not say which option to choose'), so an agent can select it unambiguously.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger examples ('how do 10,000 in savings at 4% and the same amount invested at 7% compare after 20 years') and explicit exclusions with the alternative tool named for each (historical index returns -> smartfin_compare_investment_strategies; account types/tax rules -> not modeled). This is textbook when-to-use / when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_calculate_simple_interestSimple interestARead-onlyIdempotentInspect
The interest earned and the final amount on a principal at a fixed yearly rate over a number of years, when interest is not compounded (interest = principal x rate x time). Use for questions about simple interest on a loan or deposit, such as a short-term note or a bond coupon at a flat rate. Do not use when interest is added back to the balance (use smartfin_calculate_future_value or smartfin_project_savings_growth), for loan payments (use smartfin_calculate_loan_payment), or for taxes and fees: it applies none.
| Name | Required | Description | Default |
|---|---|---|---|
| years | Yes | Time in years; a part of a year is a decimal, e.g. 0.5 | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| principal | Yes | Starting amount in the currency chosen, above 0 | |
| annual_rate_pct | Yes | Yearly interest rate in %, from 0 to 100, e.g. 5 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds domain behavior beyond annotations: it is non-compounded simple interest and applies no taxes or fees, which helps set expectations for what the calculation includes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the definition, then use cases, then exclusions. Every sentence carries routing or calculation information, and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, read-only calculator with annotations and an output schema, the description provides enough context: what it computes, when to use it, when not to use it, and which alternatives handle those cases. Return-value details are appropriately left to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents principal, annual_rate_pct, years, and currency. The description adds the relationship 'interest = principal x rate x time' and clarifies non-compounding, but it does not add per-parameter detail beyond the schema's own descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact computation: simple interest and final amount from principal, fixed yearly rate, and years. It also states the formula and distinguishes the tool from compounding, loan-payment, and tax/fee alternatives, so an agent can identify it precisely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit positive use cases (simple interest on a loan or deposit, short-term note, flat-rate bond coupon) and explicit exclusions with named alternatives: compounding tools, loan-payment tool, and taxes/fees. This is exactly the when/when-not routing guidance needed among many sibling calculators.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_compare_investment_strategiesCompare lump sum, monthly and buy-the-dipARead-onlyIdempotentInspect
Runs one amount through three ways of buying the same US stock or index ETF over a chosen period, on real daily closing prices (adjusted for splits and reinvested dividends): all at once on the first trading day (lump sum), spread evenly on the trading day nearest the 1st of each month, or bought after the price falls a set % from its latest high. Returns each strategy's final value, total and yearly return, worst fall and Sharpe ratio. Use when the user asks which way of investing would have done better for a specific stock or index over a past period, or what an amount would be worth under each approach. Do not use for one strategy only (use smartfin_calculate_investment_return), for several reference periods at once (use smartfin_compare_time_periods), or for future projections. Limits: US-listed S&P 500 companies and major index ETFs only, prices in US dollars, month-level start and end; results depend on the period and are not a prediction.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | Yes | Total dollars to invest across the whole period | |
| ticker | Yes | Stock or ETF symbol, not a company name: AAPL not Apple. Covers 508 symbols: the S&P 500 companies plus the index ETFs SPY, VOO, IVV, QQQ, DIA, IWM, VTI. | |
| end_month | No | Last month to include, YYYY-MM. Omit for the latest available month | |
| start_month | Yes | First month, YYYY-MM, e.g. 2016-01 | |
| response_format | No | detailed adds worst fall and Sharpe ratio to the summary. Default concise | |
| dip_threshold_pct | No | Buy-the-dip trigger: a fall of this % from the latest high. Default 10 | |
| dip_percent_per_buy | No | Share of the amount spent on each dip, in %. Default 10 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, non-open-world behavior, so the safety profile is covered. The description adds genuinely useful context beyond that: the pricing basis (daily closes adjusted for splits and reinvested dividends), the coverage limits (US-listed S&P 500 names plus major ETFs, USD, month-level granularity), and an explicit caveat that results are period-dependent and not a prediction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the three strategies are front-loaded before the usage guidance, and every sentence carries information. It is on the long side for a single paragraph, but the length is justified by three distinct strategies plus sibling routing; no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter analytical tool with an output schema present, the description covers methodology, universe constraints, granularity, usage routing, and interpretation caveats. An agent has everything needed to select and invoke it correctly without needing return-value details, since the output schema supplies those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning by defining what each strategy does — lump sum on the first trading day, monthly on the trading day nearest the 1st, and buy-the-dip after a set % fall from the latest high — which is exactly the semantics behind dip_threshold_pct and dip_percent_per_buy that the schema only names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (runs one amount through three buying strategies) and resource (US stock/index ETF over a period), and explicitly differentiates from siblings by naming smartfin_calculate_investment_return and smartfin_compare_time_periods. The three strategies are enumerated concretely, so an agent knows exactly what is computed.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('user asks which way of investing would have done better for a specific stock or index over a past period') and when-not-to-use cases with named alternatives for single-strategy and multi-period comparisons, plus an exclusion for future projections. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_compare_rent_vs_buyCompare renting and buying a homeARead-onlyIdempotentInspect
Compares buying a home with a fixed-rate mortgage against renting a similar home and investing the money not spent on the home, over the years someone plans to stay, the way SmartFin's rent vs buy calculator does. Both start with the same cash and spend the same each month; whichever costs less that month invests the difference. Returns the modeled money each choice leaves (home sold and loan paid, or kept as equity, against the investments), the difference, the first year-end at which buying leaves at least as much as renting, the starting rent at which both leave the same, the monthly payment, month-one costs and totals. Use when someone asks how renting and buying compare, how long they would need to stay for the two to cross, or what rent matches buying a home. Do not use for rental-property investing, for how much someone can borrow, for tax planning or for adjustable-rate loans. Rates are held constant; income-tax effects of owning and tax on the home sale are not modeled. It reports modeled money only and does not say whether to rent or buy. Amounts can be in any one currency; none is converted.
| Name | Required | Description | Default |
|---|---|---|---|
| pmi_pct | No | Mortgage insurance (PMI), % of loan a year, 0 to 3. Default 0 | |
| currency | No | Currency for the amounts in the summary and the link. Default USD; amounts are never converted | |
| keep_home | No | True: the home is kept at the end of the stay and counted as equity, not cash; false: it is sold. Default false | |
| home_price | Yes | Home price, in the currency chosen, 1000 to 100000000. Default 400000 | |
| term_years | No | Loan term, years, 1 to 40. Default 30 | |
| hoa_monthly | No | HOA or condo fees, a month, in the currency chosen, 0 to 10000. Default 0 | |
| monthly_rent | Yes | Monthly rent, a month, in the currency chosen, 1 to 1000000. Default 2000 | |
| years_to_stay | No | Years you plan to stay, whole years, 1 to 40. Default 10 | |
| annual_rate_pct | No | Mortgage rate, % a year, fixed, 0 to 25. Default 6.5 | |
| cost_growth_pct | No | Yearly increase in insurance and HOA, % a year, -5 to 15. Default 3 | |
| maintenance_pct | No | Maintenance, % of home value a year, 0 to 5. Default 1 | |
| buying_costs_pct | No | Closing costs when buying, % of price, 0 to 10. Default 3 | |
| down_payment_pct | No | Down payment, % of price, 0 to 100. Default 20 | |
| property_tax_pct | No | Property tax, % of home value a year, 0 to 5. Default 1 | |
| rent_increase_pct | No | Yearly rent increase, % a year, -10 to 15. Default 3 | |
| selling_costs_pct | No | Agent and closing costs when selling, % of sale price, 0 to 10. Default 6 | |
| investment_tax_pct | No | Tax on investment gains, % of gains, 0 to 50. Default 0 | |
| home_insurance_yearly | No | Home insurance, a year, in the currency chosen, 0 to 100000. Default 1500 | |
| home_value_growth_pct | No | Home value growth, % a year, -10 to 15. Default 3 | |
| investment_return_pct | No | Return on invested savings, % a year, -10 to 20. Default 6 | |
| renters_insurance_monthly | No | Renter's insurance, a month, in the currency chosen, 0 to 1000. Default 0 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so credit is for added context: it explains the simulation mechanics (same cash, same monthly spend, difference invested), states key modeling limitations (rates held constant, income-tax effects and sale tax not modeled), and clarifies it reports modeled money only rather than a recommendation. The limitations are the valuable additions here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the comparison method and behavior before usage guidance, which is well-ordered. However, the description is dense and lists many return fields (first-year crossover, break-even rent, monthly payment, month-one costs) in one long sentence that could be trimmed, especially since an output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a 21-parameter tool with an output schema and full annotations, the description covers the algorithm, limitations, exclusions, currency handling, and the distinction between modeled output and advice. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented with ranges and defaults. The description adds only high-level modeling context (currency never converted, rates fixed) rather than per-parameter meaning. Baseline 3 is correct when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (compares buying vs renting) and immediately distinguishes itself from siblings like calculate_savings_vs_investing by naming the exact methodology: fixed-rate mortgage vs investing the difference. An agent can select this without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives three triggering questions ('how renting and buying compare', 'how long they would need to stay', 'what rent matches buying a home') and four exclusions (rental-property investing, borrowing capacity, tax planning, ARMs). This is model when-to-use/when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_compare_time_periodsOne investment across reference periodsARead-onlyIdempotentInspect
What a fixed amount in a US stock or index ETF became across reference periods ending today (or on as_of_date): since 2000, since the dot-com peak (24 Mar 2000), since the dot-com crash low (9 Oct 2002), since the 2007 peak (9 Oct 2007), since the 2008 crash low (9 Mar 2009), since 2010, since the COVID low (23 Mar 2020), since the 2022 low (12 Oct 2022), and the last 10, 5 and 1 years. Each row gives lump sum and monthly investing results on daily closing prices adjusted for splits and reinvested dividends. Event dates are S&P 500 closing highs and lows. Use when the user asks how a stock did over several time frames, or names one of these moments ("from the COVID low", "since 2000"). Do not use for a custom start month (use smartfin_compare_investment_strategies). Limits: periods that start before the ticker's price history are skipped and listed with the reason; US dollars; not a prediction.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Dollars invested in each period. Default 1000 | |
| ticker | Yes | Stock or ETF symbol, not a company name: AAPL not Apple. Covers 508 symbols: the S&P 500 companies plus the index ETFs SPY, VOO, IVV, QQQ, DIA, IWM, VTI. | |
| periods | No | Which periods to include. Omit for all | |
| as_of_date | No | End date, YYYY-MM-DD. Omit for the latest available price |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description adds substantive context beyond them: daily closing prices adjusted for splits and reinvested dividends, US-dollar denomination, skipped periods surfaced with a reason, and an explicit 'not a prediction' caveat. It stops short of stating rate limits or latency, which keeps it at a 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core operation, then usage routing, then limits. The long enumeration of periods is justified because the underlying enum values are opaque, but the single dense paragraph could be broken up and a few clauses ('Each row gives lump sum and monthly investing results...') lean toward return-format detail that the output schema already covers.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-parameter read tool with an output schema, the description covers what an agent needs: scope, period definitions, ticker universe expectations, currency, skip behavior, and an explicit not-a-prediction boundary. Return-shape details are present but non-essential, and nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description earns above baseline by decoding the cryptic enum labels into real semantics, mapping dotcom_peak, covid_low, low_2022 etc. to actual dates and explaining that they are S&P 500 closing highs and lows, plus clarifying that event dates are index-level while the ticker drives the result.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: what a fixed amount in a named US stock or index ETF became across defined reference periods ending today or on as_of_date. It explicitly names the sibling it is not (smartfin_compare_investment_strategies) and enumerates the exact period set, so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives positive triggers ('how a stock did over several time frames', or naming a moment like 'from the COVID low') and an explicit exclusion with the correct alternative for custom start months. Nothing about when to reach for this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_compare_two_stocksCompare two stocks over the same datesARead-onlyIdempotentInspect
Compares two US-listed stocks or index ETFs on identical dates with the same money, on daily closing prices adjusted for stock splits with dividends reinvested, the way SmartFin's Compare Two Stocks page does. Returns, for each, the value of the starting amount and its total and yearly return, the worst fall with its dates and the months back to the high before it (or that it hasn't recovered), and, with monthly_amount, the whole holding (with_monthly: purchases made, money put in, value, and total return on the money put in) with that amount added once for each 1st of a month after the start date and on or before the end date, on the trading day nearest that 1st. Use when someone asks how two stocks or funds did against each other, e.g. "apple vs microsoft stock over 10 years" or "voo vs qqq since 2015". Do not use for one stock (use smartfin_calculate_investment_return), for ways of buying one stock (use smartfin_compare_investment_strategies), for future returns, or to say which to buy: it states both figures and never picks one. Limits: today's S&P 500 companies and major index ETFs only, prices in US dollars; both start on the same trading day, and when one stock's history starts later, both start then and the summary says so.
| Name | Required | Description | Default |
|---|---|---|---|
| amount | No | Starting amount invested once in each, in US dollars. Default 1000 | |
| end_date | No | End date, YYYY-MM-DD; a weekend or holiday uses the nearest trading day. Omit for the latest close | |
| start_date | No | Start date, YYYY-MM-DD; a weekend or holiday uses the nearest trading day (the earlier on a tie). Omit for 10 years before the latest close | |
| first_ticker | Yes | Stock or ETF symbol, not a company name: AAPL not Apple. Covers 508 symbols: the S&P 500 companies plus the index ETFs SPY, VOO, IVV, QQQ, DIA, IWM, VTI. | |
| second_ticker | Yes | Stock or ETF symbol, not a company name: AAPL not Apple. Covers 508 symbols: the S&P 500 companies plus the index ETFs SPY, VOO, IVV, QQQ, DIA, IWM, VTI. | |
| monthly_amount | No | Optional amount added to each every month after the start, in US dollars. Default 0 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description goes well beyond them: it discloses the exact computation basis, that both series start on the same trading day with later-start tickers truncating both, and that the summary flags this. It also clarifies the tool never picks a winner, which is a genuine behavioral constraint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then limits, and essentially every clause carries information. It is a very long run-on sentence, which slightly hurts scannability, but there is little filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite six parameters, a complex return shape, and date-alignment edge cases, the description covers scope limits, alignment rules, monthly-contribution behavior, and the no-recommendation guarantee. With an output schema present, return formatting need not be re-explained, and nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the description nevertheless adds real meaning beyond the schema by explaining the monthly_amount mechanics (added once per 1st of month after start, executed on the nearest trading day) and the shared-start-date alignment behavior, which the schema does not spell out.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (compares two US-listed stocks or index ETFs on identical dates) and pins down the methodology (split-adjusted closing prices, dividends reinvested). It explicitly names the siblings it is not (smartfin_calculate_investment_return, smartfin_compare_investment_strategies), so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete positive triggers ('apple vs microsoft stock over 10 years', 'voo vs qqq since 2015') and explicit exclusions with the correct alternative named for each (one stock, buying strategies, future returns, buy recommendations). Limits on coverage (S&P 500 + major ETFs only) are stated up front.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_get_embed_codePut a SmartFin calculator on a websiteARead-onlyIdempotentInspect
The HTML to put one of SmartFin's free calculators on a website the user runs: a blog post, a class or library page, a client resources page. One iframe line, free, no sign-up, no cookies or tracking; the widget fills the width it's given and follows the reader's light or dark mode. Calculators: compare_two_stocks (Compare Two Stocks), investment (Investment growth calculator), compound_interest (Compound interest calculator), mortgage (Mortgage calculator), car_loan (Car loan calculator), student_loan (Student loan calculator), refinance (Refinance calculator), mortgage_payoff (Mortgage payoff calculator), down_payment (Down payment calculator), cagr (CAGR calculator), rule_of_72 (Rule of 72 calculator), inflation (Inflation calculator), fire (FIRE calculator), withdrawal (Withdrawal planner), savings_vs_investing (Savings vs investing calculator), rent_vs_buy (Rent vs buy calculator), simple_interest (Simple interest calculator), future_value (Future value calculator), present_value (Present value calculator), roi (ROI calculator), profit_margin (Profit margin calculator). Use when the user wants a calculator on their own site or asks how to add one. Do not use to calculate anything (use the other smartfin_ tools).
| Name | Required | Description | Default |
|---|---|---|---|
| currency | No | Show this currency to every reader. Omit to let each reader choose | |
| calculator | Yes | Which calculator to embed |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, not open-world), so the bar is lower; the description still adds real context: free, no sign-up, no cookies or tracking, the widget fills its container width, and it follows the reader's light/dark mode. What it does not cover is the exact shape of the returned HTML or any sizing/attribute caveats, which is the only remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The value proposition (one iframe line, free, no sign-up, no tracking) and the routing rules are front-loaded, and the closing exclusion sentence is well placed. The 21-item calculator enumeration is bulky, but it is partly justified because it annotates bare enum keys with display names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation is not required, and the description covers purpose, trigger, exclusion, embed properties, and the calculator catalogue. Currency behavior is left entirely to the schema, and no guidance is given on placement or sizing caveats beyond width-filling, leaving a small completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters have enums, so the schema carries the syntax burden (baseline 3). The description adds value by mapping every cryptic enum key to a human-readable calculator name (e.g. rule_of_72 → 'Rule of 72 calculator'), which helps the agent pick the right one; the currency parameter itself is not elaborated in the description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific deliverable ('The HTML to put one of SmartFin's free calculators on a website') and immediately differentiates from the sibling smartfin_calculate_* tools by declaring it is not for computing anything. An agent can route correctly without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit positive trigger ('Use when the user wants a calculator on their own site or asks how to add one') and an explicit exclusion with the alternative ('Do not use to calculate anything (use the other smartfin_ tools)'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
smartfin_project_savings_growthProject savings growthARead-onlyIdempotentInspect
Future balance of savings or an investment growing at a fixed yearly rate, with optional monthly contributions and a chosen compounding frequency. Returns the balance, total paid in and interest earned. Use for forward-looking "how much will I have" questions at an assumed rate. Do not use for what a real stock did in the past (use smartfin_calculate_investment_return). A fixed rate is an assumption, not a forecast.
| Name | Required | Description | Default |
|---|---|---|---|
| years | Yes | Number of years | |
| currency | No | Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD | |
| principal | Yes | Starting amount in the currency chosen | |
| annual_rate_pct | Yes | Assumed yearly rate in %, e.g. 7 | |
| compounds_per_year | No | 1 yearly, 2 twice a year, 4 quarterly, 12 monthly, 365 daily. Default 12 | |
| monthly_contribution | No | Added each month, in the currency chosen. Default 0 |
Output Schema
| Name | Required | Description |
|---|---|---|
| cite | Yes | How to credit this result |
| data | Yes | |
| next | Yes | Suggested follow-up calls |
| links | Yes | |
| how_to | Yes | Steps for the user to see or redo this on smartfin.fyi |
| source | Yes | |
| summary | Yes | Plain-language result the assistant can quote |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, and an output schema exists, so the description's remaining burden is light. It still adds genuine value by calling out what the result contains (balance, total paid in, interest earned) and, importantly, framing the fixed rate as an assumption rather than a forecast — a real interpretive caveat. It stops short of behavioral detail like sign conventions for negative rates, but that is minor here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each earning its place: purpose, output, use-case routing, and a caution. The scoping and the sibling alternative are front-loaded rather than buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A read-only, idempotent calculator with a full output schema and 100% parameter documentation. Purpose, routing, and the interpretive caveat are all present; nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and two parameters carry enums with defaults, so the schema does the heavy lifting. The description echoes 'monthly contributions' and 'compounding frequency' but adds no format, default, or interaction detail beyond what the schema already provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence states a specific computation — future balance of savings/investment at a fixed yearly rate with optional contributions and compounding — and the exclusion clause names the sibling it must not be confused with (smartfin_calculate_investment_return). An agent can distinguish this from the ~19 other calculators without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('forward-looking how much will I have questions at an assumed rate') and when-not ('what a real stock did in the past'), with the alternative tool named. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
15 tool updates
- Added
smartfin_calculate_down_payment - Changed
smartfin_calculate_fire_number4 fields changed- changed
Input schema / properties / annual_expenses / descriptionPrevious value: -"Yearly spending today, in dollars"New value: +"Yearly spending today, in the currency chosen" - changed
Input schema / properties / annual_savings / descriptionPrevious value: -"Added each year, in dollars (12 x a monthly amount). Default 0"New value: +"Added each year, in the currency chosen (12 x a monthly amount). Default 0" - added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / current_savings / descriptionPrevious value: -"Invested today, in dollars. Default 0"New value: +"Invested today, in the currency chosen. Default 0"
- Changed
smartfin_calculate_future_value2 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / present_value / descriptionPrevious value: -"Amount today in dollars"New value: +"Amount today in the currency chosen"
- Changed
smartfin_calculate_inflation_impact2 fields changed- changed
Input schema / properties / amount / descriptionPrevious value: -"Amount in dollars"New value: +"Amount in the currency chosen" - added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +}
- Changed
smartfin_calculate_loan_payment3 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / home_price / descriptionPrevious value: -"Mortgage only: home price, in dollars, with down_payment_pct"New value: +"Mortgage only: home price, in the currency chosen, with down_payment_pct" - changed
Input schema / properties / loan_amount / descriptionPrevious value: -"Amount borrowed, in dollars. Give this or home_price"New value: +"Amount borrowed, in the currency chosen. Give this or home_price"
- Changed
smartfin_calculate_missing_variable3 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / future_value / descriptionPrevious value: -"Amount at the end in dollars. Leave out when solving for future_value"New value: +"Amount at the end in the currency chosen. Leave out when solving for future_value" - changed
Input schema / properties / present_value / descriptionPrevious value: -"Starting amount in dollars. Leave out when solving for present_value"New value: +"Starting amount in the currency chosen. Leave out when solving for present_value"
- Added
smartfin_calculate_mortgage_payoff - Changed
smartfin_calculate_present_value2 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / future_value / descriptionPrevious value: -"Amount due later, in dollars"New value: +"Amount due later, in the currency chosen"
- Changed
smartfin_calculate_profit_margin3 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / revenue / descriptionPrevious value: -"Revenue for the period in dollars, above 0"New value: +"Revenue for the period in the currency chosen, above 0" - changed
Input schema / properties / total_costs / descriptionPrevious value: -"Total costs for the same period in dollars; it can be above revenue"New value: +"Total costs for the same period in the currency chosen; it can be above revenue"
- Changed
smartfin_calculate_retirement_withdrawal4 fields changed- changed
Input schema / properties / balance / descriptionPrevious value: -"Starting balance, in dollars"New value: +"Starting balance, in the currency chosen" - added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / lasts_forever / descriptionPrevious value: -"For how_much: the withdrawal that never touches the principal"New value: +"For how_much: the withdrawal that never touches the principal. At a return of 0% or below no amount qualifies, and withdrawal_per_period is 0" - changed
Input schema / properties / withdrawal_amount / descriptionPrevious value: -"For how_long: each withdrawal, in dollars, at the chosen frequency"New value: +"For how_long: each withdrawal, in the currency chosen, at the chosen frequency"
- Changed
smartfin_calculate_roi3 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / final_value / descriptionPrevious value: -"Final value in dollars; it can be below the initial amount"New value: +"Final value in the currency chosen; it can be below the initial amount" - changed
Input schema / properties / initial_value / descriptionPrevious value: -"Initial investment in dollars, above 0"New value: +"Initial investment in the currency chosen, above 0"
- Changed
smartfin_calculate_simple_interest2 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / principal / descriptionPrevious value: -"Starting amount in dollars, above 0"New value: +"Starting amount in the currency chosen, above 0"
- Added
smartfin_compare_two_stocks - Changed
smartfin_get_embed_code1 field changed- changed
Input schema / properties / calculator / enumPrevious value: -[ - "investment", - "compound_interest", - "mortgage", - "car_loan", - "student_loan", - "refinance", - "cagr", - "rule_of_72", - "inflation", - "fire", - "withdrawal", - "savings_vs_investing", - "rent_vs_buy", - "simple_interest", - "future_value", - "present_value", - "roi", - "profit_margin" -]New value: +[ + "compare_two_stocks", + "investment", + "compound_interest", + "mortgage", + "car_loan", + "student_loan", + "refinance", + "mortgage_payoff", + "down_payment", + "cagr", + "rule_of_72", + "inflation", + "fire", + "withdrawal", + "savings_vs_investing", + "rent_vs_buy", + "simple_interest", + "future_value", + "present_value", + "roi", + "profit_margin" +]
- Changed
smartfin_project_savings_growth3 fields changed- added
Input schema / properties / currencyAdded value: +{ + "description": "Currency symbol for the amounts in the summary only; amounts are never converted. The link opens the page in US dollars, and how_to says to pick the currency there. Default USD", + "enum": [ + "USD", + "EUR", + "GBP", + "CHF", + "AUD", + "CAD", + "SGD", + "HKD", + "INR", + "JPY" + ], + "type": "string" +} - changed
Input schema / properties / monthly_contribution / descriptionPrevious value: -"Added each month, in dollars. Default 0"New value: +"Added each month, in the currency chosen. Default 0" - changed
Input schema / properties / principal / descriptionPrevious value: -"Starting amount in dollars"New value: +"Starting amount in the currency chosen"
9 tool updates
- Added
smartfin_calculate_future_value - Added
smartfin_calculate_missing_variable - Added
smartfin_calculate_present_value - Added
smartfin_calculate_profit_margin - Added
smartfin_calculate_roi - Added
smartfin_calculate_savings_vs_investing - Added
smartfin_calculate_simple_interest - Added
smartfin_compare_rent_vs_buy - Changed
smartfin_get_embed_code1 field changed- changed
Input schema / properties / calculator / enumPrevious value: -[ - "investment", - "compound_interest", - "mortgage", - "car_loan", - "student_loan", - "refinance", - "cagr", - "rule_of_72", - "inflation", - "fire", - "withdrawal" -]New value: +[ + "investment", + "compound_interest", + "mortgage", + "car_loan", + "student_loan", + "refinance", + "cagr", + "rule_of_72", + "inflation", + "fire", + "withdrawal", + "savings_vs_investing", + "rent_vs_buy", + "simple_interest", + "future_value", + "present_value", + "roi", + "profit_margin" +]
1 tool update
- Changed
smartfin_calculate_fire_number1 field changed- changed
Input schema / properties / withdrawal_rate_pct / descriptionPrevious value: -"Safe withdrawal rate in %. Default 4"New value: +"Withdrawal-rate assumption in %. Default 4"
9 tool updates
- Changed
smartfin_calculate_fire_number1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_calculate_inflation_impact1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_calculate_investment_return1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_calculate_loan_payment1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_calculate_retirement_withdrawal1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_compare_investment_strategies1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_compare_time_periods1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_get_embed_code1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
- Changed
smartfin_project_savings_growth1 field changed- added
Output schema / properties / links / properties / pageAdded value: +{ + "description": "SmartFin's page for this stock, when it has one", + "type": "string" +}
9 tool updates
- First observed
smartfin_calculate_fire_number - First observed
smartfin_calculate_inflation_impact - First observed
smartfin_calculate_investment_return - First observed
smartfin_calculate_loan_payment - First observed
smartfin_calculate_retirement_withdrawal - First observed
smartfin_compare_investment_strategies - First observed
smartfin_compare_time_periods - First observed
smartfin_get_embed_code - First observed
smartfin_project_savings_growth
Related MCP Connectors
When can you retire? A FIRE plan from your numbers, graded by Monte Carlo and every year since 1872.
Performance, risk, comparisons, backtests and screening for US stocks and ETFs, with charts.
Dollar-cost-averaging backtests on real historical data for crypto, stocks and commodities.
FIRE & retirement calculators + a multi-currency portfolio rebalancer (exact buy/sell trades).
Related MCP Servers
FlicenseNot gradedqualityDmaintenanceTax-aware retirement planning for Canada and the US. CPP/OAS and Social Security timing, RRSP/TFSA/401k/IRA projections, Monte Carlo simulation, withdrawal order optimization, and historical backtesting against 150 years of market data.2-- FlicenseNot gradedqualityCmaintenanceProvides market-data and quant-research tools including live stock prices, price history, moving averages, and SMA-crossover backtesting, with a synthetic-data fallback when external data is unavailable.-
- AlicenseAqualityCmaintenanceEnables point-in-time backtesting on daily bars with declarative strategy specs and deterministic simulated runs, offering two tool surfaces without needing API keys or network access.10MIT
- AlicenseBqualityCmaintenanceProvides 77 deterministic financial calculators, live market data, and a meta-advisor that chains tools into prioritized plans from plain-language descriptions.7720 PyPI6MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.