Skip to main content
Glama
AlvisoOculus

OptionsAhoy: Stock Equity and Tax Optimizer

nso_calculate

Read-onlyIdempotent

Compare exercise-and-hold vs exercise-and-sell for non-qualified stock options, with after-tax proceeds including federal, state, and FICA taxes.

Instructions

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, 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, offline; tax tables compiled in. Optional ticker resolves expectedSalePrice from a bundled trailing-CAGR snapshot.

Returns a top-level object with these keys:

  • exercise: bargainElement, federal, state, socialSecurity, medicare, additionalMedicare, total, netCashSellAll.

  • hold: costBasis, strikeCost, sharesSoldToCover, sharesRetained, effectiveSalePrice, expectedGain, ltcgFederal, ltcgState, ltcgTotal, afterTaxProceedsAtSale, netAtYearN. NSO hold is always long-term (sub-1-year is out of scope), so there is no separate long-term flag.

  • sellNowInvest: counterfactual where shares are sold at exercise and proceeds reinvested at expectedMarketReturn.

  • holdMinusCashless: dollar delta between hold and sellNowInvest.

  • bracketJump: fromRate, toRate, thresholdAtJump describing the marginal bracket change at exercise.

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"}. Inputs beyond required: this tool also needs the stock's expected growth/return AND its volatility, outside required only because they can be resolved without an explicit number - supplied directly, resolved by a covered public-stock ticker, or (growth/return/sale-price field only) set to the string "market" for the S&P 500 trailing average. Every field in required is likewise a fact about the user's situation with no built-in default. Neither the growth nor the volatility field has a default or a fallback estimate: their only valid sources are the user's own figures, a covered ticker, or (growth/return/sale-price only) the "market" sentinel. A call that neither supplies nor resolves one of them returns a required-field error naming the field; a number from any other source is accepted as-is, because a syntactically valid figure passes validation with no provenance check, and it silently changes the result. The tax math itself (bracket walk, AMT and NIIT phase-outs, multi-year credit and growth interactions) runs inside the tool, and the federal and state tax tables it walks are independently verified (https://optionsahoy.com/verification). 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 optionsahoy.com/beta?src=mcp_multi.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
sharesYesNon-qualified Stock Option (NSO) shares to exercise. Must come from the user.
strikeYesStrike price per share, USD. Must come from the user.
tickerNoOptional 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 a cached implied vol for any unsupplied volatility. Growth and volatility come from two separate cached snapshots, so some symbols resolve only one of the two fields. A symbol not in a given table falls through to a "required field" error for exactly the field it could not resolve: pass that field explicitly, or (for the growth/return/sale-price field) pass the string "market" for the S&P 500 trailing average; never invent a number. The covered-tickers resource (resources/list) lists which symbols resolve which field.
haircutNoAlternative 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 is for a haircut figure that already exists from a prior computation; the haircut formula is horizon-dependent, so a figure derived for a different horizon does not carry over. Supplying `volatility` instead lets the tool derive it.
holdYearsYesYears 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: use the value they gave, and if they gave none, ask for it rather than assuming one.
stateCodeYesTwo-letter US state code. Drives state ordinary and LTCG treatment.
volatilityNoAnnualized 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 formula is horizon-dependent. This value must come from the user or from a `ticker` that resolves it from the cached implied-vol table; if neither supplies it, ask the user rather than estimating one.
holdFundingYesHow 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); no extra input is needed - the result reports the outside cash required as the output field cashNeededAtExercise.
currentPriceYesCurrent fair market value per share, USD. The bargain element at exercise is shares × (currentPrice − strike). Must come from the user.
filingStatusYesFederal filing status. Drives ordinary brackets and LTCG brackets used at the hold horizon.
stillEmployedYesTrue if still employed at exercise. FICA (Social Security + Medicare + Additional Medicare) applies only when true.
ordinaryIncomeYesAnnual 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 applies no standard or itemized deduction to it.
expectedSalePriceNoProjected $/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. Required unless `ticker` resolves it from currentPrice × (1 + trailing CAGR)^holdYears. This tool has no default for it: a value not stated by the user, not resolved by a covered `ticker`, and not the "market" sentinel is outside the input contract.
expectedMarketReturnNoAnnual after-tax-proceeds reinvestment rate. Defaults to SPY trailing CAGR for holdYears if omitted; the string "market" names that same default explicitly.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
holdYesExercise now and hold the shares holdYears for long-term capital gains treatment.
exerciseYesTax bill at exercise on the bargain element (taxed as ordinary W-2 income).
bracketJumpYesMarginal federal bracket change caused by the new ordinary income; null when the income stays within one bracket.
sellNowInvestYesCounterfactual: sell every share at exercise and reinvest the net cash at expectedMarketReturn for holdYears.
holdMinusCashlessYeshold.netAtYearN - sellNowInvest.netAtYearN in dollars. Positive favors holding the shares; negative favors selling at exercise and reinvesting.
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses substantial behavioral traits beyond the annotations: no default/fallback for growth and volatility, required-field error behavior for unresolved inputs, acceptance of any syntactically valid number without provenance check, sub-1-year holds being out of scope, and independence of multi-tool results. It also explains the optional ticker resolution and the 'market' sentinel. This richly supplements the readOnly/idempotent hints without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but every sentence serves a purpose: use cases, output keys, example call, parameter-resolution contract, error behavior, and scope caveats. It is front-loaded with the primary use case and structured logically, though some output-key listing may overlap with the output schema and could be trimmed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 14 parameters, 9 required, enums, and an output schema, the description is remarkably complete. It covers the input contract, error semantics, tax scope, verification, and alternative-tool routing. The presence of an output schema means return-value documentation is unnecessary, and the description fills all other gaps comprehensively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even with 100% schema description coverage, the description adds meaning: it explains that certain non-required parameters are conditionally required and how they can be resolved (user, ticker, 'market'), states that no parameter has a built-in default, and gives an example call. This clarifies interdependencies and provenance rules that the schema alone does not capture, compensating beyond the baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with explicit use cases ('Use this when someone asks whether to exercise and hold or exercise and sell non-qualified stock options'), names the resource and verb (calculate after-tax payout comparing sell-at-exercise vs hold), and explicitly distinguishes from sibling tools ('for ISOs use `amt_iso_optimize`, for RSUs use `rsu_sell_vs_hold`'). This exceeds the bar for a specific, differentiated purpose.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit when-to-use guidance, including tax questions and cashless exercises, and names alternatives for ISO and RSU cases. It also notes the tool is deterministic and offline, and clarifies that integrated multi-position optimization is not available here, pointing to a beta. This effectively directs selection away from siblings and sets expectations for the analysis scope.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/AlvisoOculus/optionsahoy-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server