# Connect Claude to a live options-analytics API over MCP (the 2-endpoint gotcha)

> Source: <https://dev.to/tomasz_dobrowolski_35d32c/connect-claude-to-a-live-options-analytics-api-over-mcp-the-2-endpoint-gotcha-3e00>
> Published: 2026-05-29 13:10:21+00:00

FlashAlpha ships **two** MCP endpoints with the same tool catalogue but different auth, and picking the wrong one is the single most common setup failure. This walks both paths and the errors you will actually hit.

FlashAlpha exposes 40 tools over the Model Context Protocol (23 live, 17 historical-replay), so you can ask Claude about gamma exposure, dealer positioning, volatility surfaces and Greeks in plain English instead of hand-rolling REST calls.

Same tools on both. Different authentication. Match the row to the client you are configuring.

| Client | URL | Auth |
|---|---|---|
| claude.ai (web) | `https://lab.flashalpha.com/mcp-oauth` |
OAuth (one-time sign-in) |
| Claude Desktop |
`https://lab.flashalpha.com/mcp-oauth` (current builds) or `https://lab.flashalpha.com/mcp`
|
OAuth, or API key on older builds |
| Claude Code (CLI) | `https://lab.flashalpha.com/mcp` |
API key per tool call |
| Cursor / Windsurf / VS Code | `https://lab.flashalpha.com/mcp` |
API key per tool call |

The one rule: **claude.ai web and current Claude Desktop builds use the -oauth endpoint and OAuth sign-in.** The CLI and editor clients (Claude Code, Cursor, Windsurf, VS Code) use the plain

`/mcp`

endpoint and you hand Claude the key in your first message. If your Desktop build is old enough that OAuth fails, fall back to `/mcp`

and the apiKey path below.Cleanest setup. Sign in once, click Allow, and Claude calls tools on your behalf with no key handling. Works on Free, Pro, Max, Team and Enterprise.

`FlashAlpha`

`https://lab.flashalpha.com/mcp-oauth`

. The `-oauth`

suffix is required.On Desktop the only difference is the callback: you get an "Open Claude?" browser dialog that deep-links back into the app. Click **Open Claude**. That is expected, not an error.

Verify with a new chat: *"What is my FlashAlpha account?"* Claude calls `get_account`

and returns your email, tier and remaining quota.

Your API key never appears in Claude on this path. The OAuth resource server resolves your account from the bearer token and forwards your stored key on the internal upstream call only.

Here each tool takes an `apiKey`

argument. Two steps: register the URL, then tell Claude the key once per chat.

**Claude Desktop config:**

`~/Library/Application Support/Claude/claude_desktop_config.json`

`%APPDATA%\Claude\claude_desktop_config.json`

```
{
  "mcpServers": {
    "flashalpha": {
      "url": "https://lab.flashalpha.com/mcp"
    }
  }
}
```

Save, then **fully quit and reopen** Claude Desktop. A reload is not enough; the config is read once at startup.

First message in a fresh chat:

```
My FlashAlpha API key is fa_xxxxxxxxxxxxxxxxxxxxxxxx.
Use it on every FlashAlpha tool call.
```

Claude holds the key for the session and passes it as `apiKey`

on every call.

**Other clients, same /mcp URL and same chat-paste pattern:**

```
# Claude Code CLI
claude mcp add flashalpha --transport http https://lab.flashalpha.com/mcp
```

`flashalpha`

, URL `https://lab.flashalpha.com/mcp`

.`{ "url": "https://lab.flashalpha.com/mcp" }`

to your MCP settings.Why is the key not in the config? Claude Desktop's HTTP-transport MCP config only supports a URL. There is no `env`

or `headers`

pass-through that maps to a tool argument, and the key is a per-tool argument. So it comes from the conversation, or you skip it entirely with the OAuth endpoint.

**"MCP Server not responding" on claude.ai.** You pasted `/mcp`

into a custom-connector dialog that needs OAuth. The `/mcp`

endpoint expects an `apiKey`

argument the browser flow never sends, so the first call hangs. Edit the connector URL to exactly `https://lab.flashalpha.com/mcp-oauth`

and reconnect. This is the one nearly everyone hits.

**"A server with this URL already exists" but nothing shows in your Connectors list.** Claude.ai recorded the URL during an earlier handshake that failed mid-flow. Try, in order: hard-refresh (Ctrl/Cmd+Shift+R) and retry Add; open claude.ai in an incognito window and Add from there; sign out and back in. If all three still error, send Anthropic support the `ofid_...`

reference from the original failure and ask them to clear the orphaned record.

**"A server with this URL already exists" and FlashAlpha is visible.** Close the dialog, click the existing entry, use **Connect** / **Reconnect**. If stuck, delete from the **...** menu and re-add.

**"apiKey is required" on Desktop.** Config is fine, Claude just has not been told the key in this chat. Paste it as your first message.

**"Unauthorized" after hours of working.** Token expired before refresh. Settings then Connectors then FlashAlpha then **Reconnect**.

**HTTP 429.** Daily quota hit (Free 5/day, Basic 100, Growth 2,500, Alpha unlimited). Reset is midnight UTC, or upgrade.

**"no_data" on get_gex, get_levels, get_volatility.** Markets are closed. Not a connector bug. Retry during US market hours.

**Desktop ignores the new config.** You reloaded instead of quitting. Cmd-Q on macOS, tray then Quit on Windows, then relaunch.

All 23 live tools work immediately. Highlights:

`get_gex`

, `get_dex`

, `get_vex`

, `get_levels`

, `get_exposure_summary`

, `get_narrative`

`get_volatility`

, `get_stock_summary`

, `calculate_greeks`

, `solve_iv`

`get_stock_quote`

, `get_tickers`

, `get_option_chain`

, `get_account`

`at=<timestamp>`

argument back to April 2018Four one-click workflow prompts also surface in the client UI: `analyze_exposure(symbol)`

, `vrp_regime_check(symbol)`

, `historical_comparison(symbol, reference_date)`

and `zero_dte_brief(symbol)`

.

A good first prompt: *"Show me the gamma exposure for SPY and tell me where the gamma flip is."*

Free tier needs only an email and password, no card: [flashalpha.com/pricing](https://flashalpha.com/pricing). The same key works on both endpoints.
