io.github.AlvisoOculus/optionsahoy-mcp
REMOTE · OPTIONSAHOY.COM
Equity comp tax/trade optimizer: ISO/AMT exercise, NSO, RSU, QSBS, concentration, hedging. 50-state.
Available components
Last scanned (17 hours ago)
Scores higher than 92% of remote servers
Reachable. Last reached 7 Nov 2026.
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security77
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability74
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 13664 tokens (~803/item across 17 items; 8 tools + 9 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (100% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 8 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
- Supports UI / widget rendering.Pass
Checks we ran (14)
- TLS certificate
- Authorization
- HTTPS
- HSTS header
- DNSSEC
- Transport
- Schema quality
- Stability
- Tool coverage
- Injection markers
- Destructive annotations
- Judged manipulation
- MCP protocol
- Capabilities
Does not apply to this hosted endpoint (2)
- Supply Chain SecurityScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
- Provenance & TransparencyScored on package channels only. This is a hosted endpoint, so there is nothing to install or inspect.
The score does not measure everything. What the score does not measure →
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 6 Nov 26 +2
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 1 Nov 26 0
- Server version: 1.11.0 → 1.11.1 functional
- 31 Oct 26 0
- Tool “amt_iso_optimize” rewrote its description, which is the text the model reads security
- Tool “equity_funding_plan” rewrote its description, which is the text the model reads security
- Tool “protective_put_price” rewrote its description, which is the text the model reads security
- Tool “qsbs_check” rewrote its description, which is the text the model reads security
- Tool “rsu_lot_optimize” rewrote its description, which is the text the model reads security
- “qsbs_check” reworded the description of “acquisitionMethod” cosmetic
- “qsbs_check” reworded the description of “activeBusiness” cosmetic
- “qsbs_check” reworded the description of “assetCategory” cosmetic
- “qsbs_check” reworded the description of “industry” cosmetic
- 29 Oct 26 0
- Tool “amt_iso_optimize” rewrote its description, which is the text the model reads security
- Tool “concentration_analyze” rewrote its description, which is the text the model reads security
- Tool “equity_funding_plan” rewrote its description, which is the text the model reads security
- Tool “nso_calculate” rewrote its description, which is the text the model reads security
- Tool “protective_put_price” rewrote its description, which is the text the model reads security
- Tool “qsbs_check” rewrote its description, which is the text the model reads security
- Tool “rsu_lot_optimize” rewrote its description, which is the text the model reads security
- Tool “rsu_sell_vs_hold” rewrote its description, which is the text the model reads security
- “amt_iso_optimize” reworded the description of “expectedGrowth” cosmetic
- “amt_iso_optimize” reworded the description of “ticker” cosmetic
- “concentration_analyze” reworded the description of “expectedPositionReturn” cosmetic
- “concentration_analyze” reworded the description of “sector” cosmetic
- “concentration_analyze” reworded the description of “ticker” cosmetic
- “nso_calculate” reworded the description of “expectedSalePrice” cosmetic
- “nso_calculate” reworded the description of “ticker” cosmetic
- “protective_put_price” reworded the description of “expectedReturn” cosmetic
- “rsu_sell_vs_hold” reworded the description of “expectedSalePrice” cosmetic
- “rsu_sell_vs_hold” reworded the description of “ticker” cosmetic
- 4 Oct 26 84
- Tool “amt_iso_optimize” rewrote its description, which is the text the model reads security
- Tool “concentration_analyze” rewrote its description, which is the text the model reads security
- Tool “equity_funding_plan” rewrote its description, which is the text the model reads security
- Tool “nso_calculate” rewrote its description, which is the text the model reads security
- Tool “rsu_sell_vs_hold” rewrote its description, which is the text the model reads security
- “equity_funding_plan” reworded the description of “expectedAnnualGrowth” cosmetic
- 2 Oct 26 0
- Server version: 1.10.2 → 1.10.3 functional
- 28 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 25 Sept 26 0
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 7 Nov 2026 · Probed https://optionsahoy.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=optionsahoy.com | CN=WE1,O=Google Trust Services,C=US | 19 Oct 2026 | 17 Jan 2027 | ECDSA 256 | ECDSA-SHA256 | 36d466da4e4f81340e1d6ff6cf02b447 |
| SANs: optionsahoy.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of optionsahoy.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | Trust anchor | 20326, 38696 | 8, 8 | Verified |
| com. | DS published | 19718 | 13 | Verified |
| optionsahoy.com. | DS published | 2371 | 13 | Verified |
| optionsahoy.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://optionsahoy.com/mcp | Verified | 200 | |
| http (plaintext) | http://optionsahoy.com/mcp | HTTPS enforced | 301 | https://optionsahoy-mcp.pages.dev/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
amt_iso_optimize ~1,913
Use this when someone asks how or when to exercise incentive stock options (ISOs), whether exercising will trigger an AMT bomb or phantom income, whether to exercise early, how to plan around the alternative minimum tax (AMT) on an exercise, or how to spread ISO exercises across several years. Computes multi-year exercise schedules and compares them by after-tax Net Final Value (NFV) at the planning horizon. NFV is the after-all-tax cash equivalent of the position at year `horizon`, summing exercised shares (held to LTCG) plus the time-valued tax stream paid along the way; the search compares per-year share allocations by NFV. The headline result is `schedules.optimized.nfv`, the dollar NFV of the highest-scoring schedule found; `schedules.lumpSum` and `schedules.evenSplit` are baseline plans whose `nfv` deltas show the value added by the optimized schedule. For NSO grants use `nso_calculate`, for RSUs at vest use `rsu_sell_vs_hold`, for §1202 QSBS qualification use `qsbs_check`. Models AMT credit recovery across future years, grant-expiration timing, and the post-termination exercise window. Deterministic computation: federal + 50-state tax tables and AMT brackets are compiled in, and the only data read at call time is OptionsAhoy's own published market data, for a `ticker` or the volatility placeholder. Input values are not stored. `schedules.optimized` comes from searching the full discretized candidate space and refining share by share, and a published test case checks it against an exhaustive search (see https://optionsahoy.com/verification). `departedRecommendation`, when present, comes from a scan over candidate share counts rather than the full search. Also returns `crossoverShares`, `crossoverBargain`, `alreadyInAmt`, `timing`, `stateHasAmt`, `bargainPerShare`, and `effectiveHorizon`; see `outputSchema` for the full shape. The schedules are calculations from the inputs supplied, for planning, not tax or investment advice; the user should have a tax profess…
| Name | Type | Req | Description |
|---|---|---|---|
| carryforwardCredit | number | – | Existing federal AMT credit (Minimum Tax Credit, Form 8801) carryforward from prior tax years, USD. Recoverable in future years where regular federal tax exceeds tentative minimum tax. Optional; defa… |
| cashReturnRate | number | – | Annual after-tax return on idle cash (decimal), used to time-value the cash-tax stream. 0.05 = 5% (~short-Treasury yield). Optional: defaults to 0.04 (4%, a short-Treasury-like after-tax yield) when… |
| expectedGrowth | number|string | – | Annual expected stock growth as a decimal (0.10 = 10%), or the string "market" to use the S&P 500 trailing average when the user has no view. Resolution order: this value, else the `ticker`'s trailin… |
| filingStatus | string | yes | Federal filing status. Drives the ordinary-bracket walk, the AMT exemption tier ($90,100 single / $140,200 MFJ for 2026), and the AMT exemption phaseout start ($500,000 single / $1,000,000 MFJ). |
| fmv | number | yes | Current fair market value per share, USD. Anchors year-1 of the growth path; future years compound from here using expectedGrowth and volatilityDrag. Must come from the user. |
| grantDate | string | yes | ISO grant date (YYYY-MM-DD). Drives the 10-year statutory grant expiration (IRC §422) and the 2-year qualifying-disposition threshold from grant. |
| hasLeftCompany | boolean | yes | True if the user has separated from the company. Activates the 90-day post-termination ISO exercise window measured from terminationDate. |
| horizon | integer | yes | Planning horizon in years (1..10). The optimizer searches all feasible per-year share allocations across this many years. The user's choice, not a modelling detail, and it changes the answer: use the… |
| itemizedTaxes | number | – | Only if you itemize deductions: the state and local taxes deducted on Schedule A, line 7. The AMT adds these back instead of the standard deduction. Omit if you take the standard deduction. When omit… |
| ordinaryIncome | number | yes | Annual ordinary income before this exercise, USD. Baseline for the bracket walk and the AMT exemption phaseout. Must come from the user. This is taxable income after deductions, not gross wages: regu… |
| shares | integer | yes | Total Incentive Stock Option (ISO) shares available to exercise across the planning horizon. Must come from the user. |
| stateCode | string | yes | Two-letter US state code (e.g. CA, NY, TX). Drives state ordinary brackets, state long-term capital gains (LTCG) treatment, and state AMT (CA, CO, CT, MN). |
| strike | number | yes | Strike price per share, USD. Must come from the user. |
| terminationDate | – | – | Separation date (YYYY-MM-DD). Required only when hasLeftCompany=true (it drives the 90-day exercise-window deadline); omit it or pass null when still employed. No longer in `required` so the common e… |
| ticker | string | – | Optional public-stock symbol (e.g. "NVDA", "AAPL"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and the implied vol as of the last c… |
| volatility | number | – | Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct for… |
| volatilityDrag | number | – | Alternative to `volatility`: the multiplicative price haircut already computed for the planning horizon. Supply this OR `volatility` (if both are given, volatilityDrag wins). This field is for a drag… |
| Name | Type | Req | Description |
|---|---|---|---|
| alreadyInAmt | boolean | yes | True when the user owes AMT even with zero exercise (regular tax below tentative minimum tax at baseline income). |
| assumptionNotice | string | – | Present with `assumptions`: one plain-language sentence naming each placeholder, written to be relayed to the user. |
| assumptions | array | – | Present only when a placeholder stood in for a growth or volatility input the user did not supply, one entry per such input: `field` (the input), `value` (what it took: a rate, or for expectedSalePri… |
| bargainPerShare | number | yes | Year-1 bargain element per share in dollars: max(0, fmv - strike). |
| crossoverBargain | number | yes | Bargain element in dollars at the crossover share count: crossoverShares x (fmv - strike). |
| crossoverShares | integer | yes | Maximum whole shares exercisable in year 1 before federal AMT exceeds regular tax (the AMT crossover). |
| departedRecommendation | object | – | Present only when hasLeftCompany=true and the 90-day post-termination window is still open: the partial-exercise quantity with the highest expected after-tax value found by a scan over candidate shar… |
| effectiveHorizon | integer | yes | Years the schedules span: the requested horizon (1..10), never capped by the grant term or the departure window. 1 for a departed user inside the 90-day window, whose horizon is the post-exercise hol… |
| lastExerciseYear | integer | yes | Last schedule year with any exercise: min(effectiveHorizon, timing.maxHorizon). Later years hold the shares and recover AMT credit. |
| schedules | object | yes | The three candidate exercise schedules, each evaluated at the effective horizon. Their nfv values are directly comparable; optimized is the highest-NFV schedule the optimizer found. |
| stateHasAmt | boolean | yes | True when the user state levies its own AMT (CA, CO, CT, MN). |
| timing | object | yes | Timing constraints derived from grantDate and (when departed) terminationDate. |
No examples provided.
concentration_analyze ~1,550
Use this when someone asks how risky a large single-stock position is, whether too much of their net worth is in one stock, whether they are over-concentrated in a single name, or how to reduce or diversify a concentrated position. Single-stock concentration risk analysis on an existing position. For standalone hedge pricing use `protective_put_price`; for the tax math on the option exercise or RSU vest that created the concentration, route to `amt_iso_optimize` / `nso_calculate` / `rsu_sell_vs_hold` first. Quantifies drawdown exposure at 30/50/70% downside, then compares three after-tax strategies over a three-year horizon (sell-down to target weight, hold, hedge with put or zero-cost collar), accounting for federal LTCG, state tax, the 3.8% Net Investment Income Tax (NIIT), and reinvestment opportunity cost. `totalAssets` (concentrated position + everything else) frames risk relative to the whole portfolio. Returns a top-level object with keys: `concentration` (position/totalAssets), `riskBand` (Low / Moderate / Concentrated / Highly concentrated / Extreme), `isLongTermToday`, `longTermDate`, `daysUntilLongTerm`, `lossExposure` ({drop, dollarLoss, newConcentration} for 30/50/70% drops), `waitForLtInsight`, `schedule` (yearly sales with per-year tax), `hedging` ({kind, protectionLevel, tenorYears, strike, putPrice, callStrike, callPrice, netPremium, sigma, riskFreeRate} - a 1-year 30%-OTM put by default, or the structure named by `hedgeChoice`), `sectorContextLine`, `advisorBenchmarkLine`. Example call: {positionValue: 400000, costBasis: 100000, acquisitionDate: "2022-01-01", sector: "tech_software", stateCode: "CA", filingStatus: "single", ordinaryIncome: 200000, totalAssets: 1200000, volatility: 0.45, ticker: "NVDA"}. The expected growth (or return, or sale price) and the volatility come from the user, from a covered public-stock `ticker`, or, for growth only, from the string "market" (the S&P 500 trailing average). With none of these, the tool uses the S&P 500…
| Name | Type | Req | Description |
|---|---|---|---|
| acquisitionDate | string | yes | Earliest acquisition date in the lot (YYYY-MM-DD). Drives the 1-year LTCG threshold and the long-term-vs-short-term tax routing. |
| costBasis | number | yes | Total cost basis of the position, USD (sum of strikes paid + ordinary-income inclusions on RSU vest / NSO exercise / disqualified ISO). Must come from the user. |
| expectedMarketReturn | number|string | – | Annual after-tax-proceeds reinvestment rate. Defaults to SPY trailing CAGR for the 3-year horizon if omitted; the string "market" names that same default explicitly. |
| expectedPositionReturn | number|string | – | Annual expected return on the concentrated stock as a decimal (0.10 = 10%), or the string "market" to use the S&P 500 trailing average when the user has no view. Resolution order: this value, else th… |
| filingStatus | string | yes | Federal filing status. Drives LTCG brackets and the NIIT MAGI threshold. |
| hedgeChoice | object | – | Optional hedge specification. When supplied, the `hedging` output block prices this exact structure (kind, protectionLevel, tenorYears, plus a short call for a collar) instead of the default 1-year 3… |
| ordinaryIncome | number | yes | Annual ordinary income before any sales, USD. Baseline for LTCG bracket determination. Must come from the user. This is taxable income after deductions, not gross wages: the engine applies no standar… |
| positionValue | number | yes | Current market value of the concentrated single-stock position, USD. Must come from the user. |
| sector | string | yes | Sector tag. Sets the sector context line, and the sector-typical implied volatility the hedge is priced at when `volatilityDrag` is given without `volatility` or a `ticker` that resolves one. |
| stateCode | string | yes | Two-letter US state code. Drives state LTCG and ordinary brackets. |
| ticker | string | – | Optional public-stock symbol (e.g. "NVDA", "AAPL"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and the implied vol as of the last c… |
| totalAssets | number | yes | Total investable portfolio in dollars (concentrated position + everything else). This value must come from the user, never inferred; if the user did not state it, ask. |
| volatility | number | – | Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool uses it both for hedge pricing (as implied vol) and for the 3y hori… |
| volatilityDrag | number | – | Alternative to `volatility`: the multiplicative price haircut already computed for the horizon. Supply this OR `volatility` (if both are given, volatilityDrag wins). This field is for a drag figure t… |
| Name | Type | Req | Description |
|---|---|---|---|
| advisorBenchmarkLine | string | yes | One-line comparison of the user weight vs the common advisor 10% single-name guideline. |
| assumptionNotice | string | – | Present with `assumptions`: one plain-language sentence naming each placeholder, written to be relayed to the user. |
| assumptions | array | – | Present only when a placeholder stood in for a growth or volatility input the user did not supply, one entry per such input: `field` (the input), `value` (what it took: a rate, or for expectedSalePri… |
| concentration | number | yes | Position value / total assets, 0..1. |
| daysUntilLongTerm | number | yes | Days until long-term treatment; 0 when already long-term. |
| hedging | object | yes | Modeled cost of a protective hedge covering the full position. Defaults to a 1-year 30%-OTM put; if a `hedgeChoice` is supplied, this block prices that structure (kind / protectionLevel / tenorYears,… |
| isLongTermToday | boolean | yes | True when the position already qualifies for long-term capital gains treatment. |
| longTermDate | string | yes | Date the position turns long-term (acquisitionDate + 1 year). ISO 8601 date-time string. |
| lossExposure | array | yes | Dollar damage at 30/50/70% single-stock drawdowns. |
| riskBand | string | yes | Qualitative concentration band for the position weight. |
| schedule | array | yes | Sell-down plans over 1, 2, and 3 years; empty when the position is already at or below the target weight. |
| sectorContextLine | string | yes | One-line volatility/drawdown context for the chosen sector. |
| waitForLtInsight | object|null | yes | Tax saved by waiting for long-term treatment before selling; null when already long-term or no sale is needed. |
No examples provided.
equity_funding_plan ~1,503
Use this when someone asks which shares to sell and when to reach a cash goal by a deadline (down payment, tuition, a tax bill), or how to fund a goal from equity at a lower tax cost. Multi-year, multi-stack equity-funding optimizer. Given a target after-tax amount and a deadline (down payment, tax bill, expansion check), returns four named plans on the risk/wealth frontier: `lockInNow` (sell today, no further exposure to the stock price), `balanced` (bracket-aware spread across months), `holdForGrowth` (sell at the deadline, full exposure to the stock price), and `recommended` (the plan with the most projected wealth among those whose lognormal shortfall probability is at or below `riskToleranceShortfall`, default 10%). Also returns `frontier`, the full hybrid sweep between Lock-in-now and Balanced. Each plan carries its `plan` schedule plus `wealthAtTarget`, `totalTax`, and `shortfallProbability`; see `outputSchema` for the full shape. Use this when an equity holder needs cash by a deadline; for the upstream tax math on RSU/NSO/ISO events that PRODUCED the holdings, call `rsu_sell_vs_hold` / `nso_calculate` / `amt_iso_optimize` first. Out of scope: FICA, AMT, QSBS routing (use `qsbs_check`). Pass multi-ticker holdings via `stacks`; single-stack legacy callers can use top-level `lots` + `currentPrice`. The plans are calculations from the inputs and risk tolerance supplied, for planning, not investment or tax advice; the user should confirm a sale plan with a tax or financial professional before selling. Example: {targetAfterTax: 400000, targetDate: "2028-06-01", stacks: [{ticker: "NVDA", currentPrice: 140, expectedAnnualGrowth: 0.15, volatility: 0.45, lots: [{shares: 4000, costBasisPerShare: 60, acquisitionDate: "2023-06-15"}]}], ordinaryIncome: 280000, filingStatus: "married_joint", stateCode: "CA", cashInterestRate: 0.04, riskToleranceShortfall: 0.10}. Each stack needs `expectedAnnualGrowth`: a decimal, the string "market" (S&P 500 trailing average), or a covere…
| Name | Type | Req | Description |
|---|---|---|---|
| cashInterestRate | number | – | Annualized PRE-tax yield on cash held between each sale and the target date (money-market / short-term Treasury). The tool internally discounts this by the user's marginal federal + state ordinary ra… |
| currentPrice | number | – | Legacy single-stack current share price, USD. Pair with legacy `lots` (omit `stacks`). This value must come from the user. |
| defaultVolatility | number | – | Annualized σ assumed for any stack that omits its own `volatility`. Drives the per-sale σ × √Δt shortfall calculation. Override per-stack on the stack object when one position is materially more or l… |
| expectedAnnualGrowth | number|string | – | Legacy single-stack annual growth decimal, or the string "market" for the S&P 500 trailing average. Used with `lots`: pass 0 for a deliberately flat-price plan; if omitted it falls back to the S&P 50… |
| filingStatus | string | yes | Federal filing status. Drives LTCG brackets, NIIT threshold ($200K single / $250K MFJ MAGI), and state bracket lookups. |
| lots | array | – | Legacy single-stack input (v1.5 / v1.6). Provide either `stacks` (v1.7+) or these legacy fields, not both. Lot is one cost-basis cohort (one RSU vest tranche, one ESPP purchase, one open-market buy). |
| ordinaryIncome | number | yes | Annual ordinary income, USD. Used as the baseline for the federal LTCG bracket walk in each candidate year and for NIIT threshold tests. Must come from the user. This is taxable income after deductio… |
| riskToleranceShortfall | number | – | Max acceptable P(realized cash < target) under the lognormal price model, as a fraction (0.10 = 10%). The `recommended` plan is the plan with the most projected wealth whose shortfall is at or below… |
| stacks | array | – | Holdings, multi-stack form. Provide either `stacks` (this) OR the legacy `lots`+`currentPrice` pair, not both. Each stack is one equity position (one ticker) with its own current price, growth, optio… |
| stateCode | string | yes | Two-letter US state code (e.g. CA, NY, TX). Drives state ordinary or LTCG treatment depending on state (CA taxes LTCG as ordinary; WA has no LTCG tax under $250K; TX/FL/etc. have no state income tax). |
| targetAfterTax | number | yes | Net cash needed in the user's pocket after all applicable taxes (federal LTCG/ordinary + state + NIIT), USD. Example: a $1M house with 20% down minus existing savings might give a $200,000 target. Mu… |
| targetDate | string | yes | Date by which the user needs the net cash (YYYY-MM-DD). Bounds the planning horizon. Sales in non-target years happen on Dec 31; the target year's sale happens on this exact date. Must come from the… |
| Name | Type | Req | Description |
|---|---|---|---|
| appliedRiskTolerance | number | yes | Shortfall-probability tolerance actually applied (default 0.10 when not supplied). |
| assumptionNotice | string | – | Present with `assumptions`: one plain-language sentence naming each placeholder, written to be relayed to the user. |
| assumptions | array | – | Present only when a placeholder stood in for a growth or volatility input the user did not supply, one entry per such input: `field` (the input), `value` (what it took: a rate, or for expectedSalePri… |
| balanced | object | yes | Bracket-aware spread across all candidate years: minimum tax. |
| frontier | array | yes | All candidate plans from the hybrid lock-in sweep plus the named plans, sorted by shortfall probability. |
| holdForGrowth | object | yes | Sell only in the target year: maximum expected wealth, maximum price risk. |
| lockInNow | object | yes | Sell everything needed in the current calendar year: minimum price risk, usually highest tax. |
| recommended | object | yes | The wealth-maximal plan whose shortfall probability is at or below the applied risk tolerance. This is the plan the risk tolerance selects out of the frontier. |
| targetAfterTax | number | yes | Echo of the requested net cash target in dollars. |
| targetDateISO | string | yes | Echo of the target date as an ISO date string. |
No examples provided.
nso_calculate ~1,406
Use this when someone asks whether to exercise and hold or exercise and sell non-qualified stock options (NSOs), about a cashless exercise or same-day sale of NSOs, or what tax an NSO exercise triggers. After-tax payout on a non-qualified stock option (NSO) exercise: federal (including the 3.8% NIIT on a long-term gain where it applies), state, and FICA (Social Security + Medicare + Additional Medicare), comparing sell-at-exercise vs hold-for-long-term-capital-gains over the chosen horizon. Use for NSOs; for ISOs use `amt_iso_optimize`, for RSUs use `rsu_sell_vs_hold`. Deterministic; tax tables compiled in, and the only data read at call time is OptionsAhoy's own published market data, for a `ticker` or the volatility placeholder. Optional `ticker` resolves `expectedSalePrice` from a bundled trailing-CAGR snapshot. Returns `exercise`, `hold`, `sellNowInvest` (the counterfactual: sell at exercise and reinvest at expectedMarketReturn), `holdMinusCashless` (the dollar delta between those two), and `bracketJump`; see `outputSchema` for the full shape. NSO hold is always long-term (sub-1-year is out of scope), so there is no separate long-term flag. Example call: {shares: 5000, strike: 10, currentPrice: 50, ordinaryIncome: 180000, filingStatus: "single", stateCode: "CA", stillEmployed: true, holdYears: 2, volatility: 0.3, holdFunding: "cash", ticker: "AAPL"}. The expected growth (or return, or sale price) and the volatility come from the user, from a covered public-stock `ticker`, or, for growth only, from the string "market" (the S&P 500 trailing average). With none of these, the tool uses the S&P 500 trailing average for growth and the median implied volatility of the companies OptionsAhoy covers for volatility, both labeled as placeholders in `assumptions` and `assumptionNotice`. Every field in `required` is a fact about the user's situation with no built-in default: a missing one returns an error naming it, and validation cannot tell a supplied figure from a guessed…
| Name | Type | Req | Description |
|---|---|---|---|
| currentPrice | number | yes | Current fair market value per share, USD. The bargain element at exercise is shares × (currentPrice − strike). Must come from the user. |
| expectedMarketReturn | number|string | – | Annual after-tax-proceeds reinvestment rate. Defaults to SPY trailing CAGR for holdYears if omitted; the string "market" names that same default explicitly. |
| expectedSalePrice | number|string | – | Projected $/share at end of holdYears, or the string "market" to project currentPrice at the S&P 500 trailing average when the user has no view. Resolution order: this value, else currentPrice × (1 +… |
| filingStatus | string | yes | Federal filing status. Drives ordinary brackets and LTCG brackets used at the hold horizon. |
| haircut | number | – | Alternative to `volatility`: the multiplicative volatility-drag haircut on expectedSalePrice already computed for the hold. Supply this OR `volatility` (if both are given, haircut wins). This field i… |
| holdFunding | string | yes | How the strike cost and exercise tax are funded. 'sell-to-cover' sells enough shares to cover strike + tax (reduces sharesRetained). 'cash' pays strike + tax from outside funds (full sharesRetained);… |
| holdYears | number | yes | Years to hold after exercise (minimum 1). At ≥1 year, the appreciation since exercise is LTCG; sub-1-year holds are out of scope. The user's choice, not a modelling detail, and it changes the answer:… |
| ordinaryIncome | number | yes | Annual ordinary income before this exercise, USD. Baseline for the bracket walk on the bargain element. Must come from the user. This is taxable income after deductions, not gross wages: the engine a… |
| shares | integer | yes | Non-qualified Stock Option (NSO) shares to exercise. Must come from the user. |
| stateCode | string | yes | Two-letter US state code. Drives state ordinary and LTCG treatment. |
| stillEmployed | boolean | yes | True if still employed at exercise. FICA (Social Security + Medicare + Additional Medicare) applies only when true. |
| strike | number | yes | Strike price per share, USD. Must come from the user. |
| ticker | string | – | Optional public-stock symbol (e.g. "NVDA", "AAPL"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and the implied vol as of the last c… |
| volatility | number | – | Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct for… |
| Name | Type | Req | Description |
|---|---|---|---|
| assumptionNotice | string | – | Present with `assumptions`: one plain-language sentence naming each placeholder, written to be relayed to the user. |
| assumptions | array | – | Present only when a placeholder stood in for a growth or volatility input the user did not supply, one entry per such input: `field` (the input), `value` (what it took: a rate, or for expectedSalePri… |
| bracketJump | object|null | yes | Marginal federal bracket change caused by the new ordinary income; null when the income stays within one bracket. |
| exercise | object | yes | Tax bill at exercise on the bargain element (taxed as ordinary W-2 income). |
| hold | object | yes | Exercise now and hold the shares holdYears for long-term capital gains treatment. |
| holdMinusCashless | number | yes | hold.netAtYearN - sellNowInvest.netAtYearN in dollars. Positive favors holding the shares; negative favors selling at exercise and reinvesting. |
| sellNowInvest | object | yes | Counterfactual: sell every share at exercise and reinvest the net cash at expectedMarketReturn for holdYears. |
No examples provided.
protective_put_price ~1,473
Use this when someone asks how much it costs to hedge or protect a stock position against a drop, to protect gains, get downside protection, or limit losses on a position, or to price a protective put, a zero-cost collar, or a put spread. Closed-form pricing of a protective put, a zero-cost collar, and a put spread on a single-stock position. For concentration-vs-hedge tax-cost comparison, use `concentration_analyze` with a `hedgeChoice`. Parameter interactions: `volatility` omitted resolves from `ticker`, else a sector-typical implied volatility; an explicit sigma overrides it. For collars, omitting `upsideCapPct` lets the tool back-solve the cap that zeros the net premium (truly zero-cost collar); supplying `upsideCapPct` overrides the solver and yields a non-zero net premium when the cap is wider than zero-cost. `tenorYears` drives the risk-free-rate lookup AND the floor-hit / cap-hit probability metrics, so changing tenor shifts every probability output even at fixed strike. `expectedReturn` affects only the probability metrics (real-world drift in the floor-hit / cap-hit calculations); premium math is risk-neutral and ignores it (when a chain resolves it defaults to that stock's trailing annualized return, else to the sector's long-run return; never 0). `protectionLevel` sets the put strike as `(1 − protectionLevel) × spot`; raising it widens the protected zone but raises premium roughly linearly. `spreadRiskLevel` (default 0.10) sets the put spread's short strike by targeting the probability the stock ends below it; it affects only the `putSpread` block. The put spread finances the same floor with a short put at a lower strike (not a short call), so it is cheaper than the bare put and needs no shares to sell calls against, which makes it the one structure of the three that works on unexercised employee options; the trade-off is that protection stops at the short strike and losses resume below it. Closed-form and deterministic. With a `ticker` and no explicit…
| Name | Type | Req | Description |
|---|---|---|---|
| expectedReturn | number | – | Annual expected stock return (decimal). Drives the real-world drift in the cap-hit / floor-hit probability metrics. Does not affect premium math. Defaults to the stock's trailing annualized return wh… |
| positionValue | number | yes | Market value of the underlying single-stock position, USD. Premium and max-loss scale linearly with this. Must come from the user. |
| protectionLevel | number | yes | Put strike as (1 − this fraction) × spot. 0.10 = 10% OTM put. Range 0.05..0.50. The user's choice, not a modelling detail, and it changes the answer: use the value they gave, and if they gave none, a… |
| sector | string | yes | Sector tag. Drives the default volatility when no explicit `volatility` is supplied (a sector-typical implied volatility). |
| spreadRiskLevel | number | – | Put-spread floor breach risk: target probability the stock ENDS below the spread's short (lower) strike at expiration. Presets 0.20 / 0.10 / 0.05 / 0.01 ("1 in 5 / 10 / 20 / 100"); off-preset values… |
| tenorYears | number | yes | Option tenor in years. 1 = 12-month; 0.25 = ~90-day. The user's choice, not a modelling detail, and it changes the answer: use the value they gave, and if they gave none, ask for it rather than assum… |
| ticker | string | – | Optional public-stock symbol (e.g. "NVDA"). When set without an explicit `volatility`, each leg prices at its own strike's chain-implied vol, else at its at-the-money vol as of the last close, else t… |
| tickerLabel | string | – | Optional display string echoed back in the result. Not used in pricing. |
| volatility | number | – | Annualized implied volatility (sigma) of the stock. Resolution order: (1) explicit `volatility` if passed; (2) the `ticker`'s implied vol as of the last close; (3) sector-typical IV as last fallback.… |
| Name | Type | Req | Description |
|---|---|---|---|
| barePut | object | yes | Bare protective put: pay premium for a hard floor. |
| collar | object | yes | Put financed by a short call: lower or zero net premium in exchange for capped upside. |
| inputs | object | yes | Echo of the resolved inputs actually priced: positionValue, sector, volatility (the sigma priced), volatilitySource (where that sigma came from) and pricingMode (how the legs were priced), protection… |
| payoffRange | object | yes | Price-move range covered by payoffTable, extended at least 15% beyond each collar arm and at least +/-50%. |
| payoffTable | array | yes | Terminal P&L in dollars at each 10%-step drawdown across payoffRange, for the bare put, the collar, the put spread, and the unhedged position. |
| putSpread | object | yes | Put debit spread: long put at the protection floor financed by a short put at a lower strike. Cheaper than the bare put and needs no short call (so it works on unexercised employee options a collar c… |
| realWorldDrift | number | yes | Annual real-world drift used for the probability metrics: expectedReturn when supplied, else the sector long-run return. Does not affect premium math. |
| recommended | string | yes | Suggested structure, in triage order: collar unless its cap binds too often (>20% probability); then protective-put unless the put is expensive; then put-spread when one is available and cleanly pric… |
| riskFreeRate | number | yes | Annualized risk-free rate used in option pricing, looked up for the tenor, as a decimal. |
No examples provided.
qsbs_check ~1,725
Use this when someone asks whether stock qualifies for the qualified small business stock (QSBS) / Section 1202 gain exclusion, whether their startup stock can be sold tax-free, about the 5-year QSBS holding period, or how much of the gain would be federal-tax-free. Section 1202 Qualified Small Business Stock (QSBS) qualification check. Use this tool for §1202 / QSBS qualification. For AMT timing on the ISO exercise that produced the QSBS holding, use `amt_iso_optimize` first. Parameter interactions: `entityType="other"` short-circuits the verdict to `disqualified` regardless of other fields; `acquisitionMethod="secondary"` does the same; `assetCategory="over-75m"` likewise fails immediately. Under `acquisitionMethod="gift-or-inheritance"` the holding period tacks from the original holder, so supply that earlier date as `acquisitionDate` if known. `acquisitionDate` drives era classification independent of holding period: before 2009-02-17 caps exclusion at 50%, 2009-02-17 to 2010-09-27 at 75%, 2010-09-28 through 2025-07-04 reaches 100% after a 5-year hold (pre-OBBBA), and 2025-07-05 onward uses the OBBBA tiered schedule (50% at 3y, 75% at 4y, 100% at 5y). The per-issuer exclusion cap is `max($10M, 10 × adjustedBasis)` ($15M base for stock acquired after July 4, 2025); when `expectedGain` exceeds it, the overage is fully taxable and the response surfaces `taxableGain` for that delta. `industry` is the dominant industry (>80% revenue) when the corp operates in multiple. Evaluates the six statutory tests: domestic C-corporation entity, original-issuance acquisition method, gross assets at issuance (under $50M / $50-75M / over $75M tiered cap), qualified-trade-or-business industry, active-business posture (80% asset use), and holding period (3 / 4 / 5-year tiers under OBBBA). Pure stateless check: no filing, reporting, or IRS lookup happens; the six tests are evaluated against the bundled OBBBA 2026 rule set and per-state conformity table. Returns a top-level object wi…
| Name | Type | Req | Description |
|---|---|---|---|
| acquisitionDate | string | yes | Date the QSBS shares were acquired (YYYY-MM-DD). Drives the holding-period test and the era classification (50% pre-2009 era, 75% pre-2010 era, 100% after a 5-year hold for acquisitions from 2010-09-… |
| acquisitionMethod | string | yes | §1202 Test 2: How the user obtained the shares. 'original-issuance' (direct from the company) qualifies. 'gift-or-inheritance' tacks the original holder's basis and clock. 'secondary' (bought on a se… |
| activeBusiness | string | yes | §1202 Test 5: Did the corporation use ≥80% of its assets in the active conduct of a qualified trade throughout the holding period? 'yes' qualifies. 'no' fails. 'unsure' marks this test unconfirmed (a… |
| adjustedBasis | number | yes | Adjusted basis of the QSBS shares, USD. Used in the 10× basis cap: the per-issuer exclusion cap is max($10M, 10 × adjustedBasis). Must come from the user. |
| assetCategory | string | yes | §1202 Test 3: Aggregate gross assets of the issuing corporation at the time of issuance. 'under-50m' qualifies pre-OBBBA. '50m-to-75m' qualifies ONLY under OBBBA 2026+ (post-2025-07-05). 'over-75m' n… |
| entityType | string | yes | §1202 Test 1: Type of issuer at the time of acquisition. Only 'us-c-corp' qualifies. S-corps, LLCs, partnerships, and foreign entities fail. |
| expectedGain | number | yes | Expected total gain on sale, USD. Compared against the per-issuer exclusion cap to compute excludableGain and taxableGain. Must come from the user. |
| filingStatus | string | yes | Federal filing status. Drives the LTCG bracket on any non-excluded gain and the NIIT MAGI threshold. |
| industry | string | yes | §1202 Test 4: Industry classification of the corporation. Four values qualify: tech-software, manufacturing, biotech-research, retail-wholesale. Specified service trades or businesses (law, engineeri… |
| ordinaryIncome | number | yes | Annual ordinary income, USD. Baseline for the federal LTCG bracket on any taxable gain. Must come from the user. This is taxable income after deductions, not gross wages: the engine applies no standa… |
| saleDate | string | yes | Planned or actual sale date (YYYY-MM-DD). Together with acquisitionDate determines holdingYears. |
| stateCode | string | yes | Two-letter US state code. Drives the state-conformity verdict: CA/AL/PA/MS do not conform (full state tax owed); HI/MA partial; NJ 2026-01-01 conformity switch; most others fully conform. |
| Name | Type | Req | Description |
|---|---|---|---|
| applicableCap | number | yes | max(perIssuerCap, tenXBasisCap): the exclusion cap actually applied, in dollars. |
| cappedOverageNote | string | – | Present only when expectedGain exceeds applicableCap and an exclusion is in play: explains that the overage is fully taxable regardless of holding period and that spreading shares across separate tax… |
| era | string | yes | Acquisition-era classification that sets the exclusion schedule (50% pre-2009 era, 75% pre-2010 era, 100% at 5y pre-OBBBA, tiered 50/75/100% at 3/4/5y under OBBBA). |
| excludableGain | number | yes | Portion of expectedGain excludable from federal tax in dollars. |
| exclusionPercent | number | yes | Fraction of the capped gain excludable from federal tax, per the era and holding-period tier. |
| federalTaxSaved | number | yes | Federal LTCG tax (including NIIT) avoided on the excluded gain, in dollars. |
| holdingYears | number | yes | Calendar-aware years between acquisitionDate and saleDate. |
| perIssuerCap | number | yes | Statutory per-issuer cap in dollars: $10M pre-OBBBA, $15M for stock acquired after July 4, 2025. |
| stateConforms | string | yes | Whether the user state conforms to the federal 1202 exclusion. |
| stateNote | string | – | Per-state conformity explanation. May be omitted. |
| taxableGain | number | yes | Portion of expectedGain still federally taxable in dollars (overage above the cap plus any non-excluded fraction). |
| tenXBasisCap | number | yes | 10 x adjustedBasis cap in dollars. |
| tests | array | yes | The six statutory tests with per-test status, identifying any gate that failed. |
| verdict | string | yes | Overall verdict. "partial" = qualifies but at a sub-100% exclusion tier (e.g. an OBBBA 3- or 4-year hold gives 50% or 75%). "caveats" = qualifies, but one or more tests returned "unsure" (pass condit… |
| yearsUntilFullExclusion | number | yes | Additional years to hold before reaching the 100% exclusion tier; 0 when already reached. |
No examples provided.
rsu_lot_optimize ~1,085
Use this when someone asks which vested RSU lots to sell first, in which years, to divest part of a concentrated company-stock position, compared on total computed tax: "I want to sell down half my Amazon stock; which lots, and when?". Given the vested lots (vest date, shares, cost basis), a current price, and a divest fraction, it compares WHICH lots and WHICH sale dates to use, by computed total tax, to divest that many shares, using three levers: specific-lot identification (sell higher-basis lots to realize less gain, or underwater lots to harvest losses that net against gains), long-term deferral (wait past the one-year mark to convert short-term ordinary rates to long-term capital gains), and multi-year bracket spreading (split gains across 1 to 3 tax years, with in-plan capital-loss carryforward). Every sale is priced at today's price (flat-price assumption; there is no growth model). Returns the year-by-year sell schedule grouped by tax year, the total tax (federal LTCG + NIIT + state), what a first-in-first-out (FIFO) oldest-first sell order on the same schedule would have cost (`headlineDeltaVsFifo`), a 1/2/3-year horizon trade-off, and per-lot deferral callouts. This tool owns WHICH LOTS and WHICH DATES; for WHETHER and HOW MUCH to sell down a position use `concentration_analyze`, for a single new vest use `rsu_sell_vs_hold`, and to raise a specific cash amount by a deadline use `equity_funding_plan`. Out of scope: growth/return modeling, wash-sale basis migration, AMT, unvested grants. The lot order is a calculation from the lots and inputs supplied, for planning, not tax or investment advice; the user should have a tax professional confirm it before selling. Example: {lots: [{vestDate: "2022-08-15", shares: 120, costBasisPerShare: 95}, {vestDate: "2024-02-15", shares: 100, costBasisPerShare: 130}, {vestDate: "2026-05-15", shares: 80, costBasisPerShare: 210}], currentPrice: 180, divestFraction: 0.5, horizonYears: 2, ordinaryIncome: 200000, filingStatus:…
| Name | Type | Req | Description |
|---|---|---|---|
| currentPrice | number | yes | Current share price, USD. Every sale, on every date, is priced at this value (flat-price assumption). This value must come from the user. |
| divestFraction | number | yes | Fraction of TOTAL shares to divest, as a decimal (0.5 = sell half). Range 0.10 to 1.0. NOTE: a decimal fraction, NOT a percent, so pass 0.5 not 50. The tool sells round(divestFraction x totalShares)… |
| filingStatus | string | yes | Federal filing status. Drives LTCG brackets, the NIIT threshold, and state bracket lookups. |
| horizonYears | integer | yes | Tax years the plan may span: 1 = sell everything now, 2, or 3. More years let the plan spread gains across brackets and defer short-term lots to long-term, at the cost of staying exposed to the stock… |
| lots | array | yes | The vested RSU lots still held (after any sell-to-cover), one entry per vest tranche. The tool decides which of these to sell and when. Unvested grants are out of scope. At most 20 lots per call, the… |
| ordinaryIncome | number | yes | Total household ordinary income for the year, USD, from all sources. Sets the federal LTCG bracket floor, the short-term ordinary rate, and the net investment income tax (NIIT) threshold test. This i… |
| stateCode | string | yes | Two-letter US state code (e.g. CA, NY, TX). Drives state capital-gains treatment (CA taxes gains as ordinary; WA/TX/FL have no tax on most capital gains). |
| Name | Type | Req | Description |
|---|---|---|---|
| attribution | object | yes | Telescoping attribution of the total saving vs a FIFO-all-today sale. lotSelection + spreadingDeferral = total. |
| carryforwardRemaining | number | yes | Capital loss remaining at the end of the plan horizon, in dollars (reported, not modeled into future years). |
| deferralCallouts | array | yes | Per-lot short-term-to-long-term deferral opportunities. |
| headlineAfterTaxKept | number | yes | After-tax proceeds under the plan, in dollars: the headline "you keep $X" figure. |
| headlineDeltaVsFifo | number | yes | Dollars saved versus selling oldest-first (FIFO) on the SAME schedule. Pure lot-selection benefit; >= 0 by construction. |
| horizonCards | array | yes | The same divest target under a 1-year ("all now"), 2-year, and 3-year plan, for the trade-off strip. |
| keptUnrealizedGain | number | yes | Unrealized gain still carried by the shares NOT sold, in dollars (deferred, not eliminated). |
| schedule | array | yes | The sell plan, grouped by tax year. |
| sharesToSell | number | yes | Shares the plan divests (round(divestFraction x totalShares), floored at 1). |
| totalAfterTax | number | yes | After-tax proceeds from the divested shares, in dollars. |
| totalGross | number | yes | Gross proceeds from the divested shares, in dollars. |
| totalShares | number | yes | Total shares across all input lots. |
| totalTax | number | yes | Total plan tax across all years (federal LTCG + NIIT + state, net of in-plan loss carryforward), in dollars. |
No examples provided.
rsu_sell_vs_hold ~1,225
Use this when someone asks whether to sell RSUs at vest or hold them, whether to sell their vested shares or diversify out of company stock, or about the tax and withholding on a restricted stock unit (RSU) vest. After-tax RSU vest analysis: sell-at-vest vs hold-to-long-term-capital-gains (LTCG) over `holdYears`. Covers federal ordinary tax, long-term capital gains tax including the 3.8% NIIT where it applies, state tax, FICA (Social Security + Medicare + Additional Medicare), and the shortfall between mandatory 22% supplemental withholding and the user's marginal bracket. Use for RSUs at vest; for ISO/AMT use `amt_iso_optimize`, for NSO use `nso_calculate`. Deterministic; tax tables compiled in, and the only data read at call time is OptionsAhoy's own published market data, for a `ticker` or the volatility placeholder. Returns `vest`, `hold`, `sellNowInvest`, `holdMinusSell`, and `bracketJump`; see `outputSchema` for the full shape. Example call: {shares: 1000, currentPrice: 100, ordinaryIncome: 200000, filingStatus: "single", stateCode: "CA", stillEmployed: true, holdYears: 2, volatility: 0.3, ticker: "MSFT"}. The expected growth (or return, or sale price) and the volatility come from the user, from a covered public-stock `ticker`, or, for growth only, from the string "market" (the S&P 500 trailing average). With none of these, the tool uses the S&P 500 trailing average for growth and the median implied volatility of the companies OptionsAhoy covers for volatility, both labeled as placeholders in `assumptions` and `assumptionNotice`. Every field in `required` is a fact about the user's situation with no built-in default: a missing one returns an error naming it, and validation cannot tell a supplied figure from a guessed one. Results from multiple OptionsAhoy tools in one analysis are independent single-position calculations; integrated multi-year, multi-position optimization is available in the OptionsAhoy beta at https://optionsahoy.com/beta?src=mcp_multi.
| Name | Type | Req | Description |
|---|---|---|---|
| currentPrice | number | yes | Fair market value per share at vest, USD. Also the cost basis on retained shares. Must come from the user. |
| expectedMarketReturn | number|string | – | Annual after-tax-proceeds reinvestment rate. Defaults to SPY trailing CAGR for holdYears if omitted; the string "market" names that same default explicitly. |
| expectedSalePrice | number|string | – | Projected $/share at end of holdYears, or the string "market" to project currentPrice at the S&P 500 trailing average when the user has no view. Resolution order: this value, else currentPrice × (1 +… |
| filingStatus | string | yes | Federal filing status. |
| haircut | number | – | Alternative to `volatility`: the multiplicative volatility-drag haircut on expectedSalePrice already computed for the hold. Supply this OR `volatility` (if both are given, haircut wins). This field i… |
| holdYears | number | yes | Years to hold after vest (0.25..5). Below 1 year triggers the short-term capital gains cliff (ordinary rates on appreciation). The user's choice, not a modelling detail, and it changes the answer: us… |
| ordinaryIncome | number | yes | Annual ordinary income before this vest, USD. Baseline for the bracket walk on the vest amount. Must come from the user. This is taxable income after deductions, not gross wages: the engine applies n… |
| shares | integer | yes | Restricted Stock Unit (RSU) shares vesting in this tranche. Must come from the user. |
| stateCode | string | yes | Two-letter US state code. |
| stillEmployed | boolean | yes | True if still employed at vest. Drives FICA applicability and whether the 22% supplemental withholding rule applies. |
| ticker | string | – | Optional public-stock symbol (e.g. "NVDA", "AAPL"). When set, the tool substitutes a cached trailing return for any unsupplied expected-return / sale-price field, and the implied vol as of the last c… |
| volatility | number | – | Annualized volatility (sigma) of the stock as a decimal (0.72 = 72%). Pass the volatility itself, not a pre-computed drag: the tool derives the horizon-cumulative drag internally, and the correct for… |
| Name | Type | Req | Description |
|---|---|---|---|
| assumptionNotice | string | – | Present with `assumptions`: one plain-language sentence naming each placeholder, written to be relayed to the user. |
| assumptions | array | – | Present only when a placeholder stood in for a growth or volatility input the user did not supply, one entry per such input: `field` (the input), `value` (what it took: a rate, or for expectedSalePri… |
| bracketJump | object|null | yes | Marginal federal bracket change caused by the new ordinary income; null when the income stays within one bracket. |
| hold | object | yes | Keep the after-tax shares for holdYears, then sell. |
| holdMinusSell | number | yes | hold.netAtYearN - sellNowInvest.netAtYearN in dollars. Positive favors holding the vested shares; negative favors selling at vest and reinvesting. |
| sellNowInvest | object | yes | Counterfactual: sell every share at vest and reinvest the net cash at expectedMarketReturn for holdYears. |
| vest | object | yes | Tax bill at vest on the full vest value (taxed as ordinary W-2 income). |
No examples provided.
How do I install the io.github.AlvisoOculus/optionsahoy-mcp server?
io.github.AlvisoOculus/optionsahoy-mcp is a hosted endpoint at https://optionsahoy.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · optionsahoy.com
claude mcp add --transport http alvisooculus-optionsahoy-mcp 'https://optionsahoy.com/mcp'
What is the io.github.AlvisoOculus/optionsahoy-mcp server?
io.github.AlvisoOculus/optionsahoy-mcp is listed in the public MCP registry as io.github.AlvisoOculus/optionsahoy-mcp. Equity comp tax/trade optimizer: ISO/AMT exercise, NSO, RSU, QSBS, concentration, hedging. 50-state. This page covers its hosted endpoint (https://optionsahoy.com/mcp).
Is the io.github.AlvisoOculus/optionsahoy-mcp server safe to use?
io.github.AlvisoOculus/optionsahoy-mcp scores 86 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.AlvisoOculus/optionsahoy-mcp server expose?
io.github.AlvisoOculus/optionsahoy-mcp exposes 8 tools: amt_iso_optimize, nso_calculate, rsu_sell_vs_hold, concentration_analyze, protective_put_price, and 3 more. Their descriptions and schemas cost roughly 11,880 tokens of context every time the server is loaded.
Does the io.github.AlvisoOculus/optionsahoy-mcp server require authentication?
No. We connected to io.github.AlvisoOculus/optionsahoy-mcp without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the io.github.AlvisoOculus/optionsahoy-mcp server still maintained?
io.github.AlvisoOculus/optionsahoy-mcp is still listed as active in the MCP registry. We last reached this channel on 7 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What did VerifyMCP test on the io.github.AlvisoOculus/optionsahoy-mcp server?
VerifyMCP ran 14 checks on io.github.AlvisoOculus/optionsahoy-mcp, covering TLS certificate, Authorization, HTTPS, HSTS header and 10 more. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.