QuantCalc Retirement Engine
Server Details
Retirement Monte Carlo with a tax-aware withdrawal-order and Roth-conversion recommendation.
- Status
- Healthy
- Uptime
- 100.0% over 22 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
- Repository
- quantcalc-app/quantcalc-mcp-plugin
- GitHub Stars
- 0
- Server Listing
- app.quantcalc/retirement-engine
TDQS
Scored across 5 tools
Each tool has a clearly distinct role: running projections, running tax-aware projections, comparing assumption sets, listing sources, and explaining methodology. The two projection tools are explicitly differentiated by whether income tax is modeled, avoiding misselection.
All tool names follow a consistent snake_case verb_noun pattern (compare_, explain_, list_, run_). The compound names remain predictable and readable.
Five tools is well-scoped for a retirement calculation engine. Each tool earns its place, covering analysis, explanation, reference, and two projection variants without redundancy.
The surface covers core retirement projection workflows, tax-aware modeling, assumption comparison, source listing, and methodology explanation. Minor gaps exist, such as no explicit input/default schema or state-rule lookup tool, but they are unlikely to block agent use.
Available Tools
5 toolscompare_return_assumptionsCompare published return assumptionsARead-onlyInspect
Runs the same plan against several published capital market assumption sets and returns the success rate and median outcome under each, showing how far the answer moves with the return forecast used.
| Name | Required | Description | Default |
|---|---|---|---|
| pension | No | Yearly pension income. Default 0. | |
| sources | No | Source ids to compare. Defaults to all. | |
| allocations | No | Percentages summing to 100: [US stocks, international stocks, bonds, real estate, cash]. Default [60,10,25,5,0]. | |
| current_age | Yes | Current age of the primary person. | |
| ss_start_age | No | Age Social Security starts. Default 67. | |
| inflation_rate | No | Annual inflation as a percent, e.g. 2.5. Default 2.5. | |
| retirement_age | No | Age work income stops. Defaults to current age. | |
| returns_source | No | Which published return set to use (see list_return_assumption_sources). Default jpmorgan. | |
| annual_spending | Yes | Planned yearly spending in today's dollars, before income tax (this tool runs the standard engine, which does not model tax). | |
| current_savings | Yes | Total invested portfolio today, in dollars. | |
| life_expectancy | No | Age the plan must last until. Default 92. | |
| social_security | No | Yearly Social Security in today's dollars. Default 0 — and 0 is reported as an explicit assumption, not hidden. | |
| pension_start_age | No | Age the pension starts. Default 65. | |
| monthly_contribution | No | Monthly savings until retirement. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds meaningful context by specifying that it compares multiple published assumption sets and returns success rate and median outcome as sensitivity metrics, which is beyond what annotations provide. No contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single well-structured sentence states the core behavior, the output metrics, and the purpose (sensitivity analysis). Every clause earns its place and there is no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter tool with no output schema, the description supplies essential output expectations (success rate and median outcome under each set) while the schema covers all parameter semantics. The open-world/read-only annotations and the sibling list_return_assumption_sources provide enough surrounding context for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all 14 parameters and their defaults. The main description adds no parameter-level detail beyond the schema. The presence of both a singular 'returns_source' and a plural 'sources' array could be mildly confusing, but the schema descriptions clarify each.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it 'runs the same plan against several published capital market assumption sets' and returns success rate and median outcome under each. This clearly distinguishes it from the sibling run_retirement_projection (single plan, single forecast) and list_return_assumption_sources (listing sources).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the use case—comparing how different return forecasts affect a retirement plan—and the wording makes it distinct from a single projection. However, it does not explicitly state when to use this tool versus run_retirement_projection, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_methodologyWhat the engine models, and what it does notARead-onlyInspect
Returns what the QuantCalc engine models and what it deliberately leaves out, including the tax provisions that are out of scope, and links to the published methodology.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the description is not required to restate safety. It adds value by disclosing the tool returns both included and excluded items, specifically tax provisions, and provides links. This goes beyond the annotations and gives clear behavioral context about the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence that packs essential information: what is returned, what is excluded, and that links are provided. There is no filler, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter informational tool with no output schema, the description fully covers what the agent needs to know to call it correctly: the nature of the returned information and the presence of links. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty with 100% coverage. Per the baseline for no parameters, a score of 4 is appropriate; the description does not need to explain parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a summary of what the QuantCalc engine models and excludes, including tax provisions out of scope, and links to methodology. This is a specific verb ('Returns') and resource (engine scope), and it differentiates from sibling tools that focus on assumptions, sources, or projections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is used to understand modeling scope, but it does not explicitly state when to use it versus alternatives, nor does it provide any exclusion criteria. An agent can infer the purpose, but there is no direct guidance on selecting this tool over siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_return_assumption_sourcesList available return assumption setsARead-onlyInspect
Returns the published capital market assumption sets the engine carries and which components each publisher provides (returns, volatilities, correlations).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering safety and scope. The description adds specific behavioral context by specifying what the return includes (which components each publisher provides), going slightly beyond the annotations. It does not contradict annotations and provides useful detail about the operation's output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, efficient sentence that front-loads the main action ('Returns the published capital market assumption sets') and then adds the key detail about components. Every word contributes to clarity, with no wasted phrasing or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only listing tool with annotations covering safety and open-world behavior, the description provides all necessary context. It tells the agent what the tool returns and what information is included, which is sufficient for correct invocation. No output schema exists, so the description adequately explains the return value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema trivially covers 100% of parameters. Per rubric, a baseline of 4 is given for 0 parameters. The description does not need to add parameter meaning since there are none, and it correctly focuses on the output semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb ('Returns') and a specific resource ('the published capital market assumption sets the engine carries'), and adds detail about the returned components (returns, volatilities, correlations). This distinguishes it from siblings like compare_return_assumptions (which compares) and run_retirement_projection (which runs projections).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context about when to use the tool: to retrieve the list of available assumption sets and their components. However, it does not explicitly mention alternatives or exclusions relative to sibling tools. The purpose is obvious enough that an agent can infer when to call it, but there is no explicit 'use this when' or 'not for comparing' guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_retirement_projectionRun a retirement projectionARead-onlyInspect
Runs a Monte Carlo retirement projection on the QuantCalc engine and returns the success rate, the ending-portfolio distribution, and the assumptions that produced them. The result states the return model that ran, the number of paths, and the income assumptions it used, including when there are none. Income tax is not modelled by this tool; run_tax_aware_projection models it.
| Name | Required | Description | Default |
|---|---|---|---|
| pension | No | Yearly pension income. Default 0. | |
| allocations | No | Percentages summing to 100: [US stocks, international stocks, bonds, real estate, cash]. Default [60,10,25,5,0]. | |
| current_age | Yes | Current age of the primary person. | |
| ss_start_age | No | Age Social Security starts. Default 67. | |
| inflation_rate | No | Annual inflation as a percent, e.g. 2.5. Default 2.5. | |
| retirement_age | No | Age work income stops. Defaults to current age. | |
| returns_source | No | Which published return set to use (see list_return_assumption_sources). Default jpmorgan. | |
| annual_spending | Yes | Planned yearly spending in today's dollars, before income tax (this tool runs the standard engine, which does not model tax). | |
| current_savings | Yes | Total invested portfolio today, in dollars. | |
| life_expectancy | No | Age the plan must last until. Default 92. | |
| social_security | No | Yearly Social Security in today's dollars. Default 0 — and 0 is reported as an explicit assumption, not hidden. | |
| pension_start_age | No | Age the pension starts. Default 65. | |
| monthly_contribution | No | Monthly savings until retirement. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so no contradiction. The description adds meaningful behavioral context beyond annotations: it reveals that the result includes the return model, number of paths, and income assumptions, and explicitly states that a zero Social Security value is reported as an explicit assumption rather than hidden. This gives the agent insight into the tool's output behavior without relying on an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with no filler. The first sentence states the core function, the second lists outputs, the third gives the tax caveat and alternative. All information is front-loaded and every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 13 parameters but no output schema, the description is remarkably complete: it states what the tool returns (success rate, distribution, assumptions, return model, path count, income assumptions) and highlights the tax limitation. It also references list_return_assumption_sources for the returns_source parameter, guiding the agent to the appropriate sibling. The annotations cover read-only and open-world behavior, leaving no critical gaps for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented individually. The description adds contextual value by clarifying that tax is not modelled, which affects how annual_spending and other parameters should be interpreted, and by noting that income assumptions are always reported (even when zero). However, much of this is already present in the schema descriptions (e.g., 'before income tax'), so the marginal value is modest, matching the baseline of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb-resource pair ('Runs a Monte Carlo retirement projection on the QuantCalc engine') and lists concrete outputs (success rate, ending-portfolio distribution, assumptions). It explicitly differentiates itself from the tax-aware sibling by stating it does not model income tax, so an agent can tell it apart from run_tax_aware_projection without inspecting schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context: it runs the standard engine and explicitly states when not to use it ('Income tax is not modelled by this tool') and names the alternative (run_tax_aware_projection). It does not mention other siblings like compare_return_assumptions or explain_methodology, but these are obviously different in purpose, so the guidance is adequate without being exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_tax_aware_projectionTax-aware projection with the recommended withdrawal orderARead-onlyInspect
Runs the retirement projection with the household's accounts split by tax type and returns the withdrawal order and Roth-conversion programme the engine selected, its present-value advantage and range against drawing traditional first, and the after-tax success rate. Federal and state income tax (50 states and DC), Social Security taxability, required minimum distributions, Medicare IRMAA surcharges and the early-withdrawal penalty are paid from the portfolio year by year; spending is what the household keeps after tax. The result states every assumption it used, including the defaults for inputs that were not given, and what the engine does not model.
| Name | Required | Description | Default |
|---|---|---|---|
| state | No | Two-letter state of residence (or DC) for state income tax with that state's retirement-income rules. When absent the result states that no state tax was modelled. | |
| pension | No | Yearly pension income. Default 0. | |
| annual_qcd | No | Yearly qualified charitable distribution from the traditional account, in today's dollars, counted against required minimum distributions. Default 0. | |
| birth_year | No | Year of birth, optional. Must match current_age: 2026 minus current_age, or 2025 minus current_age when this year's birthday is still to come (then every tax rule uses the age reached in each calendar year). Sets the RMD start age (73 if born 1951-1959, 75 if born 1960 or later). Default: 2026 minus current_age, stated in the result. | |
| spouse_age | No | Spouse's current age, for married filing jointly: sets the second aged deduction and Medicare surcharge. Default: the same as current_age, stated in the result. | |
| allocations | No | Percentages summing to 100: [US stocks, international stocks, bonds, real estate, cash]. Default [60,10,25,5,0]. | |
| birth_month | No | Month of birth, 1-12, optional. Times the half-year rules: the early-withdrawal penalty ends at 59 and a half, charitable distributions start at 70 and a half, Medicare starts in the birthday month. Default: not given, stated in the result. | |
| current_age | Yes | Current age of the primary person. | |
| roth_balance | Yes | Roth IRA and Roth 401(k) balance today, in dollars. 0 if none. | |
| ss_start_age | No | Age Social Security starts. Default 67. | |
| filing_status | Yes | Federal filing status: single, married filing jointly (mfj), married filing separately (mfs) or head of household (hoh). | |
| inflation_rate | No | Annual inflation as a percent, e.g. 2.5. Default 2.5. | |
| retirement_age | No | Age work income stops. Defaults to current age. | |
| returns_source | No | Which published return set to use (see list_return_assumption_sources). Default jpmorgan. | |
| annual_spending | Yes | Planned yearly spending in today's dollars, after tax: what the household keeps. The engine withdraws enough each year to fund this plus that year's federal, state, Medicare-surcharge and penalty tax. | |
| life_expectancy | No | Age the plan must last until. Default 92. | |
| roth_conversion | No | The household's own Roth-conversion plan: a fixed amount per year between two ages. When given, the engine applies it on every path and searches withdrawal orders around it instead of searching its own conversion programmes. | |
| social_security | No | Yearly Social Security in today's dollars. Default 0 — and 0 is reported as an explicit assumption, not hidden. | |
| taxable_balance | Yes | Taxable brokerage and savings today, in dollars. 0 if none. The three balances together are the portfolio. | |
| cost_basis_ratio | No | Percentage of the taxable account that is cost basis, 0-100. Default 40, and the result says so when it is assumed. | |
| pension_start_age | No | Age the pension starts. Default 65. | |
| medicare_start_age | No | Age Medicare (and its IRMAA income surcharges) begins. Default 65. The year it begins is charged only for the months from the birthday month. | |
| tax_exempt_interest | No | Yearly municipal-bond interest, which counts toward Social Security taxability and IRMAA income but is not itself taxed. Default 0. | |
| traditional_balance | Yes | Pre-tax retirement accounts today (traditional IRA, 401(k), 403(b)), in dollars. 0 if none. | |
| monthly_contribution | No | Monthly savings until retirement. Default 0. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond them by spelling out which taxes are paid from the portfolio year by year, that spending is after-tax, that every assumption and default is surfaced in the result, and that the engine states what it does not model. This is unusually rich disclosure of modelling behaviour and limits and is fully consistent with readOnlyHint.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the action and then the returns, with no filler or restatement of the title. The tax-mechanics sentence is dense but every clause carries information (which taxes, paid from portfolio, spending definition).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 25-parameter simulation with no output schema, the description covers the inputs' conceptual model (three balances = portfolio, after-tax spending), the return payload, and the guarantee that defaults and unmodelled items are reported. Combined with 100% schema coverage, an agent has what it needs to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every one of the 25 parameters is already documented in the schema, including defaults, units and enum values. The description adds essentially no parameter-level detail beyond the state (50 states + DC) and returns_source pointer, which is the correct baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (runs the retirement projection) and enumerates the outputs concretely: withdrawal order, Roth-conversion programme, present-value advantage and range, after-tax success rate. The 'tax-aware' framing implicitly separates it from run_retirement_projection, but the sibling is never named, so the differentiation is inferred rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when it applies (household with accounts split by tax type, wants a tax-aware answer) and it routes the agent to list_return_assumption_sources for returns_source. It never says when to prefer run_retirement_projection or compare_return_assumptions instead, so the selection guidance is only implied.
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.
1 tool update
- Changed
run_tax_aware_projection3 fields changed- added
Input schema / properties / birth_monthAdded value: +{ + "description": "Month of birth, 1-12, optional. Times the half-year rules: the early-withdrawal penalty ends at 59 and a half, charitable distributions start at 70 and a half, Medicare starts in the birthday month. Default: not given, stated in the result.", + "type": "integer" +} - added
Input schema / properties / birth_yearAdded value: +{ + "description": "Year of birth, optional. Must match current_age: 2026 minus current_age, or 2025 minus current_age when this year's birthday is still to come (then every tax rule uses the age reached in each calendar year). Sets the RMD start age (73 if born 1951-1959, 75 if born 1960 or later). Default: 2026 minus current_age, stated in the result.", + "type": "integer" +} - changed
Input schema / properties / medicare_start_age / descriptionPrevious value: -"Age Medicare (and its IRMAA income surcharges) begins. Default 65."New value: +"Age Medicare (and its IRMAA income surcharges) begins. Default 65. The year it begins is charged only for the months from the birthday month."
1 tool update
- Added
run_tax_aware_projection
1 tool update
- Removed
run_tax_aware_projection
1 tool update
- Added
run_tax_aware_projection
2 tool updates
- Changed
compare_return_assumptions1 field changed- changed
Input schema / properties / annual_spending / descriptionPrevious value: -"Planned yearly spending in today's dollars."New value: +"Planned yearly spending in today's dollars, before income tax (this tool runs the standard engine, which does not model tax)."
- Changed
run_retirement_projection1 field changed- changed
Input schema / properties / annual_spending / descriptionPrevious value: -"Planned yearly spending in today's dollars."New value: +"Planned yearly spending in today's dollars, before income tax (this tool runs the standard engine, which does not model tax)."
4 tool updates
- First observed
compare_return_assumptions - First observed
explain_methodology - First observed
list_return_assumption_sources - First observed
run_retirement_projection
Related MCP Connectors
Deterministic US financial planning: retirement Monte Carlo, Roth conversion, RMD, tax, IRMAA, SS
Monte Carlo tools: three-point cost estimation and an educational retirement drawdown simulator.
Retirement planning for Canada & US. CPP/OAS, Social Security, RRSP/TFSA, 401k/IRA, Monte Carlo.
Retirement drawdown, 72(t) SEPP, RMD, Roth conversion, Social Security and state-tax calculators.
Related MCP Servers
FlicenseNot gradedqualityDmaintenanceTax-aware retirement planning for Canada and the US. CPP/OAS and Social Security timing, RRSP/TFSA/401k/IRA projections, Monte Carlo simulation, withdrawal order optimization, and historical backtesting against 150 years of market data.2-- AlicenseNot gradedqualityDmaintenanceProvides retirement planning computations for AI agents, including Monte Carlo simulations, tax burden modeling across all US states, Social Security claiming optimization, and cost-of-living comparisons.7 npmMIT
- FlicenseNot gradedqualityDmaintenanceEnables institutional-grade Monte Carlo risk analysis for portfolios, startups, real estate, and betting strategies using fat-tail distributions and proprietary algorithms. Provides comprehensive risk metrics including CVaR, VaR, ruin probability, and survival probability across multiple asset classes.1-

WealthSchemaofficial
AlicenseAqualityCmaintenanceCited 2026 and 2027 U.S. financial-planning figures (IRS, SSA, CMS), synthetic household samples, and an AI financial-advice benchmark.8MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.