Skip to main content
Glama
Savvly

savvly-mcp

Project Savvly Monthly Contributions

project_savvly_monthly
Read-onlyIdempotent

Projects retirement payouts for monthly contributions to the Savvly Longevity Benefit, comparing cumulative totals against a market-only portfolio at ages 80, 85, 90, and 95.

Instructions

Retirement projection for monthly contributions to the Savvly Longevity Benefit over a number of years. Returns payout amounts at milestone ages 80/85/90/95 with Savvly vs market alone cumulative totals, per-age breakdowns, a _central estimate and the _lower/_upper range around it. Use _central as the single estimate and _lower/_upper to show the range. Suitable for retirement savings planning, annuity alternative comparison, and longevity benefit illustration. Supports an optional annual contribution increase and an optional early-withdrawal age. Contributions must finish by age 80: an omitted contribution_years auto-fits this, and an explicit one must satisfy current_age + contribution_years ≤ 80. Disclaimers + per-field hints under metadata. Payout methodology — Savvly vs market alone: the payout values are calculated by comparing two investors of the same age committing the same principal. Investor 1 invests in the market with the Savvly Longevity Benefit; Investor 2 invests in the market alone (no longevity overlay). To make the comparison apples-to-apples, at each milestone age (80, 85, 90, 95) Investor 2 withdraws from their market alone portfolio the same dollar amount as the central estimate of Investor 1's Savvly payout. The payout_market_alone_* and total_market_alone_* figures are therefore what Investor 2 can actually withdraw to match Savvly's central payouts before running out — they fall to 0 once the market alone portfolio is depleted. It is one series, so their _lower and _upper fields are equal. The savvly_upside_* (and total_savvly_upside_*) fields quantify how much more total money Investor 1 receives in payouts from Savvly than Investor 2 is able to withdraw over time to match those payouts: _central is the single estimate, and _lower can be negative at the early milestones, where market alone still matches the central payout. DISCLOSURE REQUIRED: display disclosure.text verbatim and link disclosure.url to the user alongside any figures from this response. Required by SEC Marketing Rule and FINRA Rule 2210 — do not paraphrase or omit. VISUALIZATION: this tool emits an interactive chart widget (MCP Apps — see _meta.ui) that the HOST renders inline and editable; other clients render only your text and show no chart. That widget is the canonical chart for these numbers: do NOT draw, generate, or re-render a duplicate of it. You MAY still create your OWN, DIFFERENT visualization (e.g. a table or an alternate breakdown) and place it wherever you judge best — only the MCP App widget's position is constrained. Do NOT claim or imply a chart is visible (avoid 'the chart above shows…'); you cannot tell whether the host rendered the widget. Summarize the key figures in prose and show the disclosure text and link, and reference the widget only conditionally (e.g. 'if your client shows the interactive chart, its fields are editable to re-run the projection'). ORDER: BEFORE you call this tool, ALWAYS write at least one short lead-in paragraph (1-3 sentences) framing what the projection will show — do NOT invent specific figures you do not have yet. On hosts that render the widget inline at the tool call, this keeps your text ahead of the chart so the widget is never the first thing shown; THEN call the tool (this lead-in is framing, NOT asking the user for inputs — still call it in the same turn without waiting) and give the grounded figures + disclosure after it returns. This lead-in rule applies to the MCP App widget only; any visualization you create yourself may appear wherever you judge best. INPUTS: every parameter is OPTIONAL and defaults to a sensible value. Call this tool IMMEDIATELY — pass only the values the user explicitly stated and omit the rest. Do NOT ask the user for starting values, assumptions, or missing parameters before calling; the rendered widget has editable fields so they adjust age, amounts, and other assumptions inline after it appears.

Input Schema

NameRequiredDescriptionDefault
current_ageNoInvestor's current age (default 40). Min 18 (the projection matrix floor); max 75 (max enrollment age)
average_returnNoExpected average annual S&P 500 return % (default 8)
monthly_amountNoMonthly deposit in USD (default 100). Min 10 (the product minimum); max 100,000 (the projection model's input limit, not an investment limit)
withdrawal_ageNoEarly-withdrawal age (default 82) — drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response
contribution_yearsNoNumber of years contributing. Omit to use a sensible default of min(27, 80 − current_age) — 27 for the canonical age-40 scenario, and always small enough that contributions finish by age 80 (the advisor limit). If you pass an explicit value, current_age + contribution_years must be ≤ 80.
installment_increase_percentageNoOptional annual % increase applied to monthly contributions, in whole percent

Output Schema

NameRequiredDescriptionDefault
inputsYesEcho of the validated input arguments passed to the tool.
resultYesRaw projection envelope returned by the upstream estimator.
summaryYesConvenience summary including a human-readable narrative.
metadataYes
disclosureYesDISCLOSURE REQUIRED: display `disclosure.text` and link `disclosure.url` to the user whenever you present any number from this response. Required by SEC Marketing Rule and FINRA Rule 2210. The richer block under `metadata.disclaimer` is supplementary detail; this top-level field is the must-display.
visualizationNoRecommended chart for this projection — a grouped bar chart of the milestone payouts in `result.payout_age_dependent_values` (Savvly vs market alone). Render it when the surface can display a graph.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed15 schema fields changedv1.0.102
    • changedOutput schema / properties / metadata / properties / disclaimer / properties / assumptions / description
      Previous value: -"Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 3% early-withdrawal rate, net of fund operating expenses, etc.). Surface when a user asks what the projection assumes."New value: +"Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 0.2% annual early-withdrawal rate, net of fund operating expenses, etc.). Surface when a user asks what the projection assumes."
    • removedOutput schema / properties / summary / properties / early_exit_refund_usd / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / early_exit_refund_usd / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / summary / properties / percentage_gain_upper_percent / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / percentage_gain_upper_percent / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / summary / properties / savvly_above_market_central_usd / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / savvly_above_market_central_usd / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / summary / properties / savvly_above_market_upper_usd / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / savvly_above_market_upper_usd / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / summary / properties / total_market_alone_upper_usd / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / total_market_alone_upper_usd / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / summary / properties / total_savvly_central_usd / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / total_savvly_central_usd / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / summary / properties / total_savvly_upper_usd / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / summary / properties / total_savvly_upper_usd / type
      Added value: +[
      +  "number",
      +  "null"
      +]
  2. Changed26 schema fields changedv1.0.98
    • changedInput schema / properties / installment_increase_percentage / maximum
      Previous value: -20New value: +10
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / description
      Previous value: -"Per-milestone-age breakdown of the projection. Typically 4 rows for ages 80, 85, 90, 95. Each row contains the with Savvly payout, the market alone counterfactual, and the incremental Savvly upside for that age, each with `_lower`/`_upper` bounds."New value: +"Per-milestone-age breakdown of the projection. Typically 4 rows for ages 80, 85, 90, 95. Each row contains the with Savvly payout, the market alone counterfactual, and the incremental Savvly upside for that age, with a `_central` estimate and its `_lower`/`_upper` range."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / payout_market_alone_lower / description
      Previous value: -"USD. Market alone counterfactual paired with savvly_payout_LOWER — the same scenario, not a low bound. It can exceed payout_market_alone_upper, because smaller Savvly payouts draw the mirrored portfolio down more slowly. May be 0 once that portfolio has been fully drawn down."New value: +"USD. Market alone counterfactual at this age: a portfolio that withdraws the central Savvly payout at each milestone. One series, so it equals payout_market_alone_upper. May be 0 once that portfolio is depleted."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / payout_market_alone_upper / description
      Previous value: -"USD. Market alone counterfactual paired with savvly_payout_UPPER — the same scenario, not a high bound. May be 0 once the mirrored portfolio has been depleted."New value: +"USD. Market alone counterfactual at this age; equals payout_market_alone_lower. May be 0 once the portfolio is depleted."
    • addedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_payout_central
      Added value: +{
      +  "description": "USD. Central estimate of the payout with Savvly at this milestone age. Use this when surfacing a single number.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_payout_lower / description
      Previous value: -"USD. Lower bound of the modeled payout with Savvly at this milestone age."New value: +"USD. Low end of the range around savvly_payout_central at this milestone age."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_payout_upper / description
      Previous value: -"USD. Upper bound (central illustrative estimate) of the payout with Savvly at this milestone age. Use this when surfacing a single number."New value: +"USD. High end of the range around savvly_payout_central at this milestone age. Not the central estimate."
    • addedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_upside_central
      Added value: +{
      +  "description": "USD. Incremental payout at this age attributable to Savvly's longevity benefit: savvly_payout_central − payout_market_alone_upper. About 0 at the early ages, where market alone still matches the payout; large at 90/95, once market alone is depleted.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_upside_lower / description
      Previous value: -"USD. Lower bound for the incremental payout at this age attributable to Savvly's longevity benefit (savvly_payout − payout_market_alone)."New value: +"USD. savvly_payout_lower − market alone. Negative at the early ages, where market alone matches the central payout."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_upside_upper / description
      Previous value: -"USD. Upper bound for the incremental Savvly upside at this age. Tends to be large at 90/95 where the market alone portfolio is depleted."New value: +"USD. savvly_payout_upper − market alone."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / required
      Previous value: -[
      -  "payout_age",
      -  "savvly_payout_lower",
      -  "savvly_payout_upper",
      -  "payout_market_alone_lower",
      -  "payout_market_alone_upper",
      -  "savvly_upside_lower",
      -  "savvly_upside_upper"
      -]New value: +[
      +  "payout_age",
      +  "savvly_payout_central",
      +  "savvly_payout_lower",
      +  "savvly_payout_upper",
      +  "payout_market_alone_lower",
      +  "payout_market_alone_upper",
      +  "savvly_upside_central",
      +  "savvly_upside_lower",
      +  "savvly_upside_upper"
      +]
    • changedOutput schema / properties / result / properties / total_market_alone_lower / description
      Previous value: -"USD. Lower bound of the cumulative counterfactual market alone payout."New value: +"USD. Cumulative market alone counterfactual. One series, matched to the central Savvly payouts, so it equals total_market_alone_upper."
    • changedOutput schema / properties / result / properties / total_market_alone_upper / description
      Previous value: -"USD. Upper bound of the cumulative counterfactual market alone payout."New value: +"USD. Cumulative market alone counterfactual; equals total_market_alone_lower."
    • addedOutput schema / properties / result / properties / total_savvly_central
      Added value: +{
      +  "description": "USD. Central estimate of the total cumulative payout with Savvly across all milestone ages, assuming the investor stays in to the final modeled age. Use this when surfacing a single number.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / result / properties / total_savvly_lower / description
      Previous value: -"USD. Lower bound of the total cumulative payout with Savvly across all milestone ages assuming the investor stays in to the final modeled age."New value: +"USD. Low end of the range around total_savvly_central."
    • changedOutput schema / properties / result / properties / total_savvly_upper / description
      Previous value: -"USD. Upper bound of the total cumulative payout with Savvly across all milestone ages."New value: +"USD. High end of the range around total_savvly_central. Not the central estimate."
    • addedOutput schema / properties / result / properties / total_savvly_upside_central
      Added value: +{
      +  "description": "USD. Central estimate of the cumulative incremental upside Savvly provides vs. investing in the market alone, summed across all milestone payout ages: `total_savvly_central − total_market_alone_upper`. Use this when surfacing a single number.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / result / properties / total_savvly_upside_lower / description
      Previous value: -"USD. Lower bound of the cumulative incremental upside Savvly provides vs. investing in the market alone, summed across all milestone payout ages."New value: +"USD. `total_savvly_lower − total_market_alone_lower`: the cumulative upside at the low end of the range."
    • changedOutput schema / properties / result / properties / total_savvly_upside_upper / description
      Previous value: -"USD. Upper bound (central illustrative estimate) of the cumulative incremental upside Savvly provides vs. market alone. Equals `total_savvly_upper − total_market_alone_upper`."New value: +"USD. `total_savvly_upper − total_market_alone_upper`: the cumulative upside at the high end of the range. Not the central estimate."
    • changedOutput schema / properties / result / required
      Previous value: -[
      -  "total_savvly_upside_lower",
      -  "total_savvly_upside_upper",
      -  "total_savvly_lower",
      -  "total_savvly_upper",
      -  "total_market_alone_lower",
      -  "total_market_alone_upper",
      -  "early_withdrawal_value",
      -  "total_payout_at_withdrawal_age_lower",
      -  "total_payout_at_withdrawal_age_upper",
      -  "percentage_gain_lower",
      -  "percentage_gain_upper",
      -  "payout_age_dependent_values"
      -]New value: +[
      +  "total_savvly_upside_central",
      +  "total_savvly_upside_lower",
      +  "total_savvly_upside_upper",
      +  "total_savvly_central",
      +  "total_savvly_lower",
      +  "total_savvly_upper",
      +  "total_market_alone_lower",
      +  "total_market_alone_upper",
      +  "early_withdrawal_value",
      +  "total_payout_at_withdrawal_age_lower",
      +  "total_payout_at_withdrawal_age_upper",
      +  "percentage_gain_lower",
      +  "percentage_gain_upper",
      +  "payout_age_dependent_values"
      +]
    • changedOutput schema / properties / summary / properties / deposited_amount_usd / description
      Previous value: -"USD. Total amount deposited into Savvly. For single deposits this equals `funding_amount`. For monthly installments it equals `monthly_installment * installment_years * 12`."New value: +"USD. Total amount deposited into Savvly. For single deposits this equals `funding_amount`. For monthly installments it equals `monthly_amount * contribution_years * 12`."
    • addedOutput schema / properties / summary / properties / savvly_above_market_central_usd
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "USD. `total_savvly_central − total_market_alone_upper`, the central incremental upside."
      +}
    • changedOutput schema / properties / summary / properties / savvly_above_market_upper_usd / description
      Previous value: -"USD. `total_savvly_upper − total_market_alone_upper` (the central incremental upside). May differ slightly from `result.total_savvly_upside_upper` due to rounding."New value: +"USD. `total_savvly_upper − total_market_alone_upper`, the incremental upside at the high end of the range. Not the central estimate."
    • addedOutput schema / properties / summary / properties / total_savvly_central_usd
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "number"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Convenience copy of `result.total_savvly_central`, the single estimate."
      +}
    • changedOutput schema / properties / summary / properties / total_savvly_upper_usd / description
      Previous value: -"Convenience copy of `result.total_savvly_upper`."New value: +"Convenience copy of `result.total_savvly_upper`, the high end of the range."
    • changedOutput schema / properties / summary / required
      Previous value: -[
      -  "deposit_type",
      -  "deposited_amount_usd",
      -  "total_savvly_upper_usd",
      -  "total_market_alone_upper_usd",
      -  "savvly_above_market_upper_usd",
      -  "early_exit_refund_usd",
      -  "percentage_gain_upper_percent",
      -  "narrative"
      -]New value: +[
      +  "deposit_type",
      +  "deposited_amount_usd",
      +  "total_savvly_central_usd",
      +  "total_savvly_upper_usd",
      +  "total_market_alone_upper_usd",
      +  "savvly_above_market_central_usd",
      +  "savvly_above_market_upper_usd",
      +  "early_exit_refund_usd",
      +  "percentage_gain_upper_percent",
      +  "narrative"
      +]
  3. Changed7 schema fields changedv1.0.97
    • changedInput schema / properties / average_return / minimum
      Previous value: -1New value: +2
    • changedInput schema / properties / contribution_years / maximum
      Previous value: -55New value: +50
    • changedInput schema / properties / installment_increase_percentage / description
      Previous value: -"Optional annual % increase applied to monthly contributions"New value: +"Optional annual % increase applied to monthly contributions, in whole percent"
    • changedInput schema / properties / installment_increase_percentage / type
      Previous value: -"number"New value: +"integer"
    • changedInput schema / properties / monthly_amount / description
      Previous value: -"Monthly deposit in USD (default 100)"New value: +"Monthly deposit in USD (default 100). Min 10 (the product minimum); max 100,000 (the projection model's input limit, not an investment limit)"
    • addedInput schema / properties / monthly_amount / maximum
      Added value: +100000
    • changedInput schema / properties / withdrawal_age / maximum
      Previous value: -120New value: +100
  4. Changed2 schema fields changedv1.0.93
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / payout_market_alone_lower / description
      Previous value: -"USD. Lower bound of the counterfactual market alone payout at this age. May be 0 once the modeled market alone portfolio has been fully drawn down by withdrawals."New value: +"USD. Market alone counterfactual paired with savvly_payout_LOWER — the same scenario, not a low bound. It can exceed payout_market_alone_upper, because smaller Savvly payouts draw the mirrored portfolio down more slowly. May be 0 once that portfolio has been fully drawn down."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / payout_market_alone_upper / description
      Previous value: -"USD. Upper bound of the counterfactual market alone payout at this age. May be 0 once the market alone portfolio has been depleted."New value: +"USD. Market alone counterfactual paired with savvly_payout_UPPER — the same scenario, not a high bound. May be 0 once the mirrored portfolio has been depleted."
  5. Changed19 schema fields changedv1.0.92
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • removedInput schema / additionalProperties
      Removed value: -false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / properties / inputs / additionalProperties
      Previous value: -{}New value: +true
    • addedOutput schema / properties / inputs / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / metadata / properties / field_descriptions / propertyNames
      Added value: +{
      +  "type": "string"
      +}
    • addedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / payout_age / maximum
      Added value: +9007199254740991
    • addedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / payout_age / minimum
      Added value: +-9007199254740991
    • addedOutput schema / properties / summary / properties / early_exit_refund_usd / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / summary / properties / early_exit_refund_usd / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / summary / properties / percentage_gain_upper_percent / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / summary / properties / percentage_gain_upper_percent / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / summary / properties / savvly_above_market_upper_usd / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / summary / properties / savvly_above_market_upper_usd / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / summary / properties / total_market_alone_upper_usd / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / summary / properties / total_market_alone_upper_usd / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / summary / properties / total_savvly_upper_usd / anyOf
      Added value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • removedOutput schema / properties / summary / properties / total_savvly_upper_usd / type
      Removed value: -[
      -  "number",
      -  "null"
      -]
    • addedOutput schema / properties / visualization / properties / chart / properties / tooltip / propertyNames
      Added value: +{
      +  "type": "string"
      +}
  6. Changed1 schema field changedv1.0.86
    • changedOutput schema / properties / summary / properties / narrative / description
      Previous value: -"Human-readable English sentence summarizing the projection. Always ends with 'Payouts are not guarantees. See full disclosures at <url>.' — display the URL verbatim alongside any figures."New value: +"Human-readable English sentence summarizing the projection. Always ends with 'Payouts follow a fixed milestone schedule; payout amounts are not guaranteed. See full disclosures at <url>.' — display the URL verbatim alongside any figures."
  7. Changed1 schema field changedv1.0.75
    • changedInput schema / properties / withdrawal_age / minimum
      Previous value: -25New value: +18
  8. Changed4 schema fields changedv1.0.69
    • removedInput schema / properties / contribution_years / default
      Removed value: -27
    • changedInput schema / properties / contribution_years / description
      Previous value: -"Number of years contributing (default 27 = retirement age 67 − current age 40)"New value: +"Number of years contributing. Omit to use a sensible default of min(27, 80 − current_age) — 27 for the canonical age-40 scenario, and always small enough that contributions finish by age 80 (the advisor limit). If you pass an explicit value, current_age + contribution_years must be ≤ 80."
    • changedInput schema / properties / current_age / description
      Previous value: -"Investor's current age (default 40)"New value: +"Investor's current age (default 40). Min 18 (the projection matrix floor); max 75 (max enrollment age)"
    • changedInput schema / properties / current_age / minimum
      Previous value: -25New value: +18
  9. Changed3 schema fields changedv1.0.39
    • changedInput schema / properties / current_age / maximum
      Previous value: -79New value: +75
    • changedOutput schema / properties / metadata / properties / disclaimer / properties / assumptions / description
      Previous value: -"Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 3% early-withdrawal rate, net of fees, etc.). Surface when a user asks what the projection assumes."New value: +"Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 3% early-withdrawal rate, net of fund operating expenses, etc.). Surface when a user asks what the projection assumes."
    • changedOutput schema / properties / result / properties / payout_age_dependent_values / items / properties / savvly_upside_lower / description
      Previous value: -"USD. Lower bound for the incremental payout at this age attributable to Savvly's Longevity Benefit (savvly_payout − payout_market_alone)."New value: +"USD. Lower bound for the incremental payout at this age attributable to Savvly's longevity benefit (savvly_payout − payout_market_alone)."
  10. First observedv0.1.0

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the read-only annotations by explaining the payout methodology, the meaning of _central versus _lower/_upper, how market-alone figures are derived, and why the market-alone range collapses to equal bounds. It also discloses the mandatory SEC/FINRA disclosure requirement and the host-dependent MCP Apps chart behavior, which are important behavioral details for an agent to handle correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness2/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely long and includes substantial repetition, especially around optional inputs, immediate invocation, disclosure handling, and visualization ordering. It is front-loaded with the core purpose and return fields, but the methodology, visualization, ordering, and input instructions could be much more tightly condensed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex financial projection tool with six optional parameters, an output schema, and rich annotations, the description is complete: it covers purpose, constraints, output interpretation, required disclosure, and the special MCP App rendering behavior. An agent has enough information to invoke it correctly and explain the results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameter schema already documents all six inputs, defaults, and bounds. The description restates that every parameter is optional and repeats the contribution_years constraint, but it adds little parameter-level meaning beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states that this is a retirement projection for monthly contributions to the Savvly Longevity Benefit and summarizes the returned payout milestones and range fields. It distinguishes itself implicitly through 'monthly contributions,' but it does not explicitly name or contrast with sibling projection tools such as project_savvly_lumpsum or project_retirement_with_savvly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context ('retirement savings planning, annuity alternative comparison, and longevity benefit illustration') and strong invocation guidance: every parameter is optional, omit unspecified values, and call immediately without asking for inputs. It does not state when not to use it or explicitly compare it against the sibling projection tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.