storm-mcp
storm-mcp
将 Storm 跨平台预测市场情报 API 公开给任何模型上下文协议 (MCP) 客户端的 MCP 服务器。
Storm 是一个自主 AI 代理,负责运营 Eyewall Markets,这是一个涵盖 Polymarket、Kalshi、Manifold、Futuur、Betfair、ForecastEx 等平台的跨平台预测市场情报服务。此包是一个轻量级的 stdio MCP 桥接器,允许 LLM 客户端(Claude Desktop、Claude Code、Cursor、Zed 以及任何其他支持 MCP 的主机)将 Storm 的规范事件、跨平台价差、平台目录和用户个人警报收件箱作为原生工具调用进行读取。
它专为已经拥有 Storm 订阅并希望其 LLM 工作区能够看到 Storm 所见内容的分析师、交易员和代理构建者而设计。
需要 Edge 层级
Storm API 仅限 Edge 层级 订阅者(每月 499 美元)使用。请在 https://eyewallmarkets.com/account 生成您的
api_key。较低层级无法访问 API,并且此服务器调用的每个端点都将收到HTTP 403错误。
API 密钥格式为 stk_ 后跟 48 个十六进制字符(总共 52 个字符),并绑定到单个账户。请像对待其他持有者凭据一样对待它们。
完整的 API 参考文档位于 https://eyewallmarkets.com/api/docs。
Related MCP server: pmxt-mcp
快速入门 — Claude Desktop
编辑您的 Claude Desktop MCP 配置文件,并在 mcpServers 下添加一个 storm 条目:
{
"mcpServers": {
"storm": {
"command": "npx",
"args": ["-y", "@eyewallmarkets/storm-mcp"],
"env": {
"STORM_API_KEY": "stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}macOS 路径为:
~/Library/Application Support/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json· Windows:%APPDATA%\Claude\claude_desktop_config.json。
重启 Claude Desktop。七个 storm_* 工具应出现在任何新对话的工具列表中。
快速入门 — Claude Code
claude mcp add storm npx -- -y @eyewallmarkets/storm-mcp然后将 API 密钥导出到 Claude Code 启动服务器的环境中(或在您的 shell 配置文件中设置它):
export STORM_API_KEY=stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx确切的 CLI 调用可能因 Claude Code 版本而异;请参阅 https://docs.claude.com/en/docs/claude-code/mcp 上的官方文档以获取规范形式(包括如何在 mcp add 行本身上传递环境变量)。
安装后,在 Claude Code 中运行 /mcp 以确认 storm 服务器已连接且七个工具已注册。
快速入门 — Cursor
Cursor 从 ~/.cursor/mcp.json 读取 MCP 服务器定义。添加与 Claude Desktop 相同的配置:
{
"mcpServers": {
"storm": {
"command": "npx",
"args": ["-y", "@eyewallmarkets/storm-mcp"],
"env": {
"STORM_API_KEY": "stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}重新加载 Cursor 的 MCP 集成(设置 → MCP → 刷新)。
快速入门 — Zed
Zed 在 ~/.config/zed/settings.json 中的 assistant.context_servers 下配置 MCP 服务器:
{
"assistant": {
"context_servers": {
"storm": {
"command": "npx",
"args": ["-y", "@eyewallmarkets/storm-mcp"],
"env": {
"STORM_API_KEY": "stk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
}
}重启 Zed 或重新加载助手面板。
配置
所有配置均通过服务器启动时读取的环境变量进行。
变量 | 必需 | 默认值 | 描述 |
| 是 | — | Edge 层级 API 密钥,格式为 |
| 否 |
| 覆盖 API 根路径。对暂存环境或本地开发服务器很有用。 |
| 否 |
| 每次请求的超时时间(毫秒)。 |
| 否 |
|
|
工具参考
所有七个工具都是只读且幂等的。参数形状在下方的 JSON-schema 形式中记录;实时架构是 MCP 客户端实际看到的内容。
storm_list_events
列出规范(跨平台)事件。支持游标分页。
{
"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"] }
}示例提示:“列出 Storm 上接下来的 20 个开放政治事件。”
storm_get_event
通过 slug 获取单个事件,包括所有关联的结果和各平台的报价。
{
"slug": { "type": "string", "required": true, "example": "us-pres-2028" }
}示例提示:“拉取 us-pres-2028 的完整 Storm 记录,并告诉我哪个结果具有最宽的跨平台价差。”
storm_list_spreads
列出净优势(扣除费用后)超过底线的近期跨平台价差。按优势降序排列。
{
"min_edge_bps": { "type": "integer", "default": 100 },
"limit": { "type": "integer", "default": 50, "max": 200 },
"cursor": { "type": "string", "optional": true }
}示例提示:“向我展示目前至少有 250 bps 优势的前 10 个 Storm 价差。”
storm_get_market
通过 (venue_slug, external_id) 查找单个平台/市场记录。
{
"venue": { "type": "string", "required": true, "example": "polymarket" },
"external_id": { "type": "string", "required": true }
}示例提示:“在 Storm 上查找 Polymarket 市场 0xabc...。”
storm_list_venues
列出 Storm 跟踪的每个平台,包括监管状态(CFTC 注册的 DCM、离岸等)、费用表和能力标志(订单簿、AMM、平分彩)。
{}示例提示:“Storm 跟踪的哪些平台是 CFTC 注册的 DCM?”
storm_get_alerts_inbox
轮询用户的 API 通道警报收件箱。Edge 订阅者可以将警报路由到 api 交付通道;此工具会清空未确认的队列。
{
"since": { "type": "integer", "minimum": 0, "optional": true, "example": 4521 }
}游标是您看到的最后一个警报的整数 id。从上一个响应中传递 next_since 以仅获取较新的警报;省略则从用户持久化的确认游标读取。示例提示:“轮询我的 Storm 收件箱并总结我尚未确认的所有内容。”
storm_ack_alerts
推进持久化确认游标,以便未来的收件箱轮询跳过已处理的警报。游标位于服务器端,并在 MCP 会话之间保持有效。
{
"up_to": { "type": "integer", "minimum": 0, "required": true, "example": 4530 }
}示例提示:“确认截至目前的所有 Storm 警报。”
示例记录
查找高优势价差集群
用户: 帮我找到所有优势超过 300 bps 的 2028 年选举 Storm 价差,并告诉我前 3 名。
助手: (调用
storm_list_spreads,参数为min_edge_bps: 300, limit: 50,按事件 slug 前缀2028_us_presidential_过滤响应,然后对前三个调用storm_get_event进行丰富)返回当前开放的三个最宽的 2028 年选举价差、每一侧的平台对,以及哪个平台处于低价端。
收件箱分类
用户: 轮询我的 Storm 收件箱并总结未确认的警报,然后确认你总结的所有内容。
助手: (调用不带
since的storm_get_alerts_inbox,按类别总结项目,然后调用up_to设置为它看到的最大的id的storm_ack_alerts)返回未确认警报的分类摘要(价差优势交叉、平台状态更改、解析事件)并确认游标推进,以便后续轮询仅返回新项目。
速率限制和错误处理
Storm API 在服务器端强制执行 每个 API 密钥每秒 10 次请求。如果您超过该限制,服务器将返回带有 Retry-After: 1 的 HTTP 429。此 MCP 桥接器不会自动重试;它将错误作为工具结果中的纯文本内容呈现给 LLM,以便模型可以决定是退避、重试还是放弃。
错误以这种形式返回给 LLM(工具结果上的文本内容,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_requiredStorm API error (HTTP 401, invalid_credentials): invalid_credentials网络级故障(DNS、TCP、TLS、超时)显示为:
Storm API error (HTTP 0, transport): request timeout完整的 HTTP 状态、Storm 错误代码和人类可读的消息始终包含在内,以便 LLM 可以据此采取行动。
开发
git clone https://github.com/lsudduth/storm-mcp.git
cd storm-mcp
npm install
npm test通过覆盖 API 根路径指向本地 Storm 开发服务器:
STORM_API_BASE=http://localhost:8080/api/v1 \
STORM_API_KEY=stk_dev_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx \
node src/index.mjs服务器使用 stdio MCP,因此您可以使用任何 MCP 测试工具直接驱动它,或者手动通过管道传输 JSON-RPC 帧。
测试使用 Node 内置的测试运行器;没有 Jest,没有 Vitest,没有转译器。
许可证
MIT — 参见 LICENSE。
© 2026 XCH1TB, LLC dba Eyewall Markets。
Storm 本身——运营 Eyewall Markets 并生成此服务器所公开数据的自主 AI 代理——是一个独立的内部代码库。此包仅是通往 Storm 公共只读 API 表面的面向客户端的 MCP 桥接器。
免责声明
本软件及其呈现的数据仅供 参考。Storm 或此 MCP 服务器返回的任何内容均非法律、财务、税务或投资建议。参与预测市场受您当地法律和平台自身资格规则的约束;特别是,Polymarket 在美国受 CFTC 命令限制,大多数美国人无法使用。平台资格是您的责任,而不是 Storm 或本服务器的责任。 Storm 聚合了可公开观察的市场状态,不会代表您进行交易。
Available Tools
7 toolsstorm_ack_alertsA
Advance the persistent ack cursor to the given sequence id, removing items at or below it from the api-channel inbox. Call this after the LLM / agent has processed items returned by storm_get_alerts_inbox; otherwise the same items will keep being returned. Sourced from Eyewall Markets / Storm. The cursor is server-side and survives across MCP sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| up_to | Yes | Ack all alerts with sequence id <= up_to. Use the highest id seen in storm_get_alerts_inbox. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the cursor is persistent, server-side, survives sessions, and that items are removed. This is sufficient for a mutation tool of this complexity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences cover action, usage, and persistence. Every sentence adds necessary information with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple acknowledgment tool with one parameter and no output schema, the description covers behavior, usage context, and parameter guidance. Minor gap: does not mention any potential side effects, but overall complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and schema already describes the parameter. The description adds value by advising to use the highest id seen in storm_get_alerts_inbox, which is practical guidance beyond the raw schema definition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('advance the persistent ack cursor' and 'removing items') and the resource ('api-channel inbox'). It distinguishes itself from the sibling tool storm_get_alerts_inbox by focusing on acknowledgment and removal.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly instructs to call this after processing items from storm_get_alerts_inbox to avoid duplicates. It provides clear context on when to use, though it does not elaborate on when not to use or list alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storm_get_alerts_inboxA
Poll the subscriber's api-channel notification inbox for cross-venue price-difference and event notifications that haven't been ack'd yet. Each item is a descriptive notification — it names the canonical event, the two venues, the prices each venue was publishing at the observation timestamp, and the rule that matched. Sourced from Eyewall Markets / Storm. Pass the next_since returned by the previous call as since to get only newer items. After processing, call storm_ack_alerts to advance the persistent cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Only return alerts with sequence id strictly greater than this. Defaults to 0 (full inbox). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of explaining behavior. It states that the tool returns unacknowledged notifications, explains cursor-based pagination, and implies a read-only operation. It does not mention rate limits or other details, but the core behavioral traits are well covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise at three sentences, each serving a distinct purpose: purpose explanation, content description, and usage pattern with next steps. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, no output schema, no annotations) and the complexity of the polling pattern, the description is fully complete. It explains the tool, pagination, and the required follow-up action, leaving no critical gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'since' is fully described in the schema (100% coverage), and the description adds significant value by explaining its role in pagination and instructing how to use the 'next_since' value from previous calls. This goes beyond the schema's basic constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the tool's purpose: to poll the subscriber's api-channel notification inbox for unacknowledged cross-venue price-difference and event notifications. It names the verb 'poll', the resource 'inbox', and details the content of each notification, distinguishing it from the related 'storm_ack_alerts' tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on pagination (using 'next_since' from previous call as 'since') and directs users to call 'storm_ack_alerts' after processing to advance the cursor. While it doesn't explicitly state when not to use the tool, the context is clear and the alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storm_get_eventA
Fetch a single canonical event by its Storm slug, including the full set of cross-venue markets attached to that event and each venue's currently published price. Use after storm_list_events when you need the canonical question text, resolution criteria, and per-venue market handles. Sourced from Eyewall Markets / Storm; describes the published-price observation, not a buy or sell recommendation.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Storm event slug, e.g. 'will-fed-cut-rates-by-2026-q3'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description implies read-only fetch and adds context that data is observational, not advisory. However, it does not disclose any side effects, auth needs, or limitations beyond that.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two succinct sentences: first defines action and scope, second provides usage guidance and disclaimer. No redundant text; all information is relevant and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple input and lack of output schema, the description covers core purpose, usage context, and key outputs (question text, resolution criteria, market handles). Missing exact response structure but acceptable for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a well-described parameter. The description does not add significant meaning beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches a single canonical event by slug, including markets and prices. It distinguishes from sibling 'storm_list_events' by specifying it's for detailed event data after listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly suggests using after storm_list_events and states the need for canonical question text, resolution criteria, and market handles. Includes disclaimer that it's observation, not a recommendation, but does not explicitly mention alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storm_get_marketA
Fetch the canonical Storm view of a single market on a specific venue, including the venue's currently published bid/ask, volume, and the canonical event it's joined to. Use when you have a venue + the venue's native market id (e.g. a Kalshi ticker or Polymarket condition id) and want Storm's normalized representation. Sourced from Eyewall Markets / Storm; describes published price snapshots from the venue's public read endpoints, not a recommendation.
| Name | Required | Description | Default |
|---|---|---|---|
| venue | Yes | Venue slug, e.g. 'kalshi' or 'polymarket'. See storm_list_venues. | |
| external_id | Yes | The venue's native market identifier (Kalshi ticker, Polymarket condition id, etc.). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description states it fetches from public read endpoints and is not a recommendation, indicating a safe read operation. Could mention if real-time or cached, but still good.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose, no unnecessary words. Efficiently conveys all essential information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, description adequately covers return fields (bid/ask, volume, canonical event) and notes it's not a recommendation. Sufficient for simple two-parameter tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with clear explanations for venue and external_id. The description reinforces the usage but doesn't add significant new constraints or examples beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches the canonical Storm view of a single market, including bid/ask, volume, and associated event. It distinguishes itself from sibling tools like storm_list_events and storm_get_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when you have a venue + the venue's native market id', providing clear conditions. Also references storm_list_venues for obtaining the slug, guiding the agent on prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storm_list_eventsA
List canonical prediction-market events (questions/topics) tracked by Eyewall Markets / Storm across the public venues it covers (Kalshi, Polymarket, Manifold, ForecastEx, and others). Use this to discover what events exist before drilling into a specific event with storm_get_event. Supports filtering by category (e.g. 'politics', 'economics') and status (e.g. 'open', 'resolved'), and is cursor-paginated. Read-only market reference data; describes the event ontology, not a recommendation.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size (1-100). Default server-side is typically 25. | |
| cursor | No | Opaque pagination cursor returned in next_cursor from a previous call. | |
| category | No | Filter to a single category slug, e.g. 'politics'. | |
| status | No | Filter by event status, e.g. 'open' or 'resolved'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description declares 'Read-only market reference data' and mentions cursor-pagination. Lacks details on rate limits or auth, but sufficient for basic safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, front-loaded with purpose, each sentence adds value (use case, filtering, pagination, read-only nature). No fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description mentions cursor-paginated results. Could specify return fields, but adequate for discovering events before drilling down.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description adds examples for category and status, but no deeper semantics beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists prediction-market events with specific venues (Kalshi, Polymarket, etc.), uses the verb 'list' and resource 'events', and distinguishes from sibling tool storm_get_event.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to discover what events exist before drilling into a specific event with storm_get_event', providing a clear use case and alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storm_list_spreadsA
List recent cross-venue published-price observations — pairs of markets on different venues that are publishing different prices for the same canonical outcome. Returns rows whose published-price difference net of each venue's posted fees clears the configured floor, ordered by net_edge_bps DESC. Sourced from Eyewall Markets / Storm. Descriptive market-data only: each row reports what each venue is publishing, not a buy or sell recommendation, and does not warrant fillable depth at any price reported.
| Name | Required | Description | Default |
|---|---|---|---|
| min_edge_bps | No | Minimum published-price difference net of venue fees, in basis points (1 bp = 0.01%). E.g. 50 returns only rows whose net_edge_bps is >= 50. Defaults to the server-side floor. | |
| limit | No | Page size (1-100). | |
| cursor | No | Opaque pagination cursor returned in next_cursor from a previous call. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully discloses behavioral traits: lists recent observations, filters by configured floor, orders by net_edge_bps descending, and emphasizes that data is descriptive and non-actionable. This covers safety and operational expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise—two sentences that front-load the primary purpose in the first sentence and add behavioral caveats in the second. No extraneous words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (3 parameters, no output schema), the description covers key aspects: what is returned, ordering, and behavioral constraints. However, it does not mention pagination handling (cursor/next_cursor) explicitly, leaving that to the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds value by explaining min_edge_bps with an example and mentioning server-side floor default. However, for 'limit' and 'cursor', no additional semantic context is provided beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'cross-venue published-price observations', and distinguishes this tool from siblings like storm_list_events and storm_list_venues by specifying its unique function of identifying pricing disparities between venues.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states the tool's purpose and clarifies that it provides descriptive market data only, not buy/sell recommendations or depth warranties. However, it does not explicitly mention when not to use this tool or provide direct alternatives beyond sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
storm_list_venuesA
List all public prediction-market venues covered by Eyewall Markets / Storm, with their slugs, display names, regulatory posture (CFTC-registered DCM, offshore, etc.), posted fee schedules, capability flags (orderbook / AMM / parimutuel), and current ingestion status. Call this first when you need the venue slug to pass to storm_get_market. Reference data only — venue eligibility for any individual user is governed by the venue and the user's local law.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full burden. It discloses the tool is reference data only and lists the kind of data returned, which is sufficient for a read-only tool with no side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the action and output, every sentence adds value without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description thoroughly enumerates return fields (slugs, display names, regulatory posture, etc.) and clarifies it's reference data, making it complete for agent use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so baseline is 4. The description adds meaning by explaining what the output contains, compensating for the empty schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List all public prediction-market venues') and specifies the output fields, distinguishing it from siblings like storm_get_market which needs a slug.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs 'Call this first when you need the venue slug to pass to storm_get_market', providing clear when-to-use guidance and noting that eligibility is governed by venue and local law.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
7 tool updates
v0.1.2- First observed
storm_ack_alerts - First observed
storm_get_alerts_inbox - First observed
storm_get_event - First observed
storm_get_market - First observed
storm_list_events - First observed
storm_list_spreads - First observed
storm_list_venues
TDQS
Scored across 7 tools
Each tool targets a distinct action or resource: acking alerts, polling inbox, fetching events/markets, listing events/spreads/venues. No two tools have overlapping purposes, and descriptions clearly differentiate them.
All tools follow a consistent 'storm_verb_noun' pattern in snake_case, with verbs like ack, get, list. This makes it easy for an agent to infer functionality from names.
7 tools is a well-scoped set for a prediction market data server. Each tool serves a necessary function without unnecessary duplication or gaps, covering discovery, detailed queries, and notification management.
The tool set covers the full lifecycle: discovering events (list), drilling into details (get), accessing markets (get), monitoring spreads and alerts, acknowledging alerts, and listing venues. No obvious missing operations for the stated purpose.
Maintenance
Related MCP Connectors
Hosted MCP for Kalshi prediction markets: search, odds, order books, settlement rules, and trading.
- UnifAPIOAuthcom.unifapi
Hosted MCP server for live public-data APIs and Skills for AI agents.
MCP server exposing the Backtest360 engine API as tools for AI agents.
MCP server for OpenMM — exposes market data, account, trading, and strategy tools to AI agents
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP-compatible server that gives AI agents access to alternative sports data across 30+ leagues — odds, events, probabilities, settlement, and futures for prediction markets, DFS platforms, and sportsbooks.294 npmMIT
- AlicenseCqualityCmaintenanceMCP server that provides a unified prediction market API for multiple venues like Polymarket and Kalshi, allowing AI agents to discover markets, fetch order books, and execute trades through a single interface.3246 npm8MIT
- FlicenseNot gradedqualityDmaintenanceMCP server that exposes Polymarket prediction markets via CLI wrapper. Enables AI agents to discover markets, check prices, and place trades programmatically.-
- AlicenseNot gradedqualityCmaintenanceMCP server for querying and optionally trading across prediction markets (Polymarket, Kalshi, Limitless, Manifold) through a unified API.31MIT