MCP Hub
Back to servers

storm-mcp

MCP server that exposes the Storm cross-venue prediction-market intelligence API, enabling LLM clients to read canonical events, spreads, venue catalog, and alerts as native tool calls.

glama
Updated
Apr 29, 2026

storm-mcp

MCP server that exposes the Storm cross-venue prediction-market intelligence API to any Model Context Protocol client.

Storm is the autonomous AI agent that operates Eyewall Markets, a cross-venue prediction-market intelligence service spanning Polymarket, Kalshi, Manifold, Futuur, Betfair, ForecastEx, and more. This package is a thin stdio MCP bridge that lets LLM clients — Claude Desktop, Claude Code, Cursor, Zed, and any other MCP-aware host — read Storm's canonical events, cross-venue spreads, venue catalog, and per-user alert inbox as native tool calls.

It is intended for analysts, traders, and agent builders who already have a Storm subscription and want their LLM workspace to see what Storm sees.


Edge-tier required

The Storm API is gated to Edge-tier subscribers ($499/mo). Generate your api_key at https://eyewallmarkets.com/account. Lower tiers do not have API access and will receive HTTP 403 from every endpoint this server calls.

API keys are formatted stk_ followed by 48 hex characters (52 characters total) and are scoped to a single account. Treat them like any other bearer credential.

The full API reference lives at https://eyewallmarkets.com/api/docs.


Quick start — Claude Desktop

Edit your Claude Desktop MCP config file and add a storm entry under mcpServers:

{
  "mcpServers": {
    "storm": {
      "command": "npx",
      "args": ["-y", "@eyewallmarkets/storm-mcp"],
      "env": {
        "STORM_API_KEY": "stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

The macOS path is:

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

Linux: ~/.config/Claude/claude_desktop_config.json · Windows: %APPDATA%\Claude\claude_desktop_config.json.

Restart Claude Desktop. The seven storm_* tools should appear in the tools list inside any new conversation.


Quick start — Claude Code

claude mcp add storm npx -- -y @eyewallmarkets/storm-mcp

Then export the API key into the environment Claude Code spawns the server in (or set it in your shell profile):

export STORM_API_KEY=stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

The exact CLI invocation may vary by Claude Code version; see the official docs at https://docs.claude.com/en/docs/claude-code/mcp for the canonical form (including how to pass env vars on the mcp add line itself).

After install, run /mcp inside Claude Code to confirm the storm server is connected and the seven tools are registered.


Quick start — Cursor

Cursor reads MCP server definitions from ~/.cursor/mcp.json. Add the same shape used for Claude Desktop:

{
  "mcpServers": {
    "storm": {
      "command": "npx",
      "args": ["-y", "@eyewallmarkets/storm-mcp"],
      "env": {
        "STORM_API_KEY": "stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  }
}

Reload Cursor's MCP integration (Settings → MCP → Refresh).


Quick start — Zed

Zed configures MCP servers under assistant.context_servers in ~/.config/zed/settings.json:

{
  "assistant": {
    "context_servers": {
      "storm": {
        "command": "npx",
        "args": ["-y", "@eyewallmarkets/storm-mcp"],
        "env": {
          "STORM_API_KEY": "stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        }
      }
    }
  }
}

Restart Zed or reload the assistant panel.


Configuration

All configuration is via environment variables read at server start.

VariableRequiredDefaultDescription
STORM_API_KEYyesEdge-tier api key, format stk_<48 hex>. Without this the server starts but every tool call fails.
STORM_API_BASEnohttps://eyewallmarkets.com/api/v1Override the API root. Useful for staging or a local dev server.
STORM_HTTP_TIMEOUTno15000Per-request timeout in milliseconds.
STORM_MCP_LOG_LEVELnoinfoOne of silent, error, warn, info, debug. Logs go to stderr so they do not corrupt the stdio MCP transport.

Tool reference

All seven tools are read-only and idempotent. Argument shapes are documented in JSON-schema-ish form below; the live schema is what the MCP client actually sees.

storm_list_events

List canonical (cross-venue) events. Cursor-paginated.

{
  "limit":    { "type": "integer", "default": 50, "max": 200 },
  "cursor":   { "type": "string",  "optional": true },
  "category": { "type": "string",  "optional": true, "example": "politics" },
  "status":   { "type": "string",  "optional": true, "enum": ["open", "closed", "resolved"] }
}

Example prompt: "List the next 20 open politics events on Storm."

storm_get_event

Fetch a single event by slug, including all linked outcomes and per-venue prices.

{
  "slug": { "type": "string", "required": true, "example": "us-pres-2028" }
}

Example prompt: "Pull the full Storm record for us-pres-2028 and tell me which outcome has the widest cross-venue spread."

storm_list_spreads

List recent cross-venue spreads where the net edge (after fees) clears the floor. Sorted by edge DESC.

{
  "min_edge_bps": { "type": "integer", "default": 100 },
  "limit":        { "type": "integer", "default": 50, "max": 200 },
  "cursor":       { "type": "string",  "optional": true }
}

Example prompt: "Show me the top 10 Storm spreads with at least 250 bps of edge right now."

storm_get_market

Look up a single venue/market record by (venue_slug, external_id).

{
  "venue":       { "type": "string", "required": true, "example": "polymarket" },
  "external_id": { "type": "string", "required": true }
}

Example prompt: "Look up Polymarket market 0xabc... on Storm."

storm_list_venues

List every venue Storm tracks, with regulatory status (CFTC-registered DCM, offshore, etc.), fee schedules, and capability flags (orderbook, AMM, parimutuel).

{}

Example prompt: "Which venues that Storm tracks are CFTC-registered DCMs?"

storm_get_alerts_inbox

Poll the user's api-channel alert inbox. Edge subscribers can route alerts to the api delivery channel; this tool drains the unack'd queue.

{
  "since": { "type": "integer", "minimum": 0, "optional": true, "example": 4521 }
}

The cursor is the integer id of the last alert you've seen. Pass next_since from the previous response to fetch only newer alerts; omit to read from the user's persisted ack cursor. Example prompt: "Poll my Storm inbox and summarise everything I haven't acked."

storm_ack_alerts

Advance the persistent ack cursor so future inbox polls skip already-handled alerts. The cursor is server-side and survives across MCP sessions.

{
  "up_to": { "type": "integer", "minimum": 0, "required": true, "example": 4530 }
}

Example prompt: "Ack all Storm alerts up to right now."


Example transcripts

Finding a high-edge spread cluster

User: Find me all 2028-election Storm spreads with edge above 300 bps and tell me the top 3.

Assistant: (calls storm_list_spreads with min_edge_bps: 300, limit: 50, filters the response by event slug prefix 2028_us_presidential_, then calls storm_get_event on the top three to enrich)

Returns the three widest 2028-election spreads currently open, the venue pair on each side, and which venue is sitting on the cheap leg.

Inbox triage

User: Poll my Storm inbox and summarise unack'd alerts, then ack everything you summarised.

Assistant: (calls storm_get_alerts_inbox with no since, summarises the items by category, then calls storm_ack_alerts with up_to set to the largest id it saw)

Returns a categorised summary of unack'd alerts (spread-edge crosses, venue-status changes, resolution events) and confirms the cursor advance so subsequent polls only return new items.


Rate limits and error handling

The Storm API enforces 10 requests per second per api key server-side. If you exceed that, the server returns HTTP 429 with Retry-After: 1. This MCP bridge does not retry automatically; it surfaces the error to the LLM as plain text content in the tool result so the model can decide whether to back off, retry, or give up.

Errors are returned to the LLM in this shape (text content on the tool result, isError: true):

Storm API error (HTTP 429, rate_limited): too many requests Retry after 1000 ms.
Storm API error (HTTP 403, edge_tier_required): edge_tier_required
Storm API error (HTTP 401, invalid_credentials): invalid_credentials

Network-level failures (DNS, TCP, TLS, timeout) surface as:

Storm API error (HTTP 0, transport): request timeout

The full HTTP status, Storm error code, and human message are always included so the LLM can act on them.


Development

git clone https://github.com/lsudduth/storm-mcp.git
cd storm-mcp
npm install
npm test

Point at a local Storm dev server by overriding the API base:

STORM_API_BASE=http://localhost:8080/api/v1 \
STORM_API_KEY=stk_dev_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
node src/index.mjs

The server speaks stdio MCP, so you can drive it directly with any MCP test harness or by piping JSON-RPC frames in by hand.

Tests use Node's built-in test runner; no Jest, no Vitest, no transpiler.


License

MIT — see LICENSE.

© 2026 XCH1TB, LLC dba Eyewall Markets.

Storm itself — the autonomous AI agent that operates Eyewall Markets and produces the data this server exposes — is a separate, internal codebase. This package is only the client-facing MCP bridge to Storm's public read-only API surface.


Disclaimer

This software and the data it surfaces are provided for informational purposes only. Nothing returned by Storm or by this MCP server is legal, financial, tax, or investment advice. Prediction-market participation is subject to your local laws and to the venue's own eligibility rules; in particular, Polymarket is restricted in the United States under CFTC orders and is not available to most US persons. Venue eligibility is your responsibility, not Storm's and not this server's. Storm aggregates publicly observable market state and does not place trades on your behalf.

Reviews

No reviews yet

Sign in to write a review