MCP-Server

savvly

com.savvly/savvly
Finanzen & Investieren Recht & Compliance Öffentlich und erreichbar MCP 2025-11-25

Was dieses MCP kann

Provides Savvly product information, eligibility checks, retirement projections, comparisons, FAQs, and source-backed disclosures.

check_savvly_eligibility
Check Savvly Eligibility
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['age'], 'properties': {'age': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': "Person's current age"}, 'channel': {'enum': ['individual', 'employer', 'advisor'], 'type': 'string', 'default': 'individual', 'description': "Distribution channel — one of 'individual', 'employer', 'advisor' (default 'individual')."}, 'us_resident': {'type': 'boolean', 'default': True, 'description': 'Whether the person is a US resident'}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['eligible', 'age_eligible', 'residency_eligible', 'channel', 'criteria', 'message'], 'properties': {'channel': {'enum': ['individual', 'employer', 'advisor'], 'type': 'string', 'description': 'Distribution channel under consideration for this check.'}, 'message': {'type': 'string', 'description': 'Human-readable explanation of the eligibility outcome.'}, 'criteria': {'type': 'object', 'properties': {}, 'description': 'Full eligibility-criteria reference object (age range, residency, accredited-investor flag, channel requirements).', 'additionalProperties': True}, 'eligible': {'type': 'boolean', 'description': 'True if every eligibility criterion (age + residency) is satisfied.'}, 'age_eligible': {'type': 'boolean', 'description': 'True if age is at or under the maximum enrollment age (75); the filing sets no minimum age.'}, 'residency_eligible': {'type': 'boolean', 'description': 'True if the US-residency requirement is satisfied.'}}, 'additionalProperties': True}
compare_savvly_vs_alternative
Compare Savvly vs Alternative Product
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'alternative': {'enum': ['fixed_annuity', 'variable_annuity', 'indexed_annuity', 'target_date_fund', 'managed_payout_fund', 'all'], 'type': 'string', 'default': 'all', 'description': "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'."}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['savvly', 'metadata'], 'properties': {'savvly': {'type': 'object', 'properties': {'liquidity': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'simplicity': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'portability': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'affordability': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'cost_to_value': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'death_benefit': {'type': 'string', 'description': 'Death-benefit summary.'}, 'market_upside': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'tax_treatment': {'type': 'string', 'description': 'Tax-treatment summary.'}, 'counterparty_safety': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'inflation_protection': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'longevity_protection': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'regulatory_oversight': {'type': 'string', 'description': 'Who regulates it (e.g. SEC vs state insurance).'}}, 'description': "Savvly's profile across the comparison dimensions.", 'additionalProperties': True}, 'metadata': {'type': 'object', 'properties': {'version': {'type': 'string', 'description': 'Comparison data version.'}, 'disclaimer': {'type': 'string', 'description': 'Required disclaimer.'}}, 'description': 'Comparison dimensions, definitions, and source notes.', 'additionalProperties': True}, 'comparison': {'type': 'object', 'required': ['product_type'], 'properties': {'category': {'type': 'string', 'description': 'Product category.'}, 'dimensions': {'type': 'object', 'properties': {'liquidity': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'simplicity': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'portability': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'affordability': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'cost_to_value': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'death_benefit': {'type': 'string', 'description': 'Death-benefit summary.'}, 'market_upside': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'tax_treatment': {'type': 'string', 'description': 'Tax-treatment summary.'}, 'counterparty_safety': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'inflation_protection': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'longevity_protection': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'regulatory_oversight': {'type': 'string', 'description': 'Who regulates it (e.g. SEC vs state insurance).'}}, 'description': "This alternative's ratings across the dimensions.", 'additionalProperties': True}, 'description': {'type': 'string', 'description': 'Short description of the alternative.'}, 'display_name': {'type': 'string', 'description': 'Human-readable product name.'}, 'product_type': {'type': 'string', 'description': "Alternative product slug, e.g. 'fixed_annuity'."}}, 'description': "The selected alternative product's profile. Present when `alternative` is a specific product type (i.e. not 'all').", 'additionalProperties': True}, 'comparisons': {'type': 'array', 'items': {'type': 'object', 'required': ['product_type'], 'properties': {'category': {'type': 'string', 'description': 'Product category.'}, 'dimensions': {'type': 'object', 'properties': {'liquidity': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'simplicity': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'portability': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'affordability': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'cost_to_value': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'death_benefit': {'type': 'string', 'description': 'Death-benefit summary.'}, 'market_upside': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'tax_treatment': {'type': 'string', 'description': 'Tax-treatment summary.'}, 'counterparty_safety': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'inflation_protection': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'longevity_protection': {'type': 'object', 'required': ['score', 'label', 'explanation'], 'properties': {'label': {'type': 'string', 'description': 'Rating label: None | Very Low | Low | Medium | High | Very High.'}, 'score': {'type': 'number', 'description': 'Numeric rating; greater = better (e.g. 1–5).'}, 'explanation': {'type': 'string', 'description': 'One-sentence rationale for the rating.'}}, 'additionalProperties': True}, 'regulatory_oversight': {'type': 'string', 'description': 'Who regulates it (e.g. SEC vs state insurance).'}}, 'description': "This alternative's ratings across the dimensions.", 'additionalProperties': True}, 'description': {'type': 'string', 'description': 'Short description of the alternative.'}, 'display_name': {'type': 'string', 'description': 'Human-readable product name.'}, 'product_type': {'type': 'string', 'description': "Alternative product slug, e.g. 'fixed_annuity'."}}, 'additionalProperties': True}, 'description': "Full comparison matrix — one entry per alternative product type. Present when `alternative` is 'all'."}}, 'additionalProperties': True}
get_savvly_faq
Get Savvly FAQ
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'section': {'enum': ['all', 'understanding-savvly', 'investment-custody', 'payouts', 'withdrawals-estate', 'expenses-cost', 'tax-legacy', 'employer-portability', 'safety-regulatory'], 'type': 'string', 'default': 'all', 'description': "Filter the FAQ to one section (kebab-case, e.g. 'tax-legacy'); 'all' returns every entry."}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['section', 'total', 'entries'], 'properties': {'total': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Count of FAQ entries returned.'}, 'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'audience', 'section', 'question', 'answer', 'footnotes'], 'properties': {'id': {'type': 'string'}, 'answer': {'type': 'string'}, 'section': {'type': 'string'}, 'audience': {'enum': ['employee', 'advisor', 'broker', 'employer', 'universal', 'general'], 'type': 'string'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}}, 'question': {'type': 'string'}, 'footnotes': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': True}, 'description': "Filtered FAQ entries (the audience:'general' Q&A slice)."}, 'section': {'type': 'string', 'description': "Section filter applied to produce this result set ('all' if no filter)."}}, 'additionalProperties': True}
get_savvly_product_info
Get Savvly Product Info
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'section': {'enum': ['all', 'overview', 'regulatory', 'investment', 'expenses', 'payouts', 'tax', 'distribution'], 'type': 'string', 'default': 'all', 'description': "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."}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['name', 'category'], 'properties': {'name': {'type': 'string', 'description': "Product name (e.g. 'Savvly Longevity Benefit')."}, 'links': {'type': 'object', 'properties': {}, 'description': 'Relevant URLs (website, disclosures, etc.).', 'additionalProperties': True}, 'company': {'type': 'object', 'properties': {}, 'description': 'Issuer / advisor entity information.', 'additionalProperties': True}, 'tagline': {'type': 'string', 'description': 'Short marketing tagline.'}, 'category': {'type': 'string', 'description': "Product category slug, e.g. 'longevity_benefit_fund'."}, 'channels': {'type': 'array', 'items': {}, 'description': 'Distribution channels through which Savvly is offered.'}, 'expenses': {'type': 'object', 'properties': {}, 'description': 'Expense structure in basis points (common vs tracking shares) and the blended range; illustrations are net of expenses.', 'additionalProperties': True}, 'investment': {'type': 'object', 'properties': {}, 'description': 'How contributions are invested: underlying assets (S&P 500 ETF), asset managers, minimum/maximum monthly and lump-sum amounts, market participation.', 'additionalProperties': True}, 'next_steps': {'type': 'object', 'properties': {}, 'description': 'Suggested next actions for an interested investor.', 'additionalProperties': True}, 'regulatory': {'type': 'object', 'properties': {}, 'description': 'Regulatory status: SEC registration, Investment Company Act of 1940, advisor, custodian, and is_insurance/is_annuity flags.', 'additionalProperties': True}, 'description': {'type': 'string', 'description': 'Long-form product description.'}, 'disclaimers': {'type': 'object', 'properties': {}, 'description': 'SEC-style disclaimers and required legal language.', 'additionalProperties': True}, 'portability': {'type': 'boolean', 'description': 'Whether the position is portable.'}, 'tax_treatment': {'type': 'object', 'properties': {}, 'description': 'Tax treatment of payouts and contributions.', 'additionalProperties': True}, 'longevity_pool': {'type': 'object', 'properties': {}, 'description': "How the longevity pool works — exited participants' unused shares may be allocated to remaining participants.", 'additionalProperties': True}, 'payout_schedule': {'type': 'array', 'items': {'type': 'object', 'required': ['age', 'percentage'], 'properties': {'age': {'type': 'number', 'description': 'Milestone age (80, 85, 90, or 95).'}, 'label': {'type': 'string', 'description': "Human label, e.g. 'First milestone'."}, 'percentage': {'type': 'number', 'description': 'Fraction of accumulated value distributed at this milestone (e.g. 0.4).'}, 'description': {'type': 'string', 'description': 'What happens at this milestone.'}}, 'additionalProperties': True}, 'description': 'Milestone payout schedule at ages 80/85/90/95.'}, 'early_withdrawal': {'type': 'object', 'properties': {}, 'description': 'Early-withdrawal / surrender terms and the value returned to the estate.', 'additionalProperties': True}, 'portability_note': {'type': 'string', 'description': 'Detail on portability.'}, 'illustrative_payout': {'type': 'object', 'required': ['current_age', 'funding_amount', 'average_return', 'payouts'], 'properties': {'payouts': {'type': 'array', 'items': {'type': 'object', 'required': ['age', 'lower_usd', 'upper_usd'], 'properties': {'age': {'type': 'number', 'description': 'Milestone age (80, 85, 90, or 95).'}, 'lower_usd': {'type': 'number', 'description': 'USD. Low end of the modeled payout at this age.'}, 'upper_usd': {'type': 'number', 'description': 'USD. High end of the modeled payout at this age.'}}, 'additionalProperties': True}, 'description': 'One row per milestone age, low-to-high payout range in USD.'}, 'current_age': {'type': 'number', 'description': 'Age the illustrated allocation is made at.'}, 'average_return': {'type': 'number', 'description': 'Assumed average annual S&P 500 return, in percent.'}, 'funding_amount': {'type': 'number', 'description': 'USD allocated up front in the illustration.'}}, '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`.", 'additionalProperties': True}, 'positioning_statement': {'type': 'string', 'description': 'One-sentence positioning — what Savvly is and is NOT (not insurance, not an annuity).'}}, 'additionalProperties': True}
project_retirement_with_savvly
Project Retirement Trajectory With Savvly
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'current_age': {'type': 'integer', 'default': 40, 'maximum': 75, 'minimum': 18, 'description': 'Current age (default 40)'}, 'inflation_rate': {'type': 'number', 'default': 3, 'description': 'Expected annual inflation rate % (default 3)'}, 'retirement_age': {'type': 'integer', 'default': 68, 'maximum': 80, 'minimum': 50, 'description': 'Planned retirement age (default 68)'}, 'life_expectancy': {'type': 'integer', 'default': 100, 'maximum': 120, 'minimum': 60, 'description': 'Planning horizon (default 100)'}, 'monthly_paycheck': {'type': 'number', 'default': 4500, 'minimum': 0, 'description': 'Desired monthly retirement paycheck in USD (default 4500)'}, 'monthly_contribution': {'type': 'number', 'default': 1000, 'minimum': 0, 'description': 'Monthly retirement contribution in USD (default 1000)'}, 'percentage_in_savvly': {'type': 'number', 'default': 5, 'maximum': 50, 'minimum': 0, 'description': 'Percentage of the retirement portfolio allocated to Savvly (default 5)'}, 'pre_retirement_return': {'type': 'number', 'default': 6, 'description': 'Expected pre-retirement annual return % (default 6)'}, 'annual_income_increase': {'type': 'number', 'default': 2, 'maximum': 20, 'minimum': 0, 'description': 'Annual contribution % increase (default 2)'}, 'post_retirement_return': {'type': 'number', 'default': 5, 'description': 'Expected post-retirement annual return % (default 5)'}, 'other_retirement_income': {'type': 'number', 'default': 1600, 'minimum': 0, 'description': 'Other monthly retirement income in USD (default 1600)'}, 'current_retirement_savings': {'type': 'number', 'default': 60000, 'minimum': 0, 'description': 'Current total retirement savings in USD (default 60000)'}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['inputs', 'result', 'summary', 'disclosure', 'metadata'], 'properties': {'inputs': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': True}, 'result': {'type': 'object', 'required': ['gap_score', 'possible_higher_monthly_paycheck', 'label_message', 'label_secondary_message', 'age_dependent_values'], 'properties': {'gap_score': {'type': 'number', 'description': 'Server-computed score summarizing how well the projected retirement savings meet the desired monthly paycheck across the planning horizon.'}, 'label_message': {'type': 'string', 'description': 'Short headline message the upstream estimator produced for this scenario (e.g., on-track / shortfall framing).'}, 'age_dependent_values': {'type': 'array', 'items': {'type': 'object', 'required': ['age', 'retirement_savings_without_savvly_in_the_portfolio', 'retirement_savings_with_savvly_in_the_portfolio', 'difference_between_retirement_savings_with_and_without_savvly_in_the_portfolio', 'savvly_value_alone'], 'properties': {'age': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Age (years) the row reports.'}, 'savvly_value_alone': {'type': 'number', 'description': 'USD. Standalone value attributable to the Savvly allocation at this age, excluding the rest of the retirement portfolio.'}, 'retirement_savings_with_savvly_in_the_portfolio': {'type': 'number', 'description': 'USD. Projected total retirement savings at this age in the scenario WITH the configured Savvly allocation included in the portfolio.'}, 'retirement_savings_without_savvly_in_the_portfolio': {'type': 'number', 'description': 'USD. Projected total retirement savings at this age in the scenario WITHOUT any Savvly allocation — pure traditional retirement portfolio.'}, 'difference_between_retirement_savings_with_and_without_savvly_in_the_portfolio': {'type': 'number', 'description': 'USD. `retirement_savings_with_savvly − retirement_savings_without_savvly` for this age. Positive once Savvly milestones start paying out.'}}, 'additionalProperties': True}, 'description': 'Per-age timeline across the planning horizon (current_age → life_expectancy). One row per year.'}, 'label_secondary_message': {'type': 'string', 'description': 'Supporting subtitle that accompanies `label_message`.'}, 'possible_higher_monthly_paycheck': {'type': 'number', 'description': "USD/month. The monthly paycheck level the simulation considers achievable under the supplied assumptions — useful for surfacing alongside the user's `desired_monthly_paycheck`."}}, 'additionalProperties': True}, 'summary': {'type': 'object', 'required': ['narrative'], 'properties': {'narrative': {'type': 'string', 'description': 'Human-readable English sentence. Always ends with the canonical full-disclosures URL so AI clients that paraphrase past `metadata.disclaimer` still echo the disclosure link.'}}, 'description': 'Convenience summary. The narrative carries the canonical full-disclosures URL inline; display it verbatim alongside any figures from this response.', 'additionalProperties': False}, 'metadata': {'type': 'object', 'required': ['disclaimer', 'field_descriptions'], 'properties': {'disclaimer': {'type': 'object', 'required': ['summary', 'assumptions', 'risks', 'fund_structure', 'full_disclosures_url'], 'properties': {'risks': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'text'], 'properties': {'name': {'type': 'string'}, 'text': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Named risks (Market, Sequence-of-Returns, Longevity, Redemption Impact). Surface when a user asks what could cause actual results to differ.'}, 'summary': {'type': 'string', 'description': 'Short illustrative-purposes disclaimer matching the text directly below the chart on estimator.savvly.com. Surface this whenever you summarize the projection to a user.'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 3% early-withdrawal rate, net of fund operating expenses, etc.). Surface when a user asks what the projection assumes.'}, 'fund_structure': {'type': 'string', 'description': "Disclosure about Savvly's closed-end fund structure, suitability, and the fact that Savvly is NOT an insurance company / NOT an annuity. Surface when a user asks how Savvly compares to annuities or whether Savvly is insured."}, 'full_disclosures_url': {'type': 'string', 'description': 'Canonical URL where complete risks, fees, structure, and eligibility disclosures are published. Always include in user-facing summaries.'}}, 'additionalProperties': False}, 'display_hints': {'type': 'object', 'required': ['chart', 'layout', 'rendering_notes'], 'properties': {'chart': {'type': 'object', 'required': ['type', 'reference', 'x_axis', 'y_axis', 'series', 'interpolation', 'show_markers', 'tooltip'], 'properties': {'type': {'type': 'string', 'const': 'area'}, 'series': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'label', 'color', 'fill'], 'properties': {'fill': {'type': 'string'}, 'color': {'type': 'string'}, 'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}}, 'x_axis': {'type': 'object', 'required': ['field', 'label'], 'properties': {'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'additionalProperties': False}, 'y_axis': {'type': 'object', 'required': ['label', 'format'], 'properties': {'label': {'type': 'string'}, 'format': {'type': 'string'}}, 'additionalProperties': False}, 'tension': {'type': 'number'}, 'tooltip': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'reference': {'type': 'string'}, 'show_markers': {'type': 'boolean'}, 'interpolation': {'type': 'string'}}, 'additionalProperties': True}, 'layout': {'type': 'object', 'required': ['above_chart', 'below_chart'], 'properties': {'above_chart': {'type': 'string'}, 'below_chart': {'type': 'string'}}, 'additionalProperties': False}, 'rendering_notes': {'type': 'array', 'items': {'type': 'string'}}}, 'description': 'Rendering guidance for the retirement projection chart. Tells AI clients to render `age_dependent_values` as a stacked area chart matching estimator.savvly.com — MILD smoothing (Chart.js tension 0.4), no markers, so Savvly milestone payouts at ages 80/85/90/95 still read as distinct spikes with visible year-by-year depletion between them. KPI cards above and a narrative paragraph below the chart are encouraged.', 'additionalProperties': False}, 'field_descriptions': {'type': 'object', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': True}, 'disclosure': {'type': 'object', 'required': ['required', 'text', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical full-disclosures URL. Render as a clickable link to the user alongside the `text`. Required by SEC Marketing Rule and FINRA Rule 2210.'}, 'text': {'type': 'string', 'description': 'Short verbatim SEC disclosure text. Display this string to the user alongside any projection figures from this response. Do not paraphrase, summarize, or omit.'}, 'required': {'type': 'boolean', 'const': True, 'description': 'Always true. Signals to the calling AI client that the `text` and `url` fields MUST be displayed to the end user whenever any number from this response is shown. Required by SEC Marketing Rule and FINRA Rule 2210.'}}, 'description': 'DISCLOSURE 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.', 'additionalProperties': False}, 'visualization': {'type': 'object', 'required': ['recommended', 'instruction', 'chart'], 'properties': {'chart': {'type': 'object', 'required': ['type', 'x_axis', 'y_axis', 'series', 'rendering_notes'], 'properties': {'type': {'enum': ['area', 'line', 'bar'], 'type': 'string', 'description': 'Chart type the client should render.'}, 'series': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'label', 'color'], 'properties': {'color': {'type': 'string', 'description': 'Hex color for this series. The series representing Savvly is always #3478eb (the Savvly brand blue).'}, 'field': {'type': 'string', 'description': 'Per-row field plotted by this series.'}, 'label': {'type': 'string', 'description': 'Legend label for this series.'}}, 'additionalProperties': True}, 'description': 'One entry per plotted series — typically Savvly vs. the baseline / market-alone counterfactual.'}, 'x_axis': {'type': 'object', 'required': ['field', 'label'], 'properties': {'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'description': 'Per-row field mapped to the x-axis, plus its display label.', 'additionalProperties': True}, 'y_axis': {'type': 'object', 'required': ['label', 'format'], 'properties': {'label': {'type': 'string'}, 'format': {'type': 'string'}}, 'description': "Y-axis label and value format (e.g. 'currency_usd').", 'additionalProperties': True}, 'tooltip': {'type': 'object', 'description': 'Optional `field -> human label` map for chart tooltips.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'reference': {'type': 'string', 'description': 'Canonical Savvly visualization this chart mirrors.'}, 'rendering_notes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Plain-English rendering guidance for the client.'}}, 'description': 'Machine-readable chart spec: type, axes, series (with brand colors), and rendering notes.', 'additionalProperties': True}, 'instruction': {'type': 'string', 'description': 'Plain-English instruction telling the client to render `chart` from the per-row data in `result`, color the Savvly series #3478eb, and show the `disclosure` alongside the chart.'}, 'recommended': {'type': 'boolean', 'const': True, 'description': 'Always true. Signals to the calling AI client that it SHOULD render `chart` whenever it can display a graph.'}}, 'description': 'Recommended 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.', 'additionalProperties': True}}, 'additionalProperties': True}
project_savvly_lumpsum
Project Savvly Lump-Sum Investment
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'current_age': {'type': 'integer', 'default': 40, 'maximum': 75, 'minimum': 18, 'description': "Investor's current age (default 40). Min 18 (the projection matrix floor); max 75 (max enrollment age)"}, 'average_return': {'type': 'integer', 'default': 8, 'maximum': 15, 'minimum': 1, 'description': 'Expected average annual S&P 500 return % (default 8)'}, 'funding_amount': {'type': 'number', 'default': 10000, 'minimum': 100, 'description': 'Lump sum investment in USD (default 10000)'}, 'withdrawal_age': {'type': 'integer', 'default': 82, 'maximum': 120, 'minimum': 18, 'description': 'Early-withdrawal age (default 82) — drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response'}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['inputs', 'result', 'summary', 'disclosure', 'metadata'], 'properties': {'inputs': {'type': 'object', 'description': 'Echo of the validated input arguments passed to the tool.', 'propertyNames': {'type': 'string'}, 'additionalProperties': True}, 'result': {'type': 'object', 'required': ['total_savvly_upside_lower', 'total_savvly_upside_upper', 'total_savvly_lower', 'total_savvly_upper', 'total_market_alone_lower', 'total_market_alone_upper', 'early_withdrawal_value', 'total_payout_at_withdrawal_age_lower', 'total_payout_at_withdrawal_age_upper', 'percentage_gain_lower', 'percentage_gain_upper', 'payout_age_dependent_values'], 'properties': {'total_savvly_lower': {'type': 'number', 'description': 'USD. Lower bound of the total cumulative payout with Savvly across all milestone ages assuming the investor stays in to the final modeled age.'}, 'total_savvly_upper': {'type': 'number', 'description': 'USD. Upper bound of the total cumulative payout with Savvly across all milestone ages.'}, 'percentage_gain_lower': {'type': 'number', 'description': 'Percent. Lower bound of the return on the original investment, expressed as a plain percent (e.g. 1520 = 1,520%). Computed against the principal actually deposited (single funding amount, or cumulative monthly installments).'}, 'percentage_gain_upper': {'type': 'number', 'description': 'Percent. Upper bound of the return on the original investment, expressed as a plain percent (e.g. 1710 = 1,710%).'}, 'early_withdrawal_value': {'type': 'number', 'description': 'USD. Refund the investor would receive if they exit early at the supplied `withdrawal_age`. Point estimate (no range). Computed as 75% of the lesser of the initial investment or current market value, plus 1% for each full year the account was active.'}, 'total_market_alone_lower': {'type': 'number', 'description': 'USD. Lower bound of the cumulative counterfactual market alone payout.'}, 'total_market_alone_upper': {'type': 'number', 'description': 'USD. Upper bound of the cumulative counterfactual market alone payout.'}, 'total_savvly_upside_lower': {'type': 'number', 'description': 'USD. Lower bound of the cumulative incremental upside Savvly provides vs. investing in the market alone, summed across all milestone payout ages.'}, 'total_savvly_upside_upper': {'type': 'number', 'description': 'USD. Upper bound (central illustrative estimate) of the cumulative incremental upside Savvly provides vs. market alone. Equals `total_savvly_upper − total_market_alone_upper`.'}, 'payout_age_dependent_values': {'type': 'array', 'items': {'type': 'object', 'required': ['payout_age', 'savvly_payout_lower', 'savvly_payout_upper', 'payout_market_alone_lower', 'payout_market_alone_upper', 'savvly_upside_lower', 'savvly_upside_upper'], 'properties': {'payout_age': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Milestone age (in years) at which this payout row is reported. The estimator returns rows for ages 80, 85, 90, and 95 by default.'}, 'savvly_payout_lower': {'type': 'number', 'description': 'USD. Lower bound of the modeled payout with Savvly at this milestone age.'}, 'savvly_payout_upper': {'type': 'number', 'description': 'USD. Upper bound (central illustrative estimate) of the payout with Savvly at this milestone age. Use this when surfacing a single number.'}, 'savvly_upside_lower': {'type': 'number', 'description': "USD. Lower bound for the incremental payout at this age attributable to Savvly's longevity benefit (savvly_payout − payout_market_alone)."}, 'savvly_upside_upper': {'type': 'number', 'description': 'USD. Upper bound for the incremental Savvly upside at this age. Tends to be large at 90/95 where the market alone portfolio is depleted.'}, 'payout_market_alone_lower': {'type': 'number', 'description': 'USD. Market alone counterfactual paired with savvly_payout_LOWER — the same scenario, not a low bound. It can exceed payout_market_alone_upper, because smaller Savvly payouts draw the mirrored portfolio down more slowly. May be 0 once that portfolio has been fully drawn down.'}, 'payout_market_alone_upper': {'type': 'number', 'description': 'USD. Market alone counterfactual paired with savvly_payout_UPPER — the same scenario, not a high bound. May be 0 once the mirrored portfolio has been depleted.'}}, 'additionalProperties': True}, 'description': 'Per-milestone-age breakdown of the projection. Typically 4 rows for ages 80, 85, 90, 95. Each row contains the with Savvly payout, the market alone counterfactual, and the incremental Savvly upside for that age, each with `_lower`/`_upper` bounds.'}, 'total_payout_at_withdrawal_age_lower': {'type': 'number', 'description': 'USD. Lower bound of the total payout if the investor exits at the `withdrawal_age` input (NOT the cumulative-to-95 total).'}, 'total_payout_at_withdrawal_age_upper': {'type': 'number', 'description': 'USD. Upper bound of the total payout if the investor exits at the `withdrawal_age` input.'}}, 'description': 'Raw projection envelope returned by the upstream estimator.', 'additionalProperties': True}, 'summary': {'type': 'object', 'required': ['deposit_type', 'deposited_amount_usd', 'total_savvly_upper_usd', 'total_market_alone_upper_usd', 'savvly_above_market_upper_usd', 'early_exit_refund_usd', 'percentage_gain_upper_percent', 'narrative'], 'properties': {'narrative': {'type': 'string', 'description': "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."}, 'deposit_type': {'enum': ['single', 'monthly'], 'type': 'string', 'description': 'Whether the projection used a single upfront deposit or monthly installments.'}, 'deposited_amount_usd': {'type': 'number', 'description': 'USD. Total amount deposited into Savvly. For single deposits this equals `funding_amount`. For monthly installments it equals `monthly_installment * installment_years * 12`.'}, 'early_exit_refund_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.early_withdrawal_value`.'}, 'total_savvly_upper_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.total_savvly_upper`.'}, 'total_market_alone_upper_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.total_market_alone_upper`.'}, 'percentage_gain_upper_percent': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.percentage_gain_upper`.'}, 'savvly_above_market_upper_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'USD. `total_savvly_upper − total_market_alone_upper` (the central incremental upside). May differ slightly from `result.total_savvly_upside_upper` due to rounding.'}}, 'description': 'Convenience summary including a human-readable narrative.', 'additionalProperties': False}, 'metadata': {'type': 'object', 'required': ['disclaimer', 'methodology', 'field_descriptions'], 'properties': {'disclaimer': {'type': 'object', 'required': ['summary', 'assumptions', 'risks', 'fund_structure', 'full_disclosures_url'], 'properties': {'risks': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'text'], 'properties': {'name': {'type': 'string'}, 'text': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Named risks (Market, Sequence-of-Returns, Longevity, Redemption Impact). Surface when a user asks what could cause actual results to differ.'}, 'summary': {'type': 'string', 'description': 'Short illustrative-purposes disclaimer matching the text directly below the chart on estimator.savvly.com. Surface this whenever you summarize the projection to a user.'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 3% early-withdrawal rate, net of fund operating expenses, etc.). Surface when a user asks what the projection assumes.'}, 'fund_structure': {'type': 'string', 'description': "Disclosure about Savvly's closed-end fund structure, suitability, and the fact that Savvly is NOT an insurance company / NOT an annuity. Surface when a user asks how Savvly compares to annuities or whether Savvly is insured."}, 'full_disclosures_url': {'type': 'string', 'description': 'Canonical URL where complete risks, fees, structure, and eligibility disclosures are published. Always include in user-facing summaries.'}}, 'additionalProperties': False}, 'methodology': {'type': 'string', 'description': 'Plain-English explanation of how the Savvly vs market-alone payout figures are computed (the matched-drawdown counterfactual). Present on lumpsum and monthly projections.'}, 'field_descriptions': {'type': 'object', 'description': "Flat `field_name -> short description` map covering every field in `result` and `result.payout_age_dependent_values[]`. Useful for MCP clients that don't surface outputSchema to the LLM.", 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': True}, 'disclosure': {'type': 'object', 'required': ['required', 'text', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical full-disclosures URL. Render as a clickable link to the user alongside the `text`. Required by SEC Marketing Rule and FINRA Rule 2210.'}, 'text': {'type': 'string', 'description': 'Short verbatim SEC disclosure text. Display this string to the user alongside any projection figures from this response. Do not paraphrase, summarize, or omit.'}, 'required': {'type': 'boolean', 'const': True, 'description': 'Always true. Signals to the calling AI client that the `text` and `url` fields MUST be displayed to the end user whenever any number from this response is shown. Required by SEC Marketing Rule and FINRA Rule 2210.'}}, 'description': 'DISCLOSURE 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.', 'additionalProperties': False}, 'visualization': {'type': 'object', 'required': ['recommended', 'instruction', 'chart'], 'properties': {'chart': {'type': 'object', 'required': ['type', 'x_axis', 'y_axis', 'series', 'rendering_notes'], 'properties': {'type': {'enum': ['area', 'line', 'bar'], 'type': 'string', 'description': 'Chart type the client should render.'}, 'series': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'label', 'color'], 'properties': {'color': {'type': 'string', 'description': 'Hex color for this series. The series representing Savvly is always #3478eb (the Savvly brand blue).'}, 'field': {'type': 'string', 'description': 'Per-row field plotted by this series.'}, 'label': {'type': 'string', 'description': 'Legend label for this series.'}}, 'additionalProperties': True}, 'description': 'One entry per plotted series — typically Savvly vs. the baseline / market-alone counterfactual.'}, 'x_axis': {'type': 'object', 'required': ['field', 'label'], 'properties': {'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'description': 'Per-row field mapped to the x-axis, plus its display label.', 'additionalProperties': True}, 'y_axis': {'type': 'object', 'required': ['label', 'format'], 'properties': {'label': {'type': 'string'}, 'format': {'type': 'string'}}, 'description': "Y-axis label and value format (e.g. 'currency_usd').", 'additionalProperties': True}, 'tooltip': {'type': 'object', 'description': 'Optional `field -> human label` map for chart tooltips.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'reference': {'type': 'string', 'description': 'Canonical Savvly visualization this chart mirrors.'}, 'rendering_notes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Plain-English rendering guidance for the client.'}}, 'description': 'Machine-readable chart spec: type, axes, series (with brand colors), and rendering notes.', 'additionalProperties': True}, 'instruction': {'type': 'string', 'description': 'Plain-English instruction telling the client to render `chart` from the per-row data in `result`, color the Savvly series #3478eb, and show the `disclosure` alongside the chart.'}, 'recommended': {'type': 'boolean', 'const': True, 'description': 'Always true. Signals to the calling AI client that it SHOULD render `chart` whenever it can display a graph.'}}, 'description': 'Recommended 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.', 'additionalProperties': True}}, 'additionalProperties': True}
project_savvly_monthly
Project Savvly Monthly Contributions
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'current_age': {'type': 'integer', 'default': 40, 'maximum': 75, 'minimum': 18, 'description': "Investor's current age (default 40). Min 18 (the projection matrix floor); max 75 (max enrollment age)"}, 'average_return': {'type': 'integer', 'default': 8, 'maximum': 15, 'minimum': 1, 'description': 'Expected average annual S&P 500 return % (default 8)'}, 'monthly_amount': {'type': 'number', 'default': 100, 'minimum': 10, 'description': 'Monthly deposit in USD (default 100)'}, 'withdrawal_age': {'type': 'integer', 'default': 82, 'maximum': 120, 'minimum': 18, 'description': 'Early-withdrawal age (default 82) — drives `early_withdrawal_value` and `total_payout_at_withdrawal_age_*` in the response'}, 'contribution_years': {'type': 'integer', 'maximum': 55, 'minimum': 1, 'description': 'Number of years contributing. Omit to use a sensible default of min(27, 80 − current_age) — 27 for the canonical age-40 scenario, and always small enough that contributions finish by age 80 (the advisor limit). If you pass an explicit value, current_age + contribution_years must be ≤ 80.'}, 'installment_increase_percentage': {'type': 'number', 'maximum': 20, 'minimum': 0, 'description': 'Optional annual % increase applied to monthly contributions'}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['inputs', 'result', 'summary', 'disclosure', 'metadata'], 'properties': {'inputs': {'type': 'object', 'description': 'Echo of the validated input arguments passed to the tool.', 'propertyNames': {'type': 'string'}, 'additionalProperties': True}, 'result': {'type': 'object', 'required': ['total_savvly_upside_lower', 'total_savvly_upside_upper', 'total_savvly_lower', 'total_savvly_upper', 'total_market_alone_lower', 'total_market_alone_upper', 'early_withdrawal_value', 'total_payout_at_withdrawal_age_lower', 'total_payout_at_withdrawal_age_upper', 'percentage_gain_lower', 'percentage_gain_upper', 'payout_age_dependent_values'], 'properties': {'total_savvly_lower': {'type': 'number', 'description': 'USD. Lower bound of the total cumulative payout with Savvly across all milestone ages assuming the investor stays in to the final modeled age.'}, 'total_savvly_upper': {'type': 'number', 'description': 'USD. Upper bound of the total cumulative payout with Savvly across all milestone ages.'}, 'percentage_gain_lower': {'type': 'number', 'description': 'Percent. Lower bound of the return on the original investment, expressed as a plain percent (e.g. 1520 = 1,520%). Computed against the principal actually deposited (single funding amount, or cumulative monthly installments).'}, 'percentage_gain_upper': {'type': 'number', 'description': 'Percent. Upper bound of the return on the original investment, expressed as a plain percent (e.g. 1710 = 1,710%).'}, 'early_withdrawal_value': {'type': 'number', 'description': 'USD. Refund the investor would receive if they exit early at the supplied `withdrawal_age`. Point estimate (no range). Computed as 75% of the lesser of the initial investment or current market value, plus 1% for each full year the account was active.'}, 'total_market_alone_lower': {'type': 'number', 'description': 'USD. Lower bound of the cumulative counterfactual market alone payout.'}, 'total_market_alone_upper': {'type': 'number', 'description': 'USD. Upper bound of the cumulative counterfactual market alone payout.'}, 'total_savvly_upside_lower': {'type': 'number', 'description': 'USD. Lower bound of the cumulative incremental upside Savvly provides vs. investing in the market alone, summed across all milestone payout ages.'}, 'total_savvly_upside_upper': {'type': 'number', 'description': 'USD. Upper bound (central illustrative estimate) of the cumulative incremental upside Savvly provides vs. market alone. Equals `total_savvly_upper − total_market_alone_upper`.'}, 'payout_age_dependent_values': {'type': 'array', 'items': {'type': 'object', 'required': ['payout_age', 'savvly_payout_lower', 'savvly_payout_upper', 'payout_market_alone_lower', 'payout_market_alone_upper', 'savvly_upside_lower', 'savvly_upside_upper'], 'properties': {'payout_age': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Milestone age (in years) at which this payout row is reported. The estimator returns rows for ages 80, 85, 90, and 95 by default.'}, 'savvly_payout_lower': {'type': 'number', 'description': 'USD. Lower bound of the modeled payout with Savvly at this milestone age.'}, 'savvly_payout_upper': {'type': 'number', 'description': 'USD. Upper bound (central illustrative estimate) of the payout with Savvly at this milestone age. Use this when surfacing a single number.'}, 'savvly_upside_lower': {'type': 'number', 'description': "USD. Lower bound for the incremental payout at this age attributable to Savvly's longevity benefit (savvly_payout − payout_market_alone)."}, 'savvly_upside_upper': {'type': 'number', 'description': 'USD. Upper bound for the incremental Savvly upside at this age. Tends to be large at 90/95 where the market alone portfolio is depleted.'}, 'payout_market_alone_lower': {'type': 'number', 'description': 'USD. Market alone counterfactual paired with savvly_payout_LOWER — the same scenario, not a low bound. It can exceed payout_market_alone_upper, because smaller Savvly payouts draw the mirrored portfolio down more slowly. May be 0 once that portfolio has been fully drawn down.'}, 'payout_market_alone_upper': {'type': 'number', 'description': 'USD. Market alone counterfactual paired with savvly_payout_UPPER — the same scenario, not a high bound. May be 0 once the mirrored portfolio has been depleted.'}}, 'additionalProperties': True}, 'description': 'Per-milestone-age breakdown of the projection. Typically 4 rows for ages 80, 85, 90, 95. Each row contains the with Savvly payout, the market alone counterfactual, and the incremental Savvly upside for that age, each with `_lower`/`_upper` bounds.'}, 'total_payout_at_withdrawal_age_lower': {'type': 'number', 'description': 'USD. Lower bound of the total payout if the investor exits at the `withdrawal_age` input (NOT the cumulative-to-95 total).'}, 'total_payout_at_withdrawal_age_upper': {'type': 'number', 'description': 'USD. Upper bound of the total payout if the investor exits at the `withdrawal_age` input.'}}, 'description': 'Raw projection envelope returned by the upstream estimator.', 'additionalProperties': True}, 'summary': {'type': 'object', 'required': ['deposit_type', 'deposited_amount_usd', 'total_savvly_upper_usd', 'total_market_alone_upper_usd', 'savvly_above_market_upper_usd', 'early_exit_refund_usd', 'percentage_gain_upper_percent', 'narrative'], 'properties': {'narrative': {'type': 'string', 'description': "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."}, 'deposit_type': {'enum': ['single', 'monthly'], 'type': 'string', 'description': 'Whether the projection used a single upfront deposit or monthly installments.'}, 'deposited_amount_usd': {'type': 'number', 'description': 'USD. Total amount deposited into Savvly. For single deposits this equals `funding_amount`. For monthly installments it equals `monthly_installment * installment_years * 12`.'}, 'early_exit_refund_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.early_withdrawal_value`.'}, 'total_savvly_upper_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.total_savvly_upper`.'}, 'total_market_alone_upper_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.total_market_alone_upper`.'}, 'percentage_gain_upper_percent': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'Convenience copy of `result.percentage_gain_upper`.'}, 'savvly_above_market_upper_usd': {'anyOf': [{'type': 'number'}, {'type': 'null'}], 'description': 'USD. `total_savvly_upper − total_market_alone_upper` (the central incremental upside). May differ slightly from `result.total_savvly_upside_upper` due to rounding.'}}, 'description': 'Convenience summary including a human-readable narrative.', 'additionalProperties': False}, 'metadata': {'type': 'object', 'required': ['disclaimer', 'methodology', 'field_descriptions'], 'properties': {'disclaimer': {'type': 'object', 'required': ['summary', 'assumptions', 'risks', 'fund_structure', 'full_disclosures_url'], 'properties': {'risks': {'type': 'array', 'items': {'type': 'object', 'required': ['name', 'text'], 'properties': {'name': {'type': 'string'}, 'text': {'type': 'string'}}, 'additionalProperties': False}, 'description': 'Named risks (Market, Sequence-of-Returns, Longevity, Redemption Impact). Surface when a user asks what could cause actual results to differ.'}, 'summary': {'type': 'string', 'description': 'Short illustrative-purposes disclaimer matching the text directly below the chart on estimator.savvly.com. Surface this whenever you summarize the projection to a user.'}, 'assumptions': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Verbatim bullet list of key assumptions used by the simulation (SSA tables, 8% market growth, 3% early-withdrawal rate, net of fund operating expenses, etc.). Surface when a user asks what the projection assumes.'}, 'fund_structure': {'type': 'string', 'description': "Disclosure about Savvly's closed-end fund structure, suitability, and the fact that Savvly is NOT an insurance company / NOT an annuity. Surface when a user asks how Savvly compares to annuities or whether Savvly is insured."}, 'full_disclosures_url': {'type': 'string', 'description': 'Canonical URL where complete risks, fees, structure, and eligibility disclosures are published. Always include in user-facing summaries.'}}, 'additionalProperties': False}, 'methodology': {'type': 'string', 'description': 'Plain-English explanation of how the Savvly vs market-alone payout figures are computed (the matched-drawdown counterfactual). Present on lumpsum and monthly projections.'}, 'field_descriptions': {'type': 'object', 'description': "Flat `field_name -> short description` map covering every field in `result` and `result.payout_age_dependent_values[]`. Useful for MCP clients that don't surface outputSchema to the LLM.", 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}}, 'additionalProperties': True}, 'disclosure': {'type': 'object', 'required': ['required', 'text', 'url'], 'properties': {'url': {'type': 'string', 'description': 'Canonical full-disclosures URL. Render as a clickable link to the user alongside the `text`. Required by SEC Marketing Rule and FINRA Rule 2210.'}, 'text': {'type': 'string', 'description': 'Short verbatim SEC disclosure text. Display this string to the user alongside any projection figures from this response. Do not paraphrase, summarize, or omit.'}, 'required': {'type': 'boolean', 'const': True, 'description': 'Always true. Signals to the calling AI client that the `text` and `url` fields MUST be displayed to the end user whenever any number from this response is shown. Required by SEC Marketing Rule and FINRA Rule 2210.'}}, 'description': 'DISCLOSURE 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.', 'additionalProperties': False}, 'visualization': {'type': 'object', 'required': ['recommended', 'instruction', 'chart'], 'properties': {'chart': {'type': 'object', 'required': ['type', 'x_axis', 'y_axis', 'series', 'rendering_notes'], 'properties': {'type': {'enum': ['area', 'line', 'bar'], 'type': 'string', 'description': 'Chart type the client should render.'}, 'series': {'type': 'array', 'items': {'type': 'object', 'required': ['field', 'label', 'color'], 'properties': {'color': {'type': 'string', 'description': 'Hex color for this series. The series representing Savvly is always #3478eb (the Savvly brand blue).'}, 'field': {'type': 'string', 'description': 'Per-row field plotted by this series.'}, 'label': {'type': 'string', 'description': 'Legend label for this series.'}}, 'additionalProperties': True}, 'description': 'One entry per plotted series — typically Savvly vs. the baseline / market-alone counterfactual.'}, 'x_axis': {'type': 'object', 'required': ['field', 'label'], 'properties': {'field': {'type': 'string'}, 'label': {'type': 'string'}}, 'description': 'Per-row field mapped to the x-axis, plus its display label.', 'additionalProperties': True}, 'y_axis': {'type': 'object', 'required': ['label', 'format'], 'properties': {'label': {'type': 'string'}, 'format': {'type': 'string'}}, 'description': "Y-axis label and value format (e.g. 'currency_usd').", 'additionalProperties': True}, 'tooltip': {'type': 'object', 'description': 'Optional `field -> human label` map for chart tooltips.', 'propertyNames': {'type': 'string'}, 'additionalProperties': {'type': 'string'}}, 'reference': {'type': 'string', 'description': 'Canonical Savvly visualization this chart mirrors.'}, 'rendering_notes': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Plain-English rendering guidance for the client.'}}, 'description': 'Machine-readable chart spec: type, axes, series (with brand colors), and rendering notes.', 'additionalProperties': True}, 'instruction': {'type': 'string', 'description': 'Plain-English instruction telling the client to render `chart` from the per-row data in `result`, color the Savvly series #3478eb, and show the `disclosure` alongside the chart.'}, 'recommended': {'type': 'boolean', 'const': True, 'description': 'Always true. Signals to the calling AI client that it SHOULD render `chart` whenever it can display a graph.'}}, 'description': 'Recommended 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.', 'additionalProperties': True}}, 'additionalProperties': True}
search_savvly_content
Search Savvly Q&A Content Library
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.
Nur Lesen Idempotent
Eingabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'properties': {'limit': {'type': 'integer', 'default': 20, 'maximum': 50, 'minimum': 1, 'description': 'Cap on matched entries returned. Default 20, max 50.'}, 'query': {'type': 'string', 'description': 'Free-text search over questions, answers, and footnotes (case-insensitive). Multi-word queries match entries containing ANY of the words, ranked by relevance.'}, 'section': {'type': 'string', 'description': "Substring match against section slugs (e.g. 'tax', 'retention', 'eligibility'). Case-insensitive."}, 'audience': {'enum': ['employee', 'advisor', 'broker', 'employer', 'universal', 'general'], 'type': 'string', 'description': "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."}}}
Ausgabeschema
{'type': 'object', '$schema': 'https://json-schema.org/draft/2020-12/schema', 'required': ['total_in_library', 'matched', 'filter_applied', 'available_sections', 'entries'], 'properties': {'entries': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'audience', 'section', 'question', 'answer', 'footnotes'], 'properties': {'id': {'type': 'string'}, 'answer': {'type': 'string'}, 'section': {'type': 'string'}, 'audience': {'enum': ['employee', 'advisor', 'broker', 'employer', 'universal', 'general'], 'type': 'string'}, 'keywords': {'type': 'array', 'items': {'type': 'string'}}, 'question': {'type': 'string'}, 'footnotes': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': True}, 'description': 'Matched Q&A entries.'}, 'matched': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Count of entries matching the supplied filters.'}, 'filter_applied': {'type': 'object', 'required': ['audience', 'section', 'query', 'limit'], 'properties': {'limit': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991}, 'query': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'section': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}, 'audience': {'anyOf': [{'type': 'string'}, {'type': 'null'}]}}, 'description': 'Echo of the filters that produced this result set.', 'additionalProperties': True}, 'total_in_library': {'type': 'integer', 'maximum': 9007199254740991, 'minimum': -9007199254740991, 'description': 'Total Q&A entry count in the library across all audiences.'}, 'available_sections': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Section slugs available within the (optionally) selected audience.'}}, 'additionalProperties': True}
Hinzugefügt
search_savvly_content
17. September 2026 12:37
Hinzugefügt
get_savvly_faq
17. September 2026 12:37
Hinzugefügt
check_savvly_eligibility
17. September 2026 12:37
Hinzugefügt
project_retirement_with_savvly
17. September 2026 12:37
Hinzugefügt
project_savvly_monthly
17. September 2026 12:37
Hinzugefügt
project_savvly_lumpsum
17. September 2026 12:37
Hinzugefügt
compare_savvly_vs_alternative
17. September 2026 12:37
Hinzugefügt
get_savvly_product_info
17. September 2026 12:37