Connect Cursor, Claude, Codex, Grok, and other remote MCP clients to Theta Vantage with the same Pro API key you use for /api/v1. The remote MCP server exposes one gateway data catalog — the same tools as Athena chat and GET /api/v1/tools. It is not a second API key or a second data product.
Pro only. Free keys get 403 INSUFFICIENT_TIER, the same as the REST API. Missing or invalid keys get 401. Most MCP HTTP requests (initialize, tools/list, and ordinary tools/call) share the REST data bucket: 60 requests per minute per key. Slow tools — get_fundamentals, get_earnings_calendar, get_iv_rank, get_wheel_strategy, get_income_projections, and search_x_discourse — use a separate 15/min mcp-heavy bucket, the same cadence as POST /api/v1/chat. Those calls may take up to about a minute; the route allows 180s.
Chat (POST /api/v1/chat) and the daily report (GET /api/v1/report) are not MCP tools. Use the REST API for those. They are orchestrators that consume Athena tokens; MCP runs individual tools as Pro data requests and does not debit the chat budget.
Agents should also read /.well-known/mcp and llms.txt.
Server URL
https://thetavantage.com/api/mcp
Remote Streamable HTTP. You paste this URL and a tvk_ key into Cursor, Claude, Codex, Grok, and other remote MCP clients. A local npx install is not required when the client supports remote MCP.
Authentication
Use the key from Account → API. Do not invent a second key type.
Header (recommended)
X-API-Key: tvk_YOUR_KEY
Bearer (also accepted) — some MCP clients only send Authorization:
Authorization: Bearer tvk_YOUR_KEY
Query (last resort) — same as REST api_key. Prefer a header; query strings show up in logs and browser history:
https://thetavantage.com/api/mcp?api_key=tvk_YOUR_KEY
Rate-limit headers on every authenticated response match REST: X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset.
Cursor
Edit ~/.cursor/mcp.json (or Cursor Settings → MCP):
{
"mcpServers": {
"theta-vantage": {
"url": "https://thetavantage.com/api/mcp",
"headers": {
"X-API-Key": "tvk_YOUR_KEY"
}
}
}
}
Save, then confirm get_stock_quote is listed. Ask: What is the quote for SPY?
Stdio-only builds can bridge with mcp-remote:
{
"mcpServers": {
"theta-vantage": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://thetavantage.com/api/mcp",
"--header",
"X-API-Key: tvk_YOUR_KEY"
]
}
}
}
Claude
Claude.ai custom connector: Settings → Connectors → add a custom connector. URL https://thetavantage.com/api/mcp. If the UI asks for a header, set X-API-Key to your tvk_ key (or Authorization Bearer tvk_YOUR_KEY). This is Pro-only; Free keys are rejected.
Claude Desktop (stdio): use the mcp-remote snippet above in claude_desktop_config.json.
Tools (v1)
One catalog. tools/list is the live GET /ai/tools snapshot (static fallback if the gateway catalog is down). tools/call is POST /ai/tools/execute. Results are compact JSON/CSV for model context — not full REST grids.
| Tool | Use for |
|---|---|
get_stock_quote | Last price, change, range, volume, bid/ask |
get_option_chain | One-expiration chain CSV with side/moneyness/strike filters |
get_expirations | Listed upcoming expiration dates (YYYY-MM-DD). Optional days_forward, limit. Paste expiration_dates into other tools |
get_greek_exposure | Aggregate GEX / VEX / charm by strike (greek=gamma|vanna|charm). Optional expiration_dates; default all expirations |
get_greek_heatmap | Live strike×expiration GEX/VEX/DEX (greek=gamma|vanna|delta) |
get_gamma_profile | Dealer gamma curve, zero-gamma, regime. Optional expiration_dates; default all expirations |
get_options_flow | Detected flow events, summary, or strike stacks. Optional min_volume, min_oi; events offset (limit still max 100) |
get_market_tide | Intraday net call/put premium (default SPY, today ET). Live: moneyness, expiration_date. Historical trade_date: max_dte, strike_percent, single_leg_only |
get_price_history | OHLCV CSV. Optional days_back or start+end (not both); default 1d lookback is 180 days |
get_fundamentals | Company research (15/min) |
get_news | Headlines |
get_earnings_calendar | Market-wide FMP earnings calendar (15/min). Optional from_date/to_date (max 45d), venue, symbol, min_revenue, hide_no_estimates, report_time, date |
get_max_pain | Max-pain strike. Optional mode=series or expiration_dates / expirations for up to 12 upcoming expirations |
get_intraday_greeks | Strike×time heatmap (enabled tickers). Optional expiration_dates, range, interval / interval_ms |
get_iv_rank | IV rank / percentile (15/min) |
get_price_distribution | Return histogram |
get_indicators | Multi-timeframe technicals |
get_key_levels | Call/put walls, hedge wall, max pain, expected move. Optional days_forward 14|30|60|90 for a window + confluence |
get_options_value | Single-contract Black-Scholes |
get_wheel_strategy | Covered-call / CSP wheel picks (15/min) |
get_strike_recommendations | Strike Selector scoring |
get_income_projections | Income calculator (15/min) |
get_options_strategy | Named multi-leg catalog book |
search_x | X recent-search |
get_x_user | X profile |
get_x_user_posts | X user timeline |
search_x_discourse | Open-ended X discourse (15/min) |
Folded REST names: there is no get_gex / get_vex / get_charm. Call get_greek_exposure with greek=gamma|vanna|charm. Delta (old DEX) is get_greek_heatmap with greek=delta. Live heatmaps are get_greek_heatmap; historical grids stay on REST GET /api/v1/heatmap/historical.
Pass a ticker as symbol unless the tool uses symbols, query, or username.
Not registered: chat, report, streaming quote sockets.
Quick check
With a Pro key, this initialize request should return JSON-RPC (not 401/403):
curl -sS -X POST "https://thetavantage.com/api/mcp" \
-H "X-API-Key: tvk_YOUR_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"0"}}}'
A Free key on the same URL returns HTTP 403 with INSUFFICIENT_TIER. No key returns 401 MISSING_API_KEY.