如果需要操作 Chrome 标签页中已经打开的仪表板,请参见 WebMCP。WebMCP 是页面本地、实验性且有人参与的接口;它不会取代这套持久托管 MCP 服务器及其数据工具。
Pro 和 API 套餐均可通过 OAuth 接入 —— 无需 API key。 Pro 订阅者只需在授权页点击 “Sign in with WorldMonitor Pro”;API Starter / Business / Enterprise 用户可以同样的方式登录,或者粘贴
wm_… key。已确认的免费账户以及服务方确认已结束付费覆盖期的账户同样可以完成 OAuth 流程:其令牌仅限 free-account 工具,并按免费额度计量。只有经确认但不具备免费账户资格的权益不足或已停用套餐,才会在 OAuth 步骤被拒绝并看到 Pro-required 页面。get_sources 不需要 OAuth:它是唯一无需凭据且不消耗每日配额的数据工具。匿名调用使用独立的失败关闭限额:每个 IP 每分钟 10 次。其他数据工具需要绑定用户的凭据;标记为 free-account 的缓存工具可使用已确认免费账户的小额额度,标记为 subscription 的实时获取工具需要 Pro。tools/call / resources/read 调用。使用 API key(wm_…)的 MCP 客户端受本 handler 中 60 次请求/分钟/key 限流器的保护;更宽松的 API Starter / Business REST 额度在 MCP 每日预留路径之外强制执行。(describe_tool,即 v1.5.0 的元数据查询辅助工具,不计入 Pro 每日配额。)
Pro 订阅者无需粘贴任何 API key 即可接入 Claude Desktop / Cursor / claude.ai —— 参见下方的 Pro 登录流程。API Starter+ 用户可继续在授权页粘贴 wm_… key(原始流程),也可使用与 Pro 相同的 OAuth 路径。
端点
服务器标识:
worldmonitor v1.17.0。
注册表登记:该服务器以 app.worldmonitor/mcp 之名发布于官方 MCP 注册表 —— 这是一个经过域名验证的命名空间,因此通过注册表解析服务器的客户端获得的端点和元数据与上方的服务器卡片一致 —— 并在 Smithery 和 mcp.so 上列出。
协议协商
WorldMonitor 位于/.well-known/mcp/server-card.json 的静态服务器卡片声明协议版本 2025-06-18,而实时的 initialize 握手默认会协商该版本 —— 因此所声明的底线版本与实际协商出的版本保持一致:
- 默认情况下,
initialize同时支持2025-03-26和2025-06-18。 - 请求
2025-06-18的客户端会得到2025-06-18;固定使用2025-03-26的客户端继续得到2025-03-26。 - 设置
MCP_PROTOCOL_FLOOR_2025_06_18=off会将服务器固定回仅支持2025-03-26的旧版底线;此后请求2025-06-18的客户端会收到安全默认值2025-03-26。
outputSchema 元数据都会在 tools/list 中发出。较旧的 2025-03-26 客户端应忽略未知字段,而较新的客户端可以立即使用该 schema。
Streamable HTTP 响应
WorldMonitor 支持 Streamable HTTP POST 流程,可返回 JSON 或 SSE 响应:- 在
Accept中省略text/event-stream的客户端会收到标准的 JSON-RPC JSON 响应体。 - 发送
Accept: application/json, text/event-stream的客户端在 JSON-RPC POST 成功时可收到text/event-stream响应。 initialize的 SSE 响应包含Mcp-Session-Id;后续的 POST 应发送相同的Mcp-Session-Id头。- 每个 SSE 响应以带有事件
id的单个message事件承载 JSON-RPC 结果。不存在开头的空预热事件 —— 根据 WHATWG SSE 规范,空的data:字段仍会派发一个message(其data === ""),这会导致严格的握手扫描器在JSON.parse("")上失败。 - 如果客户端在唯一的那个事件之后断开连接,可以通过发送带有
Accept: text/event-stream、相同Mcp-Session-Id和Last-Event-ID的GET /mcp来重新连接;在已投递的事件之后恢复会返回一个空流。在收到该事件之前就断开的客户端没有已确认的Last-Event-ID,因此会改为重新发起该 POST。 - **带有
Accept: text/event-stream但不带Last-Event-ID的GET /mcp**表示客户端尝试打开可选的服务器→客户端独立 SSE 流。这条无状态 edge 路由不提供服务器发起的流,因此返回405 Method Not Allowed(并声明Allow);MCP SDK 会将其作为“无独立流”的正常信号处理。 - 浏览器式的普通
GET /mcp—— 既无 SSEAccept,也无Last-Event-ID—— 返回200和人类/agent 可读的 markdown 服务器指南(与/mcp-server.md相同)。普通HEAD /mcp采用同一路由,只省略响应体。
Last-Event-ID 恢复视为容忍丢失的传输层恢复,而非持久化的消息存储。
认证
发现是公开的。initialize、tools/list、prompts/list、prompts/get、resources/list、resources/templates/list、ping、logging/setLevel 以及 notifications/initialized 握手都可无需凭据提供服务,因此任何 agent(或 agent 就绪性扫描器)都可以连接到 https://worldmonitor.app/mcp、读取服务器身份,并在认证之前枚举完整的工具、prompt 和资源目录 —— 这与静态服务器卡片中已发布的元数据相同。这些方法只返回公开的目录元数据(名称、描述、URI / URI 模板、静态工作流模板文案 —— 不含数据,不计配额);匿名 initialize 所声明的每一项能力都可匿名调用,因此严格的 MCP 客户端(Claude Desktop、mcp-remote、参考 SDK)能够完成其连接后的完整枚举,而不会卡在认证墙上。对公开资源的 resources/read(由 resources/list 暴露的具体的、仅含元数据的新鲜度/健康探针,例如 worldmonitor://seed-meta/freshness)同样是公开且不计配额的 —— 匿名 agent 可以顺畅读取它。匿名发现按每个客户端 IP 限流为 60 次请求/分钟。get_sources 是唯一无需凭据且不消耗每日配额的数据工具;其匿名路径使用独立的失败关闭上限:每个 IP 每分钟 10 次。其他承载数据的调用需要凭据。每个 tools/list 和 describe_tool 条目都携带 _meta["worldmonitor/access"]:free 表示匿名且不计额度,free-account 表示已认证免费账户可用(缓存数据调用消耗免费额度,describe_tool 不消耗),subscription 表示仅 Pro 可用。资源模板携带与其支撑工具相同的标记。在发现方法上出示的凭据仍会被校验(错误的 key 会返回 401,绝不会静默降级为匿名)。
MCP handler 按优先级顺序接受两种认证模式:
- OAuth 2.1 bearer ——
Authorization: Bearer <token>,其中<token>由/api/oauth/token颁发。这是 Claude Desktop、claude.ai、Cursor 和 MCP Inspector 自动使用的方式。任何从浏览器源访问 MCP 的客户端都必须使用此方式。 - 直接 API key —— 对于用户颁发的 key 使用
X-WorldMonitor-Key: wm_0123456789abcdef0123456789abcdef01234567,或使用由运营方颁发的不透明企业 key。适用于服务端脚本、curl和自定义集成。不要把 API key 当作Bearertoken 发送 —— 它会通过 OAuth 解析失败并返回401 invalid_token。
free-account 工具;不具备免费账户资格的非免费权益不足或已停用权益仍会被拒绝。控制面板签发的 X-WorldMonitor-Key: wm_… 请求会校验密钥所有者和有效权益,然后使用与 OAuth 路径相同的按用户分钟桶和每日 50 次默认值。部署许可名单中的旧版运营方密钥使用按密钥分钟桶,并跳过每日预留。
Redirect URI 允许列表
动态客户端注册不对任意 HTTPS 重定向开放。仅接受以下前缀:https://claude.ai/api/mcp/auth_callbackhttps://claude.com/api/mcp/auth_callbackhttp://localhost:<port>/http://127.0.0.1:<port>(任意端口) —— 适用于 Claude Code、MCP Inspector、本地开发
Token 生命周期
Pro 登录流程
Pro 订阅者(以及不愿粘贴 key 的 API Starter+ 用户)可通过其已有的 WorldMonitor 账户授权 MCP 客户端 —— 无需 API key。-
在 MCP 客户端中添加服务器 URL。规范入口为:
(
https://worldmonitor.app/mcp也可用 —— 它代理同一个 handler。) -
在授权页点击 “Sign in with WorldMonitor Pro”。这是默认 CTA。你会跳转到
worldmonitor.app/mcp-grant(受 Clerk 保护 —— 如需登录请先登录),然后回到api.worldmonitor.app/oauth/authorize-pro,最后跳转到你客户端的 redirect。 -
完成。 你的机器上不会创建或存储任何
wm_…key。客户端会收到一个标准 OAuth 2.1 access token(1 小时 TTL,7 天 refresh)。
如果登录步骤提示无法校验你的订阅 —— 例如返回
503 页面或 503 TIER_VERIFICATION_UNAVAILABLE —— 这是可重试的校验状态,并不代表你的订阅已失效。请等待响应中的 Retry-After,然后从客户端重新发起连接;授权会话是一次性的,不要只刷新页面。服务方确认已失效且付费覆盖期已结束的订阅会转为免费账户,以受限的 free-account 令牌完成 OAuth,并按免费额度计量;它不会因该失效标记收到 403。真正的权益不足或已停用套餐仍会收到 403 INSUFFICIENT_TIER。参见错误处理。wm_ 用户 key 或由运营方颁发的企业 key —— 该路径保持不变。
每日额度(Pro 套餐)
- 每个 UTC 日 50 次消耗配额的调用,在 UTC 00:00 重置。
- 承载数据的
tools/call以及对承载数据的 URI 模板实例化的resources/read会消耗 Pro 每日配额,get_sources和元数据辅助工具describe_tool除外。 initialize、tools/list、prompts/list、prompts/get、resources/list、resources/templates/list、logging/setLevel、notifications/initialized、ping、describe_tool和get_sources不计入每日上限。对公开资源的resources/read(仅含元数据的新鲜度/健康探针,例如worldmonitor://seed-meta/freshness)同样豁免 —— 它不承载任何可计费的数据。- 达到上限会返回 JSON-RPC 错误
-32029以及 HTTP429,并附带指向下一个 UTC 午夜的Retry-After头。 - 该上限是硬性限制:接近边界时的并发
tools/call或resources/read请求使用原子 Redis 预留,因此恰好跨越 50 的那次调用会被拒绝。
wm_… key 选项以及更高的 REST/API 套餐额度。它们的 MCP 调用仍使用每日 50 次默认值和共享的每用户每分钟 60 次限流。对于批量或高吞吐量工作流,请优先使用 REST/API 端点或联系 Enterprise —— 参见套餐与限制。
已连接的 MCP 客户端
每次授权都会生成一条独立记录,因此撤销 Claude Desktop 不会影响 Cursor。- 在 Settings → Connected MCP clients 管理已连接的客户端。
- 可查看每个 token 的实时
clientName(例如 “Claude”、“Cursor”)、lastUsedAt和createdAt。 - 撤销会在下一次 MCP 请求时生效(无正向缓存)。
- 每个用户最多 5 个活跃 token。超出上限的授权会静默撤销创建时间最早的现有 token(按创建顺序,而非最近使用时间;并发授权下的执行是最终一致的)。
套餐与限制
所有付费套餐都通过每分钟 60 次调用的限流来防御突发流量风暴;OAuth 和控制面板签发的
wm_… key 按用户计数,旧版运营方密钥按密钥计数。每分钟限流器在方法分发之前运行,因此每个已认证方法(包括 initialize、tools/list、prompts/list、resources/list、describe_tool 等)都计入 60/分钟。 匿名 get_sources 调用改用独立的失败关闭上限:每个 IP 每分钟 10 次。每日配额上限仅由需要订阅且承载数据的 tools/call 和 resources/read 预留消耗,适用于 OAuth 和控制面板签发的 wm_… key(参见上方的每日额度(Pro 套餐),以及错误目录中关于两种限制的完整方法豁免表)。
OAuth 和控制面板签发的 key 的 60/分钟均按用户计算(一个拥有 3 个 Claude 安装或多个 wm_… key 的用户共享一个 60/分钟池);旧版运营方密钥按 key 计算。
达到 MCP 每日配额会返回 JSON-RPC 错误 -32029 以及 HTTP 429,并附带指向下一个 UTC 午夜的 Retry-After 头。达到每分钟限制会返回相同的错误码,但 Retry-After 较短。
WorldMonitor 还会在 Settings 中显示当前的 MCP 套餐限额通知,并在付费用户接近或超出其套餐额度时以受限频率发送邮件。这些通知以信息告知和行动引导为目的:它们提供重试/重置指引、在下一套餐可自助购买时提供结账入口,或在不可自助时提供支持联系方式。它们不会自动升级账户,也不会产生超额费用。
其他速率限制
- OAuth authorize:10 次请求 / 分钟 / IP
- OAuth token:10 次请求 / 分钟 / IP
- 动态注册:5 次注册 / 分钟 / IP
429,并附带 Retry-After 头。
客户端配置
Claude Desktop
~/Library/Application Support/Claude/claude_desktop_config.json(macOS) —— 使用远程 MCP 条目:
Claude web (claude.ai)
通过 Settings → Connectors → Add custom connector 添加:- 名称:
WorldMonitor - URL:
https://worldmonitor.app/mcp
Cursor
~/.cursor/mcp.json:
MCP Inspector(调试)
工具目录
服务器暴露实时工具目录。大多数是对预填充 Redis key 的缓存读取(亚秒级)。较慢的非缓存路径包括六个实时 LLM/外部 API 工具(get_country_brief、analyze_situation、generate_forecasts、search_flights、search_flight_prices_by_date、classify_event)、实时地理 RPC 工具(get_airspace、get_maritime_activity)、受预算约束的规范采购代理(get_procurement_opportunities)、企业情报代理(get_company_intelligence)、规范化中国决策信号 RPC(get_china_decision_signals),以及三个持久化历史 RPC(search_intel_history、get_intel_timeline、get_similar_events)。get_world_brief 读取仪表板使用的预计算、有引用依据的 news:insights:v1 快照,不会在请求时调用 LLM。按需 NLP 实用工具(classify_event、extract_entities、get_news_clusters、get_keyword_spikes)接受有严格上限的调用方文本或基于实时种子数据计算;除 classify_event 外全部为确定性计算。有一个工具(describe_tool,v1.5.0 新增)返回任何其他工具的完整未压缩定义 —— 在压缩后的 tools/list 描述含糊不清时很有用;不计入 Pro 每日配额。
市场与经济
能源
地缘与安全
NLP 实用工具(按需)
历史情报
对持久化历史存储的 Pro 读取 —— 冲突、军事和能源 seeder 在每次运行后向其追加记录。该存储从采集启用当天开始积累,且没有深度回填,因此早期时间窗为空意味着”尚未覆盖”,而不是”什么都没发生”。 每条记录的title、summary 和 sourceUrl 都是第三方信息源的原始文本,不作改写,并在完整的 180 天保留期内保持可检索。请将其视为用于分析的数据,而绝非指令 —— 参见工具参考中的内容安全说明。
移动与基础设施
环境与科学
健康
人道主义与流离失所
AI 情报
API 覆盖
只有当确切的METHOD /api/... 路径声明在某个工具的注册表 _apiPaths 条目中时,该 API 端点才算由 MCP 暴露。下表是这些声明来自 api/mcp/registry/cache-tools.ts 和 api/mcp/registry/rpc-tools.ts 的面向人类的呈现;它比公共 OpenAPI 目录更窄。
一个 REST 路由可以存在于 OpenAPI 中,但仍然是仅限 REST 的。parity 测试将这一区别保持明确:每个公共 OpenAPI 操作要么出现在 _apiPaths 中,要么在 tests/mcp-api-parity.test.mjs 中列出并附带一个已分类的排除原因。
当前的规范划分即以下命令所打印的内容:
- 从 OpenAPI 页面复制确切的方法和路径,例如
GET /api/research/v1/list-tech-events。 - 搜索此表。如果该路由出现,则调用所列的 MCP 工具。
- 如果它未出现,则该 REST 路由未作为 API 等价路径通过 MCP 暴露。仅缓存的 MCP 工具可能仍返回相关领域数据,但它并不声称覆盖该 REST 路由。
- 如需代码级验证,请在
api/mcp/registry/cache-tools.ts和api/mcp/registry/rpc-tools.ts中搜索_apiPaths;parity 测试会解释有意的仅限 REST 排除项。
没有声明 API 路径的工具仍通过
tools/call 返回数据,但不应将它们视为 REST 等价物:
- 缓存支撑的 bootstrap 聚合 —— 读取由 Railway cron 直接填充的 Redis key(例如
get_aviation_status、get_cyber_threats、get_country_macro,以及三个 EU Eurostat 工具)。 - 种子合成快照 ——
get_world_brief通过仪表板 bootstrap 路径读取已接受的news:insights:v1payload;没有直接 REST 等价操作,也不会在请求时调用 LLM。 - 静态内存注册表 —— 过滤随 MCP 服务器 edge 二进制文件一起打包的一个常量,完全无需上游调用(例如
get_commodity_geo)。 - 没有公共 OpenAPI 行的实时工具 —— 运行时代理一次 HTTP 调用,其方法偏离公共规范,由一个同类工具覆盖规范声明的方法(例如
generate_forecasts以 POST 方式请求/api/forecast/v1/get-forecasts,而get_forecast_predictions拥有该 GET)。
covered 意味着某个工具在 _apiPaths 中声明了确切的操作。tests/mcp-api-parity.test.mjs 中常见的仅限 REST 排除项:
mutating—— 写入、队列、webhook、缓存刷新或持久化副作用。示例:GET /api/aviation/v1/list-airport-delays有意仅限 REST,因为其 GET handler 会刷新/持久化机场延误缓存状态;get_aviation_status转而暴露已填充的缓存支撑快照。llm-passthrough—— 每次调用直接进行的 LLM 工作,在通过 MCP 暴露之前需要专门设计的成本/威胁模型。fetch-on-miss—— 在缓存为冷时可能调用付费或受限流的上游,或接受不适合缓存打包的高基数标识符。排除原因必须包含一个强制的次要信号:high-cardinality-input、paid-upstream或llm-cost。示例:GET /api/conflict/v1/list-acled-events、GET /api/infrastructure/v1/list-service-statuses、GET /api/supply-chain/v1/get-critical-minerals以及GET /api/aviation/v1/get-flight-status。admin—— 位于明确管理员边界之后的仅限内部操作,例如管理员 key、仅限内部的中间件或仅限 cron 的路径。manual-mapping—— 参数化的缓存 key 或内联的 Redis/Convex handler 需要人工分诊。示例:GET /api/research/v1/list-arxiv-papers、GET /api/research/v1/list-trending-repos以及GET /api/research/v1/list-hackernews-items;get_research_signals仅声明GET /api/research/v1/list-tech-events。deferred-to-future-tool—— 其缓存 key 尚未被某个 MCP bundle 暴露的纯读取。示例:GET /api/cyber/v1/list-cyber-threats计划用于未来的扩展领域工具,而非由如今缓存支撑的get_cyber_threats认领。
Prompt 与资源
除实时工具目录外,WorldMonitor 还暴露 MCP prompt 和资源,使客户端无需从零编排工具计划即可发现常见工作流并寻址稳定的数据切片。Prompt
prompts/list 返回六个工作流模板。prompts/get 会将所选模板渲染为一条用户消息,其中包含正确的 tools/call 序列和预置的 JMESPath 投影。
prompts/list 和 prompts/get 是元数据/工作流发现方法:它们不计入 Pro 每日配额,但仍计入 60/分钟的每分钟限流器。
资源
资源分为三个访问类别。公开具体资源可匿名且不计配额地读取;账户资源只向已认证、绑定用户的凭据公开,但读取时不消耗配额;URI 模板是参数化且承载数据的资源,其访问要求由_meta["worldmonitor/access"] 声明为 free-account 或 subscription,并按调用者适用的免费额度或订阅配额计量。
resources/list —— 具体、可匿名读取、不计配额:
resources/templates/list —— 参数化的 URI 模板。替换占位符,然后 resources/read 具体的 URI。客户端必须读取模板的 _meta["worldmonitor/access"]:free-account 模板允许已认证免费账户使用免费额度,subscription 模板需要有效订阅。计量方式与等价的 tools/call 对称:
resources/list 和 resources/templates/list 是元数据,不消耗每日额度。对模板实例化的 resources/read 有意消耗与等价 tools/call 相同的调用者适用额度;它通过同一个分发器路由,因此承载数据的资源无法绕过免费账户上限或订阅配额。对公开具体资源和 worldmonitor://account/mcp-allowance 的 resources/read 不计额度。与每个 MCP 方法一样,所有这些仍计入 60/分钟限流器。有关每分钟限流与每日额度耗尽之间确切的 -32029 状态/头差异,请参阅 MCP 错误目录。
MCP Apps(交互式 UI)
该服务器支持 MCP Apps(扩展io.modelcontextprotocol/ui,规范 2026-01-26)—— 即当调用某个关联工具时由宿主在沙箱化 iframe 中渲染的交互式视图。三个线路信号驱动它:
initialize在握手中声明支持。响应的capabilities.extensions会命名该扩展:{"io.modelcontextprotocol/ui": {}}。这是宿主(或 agent 就绪性扫描器)读取以将该端点归类为 MCP App 界面的协商信号 —— 下方的tools/list和resources/list条目就是它随后渲染的内容。tools/list在工具上声明这种关联。每个关联了 UI 的工具都携带指向其 UI 资源的_meta.ui.resourceUri(以及已弃用的扁平别名ui/resourceUri)。resources/list暴露 UI 资源本身,以及具体的数据资源(参数化的数据模板位于resources/templates/list):
所有 UI 资源共享
mimeType: text/html;profile=mcp-app。
对 ui:// URI 的 resources/read 返回自包含的 HTML 视图。与数据资源不同,ui:// 读取是公开且豁免配额的 —— 该模板不承载数据,也不产生上游调用,因此宿主可以在无凭据、不触及 Pro 每日上限的情况下预加载它(agent 就绪性扫描器也可以获取它)。该视图完全自包含(无外部资源),并通过标准的 MCP Apps postMessage 桥(ui/initialize → ui/notifications/tool-result → ui/notifications/size-changed)与宿主通信。
有关完整的 MCP Apps 契约 —— 宿主流程、安全态势、各小部件清单、源文件以及 docs-stat 漂移检查 —— 请参阅 MCP Apps。
JSON-RPC 示例
服务端使用直接 API key —— 将其作为X-WorldMonitor-Key 发送,不要作为 bearer token。
/api/oauth/token 的 access token,则将其作为 Authorization: Bearer $TOKEN 传入。
响应结构
工具响应使用标准 MCP content block 格式:cached_at(最旧贡献数据点的 ISO 时间戳)和 stale(布尔值 —— 当任意贡献 seed 超出其 per-key 新鲜度预算时为 true),以便模型可对新鲜度进行推理。
数据新鲜度
所有缓存工具都从由 Railway cron seeder 写入的 Redis key 读取。典型新鲜度:
每个 key 的 seed 级健康状态:status.worldmonitor.app。
错误
MCP handler 在三个独立层次上发出失败信号 —— HTTP 状态、JSON-RPCerror.code,以及 result.content[0].text 内部的 soft-behavior envelope —— 一次失败可能触及任意组合。
由外向内分诊:HTTP 状态 → JSON-RPC 错误码 → soft envelope。完整的每种形态参考(触发条件、配对状态、恢复方式、示例 payload)位于 MCP 错误目录。几个高频要点:
- 401 +
-32001携带一个WWW-Authenticate头,其resource_metadata指向/.well-known/oauth-protected-resource。支持 RFC 9728 的客户端会在此头上自动重新运行 OAuth 流程。 - 403 +
-32002是已经发出的终止性权益拒绝。lapsed-subscription只会在罕见竞态中出现:服务方确认的失效在 Pro 调用预检查通过后、执行中途才落地;若预检查时已经确认覆盖期结束,OAuth 身份会改走受限、按额度计量的free_account路径。upgrade-required表示免费账户调用了订阅工具,或不具备免费账户资格的非免费权益不足。该错误不携带WWW-Authenticate,重新运行 OAuth 无法修复这一次已经发出的拒绝。 - 429 +
-32029是 Pro 每日上限(Retry-After: <距离 UTC 午夜的秒数>)。每分钟速率限制在 HTTP 200 内返回-32029,而不是 429 —— 区别请见错误目录。 - Soft envelope 返回 HTTP 200 且没有 JSON-RPC
error字段 —— 仅检查 JSON-RPC 层的客户端会静默地将它们视为成功。务必解析result.content[0].text并在将 payload 当作数据消费前检查带前导下划线的判别 key(_budget_exceeded、_jmespath_error)。
