Optimal Roth conversion plan by year: amounts, tax, and after-tax wealth vs no conversion. Free.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Say in plain words what the user wants (e.g. 'I'm still working and want to know Roth vs traditional 401k'). Returns whether this optimizer can do it and, if not, the closest thing it can do (or the sister server that can). Fast, no solve.
The user's question in a sentence or two.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http roth-conversion-calculator https://roth-conversion-calculator.kindoflost.com/mcp
Say in plain words what the user wants (e.g. 'I'm still working and want to know Roth vs traditional 401k'). Returns whether this optimizer can do it and, if not, the closest thing it can do (or the sister server that can). Fast, no solve.
| Argument | Type | Description |
|---|---|---|
| description* | string | The user's question in a sentence or two. |
{
"type": "object",
"required": [
"description"
],
"properties": {
"description": {
"type": "string",
"maxLength": 2000,
"description": "The user's question in a sentence or two."
}
},
"additionalProperties": false
}Return a complete example input for optimize_roth_conversions with a one-line explanation of every field. No solve. Edit it to the user's situation. kind 'single' (default: a 60-year-old early retiree with a traditional IRA, a brokerage account and Social Security later) or 'married'.
| Argument | Type | Description |
|---|---|---|
| kind | string |
{
"type": "object",
"properties": {
"kind": {
"enum": [
"single",
"married"
],
"type": "string"
}
},
"additionalProperties": false
}Find the best Roth conversion amount for each year of a retirement plan, with living expenses funded from the right accounts and tax paid each year. Returns per-year conversions, taxes and balances, the after-tax wealth at the end with vs without conversions, totals, a plain-language plan narrative and the assumptions used. Advanced options (IRMAA, NIIT, real state brackets) are off by default. Runs in 1-3 seconds (up to ~15 with IRMAA/NIIT on a long horizon). All money in today's dollars. Optimal for the stated assumptions; not tax advice. Call get_conversion_example first if unsure of the shape.
| Argument | Type | Description |
|---|---|---|
| age* | integer | Your age this year. The plan starts now (conversions can begin this year). |
| filing | string | Tax filing status. Default 'single'. 'married' = one joint return (both spouses assumed the same age). |
| end_age | integer | Plan until this age (default 90; horizon at most 70 years). |
| advanced | object | Advanced layers, all OFF by default exactly like the web tool. IRMAA and NIIT make the solve a MILP (a few seconds longer; each solve is capped at 5 s, best plan found is returned). |
| balances* | object | Current household balances, dollars. Omitted = 0; at least one must be above 0. |
| assumptions |
We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 10, 2026.
| object |
| Modeling assumptions; the defaults (same as the web tool) are reported back. |
| other_income | object | Other steady ordinary income (pension, rental, part-time pay), today's dollars. Omitted = none. |
| social_security | object | Expected Social Security (household). Omitted = none. |
| spending_end_age | integer | Age spending ends (default: end of plan). |
| find_max_spending | boolean | Instead of fixed spending, solve for the highest constant yearly spending the accounts can fund, ending near $0. Default false. |
| spending_per_year | number | Yearly spending the plan must fund, today's dollars, before income tax. Required unless find_max_spending is true. |
| spending_start_age | integer | Age spending begins (default: now). |
{
"type": "object",
"required": [
"age",
"balances"
],
"properties": {
"age": {
"type": "integer",
"maximum": 90,
"minimum": 18,
"description": "Your age this year. The plan starts now (conversions can begin this year)."
},
"filing": {
"enum": [
"single",
"married"
],
"type": "string",
"description": "Tax filing status. Default 'single'. 'married' = one joint return (both spouses assumed the same age)."
},
"end_age": {
"type": "integer",
"maximum": 110,
"description": "Plan until this age (default 90; horizon at most 70 years)."
},
"advanced": {
"type": "object",
"properties": {
"niit": {
"type": "boolean",
"description": "Model the 3.8% Net Investment Income Tax. Default false."
},
"irmaa": {
"type": "boolean",
"description": "Model the Medicare Part B/D income surcharge (IRMAA) so conversions can avoid or accept tiers. Default false."
},
"state": {
"type": "object",
"properties": {
"code": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "Two-letter state code (e.g. 'KS'): uses that state's real 2026 brackets, standard deduction and credit."
},
"flat_rate_pct": {
"type": "number",
"maximum": 20,
"minimum": 0,
"description": "Flat state rate, whole percent. Without 'code' it is the whole state model; with 'code' it only overrides the end-of-plan rate (default: the state's top rate)."
},
"retirement_exclusion": {
"type": "number",
"minimum": 0,
"description": "Yearly cap on IRA distributions the state excludes, dollars. Default 0."
},
"exempts_social_security": {
"type": "boolean",
"description": "The state does not tax Social Security. Default false."
}
},
"description": "State income tax. Default: none (0%).",
"additionalProperties": false
}
},
"description": "Advanced layers, all OFF by default exactly like the web tool. IRMAA and NIIT make the solve a MILP (a few seconds longer; each solve is capped at 5 s, best plan found is returned).",
"additionalProperties": false
},
"balances": {
"type": "object",
"properties": {
"roth": {
"type": "number",
"minimum": 0,
"description": "Roth IRA / 401(k) balance."
},
"brokerage": {
"type": "number",
"minimum": 0,
"description": "Taxable brokerage and cash."
},
"traditional": {
"type": "number",
"minimum": 0,
"description": "Traditional IRA / 401(k) (pre-tax) balance: the money that can be converted."
},
"roth_penalty_free": {
"type": "number",
"minimum": 0,
"description": "Of the Roth balance, the part that can be withdrawn penalty-free before 59.5 (contributions and conversions at least 5 years old). Default 0; cannot exceed 'roth'."
},
"brokerage_gain_long_term": {
"type": "number",
"minimum": 0,
"description": "Unrealized LONG-term gain inside the brokerage balance."
},
"brokerage_gain_short_term": {
"type": "number",
"minimum": 0,
"description": "Unrealized SHORT-term gain inside the brokerage balance (long + short cannot exceed the balance)."
}
},
"description": "Current household balances, dollars. Omitted = 0; at least one must be above 0.",
"additionalProperties": false
},
"assumptions": {
"type": "object",
"properties": {
"ltcg_pct": {
"type": "number",
"maximum": 40,
"minimum": 0,
"description": "Flat capital-gains rate on gains realized during the plan. Default 15."
},
"real_return_pct": {
"type": "number",
"maximum": 15,
"minimum": -5,
"description": "Investment return above inflation, whole percent. Default 5."
},
"terminal_ltcg_pct": {
"type": "number",
"maximum": 40,
"minimum": 0,
"description": "Capital-gains rate on leftover brokerage gain at the end. Default 15."
},
"retirement_tax_rate_pct": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Income tax rate applied to leftover traditional money at the end of the plan (heirs' or your own). Default 24."
}
},
"description": "Modeling assumptions; the defaults (same as the web tool) are reported back.",
"additionalProperties": false
},
"other_income": {
"type": "object",
"properties": {
"annual": {
"type": "number",
"maximum": 5000000,
"minimum": 0,
"description": "Yearly amount."
},
"end_age": {
"type": "integer",
"description": "Last age it is received (default: end of plan)."
},
"start_age": {
"type": "integer",
"description": "First age it is received (default: now)."
}
},
"description": "Other steady ordinary income (pension, rental, part-time pay), today's dollars. Omitted = none.",
"additionalProperties": false
},
"social_security": {
"type": "object",
"properties": {
"annual": {
"type": "number",
"minimum": 0,
"description": "Yearly benefit in today's dollars."
},
"start_age": {
"type": "integer",
"maximum": 70,
"minimum": 62,
"description": "Age benefits start. Default 70."
},
"taxable_pct": {
"type": "number",
"maximum": 85,
"minimum": 0,
"description": "Share of benefits taxed as ordinary income, whole percent. Default 85."
}
},
"description": "Expected Social Security (household). Omitted = none.",
"additionalProperties": false
},
"spending_end_age": {
"type": "integer",
"description": "Age spending ends (default: end of plan)."
},
"find_max_spending": {
"type": "boolean",
"description": "Instead of fixed spending, solve for the highest constant yearly spending the accounts can fund, ending near $0. Default false."
},
"spending_per_year": {
"type": "number",
"maximum": 5000000,
"minimum": 0,
"description": "Yearly spending the plan must fund, today's dollars, before income tax. Required unless find_max_spending is true."
},
"spending_start_age": {
"type": "integer",
"description": "Age spending begins (default: now)."
}
},
"additionalProperties": false
}