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.
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_keyat https://eyewallmarkets.com/account. Lower tiers do not have API access and will receiveHTTP 403from 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_spreadswithmin_edge_bps: 300, limit: 50, filters the response by event slug prefix2028_us_presidential_, then callsstorm_get_eventon 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_inboxwith nosince, summarises the items by category, then callsstorm_ack_alertswithup_toset to the largestidit 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
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
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.
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.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
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.
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.
E2B
Using MCP to run code via e2b.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.
Neon Database
MCP server for interacting with Neon Management API and databases
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.