Compound interest and Monte Carlo simulators for investing, retirement and past asset returns.
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.
Runs the same monthly-investing plan through 2 to 4 portfolios (the same simulation as simulate_portfolio) and returns each one's final outcome range, deepest fall, past return and volatility, and url, for questions like 'S&P 500 or all-country stocks?'.
Amount invested at the end of every month.
The portfolios to compare.
Years of investing.
The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own.
Starting sum invested at once.
Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency.
Language of the page the returned url opens; match the user's language.
Last calendar year of a custom span.
First calendar year of a custom span (with history_to); replaces history.
Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
claude mcp add --transport http compoundsim https://compoundsim.app/mcp
Runs the same monthly-investing plan through 2 to 4 portfolios (the same simulation as simulate_portfolio) and returns each one's final outcome range, deepest fall, past return and volatility, and url, for questions like 'S&P 500 or all-country stocks?'.
| Argument | Type | Description |
|---|---|---|
| years | integer | Years of investing. |
| history | string | The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own. |
| initial | number | Starting sum invested at once. |
| monthly* | number | Amount invested at the end of every month. |
| currency | string | Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency. |
| language | string | Language of the page the returned url opens; match the user's language. |
| history_to | integer | Last calendar year of a custom span. |
| portfolios* | array | The portfolios to compare. |
| history_from | integer | First calendar year of a custom span (with history_to); replaces history. |
| inflation_percent | number | Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"portfolios",
"monthly"
],
"properties": {
"years": {
"type": "integer",
"default": 20,
"maximum": 40,
"minimum": 1,
"description": "Years of investing."
},
"history": {
"enum": [
"5",
"10",
"20",
"all"
],
"type": "string",
"default": "all",
"description": "The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own."
},
"initial": {
"type": "number",
"default": 0,
"maximum": 1000000000000,
"minimum": 0,
"description": "Starting sum invested at once."
},
"monthly": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Amount invested at the end of every month."
},
"currency": {
"enum": [
"USD",
"EUR",
"JPY",
"GBP",
"CNY",
"CHF",
"AUD",
"CAD",
"HKD",
"SGD",
"KRW",
"INR",
"TWD",
"BRL",
"THB",
"IDR",
"PHP",
"MYR",
"VND"
],
"type": "string",
"description": "Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency."
},
"language": {
"enum": [
"de",
"en",
"es",
"fr",
"id",
"ja",
"ko",
"pt-BR",
"th",
"vi",
"zh-Hans",
"zh-Hant"
],
"type": "string",
"default": "en",
"description": "Language of the page the returned url opens; match the user's language."
},
"history_to": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "Last calendar year of a custom span."
},
"portfolios": {
"type": "array",
"items": {
"type": "object",
"required": [
"portfolio"
],
"properties": {
"label": {
"type": "string",
"description": "Name to show for this portfolio."
},
"portfolio": {
"anyOf": [
{
"enum": [
"sixtyForty",
"allCountry",
"allWeather"
],
"type": "string"
},
{
"type": "object",
"properties": {
"agg": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"btc": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"eem": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"efa": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"gld": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"shy": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"sox": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"tlt": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"vnq": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"acwi": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"schd": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"sp500": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"ndx100": {
"type": "number",
"maximum": 100,
"minimum": 0
}
},
"additionalProperties": false
}
],
"description": "A preset name or weights in percent by asset (any total; they are scaled to 100). Assets: sp500 = S&P 500, ndx100 = Nasdaq 100, sox = SOX (Semiconductors), schd = US dividend stocks (SCHD), acwi = MSCI ACWI, efa = Developed ex-US stocks, eem = Emerging market stocks, vnq = US REITs, gld = Gold, shy = US 1–3 year Treasuries, agg = US aggregate bonds, tlt = US long-term Treasuries, btc = Bitcoin. Presets: sixtyForty = sp500 60% + agg 40%; allCountry = acwi 100%; allWeather = sp500 30% + tlt 40% + shy 15% + gld 15%."
}
}
},
"maxItems": 4,
"minItems": 2,
"description": "The portfolios to compare."
},
"history_from": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "First calendar year of a custom span (with history_to); replaces history."
},
"inflation_percent": {
"type": "number",
"maximum": 20,
"minimum": 0,
"description": "Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal."
}
}
}Annualised past returns of the assets compoundsim simulates, over the last 5, 10 or 20 years, all the data, or a calendar span: total return with dividends reinvested, price return, the dividends' share, volatility, and the return after US inflation (in USD) or the exchange rate's share of the return (in another currency).
| Argument | Type | Description |
|---|---|---|
| assets | array | Assets to include; all of them when omitted. |
| period | string | The span measured: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own. |
| currency | string | Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency. |
| language | string | Language of the page the returned url opens; match the user's language. |
| period_to | integer | Last calendar year of a custom span. |
| period_from | integer | First calendar year of a custom span (with period_to); replaces period. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"assets": {
"type": "array",
"items": {
"enum": [
"sp500",
"ndx100",
"sox",
"schd",
"acwi",
"efa",
"eem",
"vnq",
"gld",
"shy",
"agg",
"tlt",
"btc"
],
"type": "string"
},
"minItems": 1,
"description": "Assets to include; all of them when omitted."
},
"period": {
"enum": [
"5",
"10",
"20",
"all"
],
"type": "string",
"default": "10",
"description": "The span measured: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own."
},
"currency": {
"enum": [
"USD",
"EUR",
"JPY",
"GBP",
"CNY",
"CHF",
"AUD",
"CAD",
"HKD",
"SGD",
"KRW",
"INR",
"TWD",
"BRL",
"THB",
"IDR",
"PHP",
"MYR",
"VND"
],
"type": "string",
"description": "Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency."
},
"language": {
"enum": [
"de",
"en",
"es",
"fr",
"id",
"ja",
"ko",
"pt-BR",
"th",
"vi",
"zh-Hans",
"zh-Hant"
],
"type": "string",
"default": "en",
"description": "Language of the page the returned url opens; match the user's language."
},
"period_to": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "Last calendar year of a custom span."
},
"period_from": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "First calendar year of a custom span (with period_to); replaces period."
}
}
}Deterministic compound growth of monthly contributions (plus an optional starting sum) at a fixed annual return. Returns contributions, gains and total by year, and a compoundsim.app url. Use simulate_portfolio for the range of outcomes of real assets.
| Argument | Type | Description |
|---|---|---|
| years | integer | Years of investing. |
| initial | number | Starting sum invested at once. |
| monthly* | number | Amount invested at the end of every month. |
| currency | string | Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency. |
| language | string | Language of the page the returned url opens; match the user's language. |
| annual_return_pct | number | Annual return, compounded monthly. |
| inflation_percent | number | Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal. |
Monte Carlo simulation of investing monthly (plus an optional starting sum) in one asset or a mix rebalanced monthly. Returns the range of outcomes by year (10th to 90th percentile), the deepest fall along the way, the mix's own past return and volatility, and a compoundsim.app url that shows the same scenario.
| Argument | Type | Description |
|---|---|---|
| years | integer | Years of investing. |
| history | string | The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own. |
| initial | number | Starting sum invested at once. |
| monthly* | number | Amount invested at the end of every month. |
| currency | string | Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency. |
| language | string | Language of the page the returned url opens; match the user's language. |
| portfolio* | any | A preset name or weights in percent by asset (any total; they are scaled to 100). Assets: sp500 = S&P 500, ndx100 = Nasdaq 100, sox = SOX (Semiconductors), schd = US dividend stocks (SCHD), acwi = MSCI ACWI, efa = Developed ex-US stocks, eem = Emerging market stocks, vnq = US REITs, gld = Gold, shy = US 1–3 year Treasuries, agg = US aggregate bonds, tlt = US long-term Treasuries, btc = Bitcoin. Presets: sixtyForty = sp500 60% + agg 40%; allCountry = acwi 100%; allWeather = sp500 30% + tlt 40% + shy 15% + gld 15%. |
Monte Carlo simulation of withdrawing a yearly percentage of a starting balance, raised with inflation every month, from a portfolio (the 4% rule and its variants). Returns the share of paths that still had money at the end, when the others ran out, the remaining balance range in today's money, the success rate at withdrawal rates from 2% to 8%, and a compoundsim.app url.
| Argument | Type | Description |
|---|---|---|
| years | integer | Years the money has to last. |
| balance* | number | Starting balance. |
| history | string | The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own. |
| currency | string | Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency. |
| language | string | Language of the page the returned url opens; match the user's language. |
| portfolio* | any | A preset name or weights in percent by asset (any total; they are scaled to 100). Assets: sp500 = S&P 500, ndx100 = Nasdaq 100, sox = SOX (Semiconductors), schd = US dividend stocks (SCHD), acwi = MSCI ACWI, efa = Developed ex-US stocks, eem = Emerging market stocks, vnq = US REITs, gld = Gold, shy = US 1–3 year Treasuries, agg = US aggregate bonds, tlt = US long-term Treasuries, btc = Bitcoin. Presets: sixtyForty = sp500 60% + agg 40%; allCountry = acwi 100%; allWeather = sp500 30% + tlt 40% + shy 15% + gld 15%. |
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 1, 2026.
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"monthly"
],
"properties": {
"years": {
"type": "integer",
"default": 20,
"maximum": 60,
"minimum": 1,
"description": "Years of investing."
},
"initial": {
"type": "number",
"default": 0,
"maximum": 1000000000000,
"minimum": 0,
"description": "Starting sum invested at once."
},
"monthly": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Amount invested at the end of every month."
},
"currency": {
"enum": [
"USD",
"EUR",
"JPY",
"GBP",
"CNY",
"CHF",
"AUD",
"CAD",
"HKD",
"SGD",
"KRW",
"INR",
"TWD",
"BRL",
"THB",
"IDR",
"PHP",
"MYR",
"VND"
],
"type": "string",
"description": "Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency."
},
"language": {
"enum": [
"de",
"en",
"es",
"fr",
"id",
"ja",
"ko",
"pt-BR",
"th",
"vi",
"zh-Hans",
"zh-Hant"
],
"type": "string",
"default": "en",
"description": "Language of the page the returned url opens; match the user's language."
},
"annual_return_pct": {
"type": "number",
"default": 5,
"maximum": 50,
"minimum": 0,
"description": "Annual return, compounded monthly."
},
"inflation_percent": {
"type": "number",
"maximum": 20,
"minimum": 0,
"description": "Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal."
}
}
}| history_to | integer | Last calendar year of a custom span. |
| history_from | integer | First calendar year of a custom span (with history_to); replaces history. |
| inflation_percent | number | Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"portfolio",
"monthly"
],
"properties": {
"years": {
"type": "integer",
"default": 20,
"maximum": 60,
"minimum": 1,
"description": "Years of investing."
},
"history": {
"enum": [
"5",
"10",
"20",
"all"
],
"type": "string",
"default": "all",
"description": "The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own."
},
"initial": {
"type": "number",
"default": 0,
"maximum": 1000000000000,
"minimum": 0,
"description": "Starting sum invested at once."
},
"monthly": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Amount invested at the end of every month."
},
"currency": {
"enum": [
"USD",
"EUR",
"JPY",
"GBP",
"CNY",
"CHF",
"AUD",
"CAD",
"HKD",
"SGD",
"KRW",
"INR",
"TWD",
"BRL",
"THB",
"IDR",
"PHP",
"MYR",
"VND"
],
"type": "string",
"description": "Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency."
},
"language": {
"enum": [
"de",
"en",
"es",
"fr",
"id",
"ja",
"ko",
"pt-BR",
"th",
"vi",
"zh-Hans",
"zh-Hant"
],
"type": "string",
"default": "en",
"description": "Language of the page the returned url opens; match the user's language."
},
"portfolio": {
"anyOf": [
{
"enum": [
"sixtyForty",
"allCountry",
"allWeather"
],
"type": "string"
},
{
"type": "object",
"properties": {
"agg": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"btc": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"eem": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"efa": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"gld": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"shy": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"sox": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"tlt": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"vnq": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"acwi": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"schd": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"sp500": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"ndx100": {
"type": "number",
"maximum": 100,
"minimum": 0
}
},
"additionalProperties": false
}
],
"description": "A preset name or weights in percent by asset (any total; they are scaled to 100). Assets: sp500 = S&P 500, ndx100 = Nasdaq 100, sox = SOX (Semiconductors), schd = US dividend stocks (SCHD), acwi = MSCI ACWI, efa = Developed ex-US stocks, eem = Emerging market stocks, vnq = US REITs, gld = Gold, shy = US 1–3 year Treasuries, agg = US aggregate bonds, tlt = US long-term Treasuries, btc = Bitcoin. Presets: sixtyForty = sp500 60% + agg 40%; allCountry = acwi 100%; allWeather = sp500 30% + tlt 40% + shy 15% + gld 15%."
},
"history_to": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "Last calendar year of a custom span."
},
"history_from": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "First calendar year of a custom span (with history_to); replaces history."
},
"inflation_percent": {
"type": "number",
"maximum": 20,
"minimum": 0,
"description": "Annual inflation. When given, every amount out is in today's money at this rate; omitted, amounts are nominal."
}
}
}| history_to | integer | Last calendar year of a custom span. |
| history_from | integer | First calendar year of a custom span (with history_to); replaces history. |
| inflation_percent | number | Annual inflation the withdrawals rise with; balances are in today's money. |
| withdrawal_rate_pct | number | First year's withdrawal as a percentage of the starting balance. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"portfolio",
"balance"
],
"properties": {
"years": {
"type": "integer",
"default": 30,
"maximum": 60,
"minimum": 1,
"description": "Years the money has to last."
},
"balance": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "Starting balance."
},
"history": {
"enum": [
"5",
"10",
"20",
"all"
],
"type": "string",
"default": "all",
"description": "The span of past monthly returns the model is fitted to: the last 5, 10 or 20 years, or all the data. An asset with less data than the span asked for uses all of its own."
},
"currency": {
"enum": [
"USD",
"EUR",
"JPY",
"GBP",
"CNY",
"CHF",
"AUD",
"CAD",
"HKD",
"SGD",
"KRW",
"INR",
"TWD",
"BRL",
"THB",
"IDR",
"PHP",
"MYR",
"VND"
],
"type": "string",
"description": "Currency of every amount, in and out. In a currency other than USD the paths carry its exchange-rate swings against the dollar (trend removed). Defaults to the language's currency."
},
"language": {
"enum": [
"de",
"en",
"es",
"fr",
"id",
"ja",
"ko",
"pt-BR",
"th",
"vi",
"zh-Hans",
"zh-Hant"
],
"type": "string",
"default": "en",
"description": "Language of the page the returned url opens; match the user's language."
},
"portfolio": {
"anyOf": [
{
"enum": [
"sixtyForty",
"allCountry",
"allWeather"
],
"type": "string"
},
{
"type": "object",
"properties": {
"agg": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"btc": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"eem": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"efa": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"gld": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"shy": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"sox": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"tlt": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"vnq": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"acwi": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"schd": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"sp500": {
"type": "number",
"maximum": 100,
"minimum": 0
},
"ndx100": {
"type": "number",
"maximum": 100,
"minimum": 0
}
},
"additionalProperties": false
}
],
"description": "A preset name or weights in percent by asset (any total; they are scaled to 100). Assets: sp500 = S&P 500, ndx100 = Nasdaq 100, sox = SOX (Semiconductors), schd = US dividend stocks (SCHD), acwi = MSCI ACWI, efa = Developed ex-US stocks, eem = Emerging market stocks, vnq = US REITs, gld = Gold, shy = US 1–3 year Treasuries, agg = US aggregate bonds, tlt = US long-term Treasuries, btc = Bitcoin. Presets: sixtyForty = sp500 60% + agg 40%; allCountry = acwi 100%; allWeather = sp500 30% + tlt 40% + shy 15% + gld 15%."
},
"history_to": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "Last calendar year of a custom span."
},
"history_from": {
"type": "integer",
"maximum": 2026,
"minimum": 1994,
"description": "First calendar year of a custom span (with history_to); replaces history."
},
"inflation_percent": {
"type": "number",
"default": 2,
"maximum": 20,
"minimum": 0,
"description": "Annual inflation the withdrawals rise with; balances are in today's money."
},
"withdrawal_rate_pct": {
"type": "number",
"default": 4,
"maximum": 20,
"minimum": 0,
"description": "First year's withdrawal as a percentage of the starting balance."
}
}
}