Skip to main content
Glama

savvly

Server Details

Savvly MCP: query fund data, model projections, and compare against alternative retirement products.

Ownership verified
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
Savvly/savvly-mcp
GitHub Stars
2
Server Listing
savvly-mcp

Available Tools

8 tools
check_savvly_eligibilityCheck Savvly EligibilityA
Read-onlyIdempotent
Inspect

Check if a person is eligible to invest in the Savvly Longevity Benefit. Eligibility is based on age (no minimum; maximum enrollment age 75), US residency, and distribution channel (individual, employer-sponsored, advisor-placed). Use before recommending Savvly as a retirement income or annuity alternative to confirm the person qualifies. These facts come from Savvly's own current records; the response includes primary sources (e.g. SEC filings) for reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
ageYesPerson's current age
channelNoDistribution channel — one of 'individual', 'employer', 'advisor' (default 'individual').individual
us_residentNoWhether the person is a US resident

Output Schema

ParametersJSON Schema
NameRequiredDescription
channelYesDistribution channel under consideration for this check.
messageYesHuman-readable explanation of the eligibility outcome.
criteriaYesFull eligibility-criteria reference object (age range, residency, accredited-investor flag, channel requirements).
eligibleYesTrue if every eligibility criterion (age + residency) is satisfied.
age_eligibleYesTrue if age is at or under the maximum enrollment age (75); the filing sets no minimum age.
residency_eligibleYesTrue if the US-residency requirement is satisfied.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive). The description adds value by disclosing that facts come from Savvly's own current records and that the response includes primary sources, which helps the agent understand data provenance and output content.

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

Conciseness5/5

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

Three sentences with no filler. It front-loads the core purpose, then criteria, use-case, and data source. Every sentence earns its place.

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?

With annotations covering safety and an output schema (though not shown), the description provides all necessary context: purpose, criteria, usage timing, and response content. 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.

Parameters4/5

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

Schema coverage is 100% and each parameter has a description. The description adds crucial eligibility specifics (no minimum age, max 75, channel naming convention) not present in the schema, significantly enriching parameter understanding.

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

Purpose5/5

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

The description clearly states the tool checks eligibility for the Savvly Longevity Benefit, a specific verb+resource combination. It distinguishes itself from siblings by focusing on eligibility confirmation versus product info, projections, or comparisons.

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?

The description gives explicit usage context ('Use before recommending Savvly as a retirement income or annuity alternative'), but does not explicitly list when not to use it or name sibling alternatives. Still, the guidance is clear and actionable.

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

compare_savvly_vs_alternativeCompare Savvly vs Alternative ProductA
Read-onlyIdempotent
Inspect

Get a structured comparison between Savvly and another retirement product type — use it whenever the user compares Savvly to annuities, target-date funds, managed-payout funds, or any alternative, or asks how Savvly stacks up. It renders an interactive comparison widget the user expects to see. Pass 'all' for the full matrix, or a specific product type. These facts come from Savvly's own current records; the response includes primary sources (e.g. SEC filings) for reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
alternativeNoWhich product type to compare Savvly against. Use EXACTLY one of: 'fixed_annuity', 'variable_annuity', 'indexed_annuity', 'target_date_fund', 'managed_payout_fund', or 'all' for the full matrix. Pick a SPECIFIC annuity subtype — there is no generic 'annuity'.all

Output Schema

ParametersJSON Schema
NameRequiredDescription
savvlyYesSavvly's profile across the comparison dimensions.
metadataYesComparison dimensions, definitions, and source notes.
comparisonNoThe selected alternative product's profile. Present when `alternative` is a specific product type (i.e. not 'all').
comparisonsNoFull comparison matrix — one entry per alternative product type. Present when `alternative` is 'all'.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful context beyond those: it explains the data source ('Savvly's own current records'), mentions that primary sources like SEC filings are included, and notes the interactive widget behavior. This adds meaningful transparency without contradicting annotations.

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

Conciseness5/5

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

The description is compact, with the main purpose and usage guidance front-loaded. Each sentence earns its place: the first states the action and use case; the second covers the widget, parameter options, and data source. No fluff or repetition.

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?

Given that there is an output schema, the response format is already specified. The tool has only one optional parameter with an enum, and the description covers usage, parameter handling, data provenance, and widget behavior. There is nothing an agent needs to call this tool correctly that is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the schema already documents the 'alternative' parameter and its allowed enum values. The description adds extra value by clarifying the use of 'all' for the full matrix and explicitly warning that 'there is no generic annuity' — guiding the agent to pick a specific subtype. This goes beyond repeating the schema, so it deserves a 4.

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

Purpose5/5

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

The description clearly states the specific action ('Get a structured comparison') and resource ('between Savvly and another retirement product type'). It distinguishes from siblings by explicitly naming the scenarios it covers ('whenever the user compares Savvly to annuities, target-date funds, managed-payout funds, or any alternative'). This is a unique, non-tautological purpose.

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?

The description gives explicit trigger conditions ('use it whenever the user compares...') and also explains the parameter choices ('Pass 'all' for the full matrix, or a specific product type'). It does not explicitly name sibling tools for when not to use it, but the conditions are clear enough to route an agent correctly. Slightly lacking an explicit 'when not to use' but still strong.

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

get_savvly_faqGet Savvly FAQA
Read-onlyIdempotent
Inspect

Get answers to frequently asked questions about Savvly. Use when the user has specific questions about how Savvly works, expenses, withdrawals, or regulatory status. It is a convenience view of search_savvly_content scoped to the factual FAQ; for richer, audience-specific Q&As (employee / advisor / broker / employer), use search_savvly_content instead. These facts come from Savvly's own current records; the response includes primary sources (e.g. SEC filings) for reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoFilter the FAQ to one section (kebab-case, e.g. 'tax-legacy'); 'all' returns every entry.all

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYesCount of FAQ entries returned.
entriesYesFiltered FAQ entries (the audience:'general' Q&A slice).
sectionYesSection filter applied to produce this result set ('all' if no filter).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already mark readOnly and non-destructive, so the description correctly doesn't repeat those. It adds useful context: facts come from 'Savvly's own current records' and the response includes primary sources (e.g., SEC filings). This informs the agent about data currency and reference material, going beyond the annotations.

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

Conciseness5/5

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

Three sentences: purpose, when/alternatives, and a data-source note. Every sentence earns its place, and the most actionable guidance (usage and alternative) is front-loaded. No redundancy.

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 low-complexity read-only tool with full schema and an output schema, the description covers purpose, usage, differentiation, and data provenance. Nothing an agent needs to call or decide correctly is missing.

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 coverage is 100% for the single parameter (section) with a clear enum and description. The tool description does not add param-specific details, but the schema already fully documents it, so the baseline of 3 applies.

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

Purpose5/5

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

The description opens with a specific verb+resource: 'Get answers to frequently asked questions about Savvly' and immediately scopes it to factual FAQ. It explicitly contrasts with the sibling `search_savvly_content` ('convenience view'), so an agent can distinguish them 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.

Usage Guidelines5/5

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

Provides explicit when-to-use ('specific questions about how Savvly works, expenses, withdrawals, or regulatory status') and when-not-to-use with a named alternative ('for richer, audience-specific Q&As... use search_savvly_content instead'). No ambiguity.

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

get_savvly_product_infoGet Savvly Product InfoA
Read-onlyIdempotent
Inspect

Get complete product information about Savvly, an SEC-registered security offering longevity protection — use it whenever the user asks what Savvly is, how it works, its expenses, eligibility, or payouts, or wants an overview. Pass section to focus the answer (default 'all'). It renders an interactive product overview card the user expects to see. These facts come from Savvly's own current records; the response includes primary sources (e.g. SEC filings) for reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
sectionNoWhich part of the product profile to focus the text on — one of 'all', 'overview', 'regulatory', 'investment', 'expenses', 'payouts', 'tax', 'distribution' (default 'all'). The full overview card always renders regardless.all

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYesProduct name (e.g. 'Savvly Longevity Benefit').
linksNoRelevant URLs (website, disclosures, etc.).
companyNoIssuer / advisor entity information.
taglineNoShort marketing tagline.
categoryYesProduct category slug, e.g. 'longevity_benefit_fund'.
channelsNoDistribution channels through which Savvly is offered.
expensesNoExpense structure in basis points (common vs tracking shares) and the blended range; illustrations are net of expenses.
investmentNoHow contributions are invested: underlying assets (S&P 500 ETF), asset managers, minimum/maximum monthly and lump-sum amounts, market participation.
next_stepsNoSuggested next actions for an interested investor.
regulatoryNoRegulatory status: SEC registration, Investment Company Act of 1940, advisor, custodian, and is_insurance/is_annuity flags.
descriptionNoLong-form product description.
disclaimersNoSEC-style disclaimers and required legal language.
portabilityNoWhether the position is portable.
tax_treatmentNoTax treatment of payouts and contributions.
longevity_poolNoHow the longevity pool works — exited participants' unused shares may be allocated to remaining participants.
payout_scheduleNoMilestone payout schedule at ages 80/85/90/95.
early_withdrawalNoEarly-withdrawal / surrender terms and the value returned to the estate.
portability_noteNoDetail on portability.
illustrative_payoutNoOne worked example of what the schedule pays: the modeled payout RANGE at each milestone age for a single fixed allocation, so the percentages above have dollar figures beside them. Fixed inputs, identical for every caller — hypothetical, not a quote, and not tailored to the user. For the user's own age and amount, call `project_savvly_lumpsum`.
positioning_statementNoOne-sentence positioning — what Savvly is and is NOT (not insurance, not an annuity).

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly and idempotent, but the description adds behavioral context beyond that: it renders an interactive card, sources facts from Savvly's records, and includes primary sources like SEC filings. This helps the agent set user expectations and understand data provenance.

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

Conciseness4/5

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

The description is moderately long but well-structured: it leads with the core purpose, then usage guidance, then parameter behavior, then data source. It avoids waste but repeats the 'pass section' instruction already in the schema. Still, it earns its sentences with useful context.

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

Completeness4/5

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

Given a single optional parameter, a rich description, and an existing output schema (so return format need not be spelled out), the description covers the essentials: what the tool does, when to use it, how to focus responses, and what data sources are referenced. No critical information is missing.

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 coverage is 100% with a detailed description of the `section` parameter (enum, default, explanation). The tool description adds only a minor note about focusing the answer, which is already implied in the schema. No significant additional semantics beyond the schema.

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

Purpose5/5

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

The description states a clear, specific purpose: 'Get complete product information about Savvly' and lists concrete user intents (what Savvly is, how it works, expenses, eligibility, payouts, overview). This distinguishes it from sibling tools like check_savvly_eligibility or get_savvly_faq, which have narrower scopes.

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?

Explicitly states when to use it ('whenever the user asks what Savvly is, how it works... or wants an overview'), giving clear positive triggers. However, it does not explicitly mention when NOT to use it or name alternative tools, though the triggers are specific enough to avoid major confusion.

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

project_retirement_with_savvlyProject Retirement Trajectory With SavvlyA
Read-onlyIdempotent
Inspect

Full retirement simulation showing the projected savings trajectory WITH and WITHOUT a Savvly allocation across the planning horizon (current_age → life_expectancy). Requires current_age ≤ retirement_age ≤ life_expectancy. Returns gap_score, possible_higher_monthly_paycheck, a server-provided headline message, and a per-year age_dependent_values[] timeline. Disclaimers + per-field hints under metadata. 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.

ParametersJSON Schema
NameRequiredDescriptionDefault
current_ageNoCurrent age (default 40)
inflation_rateNoExpected annual inflation rate % (default 3)
retirement_ageNoPlanned retirement age (default 68)
life_expectancyNoPlanning horizon (default 100)
monthly_paycheckNoDesired monthly retirement paycheck in USD (default 4500)
monthly_contributionNoMonthly retirement contribution in USD (default 1000)
percentage_in_savvlyNoPercentage of the retirement portfolio allocated to Savvly (default 5)
pre_retirement_returnNoExpected pre-retirement annual return % (default 6)
annual_income_increaseNoAnnual contribution % increase (default 2)
post_retirement_returnNoExpected post-retirement annual return % (default 5)
other_retirement_incomeNoOther monthly retirement income in USD (default 1600)
current_retirement_savingsNoCurrent total retirement savings in USD (default 60000)

Output Schema

ParametersJSON Schema
NameRequiredDescription
inputsYes
resultYes
summaryYesConvenience summary. The narrative carries the canonical full-disclosures URL inline; display it verbatim alongside any figures from this response.
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.
visualizationNoRecommended chart for this projection — a year-by-year area chart of `result.age_dependent_values` (savings with vs. without Savvly). Render it when the surface can display a graph. The richer `metadata.display_hints` block carries the same chart plus layout/tooltip detail.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, so safety is covered. The description goes far beyond that by disclosing regulatory requirements (SEC/FINRA disclosure display), the behavior of the MCP App widget (rendering conditional, editable fields), and the exact ordering constraint (lead-in before call). It also warns against implying a visible chart and against re-rendering duplicates. No contradictions with annotations.

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

Conciseness4/5

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

The description is long but well-structured with clear section headers (DISCLOSURE, VISUALIZATION, ORDER, INPUTS) and front-loads the core purpose. Every sentence carries functional weight—no filler—though it could be tightened slightly without losing meaning. The length is justified by regulatory and UI interaction complexity.

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?

Given the tool's complexity (12 optional parameters, output schema, disclosure obligations, UI widget behavior), the description covers all essential aspects: return fields, disclosure requirements, widget handling, lead-in ordering, and parameter handling. Nothing an agent needs to call this correctly and present results responsibly is missing.

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

Parameters4/5

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

Schema description coverage is 100%, so the schema fully documents each parameter. The description adds value by stating that all parameters are optional and default to sensible values, and by instructing the agent to only send explicitly stated values—this is usage-level semantic guidance beyond the schema. It does not repeat field meanings, which is appropriate given full coverage.

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

Purpose5/5

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

The description explicitly states the tool's function: a full retirement simulation comparing a savings trajectory with and without a Savvly allocation over the planning horizon. It also lists the key output fields (gap_score, possible_higher_monthly_paycheck, headline, timeline) and distinguishes it from sibling tools like project_savvly_lumpsum and project_savvly_monthly by scope (full trajectory vs. specific projections).

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

Usage Guidelines5/5

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

Provides explicit, actionable guidance: call immediately, pass only user-stated values, omit defaults, do not ask for inputs, and write a lead-in paragraph before calling. It also addresses the widget rendering context and how to reference results, giving clear when-to-use and how-to-use instructions that separate this tool from its siblings.

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

project_savvly_lumpsumProject Savvly Lump-Sum InvestmentA
Read-onlyIdempotent
Inspect

Retirement projection for a lump-sum investment in the Savvly Longevity Benefit. Returns payout amounts at each milestone age (80, 85, 90, 95) with Savvly vs market alone cumulative totals, per-age breakdowns, and server-provided _lower/_upper range bounds. Use _upper as the central illustrative estimate and _lower to communicate downside. Suitable for retirement income planning, annuity alternative analysis, and longevity benefit illustration. Response embeds SEC-style disclaimers and per-field interpretation 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 Investor 1 receives as a payout from Savvly. The payout_market_alone_* and total_market_alone_* figures are therefore what Investor 2 can actually withdraw to match Savvly's payouts before running out — they fall to 0 once the market alone portfolio is depleted. 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. 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.

ParametersJSON 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)
funding_amountNoLump sum investment in USD (default 10000)
withdrawal_ageNoEarly-withdrawal age (default 82) — drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.

TDQS

A3.9/5.0
Behavior5/5

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

Goes far beyond the annotations (readOnly=true, idempotent=true). It discloses the SEC Marketing Rule/FINRA 2210 disclosure obligation (show `disclosure.text` verbatim, do not paraphrase), the MCP Apps widget rendering semantics (don't render a duplicate chart, don't claim a chart is visible), the lead-in paragraph ordering rule, and the detailed payout methodology (Investor 2 matching withdrawals). All consistent with the read-only/idempotent annotations — no contradiction.

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

Conciseness3/5

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

Well-structured with explicit section headers (INPUTS, DISCLOSURE REQUIRED, VISUALIZATION, ORDER), which aids scanning, and the purpose is front-loaded. But the prose is heavily verbose — the payout-methodology and lead-in-rule explanations are several times longer than needed and repeat the same 'do not ask for inputs' point. It is thorough at the expense of economy.

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

Completeness4/5

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

For a tool with 4 optional params, an output schema, and meaningful compliance/visualization obligations, coverage is essentially complete: input defaults, disclosure handling, chart semantics, response-field interpretation (`_upper` as central estimate, `_lower` as downside), and the pre-call ordering rule are all covered. An agent has virtually everything it needs to call this correctly.

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

Parameters4/5

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 value: it states every parameter is optional with sensible defaults, instructs the agent to call immediately passing only user-stated values (never asking for assumptions), and maps `withdrawal_age` to its downstream response fields. This meaningfully exceeds what the schema properties alone provide.

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?

States a specific verb and resource ('Retirement projection for a lump-sum investment in the Savvly Longevity Benefit') and enumerates the concrete outputs: payout amounts at milestone ages, Savvly vs market-alone cumulative totals, per-age breakdowns, and `_lower`/`_upper` bounds. However, it never distinguishes itself from siblings `project_savvly_monthly` (monthly vs lump-sum) or `project_retirement_with_savvly` — an agent has no explicit signal that this tool is the lump-sum variant.

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

Usage Guidelines3/5

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

Provides contextual fit ('Suitable for retirement income planning, annuity alternative analysis, and longevity benefit illustration') and a behavioral use rule (the lead-in paragraph + immediate-call instruction). But there is no explicit when-not-to-use guidance or routing to named alternatives; the choice between this and `project_savvly_monthly`/`project_retirement_with_savvly` is left entirely to inference.

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

project_savvly_monthlyProject Savvly Monthly ContributionsA
Read-onlyIdempotent
Inspect

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, and server-provided _lower/_upper range bounds. Use _upper as the central illustrative estimate and _lower to communicate downside. 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 Investor 1 receives as a payout from Savvly. The payout_market_alone_* and total_market_alone_* figures are therefore what Investor 2 can actually withdraw to match Savvly's payouts before running out — they fall to 0 once the market alone portfolio is depleted. 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. 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.

ParametersJSON 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)
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

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), and the description adds substantial non-obvious behavior: the SEC Marketing Rule / FINRA 2210 disclosure requirement (must display disclosure.text verbatim), the MCP App widget emission behavior, the instruction to never claim a chart is visible, and the full payout methodology (Investor 1 vs Investor 2 comparison). All of this exceeds what annotations alone convey.

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

Conciseness4/5

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

The description is very long but well-structured with CAPS-delimited sections (DISCLOSURE REQUIRED, VISUALIZATION, ORDER, INPUTS) and front-loads the core purpose before diving into methodology and compliance rules. Every paragraph carries necessary complexity — SEC compliance, widget behavior, ordering — though the payout-methodology and visualization sections run verbose and could be tightened without losing meaning.

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 tool with 6 optional params, an output schema, a compliance mandate, and a widget-rendering side effect, the description is exceptionally complete: purpose, return shape (including the _lower/_upper usage convention), parameter behavior, methodology, disclosure obligation, visualization rules, ordering guidance, and input strategy are all covered. The presence of an output schema covers return values, and nothing essential for correct invocation is missing.

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 coverage is 100%, so the schema fully documents all 6 optional parameters — baseline is 3. The description adds marginal value on top: the auto-fit default logic for contribution_years (omitted default = min(27, 80 − current_age)) and the note that withdrawal_age drives early_withdrawal_value. Useful but modest, consistent with a high-coverage schema carrying the main burden.

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

Purpose5/5

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

The opening sentence states a specific verb and resource — 'Retirement projection for monthly contributions to the Savvly Longevity Benefit' — and enumerates what it returns (payout amounts at 80/85/90/95, cumulative totals, per-age breakdowns, lower/upper bounds). The 'monthly' qualifier implicitly differentiates it from sibling project_savvly_lumpsum without needing to name it.

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?

The description gives clear context ('Suitable for retirement savings planning, annuity alternative comparison, and longevity benefit illustration') and unusually rich operational guidance — a required lead-in paragraph before calling, call immediately without asking for inputs, and the age-80 contribution constraint. However, it never explicitly names sibling alternatives (e.g., project_savvly_lumpsum) or states when NOT to use this tool, relying on implied monthly-vs-lumpsum contrast.

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

search_savvly_contentSearch Savvly Q&A Content LibraryA
Read-onlyIdempotent
Inspect

Search the Savvly Q&A Content Library — audience-tagged questions and answers compiled from Savvly's marketing collateral plus the factual FAQ, organized by stakeholder (employee, advisor, broker, employer, universal, general) and section (kebab-case slugs, e.g. 'tax-legacy', 'retention-talent-strategy', 'implementation'). Use this when the user asks about Savvly's positioning, value props, audience-specific talking points, or Q&A-style messaging. Each entry carries the verbatim answer plus any disclaimer footnotes attached to it in the source. These facts come from Savvly's own current records; the response includes primary sources (e.g. SEC filings) for reference.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoCap on matched entries returned. Default 20, max 50.
queryNoFree-text search over questions, answers, and footnotes (case-insensitive). Multi-word queries match entries containing ANY of the words, ranked by relevance.
sectionNoSubstring match against section slugs (e.g. 'tax', 'retention', 'eligibility'). Case-insensitive.
audienceNoRestrict to one stakeholder audience. Use EXACTLY one of: 'employee', 'advisor', 'broker', 'employer', 'universal', or 'general' ('general' is the factual FAQ). Omit to search across all audiences.

Output Schema

ParametersJSON Schema
NameRequiredDescription
entriesYesMatched Q&A entries.
matchedYesCount of entries matching the supplied filters.
filter_appliedYesEcho of the filters that produced this result set.
total_in_libraryYesTotal Q&A entry count in the library across all audiences.
available_sectionsYesSection slugs available within the (optionally) selected audience.

TDQS

A4/5.0
Behavior4/5

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

Annotations already specify readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering the safety profile. The description adds valuable behavioral context beyond that: it notes each entry contains the verbatim answer plus disclaimer footnotes, that facts come from Savvly's current records, and that the response includes primary sources (e.g., SEC filings). This supplements the annotations with specific detail about the tool's output and provenance, so a 4 is justified.

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

Conciseness4/5

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

The description is a single paragraph, front-loaded with the core purpose, then adding organizational details, usage guidance, content structure, and source provenance. Each sentence contributes value: the kebab-case slug examples and the note about primary sources are helpful but not essential. It is somewhat verbose but well-structured and not redundant, so a 4 is fitting.

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?

The description is comprehensive for this tool's complexity. It explains what the tool searches, how it is organized, when to use it, what each entry contains (verbatim answer + disclaimers), and the source of the data. Since an output schema exists, return values need not be described. The description covers all necessary context for an agent to decide when and how to invoke it correctly, so a 5 is warranted.

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%, meaning each parameter (limit, query, section, audience) is fully described in the schema with types, defaults, and helpful notes. The description does not add significant additional meaning beyond the schema—it only reiterates the concept of audience and section slugs. With full schema coverage, the baseline is 3, and the description adds only marginal context (e.g., examples of section slugs), so a 3 is the correct score.

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 the tool searches a Q&A content library with specific organization (audience, section). It gives a strong verb-resource pairing and specifies the nature of the content (audience-tagged questions/answers, marketing collateral + FAQ). However, it does not explicitly differentiate from the sibling tool get_savvly_faq, which likely overlaps in purpose. Therefore it does not fully distinguish from siblings, warranting a 4 rather than 5.

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?

The description provides explicit usage guidance: 'Use this when the user asks about Savvly's positioning, value props, audience-specific talking points, or Q&A-style messaging.' This tells the agent exactly when to use it. However, it does not mention when NOT to use it or suggest alternatives (like get_savvly_faq) for other cases. It gives clear context without exclusions, so a 4 is appropriate.

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. Dates show when Glama detected each change.

  1. 8 tool updates
    • Changedcheck_savvly_eligibility2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedcompare_savvly_vs_alternative2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedget_savvly_faq2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedget_savvly_product_info2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedproject_retirement_with_savvly2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedproject_savvly_lumpsum2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedproject_savvly_monthly2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
    • Changedsearch_savvly_content2 fields changed
      • removedInput schema / properties / session_id
        Removed value: -{
        -  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / _mcp_instructions
        Removed value: -{
        -  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        -  "properties": {
        -    "instructions": {
        -      "type": "string"
        -    },
        -    "session_id": {
        -      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        -      "type": "string"
        -    }
        -  },
        -  "type": "object"
        -}
  2. 8 tool updates
    • Changedcheck_savvly_eligibility7 fields changed
      • 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
      • addedInput schema / properties / age / maximum
        Added value: +9007199254740991
      • addedInput schema / properties / age / minimum
        Added value: +-9007199254740991
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedcompare_savvly_vs_alternative105 fields changed
      • 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
      • addedInput schema / properties / alternative / default
        Added value: +"all"
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • removedOutput schema / properties / comparison / properties / dimensions / properties / affordability / $ref
        Removed value: -"#/properties/savvly/properties/affordability"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / affordability / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / affordability / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / affordability / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / affordability / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / cost_to_value / $ref
        Removed value: -"#/properties/savvly/properties/cost_to_value"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / cost_to_value / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / cost_to_value / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / cost_to_value / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / cost_to_value / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / counterparty_safety / $ref
        Removed value: -"#/properties/savvly/properties/counterparty_safety"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / counterparty_safety / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / counterparty_safety / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / counterparty_safety / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / counterparty_safety / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / death_benefit / $ref
        Removed value: -"#/properties/savvly/properties/death_benefit"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / death_benefit / description
        Added value: +"Death-benefit summary."
      • addedOutput schema / properties / comparison / properties / dimensions / properties / death_benefit / type
        Added value: +"string"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / inflation_protection / $ref
        Removed value: -"#/properties/savvly/properties/inflation_protection"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / inflation_protection / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / inflation_protection / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / inflation_protection / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / inflation_protection / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / liquidity / $ref
        Removed value: -"#/properties/savvly/properties/liquidity"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / liquidity / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / liquidity / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / liquidity / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / liquidity / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / longevity_protection / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / longevity_protection / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / longevity_protection / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / longevity_protection / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / longevity_protection / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / market_upside / $ref
        Removed value: -"#/properties/savvly/properties/market_upside"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / market_upside / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / market_upside / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / market_upside / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / market_upside / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / portability / $ref
        Removed value: -"#/properties/savvly/properties/portability"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / portability / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / portability / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / portability / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / portability / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / regulatory_oversight / $ref
        Removed value: -"#/properties/savvly/properties/regulatory_oversight"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / regulatory_oversight / description
        Added value: +"Who regulates it (e.g. SEC vs state insurance)."
      • addedOutput schema / properties / comparison / properties / dimensions / properties / regulatory_oversight / type
        Added value: +"string"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / simplicity / $ref
        Removed value: -"#/properties/savvly/properties/simplicity"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / simplicity / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparison / properties / dimensions / properties / simplicity / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / comparison / properties / dimensions / properties / simplicity / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / comparison / properties / dimensions / properties / simplicity / type
        Added value: +"object"
      • removedOutput schema / properties / comparison / properties / dimensions / properties / tax_treatment / $ref
        Removed value: -"#/properties/savvly/properties/tax_treatment"
      • addedOutput schema / properties / comparison / properties / dimensions / properties / tax_treatment / description
        Added value: +"Tax-treatment summary."
      • addedOutput schema / properties / comparison / properties / dimensions / properties / tax_treatment / type
        Added value: +"string"
      • removedOutput schema / properties / comparisons / items / $ref
        Removed value: -"#/properties/comparison"
      • addedOutput schema / properties / comparisons / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / comparisons / items / properties
        Added value: +{
        +  "category": {
        +    "description": "Product category.",
        +    "type": "string"
        +  },
        +  "description": {
        +    "description": "Short description of the alternative.",
        +    "type": "string"
        +  },
        +  "dimensions": {
        +    "additionalProperties": true,
        +    "description": "This alternative's ratings across the dimensions.",
        +    "properties": {
        +      "affordability": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "cost_to_value": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "counterparty_safety": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "death_benefit": {
        +        "description": "Death-benefit summary.",
        +        "type": "string"
        +      },
        +      "inflation_protection": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "liquidity": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "longevity_protection": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "market_upside": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "portability": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "regulatory_oversight": {
        +        "description": "Who regulates it (e.g. SEC vs state insurance).",
        +        "type": "string"
        +      },
        +      "simplicity": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "explanation": {
        +            "description": "One-sentence rationale for the rating.",
        +            "type": "string"
        +          },
        +          "label": {
        +            "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +            "type": "string"
        +          },
        +          "score": {
        +            "description": "Numeric rating; greater = better (e.g. 1–5).",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "score",
        +          "label",
        +          "explanation"
        +        ],
        +        "type": "object"
        +      },
        +      "tax_treatment": {
        +        "description": "Tax-treatment summary.",
        +        "type": "string"
        +      }
        +    },
        +    "type": "object"
        +  },
        +  "display_name": {
        +    "description": "Human-readable product name.",
        +    "type": "string"
        +  },
        +  "product_type": {
        +    "description": "Alternative product slug, e.g. 'fixed_annuity'.",
        +    "type": "string"
        +  }
        +}
      • addedOutput schema / properties / comparisons / items / required
        Added value: +[
        +  "product_type"
        +]
      • addedOutput schema / properties / comparisons / items / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / affordability / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / affordability / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / affordability / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / affordability / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / affordability / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / cost_to_value / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / cost_to_value / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / cost_to_value / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / cost_to_value / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / cost_to_value / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / counterparty_safety / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / counterparty_safety / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / counterparty_safety / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / counterparty_safety / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / counterparty_safety / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / inflation_protection / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / inflation_protection / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / inflation_protection / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / inflation_protection / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / inflation_protection / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / liquidity / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / liquidity / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / liquidity / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / liquidity / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / liquidity / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / market_upside / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / market_upside / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / market_upside / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / market_upside / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / market_upside / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / portability / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / portability / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / portability / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / portability / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / portability / type
        Added value: +"object"
      • removedOutput schema / properties / savvly / properties / simplicity / $ref
        Removed value: -"#/properties/savvly/properties/longevity_protection"
      • addedOutput schema / properties / savvly / properties / simplicity / additionalProperties
        Added value: +true
      • addedOutput schema / properties / savvly / properties / simplicity / properties
        Added value: +{
        +  "explanation": {
        +    "description": "One-sentence rationale for the rating.",
        +    "type": "string"
        +  },
        +  "label": {
        +    "description": "Rating label: None | Very Low | Low | Medium | High | Very High.",
        +    "type": "string"
        +  },
        +  "score": {
        +    "description": "Numeric rating; greater = better (e.g. 1–5).",
        +    "type": "number"
        +  }
        +}
      • addedOutput schema / properties / savvly / properties / simplicity / required
        Added value: +[
        +  "score",
        +  "label",
        +  "explanation"
        +]
      • addedOutput schema / properties / savvly / properties / simplicity / type
        Added value: +"object"
    • Changedget_savvly_faq7 fields changed
      • 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
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / total / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total / minimum
        Added value: +-9007199254740991
    • Changedget_savvly_product_info5 fields changed
      • 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
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedproject_retirement_with_savvly12 fields changed
      • 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
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • changedOutput schema / properties / inputs / additionalProperties
        Previous value: -{}New value: +true
      • addedOutput schema / properties / inputs / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / display_hints / properties / chart / properties / tooltip / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / metadata / properties / field_descriptions / propertyNames
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / result / properties / age_dependent_values / items / properties / age / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / result / properties / age_dependent_values / items / properties / age / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / visualization / properties / chart / properties / tooltip / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedproject_savvly_lumpsum21 fields changed
      • 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
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • 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"
        +}
    • Changedproject_savvly_monthly21 fields changed
      • 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
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • 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"
        +}
    • Changedsearch_savvly_content17 fields changed
      • 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
      • addedInput schema / properties / session_id
        Added value: +{
        +  "description": "REQUIRED on every call after your first. This MCP server associates all of your tool calls for a given task using session_id; a call that arrives without it cannot be associated with your earlier work and is treated as the start of an unrelated task, disconnected from the original goal. Omit it on your first call only — the server will issue one in the _mcp_instructions field of the result (or a trailing [MCP INSTRUCTIONS] text block) — then echo that exact value on every later call. Never invent a value, and do not issue parallel tool calls until the server has issued your session_id. One session_id covers the whole goal from start to finish: when you spawn subagents you MUST give them this same session_id, or their work is severed from yours. Without session_id, this server does not function as intended.",
        +  "type": "string"
        +}
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / properties / _mcp_instructions
        Added value: +{
        +  "description": "Your handles for this task, confirmed by this MCP server on every response, and the instructions for echoing them on later calls. Read and follow.",
        +  "properties": {
        +    "instructions": {
        +      "type": "string"
        +    },
        +    "session_id": {
        +      "description": "Echo this exact value as the session_id argument on every subsequent tool call.",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
      • addedOutput schema / properties / filter_applied / properties / audience / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / filter_applied / properties / audience / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / filter_applied / properties / limit / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / filter_applied / properties / limit / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / filter_applied / properties / query / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / filter_applied / properties / query / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / filter_applied / properties / section / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedOutput schema / properties / filter_applied / properties / section / type
        Removed value: -[
        -  "string",
        -  "null"
        -]
      • addedOutput schema / properties / matched / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / matched / minimum
        Added value: +-9007199254740991
      • addedOutput schema / properties / total_in_library / maximum
        Added value: +9007199254740991
      • addedOutput schema / properties / total_in_library / minimum
        Added value: +-9007199254740991
  3. 1 tool update
    • Changedget_savvly_product_info1 field changed
      • addedOutput schema / properties / illustrative_payout
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "One worked example of what the schedule pays: the modeled payout RANGE at each milestone age for a single fixed allocation, so the percentages above have dollar figures beside them. Fixed inputs, identical for every caller — hypothetical, not a quote, and not tailored to the user. For the user's own age and amount, call `project_savvly_lumpsum`.",
        +  "properties": {
        +    "average_return": {
        +      "description": "Assumed average annual S&P 500 return, in percent.",
        +      "type": "number"
        +    },
        +    "current_age": {
        +      "description": "Age the illustrated allocation is made at.",
        +      "type": "number"
        +    },
        +    "funding_amount": {
        +      "description": "USD allocated up front in the illustration.",
        +      "type": "number"
        +    },
        +    "payouts": {
        +      "description": "One row per milestone age, low-to-high payout range in USD.",
        +      "items": {
        +        "additionalProperties": true,
        +        "properties": {
        +          "age": {
        +            "description": "Milestone age (80, 85, 90, or 95).",
        +            "type": "number"
        +          },
        +          "lower_usd": {
        +            "description": "USD. Low end of the modeled payout at this age.",
        +            "type": "number"
        +          },
        +          "upper_usd": {
        +            "description": "USD. High end of the modeled payout at this age.",
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "age",
        +          "lower_usd",
        +          "upper_usd"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "current_age",
        +    "funding_amount",
        +    "average_return",
        +    "payouts"
        +  ],
        +  "type": "object"
        +}
  4. 2 tool updates
    • Changedget_savvly_faq1 field changed
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "all",
        -  "understanding-savvly",
        -  "investment-custody",
        -  "payouts",
        -  "withdrawals-estate",
        -  "fees-cost",
        -  "tax-legacy",
        -  "employer-portability",
        -  "safety-regulatory"
        -]New value: +[
        +  "all",
        +  "understanding-savvly",
        +  "investment-custody",
        +  "payouts",
        +  "withdrawals-estate",
        +  "expenses-cost",
        +  "tax-legacy",
        +  "employer-portability",
        +  "safety-regulatory"
        +]
    • Changedget_savvly_product_info4 fields changed
      • changedInput schema / properties / section / description
        Previous value: -"Which part of the product profile to focus the text on — one of 'all', 'overview', 'regulatory', 'investment', 'fees', 'payouts', 'tax', 'distribution' (default 'all'). The full overview card always renders regardless."New value: +"Which part of the product profile to focus the text on — one of 'all', 'overview', 'regulatory', 'investment', 'expenses', 'payouts', 'tax', 'distribution' (default 'all'). The full overview card always renders regardless."
      • changedInput schema / properties / section / enum
        Previous value: -[
        -  "all",
        -  "overview",
        -  "regulatory",
        -  "investment",
        -  "fees",
        -  "payouts",
        -  "tax",
        -  "distribution"
        -]New value: +[
        +  "all",
        +  "overview",
        +  "regulatory",
        +  "investment",
        +  "expenses",
        +  "payouts",
        +  "tax",
        +  "distribution"
        +]
      • addedOutput schema / properties / expenses
        Added value: +{
        +  "additionalProperties": true,
        +  "description": "Expense structure in basis points (common vs tracking shares) and the blended range; illustrations are net of expenses.",
        +  "properties": {},
        +  "type": "object"
        +}
      • removedOutput schema / properties / fees
        Removed value: -{
        -  "additionalProperties": true,
        -  "description": "Fee structure in basis points (common vs tracking shares) and the blended range; illustrations are net of fees.",
        -  "properties": {},
        -  "type": "object"
        -}
  5. 4 tool updates
    • Changedcheck_savvly_eligibility1 field changed
      • changedInput schema / properties / channel / description
        Previous value: -"Distribution channel"New value: +"Distribution channel — one of 'individual', 'employer', 'advisor' (default 'individual')."
    • Changedcompare_savvly_vs_alternative2 fields changed
      • changedInput schema / properties / alternative / description
        Previous value: -"The product type to compare against Savvly, or 'all' for the full matrix"New value: +"Which product type to compare Savvly against. Use EXACTLY one of: 'fixed_annuity', 'variable_annuity', 'indexed_annuity', 'target_date_fund', 'managed_payout_fund', or 'all' for the full matrix. Pick a SPECIFIC annuity subtype — there is no generic 'annuity'."
      • removedInput schema / required
        Removed value: -[
        -  "alternative"
        -]
    • Changedget_savvly_product_info1 field changed
      • changedInput schema / properties / section / description
        Previous value: -"Which part of the product profile to focus the text on; the full overview card always renders regardless."New value: +"Which part of the product profile to focus the text on — one of 'all', 'overview', 'regulatory', 'investment', 'fees', 'payouts', 'tax', 'distribution' (default 'all'). The full overview card always renders regardless."
    • Changedsearch_savvly_content1 field changed
      • changedInput schema / properties / audience / description
        Previous value: -"Restrict to one stakeholder audience ('general' is the factual FAQ). Omit to search across all audiences."New value: +"Restrict to one stakeholder audience. Use EXACTLY one of: 'employee', 'advisor', 'broker', 'employer', 'universal', or 'general' ('general' is the factual FAQ). Omit to search across all audiences."
  6. 1 tool update
    • Changedsearch_savvly_content1 field changed
      • changedInput schema / properties / audience / description
        Previous value: -"Restrict to one stakeholder audience ('general' is the factual FAQ). Use the exact lowercase token (the enum is case-sensitive). Omit to search across all audiences."New value: +"Restrict to one stakeholder audience ('general' is the factual FAQ). Omit to search across all audiences."
  7. 2 tool updates
    • Changedproject_savvly_lumpsum1 field changed
      • 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."
    • Changedproject_savvly_monthly1 field changed
      • 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."
  8. 2 tool updates
    • Changedproject_savvly_lumpsum1 field changed
      • changedInput schema / properties / withdrawal_age / minimum
        Previous value: -25New value: +18
    • Changedproject_savvly_monthly1 field changed
      • changedInput schema / properties / withdrawal_age / minimum
        Previous value: -25New value: +18
  9. 3 tool updates
    • Changedproject_retirement_with_savvly5 fields changed
      • changedInput schema / properties / current_age / description
        Previous value: -"Current age (default 40). Accepts 0–75; an age under 18 is modeled on the age-18 basis (growth understated), flagged via the response's `age_modeling` block"New value: +"Current age (default 40)"
      • changedInput schema / properties / current_age / minimum
        Previous value: -0New value: +18
      • removedOutput schema / properties / result / properties / current_age_clamp_note
        Removed value: -{
        -  "description": "Disclosure (single-sourced from advisor_functions) that the projection is modeled on the age-18 basis and the shown growth is understated for a younger investor. Present only when clamped; display alongside any figures.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / result / properties / current_age_clamped
        Removed value: -{
        -  "description": "Present + true ONLY when the supplied current_age was below the age-18 matrix floor; the projection was then modeled on the age-18 basis.",
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / result / properties / modeled_current_age
        Removed value: -{
        -  "description": "The age used for the matrix lookup (18) when current_age was younger. Present only when clamped.",
        -  "type": "integer"
        -}
    • Changedproject_savvly_lumpsum5 fields changed
      • changedInput schema / properties / current_age / description
        Previous value: -"Investor's current age (default 40). Accepts 0–75; an age under 18 is modeled on the age-18 basis (the projection matrix has no rows below 18), so projected growth is understated for a sub-18 investor — the response flags this in its `age_modeling` block. Max 75 (max enrollment age)"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: -0New value: +18
      • removedOutput schema / properties / result / properties / current_age_clamp_note
        Removed value: -{
        -  "description": "Disclosure (single-sourced from advisor_functions) that the projection is modeled on the age-18 basis and the shown growth is understated for a younger investor. Present only when clamped; display alongside any figures.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / result / properties / current_age_clamped
        Removed value: -{
        -  "description": "Present + true ONLY when the supplied current_age was below the age-18 matrix floor; the projection was then modeled on the age-18 basis.",
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / result / properties / modeled_current_age
        Removed value: -{
        -  "description": "The age used for the matrix lookup (18) when current_age was younger. Present only when clamped.",
        -  "type": "integer"
        -}
    • Changedproject_savvly_monthly5 fields changed
      • changedInput schema / properties / current_age / description
        Previous value: -"Investor's current age (default 40). Accepts 0–75; an age under 18 is modeled on the age-18 basis (the projection matrix has no rows below 18), so projected growth is understated for a sub-18 investor — the response flags this in its `age_modeling` block. Max 75 (max enrollment age)"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: -0New value: +18
      • removedOutput schema / properties / result / properties / current_age_clamp_note
        Removed value: -{
        -  "description": "Disclosure (single-sourced from advisor_functions) that the projection is modeled on the age-18 basis and the shown growth is understated for a younger investor. Present only when clamped; display alongside any figures.",
        -  "type": "string"
        -}
      • removedOutput schema / properties / result / properties / current_age_clamped
        Removed value: -{
        -  "description": "Present + true ONLY when the supplied current_age was below the age-18 matrix floor; the projection was then modeled on the age-18 basis.",
        -  "type": "boolean"
        -}
      • removedOutput schema / properties / result / properties / modeled_current_age
        Removed value: -{
        -  "description": "The age used for the matrix lookup (18) when current_age was younger. Present only when clamped.",
        -  "type": "integer"
        -}

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for cove-fi, a deterministic retirement and financial-independence projection engine. It lets users run plans, create scenarios, and explore year-by-year net-worth projections through natural language.
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A thin MCP bridge that connects any MCP client to the Numeratica financial-planning API — retirement Monte Carlo, taxes, RMDs, Social Security, Roth conversions, and more.
    125
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    MCP server for ProjectionLab — export, snapshot, and restore your financial plans. Includes a built-in FIRE advisor knowledge base.
    5
    17
    11
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Stock screening, company financials, ETF search, and personal portfolio analysis over a remote OAuth-protected MCP server https://mcp.bull-run.org/mcp
    14
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation4/5

The three projection tools (project_retirement_with_savvly, project_savvly_lumpsum, project_savvly_monthly) share a scenario-based boundary that is reasonably clear but has some overlap — the full retirement simulation could conceptually subsume the lump-sum and monthly scenarios. The FAQ tool explicitly documents its overlap with search_savvly_content, which mitigates confusion. The eligibility, product info, and comparison tools are clearly distinct.

Naming Consistency5/5

Every tool follows a clean verb_savvly_noun convention in snake_case: check, compare, get, get, project, project, project, search. The pattern is perfectly predictable across the set, with the three projection tools sharing the 'project' verb and differing only in their object (retirement_with_savvly, savvly_lumpsum, savvly_monthly).

Tool Count5/5

Eight tools is well within the ideal 3-15 range and is appropriately scoped for a retirement advisory server. Each tool earns its place: eligibility checks, product info, FAQ, content search, comparison, and three distinct projection modes cover the server's stated purpose without redundancy bloat.

Completeness4/5

The tool surface covers the full advisory lifecycle well: eligibility screening, product overview, FAQ, content search, competitive comparison, and three projection scenarios (full retirement, lump-sum, monthly). Minor gaps exist — there is no enrollment/purchase tool or a standalone pricing/quote tool — but these are arguably outside an information-advisory scope, so agents can complete core workflows without dead ends.