MCP server: the Roth Conversion Calculator inside your AI assistant
https://roth-conversion-calculator.kindoflost.com/mcpFree, no signup, no API key. Streamable HTTP transport. Version 1.0.0.
What it does
This server gives an AI assistant the same optimizer that runs in the Roth Conversion Calculator. Given your age, your traditional, Roth and brokerage balances, your spending and your Social Security, it solves a linear program over the US federal tax brackets and returns how much to convert to Roth in each year, the tax on it, where the spending comes from, and the ending balances. It also solves the same plan with no conversions at all, so you can see what converting is worth. IRMAA (the Medicare surcharge), the 3.8% NIIT and real state brackets are available as advanced options, off by default just like the web tool. An assistant doing this arithmetic by itself will guess; here a solver does it.
Still working and wondering how to split your savings between Roth and traditional? That is the Roth vs Traditional Calculator, which has its own server.
How to connect
Claude: at https://claude.ai/customize/connectors, add a custom connector with the URL above. No OAuth needed.
Claude Code: claude mcp add --transport http roth-conversion https://roth-conversion-calculator.kindoflost.com/mcp
Other assistants and clients: anything that accepts a remote MCP server over HTTP; use the same URL.
Tools
Three tools, all read-only: none of them changes anything or stores your numbers.
get_conversion_example
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'.
Inputs (* = required):
| Input | Type | Range | Meaning |
|---|---|---|---|
kind | single | married |
Returns: A complete example input object (single or married), a one-line explanation of every field (field_notes), the required fields and the next step. Nothing is solved.
optimize_roth_conversions
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.
Inputs (* = required):
| Input | Type | Range | Meaning |
|---|---|---|---|
filing | single | married | Tax filing status. Default 'single'. 'married' = one joint return (both spouses assumed the same age). | |
age * | integer | 18 to 90 | Your age this year. The plan starts now (conversions can begin this year). |
end_age | integer | max 110 | Plan until this age (default 90; horizon at most 70 years). |
balances * | object | Current household balances, dollars. Omitted = 0; at least one must be above 0. | |
balances.traditional | number | min 0 | Traditional IRA / 401(k) (pre-tax) balance: the money that can be converted. |
balances.roth | number | min 0 | Roth IRA / 401(k) balance. |
balances.roth_penalty_free | number | min 0 | 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'. |
balances.brokerage | number | min 0 | Taxable brokerage and cash. |
balances.brokerage_gain_long_term | number | min 0 | Unrealized LONG-term gain inside the brokerage balance. |
balances.brokerage_gain_short_term | number | min 0 | Unrealized SHORT-term gain inside the brokerage balance (long + short cannot exceed the balance). |
spending_per_year | number | 0 to 5,000,000 | 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). | |
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. | |
social_security | object | Expected Social Security (household). Omitted = none. | |
social_security.annual | number | min 0 | Yearly benefit in today's dollars. |
social_security.start_age | integer | 62 to 70 | Age benefits start. Default 70. |
social_security.taxable_pct | number | 0 to 85 | Share of benefits taxed as ordinary income, whole percent. Default 85. |
other_income | object | Other steady ordinary income (pension, rental, part-time pay), today's dollars. Omitted = none. | |
other_income.annual | number | 0 to 5,000,000 | Yearly amount. |
other_income.start_age | integer | First age it is received (default: now). | |
other_income.end_age | integer | Last age it is received (default: end of plan). | |
assumptions | object | Modeling assumptions; the defaults (same as the web tool) are reported back. | |
assumptions.real_return_pct | number | -5 to 15 | Investment return above inflation, whole percent. Default 5. |
assumptions.retirement_tax_rate_pct | number | 0 to 60 | Income tax rate applied to leftover traditional money at the end of the plan (heirs' or your own). Default 24. |
assumptions.terminal_ltcg_pct | number | 0 to 40 | Capital-gains rate on leftover brokerage gain at the end. Default 15. |
assumptions.ltcg_pct | number | 0 to 40 | Flat capital-gains rate on gains realized during the plan. Default 15. |
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). | |
advanced.irmaa | boolean | Model the Medicare Part B/D income surcharge (IRMAA) so conversions can avoid or accept tiers. Default false. | |
advanced.niit | boolean | Model the 3.8% Net Investment Income Tax. Default false. | |
advanced.state | object | State income tax. Default: none (0%). | |
advanced.state.code | string | Two-letter state code (e.g. 'KS'): uses that state's real 2026 brackets, standard deduction and credit. | |
advanced.state.flat_rate_pct | number | 0 to 20 | 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). |
advanced.state.exempts_social_security | boolean | The state does not tax Social Security. Default false. | |
advanced.state.retirement_exclusion | number | min 0 | Yearly cap on IRA distributions the state excludes, dollars. Default 0. |
Returns: A short plain-text summary plus structured data: the conversion amount for every year (conversion_schedule), a year-by-year table (conversion, income tax, marginal rate, withdrawals from each account, start-of-year balances), the after-tax wealth at the end of the plan with the optimal conversions against the same plan with none, total tax, ending balances, a plain-language plan narrative, the assumptions used (defaults included) and the disclaimer.
check_request
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.
Inputs (* = required):
| Input | Type | Range | Meaning |
|---|---|---|---|
description * | string | The user's question in a sentence or two. |
Returns: Whether the request fits (supported), the unsupported parts with the closest thing the server can do (or the sister server that can), and what the server does.
Example
Prompt:
I'm 60, single and retired. I have $900,000 in a traditional IRA, $60,000 in a Roth IRA and $350,000 in a brokerage account (about $120,000 of it is long-term gain). I spend about $60,000 a year, and I expect $36,000 a year of Social Security from 70. Assume a 5% real return and plan to age 92. How much should I convert to Roth each year, and what does it add compared with not converting?
The assistant calls get_conversion_example, fills in your numbers and calls
optimize_roth_conversions. The text the tool returns for that example (generated
live from the server):
Optimal for these assumptions (age 60, single, plan to 92). Convert to Roth, by age: 60: $90,014, 61: $66,500, 62: $66,500, 63: $28,127, 64: $700, 65: $2,750, 66: $2,750, 67: $2,750, 68: $2,750, 69: $2,750. Total $265,591 over ages 60-69. After-tax wealth at 92 (today's dollars): with conversions $896,838; with none $818,935 (conversions add +9.5%, $77,903). Income tax over the plan: $264,738 with conversions, $269,601 without. Ending balances at 92: traditional $0, Roth $896,838, brokerage $0. Assumes 5% real return, 24% tax on leftover traditional money, state: none (0%), IRMAA off, NIIT off. Note: Nothing is left in the traditional IRA Note: Your conversion window is ages 60–63 Note: It stops at the 22% bracket Optimal for these assumptions only; not tax advice. Results depend on the assumed real return, the future tax rate and current tax law. See every year and adjust inputs: https://roth-conversion-calculator.kindoflost.com
And the start of the structured data, trimmed:
{
"status": "ok",
"optimal_for_these_assumptions": true,
"summary": {
"metric": "after_tax_terminal_wealth (today's dollars, at age 92)",
"with_optimal_conversions": 896838,
"with_no_conversions": 818935,
"conversions_add": {
"dollars": 77903,
"pct": 9.5
},
"total_converted_to_roth": 265591,
"conversion_ages": "60-69",
"total_income_tax_with_conversions": 264738,
"total_income_tax_without_conversions": 269601,
"of_which_state_tax": 0,
"niit_paid": 0,
"irmaa_surcharges_paid": 0
},
"conversion_schedule": [
{
"age": 60,
"amount": 90014
},
{
"age": 61,
"amount": 66500
},
{
"age": 62,
"amount": 66500
},
{
"age": 63,
"amount": 28127
},
{
"...": "more years"
}
],
"...": "plan_by_year, end_of_plan, plan_notes, assumptions, note"
}
Limits
- Ages 18 to 90; plan horizon up to 70 years (end age up to 110); balances up to $1,000,000,000.
- One household: single, or married filing jointly with both spouses assumed the same age and both alive for the whole plan. 2026 US federal tax; a US state's brackets or a flat state rate. One fixed real return, no random market paths. ACA premium-credit modeling is in the web version's advanced options but not on this server.
- One solve runs at a time; a run takes a second or two (a few seconds more with IRMAA or NIIT on, each solve capped at 5 seconds). If the server is busy the assistant is told to retry in about 20 seconds.
- Rate limit: 20 solves per network address per 10 minutes. Requests larger than 1 MB are refused.
Honest note
The plan is optimal for the stated assumptions (the real return, the future tax rate, current tax law and the other inputs), not for the future. Change the return or the tax rate on what is left and the answer can change. “Without conversions” is the same model with every conversion forced to zero. This is not tax advice, and I'm not a CPA: use the result as a starting point to bring to one. Money is in today's dollars.
Try it yourself
Prefer a form with charts and every year laid out? Use the calculator. Details on what is stored are in the privacy policy.
Support: mario@kindoflost.com.