storm-mcp

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.

Category
Visit Server

README

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.

Variable Required Default Description
STORM_API_KEY yes Edge-tier api key, format stk_<48 hex>. Without this the server starts but every tool call fails.
STORM_API_BASE no https://eyewallmarkets.com/api/v1 Override the API root. Useful for staging or a local dev server.
STORM_HTTP_TIMEOUT no 15000 Per-request timeout in milliseconds.
STORM_MCP_LOG_LEVEL no info One 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.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured