This server is an equity-compensation tax optimization engine with seven deterministic tools for ISO/NSO/RSU/QSBS holders, covering federal + all 50 states + DC tax rules.
ISO/AMT Exercise Optimization (
amt_iso_optimize): Generate a multi-year ISO exercise schedule that minimizes AMT and maximizes after-tax value, including AMT credit recovery, grant expiration, and post-termination windows.NSO Tax & Sell-vs-Hold Analysis (
nso_calculate): Calculate after-tax payout on NSO exercise (federal, state, FICA) and compare selling at exercise vs. holding for long-term capital gains (LTCG).RSU Sell-at-Vest vs. Hold (
rsu_sell_vs_hold): Analyze RSU vest tax impact (including the 22% federal withholding gap, FICA) and compare immediate sale vs. holding for LTCG.Single-Stock Concentration Analysis (
concentration_analyze): Quantify drawdown exposure (30/50/70% scenarios) and compare sell-down, hold, or hedge (put/collar) strategies over a 3-year horizon with full tax accounting including NIIT.Protective Put / Zero-Cost Collar Pricing (
protective_put_price): Black-Scholes pricing of protective puts and collars, including annualized hedge cost, max loss, cap probability, and payoff tables.QSBS Qualification Check (
qsbs_check): Evaluate all eight §1202 statutory tests, apply OBBBA 2026 tiered exclusion rules, compute excluded vs. taxable gain and federal tax saved, and report per-state conformity.Equity Funding Plan (
equity_funding_plan): Build a multi-year, minimum-tax sell schedule across one or multiple stock positions to net a target after-tax dollar amount by a deadline, returning optimal and alternative plans.
Additional features include full AMT modeling (including CA, CO, CT, MN state AMT), NIIT, six topical markdown briefings to ground reasoning before tool use, six workflow scaffold prompts, a REST API mirroring all tools, and fully deterministic offline computation with no PII retention.
Enables registration of the OptionsAhoy MCP server in Google Cloud Agent Registry, allowing Gemini agents to call the optimization tools for equity-compensation tax planning.
Allows Perplexity to access equity-compensation optimization tools including ISO, NSO, RSU, concentration risk, protective put pricing, and QSBS qualification checks, enabling tax-smart financial planning through natural language.
OptionsAhoy MCP Server
Equity-compensation optimizer. ISO/AMT, NSO, RSU, QSBS, single-stock concentration, protective puts/collars, and equity-funding plans. Seven deterministic tools across the federal + 50-state + DC tax code.
Live MCP endpoint: https://optionsahoy.com/mcp (no auth, no install)
Live REST API: https://optionsahoy.com/api/v1
OpenAPI 3.1 spec: /openapi.json
Discovery manifests: /.well-known/mcp.json · /.well-known/openapi.json
Agent integration docs: optionsahoy.com/for-agents
Built by AlphaLatitude Inc. — a pre-revenue beta-stage equity-compensation optimization product.
What this is
An optimization engine for equity-compensation tax planning, exposed as both a Model Context Protocol (MCP) server and a plain REST API. Seven tools:
Tool name | What it computes |
| Multi-year Incentive Stock Option (ISO) exercise schedule that minimizes federal and state Alternative Minimum Tax (AMT), with credit recovery across years |
| Non-qualified Stock Option (NSO) exercise tax + sell-vs-hold-for-LTCG comparison |
| RSU sell-at-vest vs hold-for-long-term-capital-gains decision |
| Single-stock concentration risk + sell-down vs hold vs hedge optimization |
| Protective put / zero-cost collar pricing via Black-Scholes against implied volatility from a daily-refreshed option-chain snapshot |
| Section 1202 Qualified Small Business Stock (QSBS) qualification (eight statutory tests, OBBBA 2026 tiered exclusion) |
| Multi-year, multi-stack equity-funding plan for hitting a target after-tax amount by a deadline. Returns four named plans (Lock-in-now / Balanced / Hold-for-growth / Recommended) plus the full risk/wealth frontier. |
Each tool returns the globally-optimal schedule across the candidate space — not heuristics, not samples. Coverage spans the full federal tax code (ordinary brackets, long-term capital gains, AMT with credit recovery, FICA, NIIT) plus all 50 states and DC (state ordinary brackets, LTCG treatment, state AMT for CA, NY, MN). Same engine as the in-browser calculators at optionsahoy.com/tools; the API response is byte-identical to clicking through the tool.
MCP resources (topical briefings)
Six markdown resources under resources/list give an LLM enough grounding to discuss the topic before picking a tool. Each maps 1:1 with a cornerstone article on optionsahoy.com/learn and the matching calculator.
Resource URI | Topic | Pair with |
| ISO/AMT crossover and four expensive mistakes |
|
| NSO sell-at-exercise vs hold-for-LTCG |
|
| RSU 22% withholding gap and five April surprises |
|
| Concentration risk and diversification trade-off |
|
| Protective puts and zero-cost collars |
|
| QSBS qualification and five ways to lose the exclusion |
|
MCP prompts (workflow scaffolds)
Six prompts under prompts/list scaffold typical user questions and route to the right tool. In Claude Desktop they appear as named slash-commands; in any MCP client, prompts/get { name, arguments } returns a fully-templated user message.
Prompt name | Routes to |
|
|
|
|
|
|
|
|
|
|
|
|
Related MCP server: cinderfi-mcp
Why use an optimizer
A benchmark of five frontier large language models on the same multi-year ISO exercise problem found that every one of 15 trials overshot the achievable after-tax outcome by 2x to 20x. Multi-year scheduling has a search space larger than an LLM can reason through in-context. Full write-up: HackerNoon — But can it do taxes though?
Use from Claude / ChatGPT / Perplexity / any MCP client
Add the server as a remote HTTP MCP connection:
https://optionsahoy.com/mcpOr via the add-mcp CLI:
npx add-mcp https://optionsahoy.com/mcpUse the REST API directly
# List endpoints
curl https://optionsahoy.com/api/v1
# Run an optimization
curl -X POST https://optionsahoy.com/api/v1/amt-iso \
-H "content-type: application/json" \
-d @input.jsonRequest body shapes are documented in public/openapi.json.
Repository layout
functions/ Cloudflare Pages Functions (MCP server + REST API endpoints)
mcp.ts HTTP MCP server
api/v1/*.ts Six REST endpoints + GET /api/v1 discovery
_lib/*.ts Shared helpers, calc-input parsers, MCP tool descriptors
lib/ Optimizer + tax-code logic
calc/ Per-tool optimizer functions (computeAmtIso, etc.)
tax/ Federal + 50-state + DC bracket data, AMT, FICA, NIIT
markets/ Sector statistics
options/ Black-Scholes, risk-free rates
data/ Type definitions for option-chain data
public/ Static assets: OpenAPI spec, llms.txt, discovery manifests
tests/ Vitest suites (873+ tests including byte-identity assertions)Run tests
npm install
npm test # 870+ tests, ~3s on a laptop
npm run typecheckRegistry listings
Official MCP Registry —
io.github.AlvisoOculus/optionsahoy-mcpv1.0.0, status activePulseMCP (cascades from Official Registry)
Use from Google Cloud (Gemini agents)
Google Cloud Agent Registry lets each GCP project register external MCP servers for use by Gemini agents. Registration is per-project (no central submission). Two paths:
# Path A: let the Agent Registry introspect our MCP endpoint
gcloud alpha agent-registry mcp-servers register \
--uri=https://optionsahoy.com/mcp \
--display-name="OptionsAhoy" \
--location=us-central1 \
--import-tools
# Path B: pass our published toolspec.json directly (faster, no introspection)
gcloud alpha agent-registry mcp-servers register \
--uri=https://optionsahoy.com/mcp \
--display-name="OptionsAhoy" \
--location=us-central1 \
--tool-spec=<(curl -sSL https://optionsahoy.com/toolspec.json)The toolspec.json mirrors the MCP tools/list response with readOnlyHint and idempotentHint annotations on all six tools (all are pure deterministic calculators with no side effects). To regenerate after a tool-shape change:
curl -sS -X POST https://optionsahoy.com/mcp \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","method":"tools/list","id":1}' \
| jq -c '{tools: [.result.tools[] | . + {annotations: {readOnlyHint:true, idempotentHint:true, destructiveHint:false, openWorldHint:false}}]}' \
> public/toolspec.jsonTroubleshooting
Connection refused / 404 from the MCP endpoint
https://optionsahoy.com/mcp requires POST with content-type: application/json and a JSON-RPC body. A GET returns a JSON server description; any other verb returns 405. Verify with:
curl -X POST https://optionsahoy.com/mcp -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","method":"initialize","id":1,"params":{}}'Tool calls fail with Error: ... text in the response
The MCP server returns isError: true with a human-readable message when input validation fails. Most common: a required field missing, or a number passed as a string. Check the input against the inputSchema returned by tools/list, or against /openapi.json.
Tool not appearing in Claude.ai or Claude Desktop
Confirm the connector URL is exactly
https://optionsahoy.com/mcp(no trailing slash, no/v1).In Claude Desktop, restart the app after editing
claude_desktop_config.json.In Claude.ai, the connector toggle is per-chat: enable it in the attachments menu.
Check the live
tools/listresponse (six tools expected):curl -X POST https://optionsahoy.com/mcp -H 'content-type: application/json' -d '{"jsonrpc":"2.0","method":"tools/list","id":1}'
CORS errors from a browser-based client
The server returns access-control-allow-origin: * on all responses including preflight, and accepts the standard MCP headers (content-type, mcp-session-id, mcp-protocol-version). If a browser still blocks, the client is likely sending a non-allowed header — verify the request headers against the access-control-allow-headers response.
Resource / prompt not found
Resource URIs and prompt names are case-sensitive. Pull the canonical list with resources/list and prompts/list rather than hand-typing.
Stale tax-year math
The tax engine ships with 2026 inflation-adjusted brackets, OBBBA 2026 QSBS rules, and current state-conformity tables. If results look off for a multi-year horizon, verify the input grantDate, acquisitionDate, or saleDate falls in the year you expect — the engine resolves brackets per tax year.
Reporting a calculation bug or unexpected output Email andrew@alphalatitude.com with: the exact JSON-RPC request body, the response, the expected value, and (if known) the IRS publication or state statute the expected value derives from.
License
MIT. See LICENSE. The deployed service at https://optionsahoy.com/mcp and https://optionsahoy.com/api/v1 is free during beta under terms.
Contact
For partnerships, early API access, MCP integration support: andrew@alphalatitude.com
Deployment topology
Two pieces serve the live endpoint:
Cloudflare Pages project (GitHub-connected to this repo) auto-deploys
functions/+public/on every push to main →optionsahoy-mcp.pages.dev.Cloudflare Worker in
worker-proxy/forwardsoptionsahoy.com/mcp*+/api/v1/*to that Pages deployment, so the public URL stays stable. One-timewrangler deploy— seeworker-proxy/README.md.
Call stats (D1)
Every inbound MCP and REST call writes one row to a D1 table via
ctx.waitUntil (fire-and-forget — never blocks the response). View
aggregates at https://optionsahoy-mcp.pages.dev/admin/mcp-stats?token=<ADMIN_TOKEN>.
One-time setup (Andrew):
# 1. Create the database. Outputs a database_id.
cd /Users/andrewk/Projects/optionsahoy-mcp
npx wrangler d1 create optionsahoy-mcp-stats
# 2. Apply the schema.
npx wrangler d1 execute optionsahoy-mcp-stats --remote \
--file=db/migrations/0001_init.sql
# 3. Generate a token.
openssl rand -hex 32Then in the Cloudflare dashboard for the optionsahoy-mcp Pages project:
Settings → Functions → D1 database bindings — add variable name
MCP_STATS, point at the database created in step 1.Settings → Environment variables → Production — add
ADMIN_TOKENwith the value from step 3 (mark as encrypted).
After the next deploy, /admin/mcp-stats?token=...&days=30 renders the
dashboard. Without the bindings, logCall silently no-ops and the admin
page returns 503 (the rest of the server is unaffected).
What's logged: ts, endpoint, tool, is_error, error_msg (truncated 500), client_name, ua (truncated 200), country. Tool arguments are never
logged (PII + table-size).
Maintenance
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
