firenum - retirement planner
When can you retire? Turns your age, savings, income and spending into a retirement date, checked against 500 simulated markets and every start year since 1872.
Hosted MCP Server
npx add-mcp 'https://firenum.com/mcp'Installs into Claude Code, Codex, Cursor and more
Documentation
Developers
Put firenum on your site, or drive the Fire Planner from code. No API key, no cost.
firenum's planner and calculators run in the browser. The tools below let you reuse them: embed a calculator, show that you are listed in the directory, or hand structured financial data to the Fire Planner and get back its answer and a link to the plan. All endpoints are open and unauthenticated.
Embed a calculator
Drop any of the 8 FIRE calculators into your page with an iframe. The embed resizes itself as readers change inputs and adapts to their currency. The snippet builder gives you the currency, theme, and auto-resize code ready to paste.
Partner badge
Listed in the advisor directory? Show the "Featured on firenum" badge on your site. Four layouts, dark and light, with copy-paste code.
MCP server
https://firenum.com/mcp is a Model Context Protocol server with one tool, build_retirement_plan. When someone tells ChatGPT, Claude or another assistant their age, income, savings and spending and asks when they can retire, whether their money will last or what their Coast FIRE or FIRE number is, the assistant sends those numbers and gets back the planner's answer and a link that opens their plan, filled in. It answers in the chat with firenum's numbers; the link is the whole plan.
Streamable HTTP, stateless, no auth. The tool is the REST operation below: its description, parameters and result schema come from the OpenAPI spec, and it is read-only.
Connect
- ChatGPT: chatgpt.com/plugins, then +, then Add custom MCP server, with the URL above.
- Claude: Customize, then Connectors, then Add custom connector, with the URL above and no sign-in.
- Claude Code:
claude mcp add --transport http firenum https://firenum.com/mcp - Le Chat: Connectors, then + Add Connector, then Custom MCP Connector, named
firenum, with the URL above. - Perplexity (Pro and up): Account settings, then Connectors, then + Custom connector, then Remote, with the URL above and authentication None.
- Gemini (personal US accounts, 18+, English): gemini.google.com, Settings, then Connected Apps, then Add a custom app, with the URL above.
Listed in the official MCP Registry as com.firenum/fire-planner.
Call
POST https://firenum.com/mcp
Content-Type: application/json
Accept: application/json, text/event-stream
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": { "name": "build_retirement_plan", "arguments": { "salary": 80000, "expenses": 4000, "retirement": 200000, "birth": 1990, "retire_age": 55 } }
}
Result
structuredContent, also sent as JSON text, answered when this page was built (October 2026):
{
"url": "https://firenum.com/fire-planner?salary=80000&expenses=4000&retirement=200000&birth=1990&retire_age=55&source=agent",
"params_applied": ["salary", "expenses", "retirement", "birth", "retire_age"],
"answer": {
"headline": "Retiring Jan 2045, at 55: money lasts to age 90",
"monte_carlo": "money lasts in 230 of 500 simulations",
"backtest": "money lasts in 100 of 100 start years",
"money_left": "Money left at age 90: $1.56M",
"spending_room": "You could spend up to $4,650/mo and the money still lasts to age 90",
"coast": "If you stopped saving today and still retired Jan 2045, the money runs out in 2055.",
"fire_number": 1200000,
"coast_number": 569571,
"coast_age": 55,
"assumptions": {
"currency": "USD",
"money": "Today's money",
"average_return_pct": 7,
"inflation_pct": 3,
"retirement": "Their own date",
"money_lasts_until": "age 90",
"models": {
"average_returns": "One smooth path. Your investments grow 7% every year before 3% inflation. This shows what happens if every single year is average. Real years never are.",
"monte_carlo": "500 simulations. Each one draws a different return every year around the same 7% average, with 15% yearly swings. The result is how many of the 500 simulations your money survives.",
"backtest": "Every real start year since 1872 (100 of them, each with 55 years of data). Your plan is replayed through what the stock market returned from that year on, with your own inflation rate. The result is how many of the 100 start years your money survives."
},
"withdrawal_order": "Taxable first: Retirement Account",
"early_withdrawal_penalty": "Not applied: every account is drawn in order at any age",
"accounts": [
{
"name": "Retirement Account",
"balance": 200000,
"growth_pct": 7,
"monthly_contribution": 0
}
],
"income": [
{
"name": "Salary",
"amount": 6667,
"frequency": "monthly",
"from": "now",
"until": "retirement",
"growth_pct": 3
}
],
"spending": [
{
"name": "Monthly expenses",
"amount": 4000,
"frequency": "monthly",
"from": "now",
"until": "never",
"growth_pct": 3
}
],
"debts": [],
"not_modeled": "Tax amounts (model tax as spending or a lower growth rate); the early withdrawal penalty itself (flagged, not charged); benefit estimates and the best claiming age (Social Security and pensions are income from the age chosen); Roth conversions; non-US market history (the backtest replays the S&P 500). A projection, not financial advice."
},
"table": {
"columns": ["year", "age", "net_worth_average_returns", "net_worth_monte_carlo_p10", "net_worth_monte_carlo_median", "net_worth_monte_carlo_p90", "net_worth_backtest_p10", "net_worth_backtest_median", "net_worth_backtest_p90", "income", "spending", "withdrawals"],
"rows": [
[2026, 36, 211000, 190000, 210000, 232000, 188000, 211000, 230000, 20000, 12000, 0],
[2030, 40, 386000, 275000, 369000, 502000, 293000, 401000, 578000, 80000, 48000, 0],
[2035, 45, 649000, 407000, 596000, 895000, 474000, 696000, 1170000, 80000, 48000, 0],
[2040, 50, 971000, 512000, 860000, 1490000, 707000, 1050000, 2040000, 80000, 48000, 0],
[2045, 55, 1280000, 620000, 1080000, 1940000, 952000, 1410000, 3320000, 0, 48000, 48000],
[2050, 60, 1300000, 385000, 973000, 2260000, 1080000, 1500000, 4590000, 0, 48000, 48000],
[2055, 65, 1330000, 152000, 857000, 2580000, 1090000, 2180000, 6180000, 0, 48000, 48000],
[2060, 70, 1360000, 0, 704000, 3010000, 1140000, 3470000, 7690000, 0, 48000, 48000],
[2065, 75, 1400000, 0, 512000, 2960000, 1090000, 5140000, 8660000, 0, 48000, 48000],
[2070, 80, 1440000, 0, 341000, 3260000, 1130000, 6550000, 12800000, 0, 48000, 48000],
[2075, 85, 1500000, 0, 109000, 3600000, 1400000, 7890000, 22100000, 0, 48000, 48000],
[2080, 90, 1560000, 0, 0, 4180000, 1350000, 8680000, 31000000, 0, 48000, 48000]
],
"retirement_year": 2045,
"notes": ["2026 is a part year (Oct to Dec)."]
}
}
}
The answer
The MCP tool, the REST API and the agent-to-agent API return the same answer: the Fire Planner's own, in its words, as the plan shows it once opened. The planner's code computes it: the plan the link makes, its earliest retirement date (or their own year), 500 Monte Carlo simulations on the planner's one seed and every historical start year. Where they said nothing it uses the planner's defaults: 7% growth, 3% inflation, money lasting to age 90, no taxes. Sums are in today's money and their currency. A field that does not apply is left out.
Field
What it says
headline
When they can retire and how long the money lasts on average returns, or why no date works.
monte_carlo
How many of 500 simulated markets the money lasts in.
backtest
How many historical start years since 1872 the money lasts in.
money_left
What is left at the end, on average returns, in today's money.
spending_room
With a retirement year of their own: the most they could spend a month and still last.
coast
Whether they could stop saving today and still retire then (Coast FIRE).
fire_number
25 times a year's spending (the 4% rule), in their currency.
coast_number
Their Coast FIRE number: what they would need invested today to stop saving and still reach fire_number by coast_age, growing at the plan's growth less inflation. In their currency.
coast_age
The retirement age coast_number is for: theirs if they gave one, else 65.
assumed
What the answer assumed that they did not say. Without a salary or side income, an income that covers their spending, contributions and debt payments until they retire.
missing
The parameters the planner needs before it can grade anything (an age, spending). Ask for them and call again.
assumptions
What the answer rests on, as the plan's Assumptions and its lines hold them: rates in % a year, sums in their currency. `models` says how each model that ran works, in the planner's words; `accounts`, `income`, `spending` and `debts` are their numbers as the planner read them, each with its growth, start and end.
table
Year by year in today's money, the rows and numbers the planner's Table shows (3 significant figures): the first and last years, every 5th year and the retirement year. Net worth is at the end of each year: on average returns, and the 10th percentile, median and 90th percentile of the Monte Carlo simulations and of the backtest's start years, for each model that ran (0 once the money has run out). Income, spending (debt payments not included) and withdrawals are on the average path. `notes` names a part first year and the years that draw on a retirement account while the early withdrawal penalty applies.
The headline's date is the first month the money lasts on average returns. Monte Carlo and the backtest say how often that survives real market swings, so give them together: a low count means the date is on a knife edge. To grade another retirement year, call again with retire.
REST API
POST /api/fire-plan takes a JSON object of financial data and returns the planner's answer and a URL that opens the Fire Planner's quick-start with everything filled in. The reader checks the numbers, adds what is missing, and gets a new plan named "From a link" beside any plans they already have.
Income is annual. Expenses and contributions are monthly. Amounts are in whole currency units. Every field is optional. Unknown fields are ignored. CORS is open, so browser code can call it.
Request
curl -X POST https://firenum.com/api/fire-plan \
-H "Content-Type: application/json" \
-d '{ "salary": 80000, "expenses": 4000, "retirement": 200000, "birth": 1990, "retire_age": 55 }'
Response
{
"url": "https://firenum.com/fire-planner?salary=80000&expenses=4000&retirement=200000&birth=1990&retire_age=55&source=agent",
"params_applied": ["salary", "expenses", "retirement", "birth", "retire_age"],
"answer": {
"headline": "Retiring Jan 2045, at 55: money lasts to age 90",
"monte_carlo": "money lasts in 230 of 500 simulations",
"backtest": "money lasts in 100 of 100 start years",
"money_left": "Money left at age 90: $1.56M",
"spending_room": "You could spend up to $4,650/mo and the money still lasts to age 90",
"coast": "If you stopped saving today and still retired Jan 2045, the money runs out in 2055.",
"fire_number": 1200000,
"coast_number": 569571,
"coast_age": 55,
"assumptions": {
"currency": "USD",
"money": "Today's money",
"average_return_pct": 7,
"inflation_pct": 3,
"retirement": "Their own date",
"money_lasts_until": "age 90",
"models": {
"average_returns": "One smooth path. Your investments grow 7% every year before 3% inflation. This shows what happens if every single year is average. Real years never are.",
"monte_carlo": "500 simulations. Each one draws a different return every year around the same 7% average, with 15% yearly swings. The result is how many of the 500 simulations your money survives.",
"backtest": "Every real start year since 1872 (100 of them, each with 55 years of data). Your plan is replayed through what the stock market returned from that year on, with your own inflation rate. The result is how many of the 100 start years your money survives."
},
"withdrawal_order": "Taxable first: Retirement Account",
"early_withdrawal_penalty": "Not applied: every account is drawn in order at any age",
"accounts": [
{
"name": "Retirement Account",
"balance": 200000,
"growth_pct": 7,
"monthly_contribution": 0
}
],
"income": [
{
"name": "Salary",
"amount": 6667,
"frequency": "monthly",
"from": "now",
"until": "retirement",
"growth_pct": 3
}
],
"spending": [
{
"name": "Monthly expenses",
"amount": 4000,
"frequency": "monthly",
"from": "now",
"until": "never",
"growth_pct": 3
}
],
"debts": [],
"not_modeled": "Tax amounts (model tax as spending or a lower growth rate); the early withdrawal penalty itself (flagged, not charged); benefit estimates and the best claiming age (Social Security and pensions are income from the age chosen); Roth conversions; non-US market history (the backtest replays the S&P 500). A projection, not financial advice."
},
"table": {
"columns": ["year", "age", "net_worth_average_returns", "net_worth_monte_carlo_p10", "net_worth_monte_carlo_median", "net_worth_monte_carlo_p90", "net_worth_backtest_p10", "net_worth_backtest_median", "net_worth_backtest_p90", "income", "spending", "withdrawals"],
"rows": [
[2026, 36, 211000, 190000, 210000, 232000, 188000, 211000, 230000, 20000, 12000, 0],
[2030, 40, 386000, 275000, 369000, 502000, 293000, 401000, 578000, 80000, 48000, 0],
[2035, 45, 649000, 407000, 596000, 895000, 474000, 696000, 1170000, 80000, 48000, 0],
[2040, 50, 971000, 512000, 860000, 1490000, 707000, 1050000, 2040000, 80000, 48000, 0],
[2045, 55, 1280000, 620000, 1080000, 1940000, 952000, 1410000, 3320000, 0, 48000, 48000],
[2050, 60, 1300000, 385000, 973000, 2260000, 1080000, 1500000, 4590000, 0, 48000, 48000],
[2055, 65, 1330000, 152000, 857000, 2580000, 1090000, 2180000, 6180000, 0, 48000, 48000],
[2060, 70, 1360000, 0, 704000, 3010000, 1140000, 3470000, 7690000, 0, 48000, 48000],
[2065, 75, 1400000, 0, 512000, 2960000, 1090000, 5140000, 8660000, 0, 48000, 48000],
[2070, 80, 1440000, 0, 341000, 3260000, 1130000, 6550000, 12800000, 0, 48000, 48000],
[2075, 85, 1500000, 0, 109000, 3600000, 1400000, 7890000, 22100000, 0, 48000, 48000],
[2080, 90, 1560000, 0, 0, 4180000, 1350000, 8680000, 31000000, 0, 48000, 48000]
],
"retirement_year": 2045,
"notes": ["2026 is a part year (Oct to Dec)."]
}
}
}
The full parameter list (assets, debts, per-category expenses, growth and inflation rates, currency, and the retirement timeline) lives in the OpenAPI spec: firenum.com/openapi.yaml.
Agent-to-agent API
The same capability is exposed as an A2A skill over JSON-RPC 2.0, so an agent can get the planner's answer and a plan link without scraping the site. The agent card is published at /.well-known/agent-card.json.
Send the financial data as a DataPart (kind: "data") inside a message/send call. The result is a completed task whose artifact carries the REST response as a DataPart and its gist as text.
Request
POST https://firenum.com/a2a
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"message": {
"parts": [
{ "kind": "data", "data": { "salary": 80000, "expenses": 4000, "retirement": 200000, "birth": 1990, "retire_age": 55 } }
]
}
}
}
The artifact's text
Retiring Jan 2045, at 55: money lasts to age 90; money lasts in 230 of 500 simulations; money lasts in 100 of 100 start years. Full plan: https://firenum.com/fire-planner?salary=80000&expenses=4000&retirement=200000&birth=1990&retire_age=55&source=agent
Send message/send with no DataPart and the agent replies with an input-required status describing the fields it expects. Same parameter names as the REST API. Streaming and push notifications are not supported.
Fair use
No key, no cost, no rate tiers to sign up for. The APIs answer from the data you send and build a planner URL from it. They store none of it. The answer is a projection from those numbers, not financial advice. Two limits keep it free: more than 30 requests in 10 seconds from one IP get HTTP 429 for 10 seconds, and once the day's answers are used up (shared by every caller, reset at 00:00 UTC) a result carries the link without answer. See the terms for the details.