Planning calculators and market data for financial advisors: Roth, RMD, Social Security, 13F.
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.
Screen draft client communications (emails, letters, social posts, meeting notes) for common FINRA/SEC communication-rule problems, including guarantees, misleading projections, pressure tactics, testimonials, specific recommendations, tax claims, missing performance disclosures, and Social Security or account numbers. Returns a status (clear, review or revise), findings with suggested revisions, and disclosure language for the firm’s compliance review.
The text to screen, up to 60,000 characters.
True when the client has a documented risk profile on file; lowers the severity of specific recommendations.
True (default) when the text goes to a client or the public; checks for a general risk disclosure.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http lunaterminal https://lunaterminal.com/mcp
Screen draft client communications (emails, letters, social posts, meeting notes) for common FINRA/SEC communication-rule problems, including guarantees, misleading projections, pressure tactics, testimonials, specific recommendations, tax claims, missing performance disclosures, and Social Security or account numbers. Returns a status (clear, review or revise), findings with suggested revisions, and disclosure language for the firm’s compliance review.
| Argument | Type | Description |
|---|---|---|
| text* | string | The text to screen, up to 60,000 characters. |
| hasProfile | boolean | True when the client has a documented risk profile on file; lowers the severity of specific recommendations. |
| clientFacing | boolean | True (default) when the text goes to a client or the public; checks for a general risk disclosure. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 60000,
"description": "The text to screen, up to 60,000 characters."
},
"hasProfile": {
"type": "boolean",
"description": "True when the client has a documented risk profile on file; lowers the severity of specific recommendations."
},
"clientFacing": {
"type": "boolean",
"description": "True (default) when the text goes to a client or the public; checks for a general risk disclosure."
}
},
"additionalProperties": false
}Which tracked institutional managers held a stock in their latest quarterly SEC 13F filings: value, shares, portfolio weight and whether they bought, added or reduced, plus managers that sold out.
| Argument | Type | Description |
|---|---|---|
| symbol* | string | Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC. |
{
"type": "object",
"required": [
"symbol"
],
"properties": {
"symbol": {
"type": "string",
"maxLength": 16,
"description": "Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC."
}
},
"additionalProperties": false
}What tracked hedge funds did in their latest 13F filings. view: consensus (most bought and sold, new and closed positions), crowding (stocks in the most managers' top tens), mostHeld, rotation (money moving between sectors), funds (the tracked managers).
| Argument | Type | Description |
|---|---|---|
| view* | string | Which view to return. |
{
"type": "object",
"required": [
"view"
],
"properties": {
"view": {
"enum": [
"consensus",
"crowding",
"mostHeld",
"rotation",
"funds"
],
"type": "string",
"description": "Which view to return."
}
},
"additionalProperties": false
}A U.S. economic series from FRED: fedfunds (effective fed funds rate), treasury10y, inflation, unemployment, cpi or gdp. Returns the latest value, its date and recent history.
| Argument | Type | Description |
|---|---|---|
| series* | string | One of fedfunds, treasury10y, inflation, unemployment, cpi, gdp. |
{
"type": "object",
"required": [
"series"
],
"properties": {
"series": {
"enum": [
"fedfunds",
"treasury10y",
"inflation",
"unemployment",
"cpi",
"gdp"
],
"type": "string",
"description": "One of fedfunds, treasury10y, inflation, unemployment, cpi, gdp."
}
},
"additionalProperties": false
}Recent headlines for one symbol, or the day's market headlines when no symbol is given, with publisher, time and link.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Headlines to return, default 8. |
| symbol | string | Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Headlines to return, default 8."
},
"symbol": {
"type": "string",
"maxLength": 16,
"description": "Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC."
}
},
"additionalProperties": false
}The Fear & Greed market sentiment index (0 = extreme fear, 100 = extreme greed) with its previous close, one week, one month and one year ago.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Daily (or intraday for 1D and 5D) price history for one symbol over a range, with the period return, high and low. Returns up to 400 points.
| Argument | Type | Description |
|---|---|---|
| range | string | One of 1D, 5D, 1M, 3M, 6M, YTD, 1Y, 2Y, 5Y, 10Y, MAX. Default 6M. |
| symbol* | string | Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC. |
{
"type": "object",
"required": [
"symbol"
],
"properties": {
"range": {
"enum": [
"1D",
"5D",
"1M",
"3M",
"6M",
"YTD",
"1Y",
"2Y",
"5Y",
"10Y",
"MAX"
],
"type": "string",
"description": "One of 1D, 5D, 1M, 3M, 6M, YTD, 1Y, 2Y, 5Y, 10Y, MAX. Default 6M."
},
"symbol": {
"type": "string",
"maxLength": 16,
"description": "Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC."
}
},
"additionalProperties": false
}Latest quotes for up to 25 stocks, ETFs, indices or currency pairs (e.g. EUR/USD): last price, change, day range, previous close, volume and 52-week range, each with its observation time and provider.
| Argument | Type | Description |
|---|---|---|
| symbols* | array | 1 to 25 symbols. |
{
"type": "object",
"required": [
"symbols"
],
"properties": {
"symbols": {
"type": "array",
"items": {
"type": "string",
"maxLength": 16,
"description": "Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC."
},
"maxItems": 25,
"description": "1 to 25 symbols."
}
},
"additionalProperties": false
}Price, daily change, day and 52-week range, market cap, valuation (P/E, forward P/E, EPS, dividend yield), company profile (sector, industry, CEO, employees, description), revenue and margins, the next earnings date and the ETFs that hold it, for one stock or ETF. Includes the as-of time and source.
| Argument | Type | Description |
|---|---|---|
| symbol* | string | Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC. |
{
"type": "object",
"required": [
"symbol"
],
"properties": {
"symbol": {
"type": "string",
"maxLength": 16,
"description": "Ticker symbol, e.g. NVDA, SPY or BRK.B. Index symbols use ^, e.g. ^GSPC."
}
},
"additionalProperties": false
}The latest U.S. Treasury daily par yield curve, from 1 month to 30 years.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Work out the distribution rules for an inherited IRA under the SECURE Act final regulations (T.D. 10001) and IRS Pub. 590-B: the beneficiary class (eligible designated, designated or non-designated), whether the owner died before or after the required beginning date, the rule that applies (life expectancy, 10-year with or without annual RMDs, 5-year), the deadline to empty the account, this year's required minimum from the Single Life Expectancy Table, and four ways to drain it (back-loaded, even, front-loaded, fill a bracket) compared on federal tax in 2026 dollars and after-tax value. No names or account numbers are needed.
| Argument | Type | Description |
|---|---|---|
| roth | boolean | True for an inherited Roth IRA. |
| year | integer | Plan year (default 2026). |
| balance* | number | Account balance on December 31 of the prior year. |
| fillRate | integer | Bracket to fill each year in the fill strategy (default 24). |
| realReturn | number | Annual return after inflation in percent (default 0). |
| otherIncome | number | Beneficiary's other ordinary income per year (default 0). |
| electTenYear | boolean |
Review a household's holdings against a target model or custom allocation. Returns value by asset class and account, allocation drift, single-stock concentration, tax-loss harvesting candidates, unrealized gains, stress tests, and an asset-location score with suggestions. Missing prices are fetched from live quotes.
| Argument | Type | Description |
|---|---|---|
| band | number | Rebalancing band in percentage points (default 5): an asset class further than this from target is out of band. |
| model | string | Target model portfolio: conservative (20% stocks), moderately_conservative (40% stocks), moderate (60% stocks), growth (75% stocks), aggressive (90% stocks). Default moderate. risk_profile_score maps a client to one. |
| prices | object | Latest price per share by symbol, e.g. {"VTI": 301.25}. CASH and money-market funds are priced at $1. Symbols without a price here are fetched from live quotes. |
| target | object | Custom target allocation in percent, totalling 100. Use instead of model. |
| holdings | array | Holdings as objects, instead of holdingsCsv. Up to 300 rows; one row per lot gives the best tax estimates. |
| holdingsCsv | string | Holdings as CSV text in the afa import format: a header row with at least symbol and shares; the full header is account,account_type,symbol,shares,cost_basis,asset_class,acquired. cost_basis is the row's total dollars, acquired is YYYY-MM-DD. Example: account,account_type,symbol,shares,cost_basis,asset_class,acquired Joint brokerage,taxable,VTI,120,24000,,2021-03-15 Joint brokerage,taxable,AAPL,150,18000,,2019-06-01 Joint brokerage,taxable,CASH,8000,8000,, Up to 300 rows and 128 KB. Send this or holdings, not both. |
Build a tax-aware rebalancing trade list that brings holdings back to the target model or custom allocation, optionally investing new cash. Sells come from tax-advantaged accounts first, then taxable lots with losses, then the smallest gains; proceeds stay in the account that raised them. Returns each trade (account, symbol, dollars, estimated shares, estimated realized gain and tax), totals, the allocation after the trades, wash-sale and concentration warnings, and notes. Takes the same holdings, prices and target inputs as portfolio_review; missing prices are fetched from live quotes. Trades are estimates for advisor review, not orders.
| Argument | Type | Description |
|---|---|---|
| band | number | Rebalancing band in percentage points (default 5): an asset class further than this from target is out of band. |
| force | boolean | Rebalance to target even when every class is within the band (default false). |
| model | string | Target model portfolio: conservative (20% stocks), moderately_conservative (40% stocks), moderate (60% stocks), growth (75% stocks), aggressive (90% stocks). Default moderate. risk_profile_score maps a client to one. |
| prices | object | Latest price per share by symbol, e.g. {"VTI": 301.25}. CASH and money-market funds are priced at $1. Symbols without a price here are fetched from live quotes. |
| target | object | Custom target allocation in percent, totalling 100. Use instead of model. |
Run a retirement Monte Carlo simulation in today's dollars: probability that savings last through the planning age, the range of portfolio values at retirement and at the end, median depletion age when paths fail, the initial withdrawal rate, the effect of three levers (save more, retire two years later, spend 10% less) and the highest spending that keeps the target success rate. Required: currentAge, retirementAge, planToAge, savings and spending. Return and volatility default to afa's capital market assumptions for the chosen model (a step more conservative in retirement); other optional inputs default to 0, and inflation to 2.5%. Results are hypothetical.
| Argument | Type | Description |
|---|---|---|
| seed | integer | Random seed; the same inputs and seed give the same result (default 1). |
| model | string | Model portfolio used for omitted return and volatility inputs: conservative (20% stocks), moderately_conservative (40% stocks), moderate (60% stocks), growth (75% stocks), aggressive (90% stocks). Default moderate. |
| trials | integer | Number of simulated market paths (default 2000). |
| savings* | number | Current investable savings. |
| spending* | number | Annual retirement spending from the portfolio and other income, in today’s dollars. |
| inflation |
Score the eight-question risk questionnaire and map the client to a model portfolio. Four questions measure capacity to absorb losses and four measure willingness to take risk. The profile uses the lower of the two. With no answers, the result contains the questions and choices. With eight answers scored from 1 to 5, it returns the profile, score, rationale, model allocation, and illustrative return and volatility.
| Argument | Type | Description |
|---|---|---|
| answers | object | All eight answers, each 1-5 (1 = first option). Omit to get the questionnaire. |
{
"type": "object",
"properties": {
"answers": {
"type": "object",
"properties": {
"range": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Which one-year range of outcomes would the client accept? (illustrative) 1 = −2% to +6%; 2 = −6% to +12%; 3 = −12% to +20%; 4 = −20% to +30%; 5 = −30% to +45%."
},
"income": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "How stable is the client’s income, excluding this portfolio? 1 = No other income; relies on this portfolio; 2 = Unstable; 3 = Somewhat stable; 4 = Stable; 5 = Very stable with a surplus."
},
"horizon": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "When will the client need to start withdrawing a significant part of this money? 1 = Within 3 years; 2 = 3 to 5 years; 3 = 6 to 10 years; 4 = 11 to 15 years; 5 = More than 15 years."
},
"drawdown": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "If the portfolio fell 20% over a few months, the client would most likely… 1 = Sell everything; 2 = Sell some; 3 = Wait it out; 4 = Rebalance into stocks; 5 = Add significant new money."
},
"reserves": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "How much emergency savings does the client hold outside this portfolio? 1 = None; 2 = Less than 3 months of expenses; 3 = 3 to 6 months; 4 = 6 to 12 months; 5 = More than 12 months."
},
"objective": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "What is the client’s primary objective for this money? 1 = Preserve capital; 2 = Generate income; 3 = Balance growth and income; 4 = Growth; 5 = Aggressive growth."
},
"experience": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "How would you describe the client’s investing experience? 1 = None; 2 = Limited; 3 = Moderate; 4 = Experienced; 5 = Extensive, including market downturns."
},
"withdrawals": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "How much of the portfolio will the client withdraw each year over the next five years? 1 = More than 10%; 2 = 6% to 10%; 3 = 3% to 5%; 4 = Less than 3%; 5 = None."
}
},
"description": "All eight answers, each 1-5 (1 = first option). Omit to get the questionnaire.",
"additionalProperties": false
}
},
"additionalProperties": false
}Compare Roth conversion strategies year by year under 2026 federal tax law in today's dollars: no conversions versus filling the 12%, 22%, 24% or 32% bracket each year until RMDs start (or stopAge). Models RMDs, Social Security taxation, the senior deduction, a flat state tax and heirs' tax on the remaining traditional balance, and flags IRMAA years. Returns each strategy's lifetime tax, after-tax wealth and amount converted, the best strategy by after-tax wealth, its year-by-year schedule, and the assumptions. Required: filingStatus, birthYear and traditional balance.
| Argument | Type | Description |
|---|---|---|
| roth | number | Roth balance (default 0). |
| endAge | integer | Last plan year age (default 95). |
| stopAge | integer | Last conversion age (default the year before RMDs start). |
| taxable | number | Taxable account balance that pays conversion tax (default 0). |
| startAge | integer | First plan year age (default the client's age in 2026). |
| birthYear* | integer | Client birth year. |
| realReturn | number | Annual return after inflation in percent (default 0). |
Screen stocks on up to 20 fundamentals, each with an optional minimum and maximum (market cap in billions; growth, yield, margins and returns in percent). Returns matching stocks with price, change, market cap, P/E, forward P/E and EPS.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Rows to return, default 25. |
| pbMax | number | Maximum price to book. |
| pbMin | number | Minimum price to book. |
| peMax | number | Maximum trailing P/E. |
| peMin | number | Minimum trailing P/E. |
| psMax | number | Maximum price to sales. |
| psMin | number | Minimum price to sales. |
| capMax | number | Maximum market cap in billions of dollars. |
| capMin | number | Minimum market cap in billions of dollars. |
| pegMax | number |
Find ticker symbols by company or fund name, e.g. "nvidia" or "vanguard total".
| Argument | Type | Description |
|---|---|---|
| query* | string | Company, fund or ticker to look up. |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"maxLength": 40,
"description": "Company, fund or ticker to look up."
}
},
"additionalProperties": false
}Compare Social Security claiming ages 62-70 for a single client or a couple (all 81 combinations), including spousal top-ups, survivor benefits and delayed credits, ranked by present value in today's dollars. Returns the best available strategy, the top ten, claiming at 62, 67 and 70 for comparison, breakeven ages for the primary and the assumptions. PIA is the monthly benefit at full retirement age from the client's SSA statement.
| Argument | Type | Description |
|---|---|---|
| spouse | object | The spouse, for a married couple. |
| primary* | object | The client. |
| discountRate | number | Real discount rate in percent for present values (default 2). |
{
"type": "object",
"required": [
"primary"
],
"properties": {
"spouse": {
"type": "object",
"required": [
"birthYear",
"pia"
],
"properties": {
"pia": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Primary insurance amount: monthly benefit at full retirement age, in dollars."
},
"birthYear": {
"type": "integer",
"maximum": 2026,
"minimum": 1943,
"description": "Birth year."
},
"lifeExpectancy": {
"type": "integer",
"maximum": 120,
"minimum": 62,
"description": "Age at death assumed for the analysis (default 92)."
}
},
"description": "The spouse, for a married couple.",
"additionalProperties": false
},
"primary": {
"type": "object",
"required": [
"birthYear",
"pia"
],
"properties": {
"pia": {
"type": "number",
"maximum": 100000,
"minimum": 0,
"description": "Primary insurance amount: monthly benefit at full retirement age, in dollars."
},
"birthYear": {
"type": "integer",
"maximum": 2026,
"minimum": 1943,
"description": "Birth year."
},
"lifeExpectancy": {
"type": "integer",
"maximum": 120,
"minimum": 62,
"description": "Age at death assumed for the analysis (default 90)."
}
},
"description": "The client.",
"additionalProperties": false
},
"discountRate": {
"type": "number",
"maximum": 15,
"minimum": -5,
"description": "Real discount rate in percent for present values (default 2)."
}
},
"additionalProperties": false
}Estimate a household's 2026 federal income tax, net investment income tax (3.8%), alternative minimum tax and resident state income tax in one pass. States: CA, NY, PA, IL, OH, GA, NC, MI, TX, FL, NV, SD, WY, AK, TN, NH, WA (the ten most populous plus states without a wage income tax; Washington's capital gains tax included). Each state's figures carry the year they come from; every result says which rules were applied. Standard deductions only; local income taxes and most credits are not modeled.
| Argument | Type | Description |
|---|---|---|
| ages | array | Ages of the filers at year-end (for senior deductions and state retirement exclusions). |
| state | string | Two-letter state of residence (omit for federal only). |
| wages | number | Wages, including RSU vests and NSO exercises. |
| isoSpread | number | Bargain element of ISOs exercised and held at year-end (AMT preference). |
| otherIncome | number | Interest, Roth conversions and other ordinary income. |
| filingStatus* | string | single or mfj (married filing jointly). |
| qualifiedIncome | number | Qualified dividends plus net long-term capital gains. |
Classify the text of an incoming client email and detect fraud red flags such as new banking details or requests to avoid a phone call. Returns the risk level, urgency, complaint logging flag, and suggested steps for the advisor, including verification by phone when fraud or account takeover is suspected.
| Argument | Type | Description |
|---|---|---|
| text* | string | The email text (subject and body), up to 20,000 characters. |
{
"type": "object",
"required": [
"text"
],
"properties": {
"text": {
"type": "string",
"maxLength": 20000,
"description": "The email text (subject and body), up to 20,000 characters."
}
},
"additionalProperties": false
}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 9, 2026.
| Eligible beneficiary elected the 10-year rule (owner died before the required beginning date). |
| filingStatus | string | Beneficiary's filing status (default single). |
| stateTaxRate | number | Flat state tax rate in percent (default 0). |
| takenThisYear | number | Distributions already taken this year (default 0). |
| ownerBirthYear* | integer | Original owner's birth year. |
| ownerDeathDate* | string | Owner's date of death, YYYY-MM-DD (or a year). |
| beneficiaryClass* | string | spouse = Surviving spouse; minor_child = Owner’s child under 21; disabled = Disabled; chronically_ill = Chronically ill; close_in_age = Not more than 10 years younger than the owner; designated = Other person (designated beneficiary); non_designated = Estate, charity or non-qualifying trust. |
| beneficiaryBirthYear | integer | Beneficiary's birth year (not needed for non_designated). |
{
"type": "object",
"required": [
"beneficiaryClass",
"ownerBirthYear",
"ownerDeathDate",
"balance"
],
"properties": {
"roth": {
"type": "boolean",
"description": "True for an inherited Roth IRA."
},
"year": {
"type": "integer",
"maximum": 2200,
"minimum": 1990,
"description": "Plan year (default 2026)."
},
"balance": {
"type": "number",
"minimum": 0,
"description": "Account balance on December 31 of the prior year."
},
"fillRate": {
"enum": [
10,
12,
22,
24,
32,
35
],
"type": "integer",
"description": "Bracket to fill each year in the fill strategy (default 24)."
},
"realReturn": {
"type": "number",
"maximum": 15,
"minimum": -10,
"description": "Annual return after inflation in percent (default 0)."
},
"otherIncome": {
"type": "number",
"minimum": 0,
"description": "Beneficiary's other ordinary income per year (default 0)."
},
"electTenYear": {
"type": "boolean",
"description": "Eligible beneficiary elected the 10-year rule (owner died before the required beginning date)."
},
"filingStatus": {
"enum": [
"single",
"mfj"
],
"type": "string",
"description": "Beneficiary's filing status (default single)."
},
"stateTaxRate": {
"type": "number",
"maximum": 15,
"minimum": 0,
"description": "Flat state tax rate in percent (default 0)."
},
"takenThisYear": {
"type": "number",
"minimum": 0,
"description": "Distributions already taken this year (default 0)."
},
"ownerBirthYear": {
"type": "integer",
"maximum": 2026,
"minimum": 1900,
"description": "Original owner's birth year."
},
"ownerDeathDate": {
"type": "string",
"maxLength": 10,
"description": "Owner's date of death, YYYY-MM-DD (or a year)."
},
"beneficiaryClass": {
"enum": [
"spouse",
"minor_child",
"disabled",
"chronically_ill",
"close_in_age",
"designated",
"non_designated"
],
"type": "string",
"description": "spouse = Surviving spouse; minor_child = Owner’s child under 21; disabled = Disabled; chronically_ill = Chronically ill; close_in_age = Not more than 10 years younger than the owner; designated = Other person (designated beneficiary); non_designated = Estate, charity or non-qualifying trust."
},
"beneficiaryBirthYear": {
"type": "integer",
"maximum": 2026,
"minimum": 1900,
"description": "Beneficiary's birth year (not needed for non_designated)."
}
},
"additionalProperties": false
}| harvestMinimum | number | Smallest unrealized loss in dollars worth listing as a tax-loss candidate (default 1000). |
| concentrationLimit | number | Flag a single non-diversified holding above this % of the household (default 10). |
{
"type": "object",
"properties": {
"band": {
"type": "number",
"maximum": 25,
"minimum": 1,
"description": "Rebalancing band in percentage points (default 5): an asset class further than this from target is out of band."
},
"model": {
"enum": [
"conservative",
"moderately_conservative",
"moderate",
"growth",
"aggressive"
],
"type": "string",
"description": "Target model portfolio: conservative (20% stocks), moderately_conservative (40% stocks), moderate (60% stocks), growth (75% stocks), aggressive (90% stocks). Default moderate. risk_profile_score maps a client to one."
},
"prices": {
"type": "object",
"description": "Latest price per share by symbol, e.g. {\"VTI\": 301.25}. CASH and money-market funds are priced at $1. Symbols without a price here are fetched from live quotes.",
"maxProperties": 1000,
"additionalProperties": {
"type": "number",
"exclusiveMinimum": 0
}
},
"target": {
"type": "object",
"properties": {
"cash": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Cash & equivalents target %"
},
"bonds": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Bonds target %"
},
"us_equity": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "US stocks target %"
},
"intl_equity": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "International stocks target %"
},
"alternatives": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Real estate & alternatives target %"
}
},
"description": "Custom target allocation in percent, totalling 100. Use instead of model.",
"additionalProperties": false
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"required": [
"symbol",
"shares"
],
"properties": {
"shares": {
"type": "number",
"description": "Number of shares; for CASH, the dollar amount.",
"exclusiveMinimum": 0
},
"symbol": {
"type": "string",
"maxLength": 18,
"description": "Ticker, e.g. VTI. Use CASH for cash balances."
},
"account": {
"type": "string",
"maxLength": 60,
"description": "Account name, e.g. \"Joint brokerage\". Default \"Brokerage\"."
},
"acquired": {
"type": "string",
"maxLength": 10,
"description": "Date acquired, YYYY-MM-DD; decides short- or long-term gains."
},
"costBasis": {
"type": "number",
"minimum": 0,
"description": "Total cost basis of this row in dollars (not per share). Omit when unknown."
},
"assetClass": {
"type": "string",
"maxLength": 120,
"description": "Optional override: us_equity, intl_equity, bonds, cash or alternatives, or a split such as \"us_equity:60;bonds:40\". Common ETFs and index funds are classified automatically; unknown tickers count as US stocks."
},
"accountType": {
"type": "string",
"maxLength": 30,
"description": "taxable, brokerage, individual, joint, trust, ira, traditional ira, rollover ira, sep ira, 401k, 403b, 457, roth, roth ira, roth 401k, hsa or other. Default taxable."
}
},
"additionalProperties": false
},
"maxItems": 300,
"description": "Holdings as objects, instead of holdingsCsv. Up to 300 rows; one row per lot gives the best tax estimates."
},
"holdingsCsv": {
"type": "string",
"maxLength": 131072,
"description": "Holdings as CSV text in the afa import format: a header row with at least symbol and shares; the full header is account,account_type,symbol,shares,cost_basis,asset_class,acquired. cost_basis is the row's total dollars, acquired is YYYY-MM-DD. Example:\naccount,account_type,symbol,shares,cost_basis,asset_class,acquired\nJoint brokerage,taxable,VTI,120,24000,,2021-03-15\nJoint brokerage,taxable,AAPL,150,18000,,2019-06-01\nJoint brokerage,taxable,CASH,8000,8000,,\nUp to 300 rows and 128 KB. Send this or holdings, not both."
},
"harvestMinimum": {
"type": "number",
"maximum": 10000000,
"minimum": 0,
"description": "Smallest unrealized loss in dollars worth listing as a tax-loss candidate (default 1000)."
},
"concentrationLimit": {
"type": "number",
"maximum": 100,
"minimum": 1,
"description": "Flag a single non-diversified holding above this % of the household (default 10)."
}
},
"additionalProperties": false
}| newCash |
| number |
| New money to invest, in dollars (default 0). |
| holdings | array | Holdings as objects, instead of holdingsCsv. Up to 300 rows; one row per lot gives the best tax estimates. |
| minTrade | number | Smallest trade in dollars (default 100). |
| taxRates | object | Capital-gains rates in percent used to estimate tax (default 24 short-term, 15 long-term). |
| holdingsCsv | string | Holdings as CSV text in the afa import format: a header row with at least symbol and shares; the full header is account,account_type,symbol,shares,cost_basis,asset_class,acquired. cost_basis is the row's total dollars, acquired is YYYY-MM-DD. Example: account,account_type,symbol,shares,cost_basis,asset_class,acquired Joint brokerage,taxable,VTI,120,24000,,2021-03-15 Joint brokerage,taxable,AAPL,150,18000,,2019-06-01 Joint brokerage,taxable,CASH,8000,8000,, Up to 300 rows and 128 KB. Send this or holdings, not both. |
| newCashAccount | string | Account name that receives the new cash (default: the first taxable account). |
{
"type": "object",
"properties": {
"band": {
"type": "number",
"maximum": 25,
"minimum": 1,
"description": "Rebalancing band in percentage points (default 5): an asset class further than this from target is out of band."
},
"force": {
"type": "boolean",
"description": "Rebalance to target even when every class is within the band (default false)."
},
"model": {
"enum": [
"conservative",
"moderately_conservative",
"moderate",
"growth",
"aggressive"
],
"type": "string",
"description": "Target model portfolio: conservative (20% stocks), moderately_conservative (40% stocks), moderate (60% stocks), growth (75% stocks), aggressive (90% stocks). Default moderate. risk_profile_score maps a client to one."
},
"prices": {
"type": "object",
"description": "Latest price per share by symbol, e.g. {\"VTI\": 301.25}. CASH and money-market funds are priced at $1. Symbols without a price here are fetched from live quotes.",
"maxProperties": 1000,
"additionalProperties": {
"type": "number",
"exclusiveMinimum": 0
}
},
"target": {
"type": "object",
"properties": {
"cash": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Cash & equivalents target %"
},
"bonds": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Bonds target %"
},
"us_equity": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "US stocks target %"
},
"intl_equity": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "International stocks target %"
},
"alternatives": {
"type": "number",
"maximum": 100,
"minimum": 0,
"description": "Real estate & alternatives target %"
}
},
"description": "Custom target allocation in percent, totalling 100. Use instead of model.",
"additionalProperties": false
},
"newCash": {
"type": "number",
"maximum": 1000000000000,
"minimum": 0,
"description": "New money to invest, in dollars (default 0)."
},
"holdings": {
"type": "array",
"items": {
"type": "object",
"required": [
"symbol",
"shares"
],
"properties": {
"shares": {
"type": "number",
"description": "Number of shares; for CASH, the dollar amount.",
"exclusiveMinimum": 0
},
"symbol": {
"type": "string",
"maxLength": 18,
"description": "Ticker, e.g. VTI. Use CASH for cash balances."
},
"account": {
"type": "string",
"maxLength": 60,
"description": "Account name, e.g. \"Joint brokerage\". Default \"Brokerage\"."
},
"acquired": {
"type": "string",
"maxLength": 10,
"description": "Date acquired, YYYY-MM-DD; decides short- or long-term gains."
},
"costBasis": {
"type": "number",
"minimum": 0,
"description": "Total cost basis of this row in dollars (not per share). Omit when unknown."
},
"assetClass": {
"type": "string",
"maxLength": 120,
"description": "Optional override: us_equity, intl_equity, bonds, cash or alternatives, or a split such as \"us_equity:60;bonds:40\". Common ETFs and index funds are classified automatically; unknown tickers count as US stocks."
},
"accountType": {
"type": "string",
"maxLength": 30,
"description": "taxable, brokerage, individual, joint, trust, ira, traditional ira, rollover ira, sep ira, 401k, 403b, 457, roth, roth ira, roth 401k, hsa or other. Default taxable."
}
},
"additionalProperties": false
},
"maxItems": 300,
"description": "Holdings as objects, instead of holdingsCsv. Up to 300 rows; one row per lot gives the best tax estimates."
},
"minTrade": {
"type": "number",
"maximum": 1000000,
"minimum": 0,
"description": "Smallest trade in dollars (default 100)."
},
"taxRates": {
"type": "object",
"properties": {
"longTerm": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Long-term gains rate in percent."
},
"shortTerm": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Short-term gains rate in percent."
}
},
"description": "Capital-gains rates in percent used to estimate tax (default 24 short-term, 15 long-term).",
"additionalProperties": false
},
"holdingsCsv": {
"type": "string",
"maxLength": 131072,
"description": "Holdings as CSV text in the afa import format: a header row with at least symbol and shares; the full header is account,account_type,symbol,shares,cost_basis,asset_class,acquired. cost_basis is the row's total dollars, acquired is YYYY-MM-DD. Example:\naccount,account_type,symbol,shares,cost_basis,asset_class,acquired\nJoint brokerage,taxable,VTI,120,24000,,2021-03-15\nJoint brokerage,taxable,AAPL,150,18000,,2019-06-01\nJoint brokerage,taxable,CASH,8000,8000,,\nUp to 300 rows and 128 KB. Send this or holdings, not both."
},
"newCashAccount": {
"type": "string",
"maxLength": 60,
"description": "Account name that receives the new cash (default: the first taxable account)."
}
},
"additionalProperties": false
}| number |
| Inflation (%). |
| planToAge* | integer | Plan through age. |
| currentAge* | integer | Current age. |
| volatility | number | Annual volatility before retirement (%). |
| otherIncome | number | Social Security, pensions and other income per year, in today’s dollars. |
| contribution | number | Annual savings until retirement. |
| distribution | string | normal (default) or fat-tailed returns (Student-t), which make severe years more frequent. |
| retirementAge* | integer | Retirement age. |
| targetSuccess | number | Success rate in percent used for sustainable spending (default 85). |
| expectedReturn | number | Expected annual return before retirement (%). |
| otherIncomeAge | integer | Age other income starts. |
| volatilityRetired | number | Annual volatility in retirement (%). |
| withdrawalTaxRate | number | Average tax rate on withdrawals in percent; withdrawals are grossed up for it (default 0). |
| contributionGrowth | number | Annual savings growth above inflation (%). |
| expectedReturnRetired | number | Expected annual return in retirement (%). |
{
"type": "object",
"required": [
"currentAge",
"retirementAge",
"planToAge",
"savings",
"spending"
],
"properties": {
"seed": {
"type": "integer",
"maximum": 2147483648,
"minimum": 0,
"description": "Random seed; the same inputs and seed give the same result (default 1)."
},
"model": {
"enum": [
"conservative",
"moderately_conservative",
"moderate",
"growth",
"aggressive"
],
"type": "string",
"description": "Model portfolio used for omitted return and volatility inputs: conservative (20% stocks), moderately_conservative (40% stocks), moderate (60% stocks), growth (75% stocks), aggressive (90% stocks). Default moderate."
},
"trials": {
"type": "integer",
"maximum": 10000,
"minimum": 100,
"description": "Number of simulated market paths (default 2000)."
},
"savings": {
"type": "number",
"maximum": 10000000000,
"minimum": 0,
"description": "Current investable savings."
},
"spending": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Annual retirement spending from the portfolio and other income, in today’s dollars."
},
"inflation": {
"type": "number",
"maximum": 15,
"minimum": -2,
"description": "Inflation (%)."
},
"planToAge": {
"type": "integer",
"maximum": 110,
"minimum": 60,
"description": "Plan through age."
},
"currentAge": {
"type": "integer",
"maximum": 100,
"minimum": 18,
"description": "Current age."
},
"volatility": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Annual volatility before retirement (%)."
},
"otherIncome": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Social Security, pensions and other income per year, in today’s dollars."
},
"contribution": {
"type": "number",
"maximum": 100000000,
"minimum": 0,
"description": "Annual savings until retirement."
},
"distribution": {
"enum": [
"normal",
"fat"
],
"type": "string",
"description": "normal (default) or fat-tailed returns (Student-t), which make severe years more frequent."
},
"retirementAge": {
"type": "integer",
"maximum": 100,
"minimum": 30,
"description": "Retirement age."
},
"targetSuccess": {
"type": "number",
"maximum": 99,
"minimum": 50,
"description": "Success rate in percent used for sustainable spending (default 85)."
},
"expectedReturn": {
"type": "number",
"maximum": 20,
"minimum": -5,
"description": "Expected annual return before retirement (%)."
},
"otherIncomeAge": {
"type": "integer",
"maximum": 100,
"minimum": 50,
"description": "Age other income starts."
},
"volatilityRetired": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Annual volatility in retirement (%)."
},
"withdrawalTaxRate": {
"type": "number",
"maximum": 60,
"minimum": 0,
"description": "Average tax rate on withdrawals in percent; withdrawals are grossed up for it (default 0)."
},
"contributionGrowth": {
"type": "number",
"maximum": 10,
"minimum": -10,
"description": "Annual savings growth above inflation (%)."
},
"expectedReturnRetired": {
"type": "number",
"maximum": 20,
"minimum": -5,
"description": "Expected annual return in retirement (%)."
}
},
"additionalProperties": false
}| heirTaxRate | number | Heirs' tax rate on the inherited traditional balance in percent (default 24). |
| otherIncome | number | Wages and pensions per year (default 0). |
| traditional* | number | Traditional IRA/401(k) balance in dollars. |
| filingStatus* | string | single or mfj (married filing jointly). |
| stateTaxRate | number | Flat state income tax rate in percent (default 0). |
| socialSecurity | object | Household Social Security benefits. |
| spouseBirthYear | integer | Spouse birth year (mfj only; default same as client). |
| otherIncomeEndAge | integer | Age when other income stops (default never). |
{
"type": "object",
"required": [
"filingStatus",
"birthYear",
"traditional"
],
"properties": {
"roth": {
"type": "number",
"minimum": 0,
"description": "Roth balance (default 0)."
},
"endAge": {
"type": "integer",
"maximum": 120,
"minimum": 19,
"description": "Last plan year age (default 95)."
},
"stopAge": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Last conversion age (default the year before RMDs start)."
},
"taxable": {
"type": "number",
"minimum": 0,
"description": "Taxable account balance that pays conversion tax (default 0)."
},
"startAge": {
"type": "integer",
"maximum": 110,
"minimum": 18,
"description": "First plan year age (default the client's age in 2026)."
},
"birthYear": {
"type": "integer",
"maximum": 2026,
"minimum": 1900,
"description": "Client birth year."
},
"realReturn": {
"type": "number",
"maximum": 15,
"minimum": -10,
"description": "Annual return after inflation in percent (default 0)."
},
"heirTaxRate": {
"type": "number",
"maximum": 50,
"minimum": 0,
"description": "Heirs' tax rate on the inherited traditional balance in percent (default 24)."
},
"otherIncome": {
"type": "number",
"minimum": 0,
"description": "Wages and pensions per year (default 0)."
},
"traditional": {
"type": "number",
"minimum": 0,
"description": "Traditional IRA/401(k) balance in dollars."
},
"filingStatus": {
"enum": [
"single",
"mfj"
],
"type": "string",
"description": "single or mfj (married filing jointly)."
},
"stateTaxRate": {
"type": "number",
"maximum": 15,
"minimum": 0,
"description": "Flat state income tax rate in percent (default 0)."
},
"socialSecurity": {
"type": "object",
"properties": {
"annual": {
"type": "number",
"minimum": 0,
"description": "Household benefits per year, today's dollars."
},
"startAge": {
"type": "integer",
"maximum": 70,
"minimum": 62,
"description": "Client age when benefits start."
}
},
"description": "Household Social Security benefits.",
"additionalProperties": false
},
"spouseBirthYear": {
"type": "integer",
"maximum": 2026,
"minimum": 1900,
"description": "Spouse birth year (mfj only; default same as client)."
},
"otherIncomeEndAge": {
"type": "integer",
"maximum": 120,
"minimum": 0,
"description": "Age when other income stops (default never)."
}
},
"additionalProperties": false
}| Maximum PEG ratio. |
| pegMin | number | Minimum PEG ratio. |
| roaMax | number | Maximum return on assets, %. |
| roaMin | number | Minimum return on assets, %. |
| roeMax | number | Maximum return on equity, %. |
| roeMin | number | Minimum return on equity, %. |
| betaMax | number | Maximum beta. |
| betaMin | number | Minimum beta. |
| roicMax | number | Maximum return on invested capital, %. |
| roicMin | number | Minimum return on invested capital, %. |
| evSalesMax | number | Maximum EV/sales. |
| evSalesMin | number | Minimum EV/sales. |
| divYieldMax | number | Maximum dividend yield, %. |
| divYieldMin | number | Minimum dividend yield, %. |
| evEbitdaMax | number | Maximum EV/EBITDA. |
| evEbitdaMin | number | Minimum EV/EBITDA. |
| epsGrowthMax | number | Maximum EPS growth, %. |
| epsGrowthMin | number | Minimum EPS growth, %. |
| forwardPeMax | number | Maximum forward P/E. |
| forwardPeMin | number | Minimum forward P/E. |
| netMarginMax | number | Maximum net margin, %. |
| netMarginMin | number | Minimum net margin, %. |
| revGrowthMax | number | Maximum revenue growth, %. |
| revGrowthMin | number | Minimum revenue growth, %. |
| debtEquityMax | number | Maximum debt to equity. |
| debtEquityMin | number | Minimum debt to equity. |
| grossMarginMax | number | Maximum gross margin, %. |
| grossMarginMin | number | Minimum gross margin, %. |
| currentRatioMax | number | Maximum current ratio. |
| currentRatioMin | number | Minimum current ratio. |
| salesGrowthQMax | number | Maximum quarterly sales growth, %. |
| salesGrowthQMin | number | Minimum quarterly sales growth, %. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Rows to return, default 25."
},
"pbMax": {
"type": "number",
"description": "Maximum price to book."
},
"pbMin": {
"type": "number",
"description": "Minimum price to book."
},
"peMax": {
"type": "number",
"description": "Maximum trailing P/E."
},
"peMin": {
"type": "number",
"description": "Minimum trailing P/E."
},
"psMax": {
"type": "number",
"description": "Maximum price to sales."
},
"psMin": {
"type": "number",
"description": "Minimum price to sales."
},
"capMax": {
"type": "number",
"description": "Maximum market cap in billions of dollars."
},
"capMin": {
"type": "number",
"description": "Minimum market cap in billions of dollars."
},
"pegMax": {
"type": "number",
"description": "Maximum PEG ratio."
},
"pegMin": {
"type": "number",
"description": "Minimum PEG ratio."
},
"roaMax": {
"type": "number",
"description": "Maximum return on assets, %."
},
"roaMin": {
"type": "number",
"description": "Minimum return on assets, %."
},
"roeMax": {
"type": "number",
"description": "Maximum return on equity, %."
},
"roeMin": {
"type": "number",
"description": "Minimum return on equity, %."
},
"betaMax": {
"type": "number",
"description": "Maximum beta."
},
"betaMin": {
"type": "number",
"description": "Minimum beta."
},
"roicMax": {
"type": "number",
"description": "Maximum return on invested capital, %."
},
"roicMin": {
"type": "number",
"description": "Minimum return on invested capital, %."
},
"evSalesMax": {
"type": "number",
"description": "Maximum EV/sales."
},
"evSalesMin": {
"type": "number",
"description": "Minimum EV/sales."
},
"divYieldMax": {
"type": "number",
"description": "Maximum dividend yield, %."
},
"divYieldMin": {
"type": "number",
"description": "Minimum dividend yield, %."
},
"evEbitdaMax": {
"type": "number",
"description": "Maximum EV/EBITDA."
},
"evEbitdaMin": {
"type": "number",
"description": "Minimum EV/EBITDA."
},
"epsGrowthMax": {
"type": "number",
"description": "Maximum EPS growth, %."
},
"epsGrowthMin": {
"type": "number",
"description": "Minimum EPS growth, %."
},
"forwardPeMax": {
"type": "number",
"description": "Maximum forward P/E."
},
"forwardPeMin": {
"type": "number",
"description": "Minimum forward P/E."
},
"netMarginMax": {
"type": "number",
"description": "Maximum net margin, %."
},
"netMarginMin": {
"type": "number",
"description": "Minimum net margin, %."
},
"revGrowthMax": {
"type": "number",
"description": "Maximum revenue growth, %."
},
"revGrowthMin": {
"type": "number",
"description": "Minimum revenue growth, %."
},
"debtEquityMax": {
"type": "number",
"description": "Maximum debt to equity."
},
"debtEquityMin": {
"type": "number",
"description": "Minimum debt to equity."
},
"grossMarginMax": {
"type": "number",
"description": "Maximum gross margin, %."
},
"grossMarginMin": {
"type": "number",
"description": "Minimum gross margin, %."
},
"currentRatioMax": {
"type": "number",
"description": "Maximum current ratio."
},
"currentRatioMin": {
"type": "number",
"description": "Minimum current ratio."
},
"salesGrowthQMax": {
"type": "number",
"description": "Maximum quarterly sales growth, %."
},
"salesGrowthQMin": {
"type": "number",
"description": "Minimum quarterly sales growth, %."
}
},
"additionalProperties": false
}| retirementIncome | number | Taxable IRA and pension distributions. |
| netInvestmentIncome | number | Net investment income for NIIT (default qualifiedIncome). |
| taxableSocialSecurity | number | Taxable part of Social Security benefits. |
{
"type": "object",
"required": [
"filingStatus"
],
"properties": {
"ages": {
"type": "array",
"items": {
"type": "number",
"maximum": 120,
"minimum": 0
},
"maxItems": 2,
"description": "Ages of the filers at year-end (for senior deductions and state retirement exclusions)."
},
"state": {
"enum": [
"CA",
"NY",
"PA",
"IL",
"OH",
"GA",
"NC",
"MI",
"TX",
"FL",
"NV",
"SD",
"WY",
"AK",
"TN",
"NH",
"WA"
],
"type": "string",
"description": "Two-letter state of residence (omit for federal only)."
},
"wages": {
"type": "number",
"minimum": 0,
"description": "Wages, including RSU vests and NSO exercises."
},
"isoSpread": {
"type": "number",
"minimum": 0,
"description": "Bargain element of ISOs exercised and held at year-end (AMT preference)."
},
"otherIncome": {
"type": "number",
"minimum": 0,
"description": "Interest, Roth conversions and other ordinary income."
},
"filingStatus": {
"enum": [
"single",
"mfj"
],
"type": "string",
"description": "single or mfj (married filing jointly)."
},
"qualifiedIncome": {
"type": "number",
"minimum": 0,
"description": "Qualified dividends plus net long-term capital gains."
},
"retirementIncome": {
"type": "number",
"minimum": 0,
"description": "Taxable IRA and pension distributions."
},
"netInvestmentIncome": {
"type": "number",
"minimum": 0,
"description": "Net investment income for NIIT (default qualifiedIncome)."
},
"taxableSocialSecurity": {
"type": "number",
"minimum": 0,
"description": "Taxable part of Social Security benefits."
}
},
"additionalProperties": false
}