io.modelcontextprotocol/ui 扩展支持 MCP Apps。当前阵容提供 MCP Apps:ui:// HTML 资源,MCP Apps 宿主可在关联的工具调用后内联渲染它们。
本页面是交互式接口的权威指南。请与 MCP Server 概述配合使用,以了解认证、配额、传输和一般 JSON-RPC 行为。
MCP Apps 在托管工具调用后,把 WorldMonitor UI 渲染到 MCP 宿主内部。WebMCP 则让浏览器智能体操作当前标签页中已有的 WorldMonitor 网站。WebMCP 不是 MCP App,也不会取代这些资源背后的托管 MCP 服务器。
契约
三个发现信号必须保持一致:
阵容
精简国家简报视图支持原始响应和受支持的对象投影。保留的新闻摘要覆盖信息会显示中性提示,不声称评估使用了保留的支撑材料。仅在响应提供时显示报告的快照年龄和有效的 UTC 刷新尝试时间。缺失或格式错误的覆盖信息不作新鲜度声明。替换结果会清除之前的段落、证据、来源链接、生成时间和保留摘要提示。宿主声明
country-brief-v3.html;country-brief-v2.html 和原始 country-brief.html 作为私有读取别名保留,直到旧版已安装元数据退役。普通国家请求仍打开完整国家视图。
原始的 ui://worldmonitor/prediction-markets.html 和之前的 ui://worldmonitor/prediction-markets-v2.html 仍作为未列出的读取别名。刷新已安装连接的元数据并打开新卡片后才能加载 v3。已有的缓存卡片仍使用旧 HTML。省略合约数据的投影无法恢复被省略的详情。返回的空类别不能证明上游交易平台的完整覆盖。
国家风险 v2 保留原始对象和投影对象中的字段,包括嵌套的 CII 组成部分和上游可用状态。缺失或格式错误的旅行警示值仍为未知;原生响应中的空字符串仍表示无旅行警示。替换结果会清除之前的风险详情。原来的 ui://worldmonitor/country-risk.html 保留为已安装元数据的私有读取别名,在旧元数据退役后即可移除。
运行时流程
- 宿主对
https://worldmonitor.app/mcp调用initialize。 - WorldMonitor 返回正常的 MCP 能力,外加
capabilities.extensions["io.modelcontextprotocol/ui"]。 - 宿主调用
tools/list。关联 UI 的工具携带_meta.ui.resourceUri以及已弃用的扁平别名_meta["ui/resourceUri"]。 - 宿主调用
resources/list并看到ui://应用资源。每个 UI 条目包含mimeType: text/html;profile=mcp-app和_meta.ui.csp。 - 宿主对选定的
ui://URI 调用resources/read。此次读取是公开且不计配额的,因为它只返回一个静态的、不含数据的模板。 - 宿主对关联工具执行正常的、经过身份验证的
tools/call。这是唯一获取实时数据并消耗适用配额的步骤。 - 宿主将返回的 HTML 嵌入一个沙盒化的 iframe,并交换 MCP Apps 消息:
原始活跃战区
Load active theaters 操作通过宿主调用get_forecast_theaters,使用同一个签名的预测 panel_request。它只读取最新的原始模拟摘要。战区来源的运行 ID 和时间独立于预测列表的生成版本;来源时间本身不能证明新鲜度。本地展开保留已发布的所有路径、参与者、可选角色、反应、稳定因素和失效条件。
读取共享打开面板时的每日分配以及 64 次未缓存读取上限。完整且通过验证的快照,以及明确无符合条件战区的空结果,会被复用。部分、失败、缺失、处理中和未知结果保持区别,并可使用同一准入手动重试。重试失败时保留原始证据。此操作不会选择任意运行、触发模拟或访问私有产物;格式无效或超出大小上限的摘要会报告不可用,不会截断证据。部署后刷新工具元数据以发现 forecasts-v3.html。保存的 forecasts-v2.html 和 forecasts.html 仍作为私有读取别名。
资源读取与配额
resources/list 暴露具体的公开资源,包括所有 ui:// 模板。resources/templates/list 暴露参数化的数据资源。
所有方法仍计入每密钥、每用户或匿名 IP 每分钟 60 次的速率限制器。
冲突事件计量
在 Pro 与 Pro Business 上,get_conflict_events 的首次打开扣一次冲突事件面板额度。国家、死亡人数和数量筛选及重复打开在五分钟内复用该分配。使用返回的 panelRequest.token 作为 panel_request 进行受限读取。显式刷新需设置 refresh: true,提供 UUID 格式的 request_id,并省略 panel_request;刷新扣一次新额度,同一 UUID 的重试复用该分配。API 和免费账户调用保留普通按工具计费,不接受这些付费控制。
每份分配最多允许 64 次未缓存工具执行,未缓存执行与已确认缓存回放分别限制为每分钟 64 次。每次未缓存执行读取五个固定 Redis 键,启用伊朗事件时为六个;各键读取不会分别扣面板额度。相同筛选的成功原始结果在摘要或 JMESPath 呈现之前回放。授权凭据读取在使用量已确认时返回当前通知,使用量未知时省略数字通知。
可选的 conflict_source.ucdp 仅复制已读取 UCDP 元数据中类型正确的 fetchedAt、candidateVersion、candidateComplete 和 annualFailedPages,缺失字段保持缺失。已知不完整、缺失、格式错误、过期或不兼容的数据不作为成功缓存,可使用原凭据重试。其他来源降级时,可用列表仍按请求筛选。该观察不能证明原子发布、所有动荡提供方的完整覆盖或 CII/伊朗数据的独立新鲜度。
自然灾害计量
在 Pro 与 Pro Business 上,get_natural_disasters 首次打开扣一次自然灾害面板额度。重复打开及数据集、震级、活动状态和数量筛选在五分钟内复用该分配。使用返回的 panelRequest.token 作为 panel_request 进行受限读取。显式刷新需提供 refresh: true 和 UUID 格式的 request_id,且不携带读取凭据;同一 UUID 的重试复用刷新额度。API 与免费账户调用保留普通按工具计费及现有参数转换,不接受付费刷新控制。
每次未缓存执行读取三个固定数据键及已存在的地震元数据键,作为 64 次读取预算中的一次工具执行。相同筛选的成功原始结果在摘要或 JMESPath 呈现之前回放,但不得超过最早可观察的来源时效或 EONET 保留期限。新筛选或不可用、格式错误、已知降级、时间未知的数据可在同一分配内重新读取。区域来源的阻止决策保持可读但不缓存,包括未发出请求的预检决策。该策略不证明所有提供方覆盖完整。已有新闻凭据仍仅允许其固定灾害数据集列表及数量 100、20 或 1,不能使用独立面板的震级或活动筛选。内部来源时间和复用期限不会添加公开元数据字段。授权读取返回已确认的当前使用量;计数未知时省略数字通知。
视图安全
应用外壳被刻意设计得静态且受限:- 静态打包的组件使用自包含 HTML。新闻、国家和市场引导程序也是内联资源,但会从资源元数据允许的来源加载当前公共界面资源。界面加载不会获取市场数据。
- 渲染使用 DOM 构造和
textContent,绝不使用innerHTML。 - 链接仅通过
http:或https:URL 解析被允许,并以rel="noopener noreferrer"渲染。 - 共享外壳在初始化后以及每次渲染后报告尺寸,以便宿主调整 iframe 大小。
- 软错误信封(
_budget_exceeded、_jmespath_error以及顶层字符串error)会渲染为可见的错误消息,而非空白的成功状态。 - 该 HTML 包含一个 meta CSP,设置了
default-src 'none'、限定范围的内联脚本/样式许可、锁定的form-action和base-uri,以及镜像_meta.ui.csp.connectDomains策略的 connect-src。
frame-ancestors 仅为建议性。浏览器仅从 HTTP Content-Security-Policy 响应头强制执行 frame-ancestors。该 meta 指令保留在外壳中,供静态扫描器和意图文档使用;请勿将其视为浏览器级别的点击劫持防护。
添加新的 MCP App
- 在
api/mcp/ui/*-app.ts下添加自包含的应用外壳。 - 复用
api/mcp/ui/shell.ts中的buildAppHtml(),除非有协议方面的理由不这样做。 - 在
api/mcp/ui/registry.ts中添加规范的*_UI_URI常量和注册表条目。 - 在
api/mcp/registry/rpc-tools.ts或api/mcp/registry/cache-tools.ts中,恰好为一个后备工具设置_uiResourceUri。 - 更新
docs/mcp-apps.mdx、简短的 MCP 概述以及public/.well-known/mcp/server-card.json。 - 运行
npm run docs:stats以刷新docs/generated/stats.json。 - 运行
npm run docs:check以及针对性的 MCP 资源/工具测试。
api/mcp/ui/registry.ts 和工具注册表派生应用清单。它在以下情况失败:
docs/mcp-apps.mdx、docs/mcp-overview.mdx或public/mcp-server.md遗漏了某个关联工具或ui://URI。public/.well-known/mcp/server-card.json.metadata.mcpApps与代码派生的应用列表、规范版本或 MIME 类型不一致。docs/docs.json将本页面从导航中移除。- 文档记录的 MCP 工具数量与服务器卡片的工具清单不一致。
源文件
News Intelligence 面板额度
在 Pro 和 Pro Business 中,get_news_intelligence 打开一次 News Intelligence 面板只消耗一个额度。重复打开、筛选、summary 和 JMESPath 视图在授权窗口内复用同一完整原始快照。返回的 panelRequest.token 作为 panel_request 仅授权此工具;新闻和国家面板凭据不能授权它。显式刷新需设置 refresh: true,提供 UUID request_id,并省略读取凭据。重试同一 UUID 复用该额度。已授权凭据读取会查询当前用量,不再分配额度;用量未知时不显示数字。API 和免费账户保持逐工具计费,并拒绝这些付费控制参数。
复用仍使用现有四个数据 GET 和三个元数据 GET。有效期取 30/45/60 分钟元数据期限、共享的 60 分钟 Insights 生成期限、已评估的 GDELT 内容年龄期限及面板授权期限的最早值。公告发布时间会验证,但此读取图没有独立的公告新鲜度评估。缺失、降级、格式错误、过期、未来或未评估的来源可以重试。付费读取通过 stale 表示已证实的生成时间过期,通过 freshnessUnknown 表示未评估的时钟;原始来源值保持不变。跨源生产程序允许已观察的空信号列表;空 Insights 和公告引导列表不可复用。64 次读取上限计算未缓存的工具执行次数,不是单个 Redis GET 次数。这不证明所有提供方的完整覆盖。
咽喉要道面板额度
在 Pro 和 Pro Business 中,get_chokepoint_status 打开一次签名的 chokepoints 面板只消耗一个额度。重复筛选、summary 和 JMESPath 视图共享该额度。实际请求的来源子集完整时复用未截断的原始数据;规范化数据集子集或咽喉筛选变化时,可在同一额度内重新获取来源。仅含未知名称的数据集选择器使用完整数据包。键控筛选未匹配时保留原映射,不能制造完整空覆盖。稀疏 AIS、不可用的今日计数和部分建模流量保持可见且可重试。
返回的 panelRequest.token 作为 panel_request 仅授权此工具。显式 refresh: true 需要 UUID request_id,并省略读取凭据;同一 UUID 的重试复用该额度。已授权凭据读取会查询当前用量,不再分配额度;用量未知时不显示数字。API 和免费账户保持逐工具计费,并拒绝这些付费控制参数。
每次未缓存执行仍使用六个数据 GET、六个元数据 GET 和一个激活 EXISTS 命令。64 次读取限制按工具执行计数,不按这 13 个 Redis 命令计数。复用在缓存查询后和保存前验证所选来源形状、可用性、发布时间以及 CN/HK 关键内容时效。部分、格式错误、未经评估或过期的原始数据不会作为完整数据缓存。基准参考年份和建模流量发布时间不能证明当前实测油流或底层历史的新鲜度。私有封装缓存仍为 512 KiB,工具输出仍为 128 KiB。此额度修改不增加网站详情、历史、警告或提供商读取。
世界简报面板额度
在 Pro 和 Pro Business 中,get_world_brief 打开一次签名的 world-brief 面板只消耗一个额度。重复提问、兼容参数 geo_context 的变化和 JMESPath 视图共享该额度。RPC 忽略 summary,不会据此压缩简报。复用保留展示处理前的已接受原文、证据和引用顺序。复用期限取面板授权期限与 generatedAt 加 60 分钟的最早值,读取时重新计算内容年龄。这表示保留已接受的生成版本,不证明生产程序的最新尝试成功。
返回的 panelRequest.token 作为 panel_request 仅授权此工具。显式 refresh: true 需要 UUID request_id,并省略读取凭据;同一 UUID 的重试复用该额度。已授权凭据读取查询当前用量,不再分配额度;用量未知时不显示数字。API 保持逐工具计费,免费账户保持现有订阅拒绝行为。
有效内容生成后 60 分钟至不足三小时仍可返回,并标记 stale: true,但不会作为新鲜快照缓存复用。失败、缺失、格式错误或过期的原始数据可在同一额度内重试。64 次读取限制按未缓存工具执行计数。获取仍使用现有已认证 bootstrap 网关路径,不增加提供商调用或生产健康状态传输。私有封装缓存仍为 512 KiB,工具输出仍为 64 KiB。
国家简报和风险的直接读取
在 Pro 和 Pro Business 中,get_country_brief 和 get_country_risk 与 open_country_brief 共享同一国家额度。国家别名解析为同一 ISO2 标识。重复读取和分析框架变化共享额度。已接受的原始结果按工具和实际分析分别复用,再处理 JMESPath 展示。首次直接风险读取不会复用完整面板中形状不同的风险章节。
返回的 panelRequest.token 可作为 panel_request,授权读取该国家。显式 refresh: true 需要 UUID request_id,并省略读取凭据。新的刷新分配一次国家额度;同一 UUID 的重试复用该额度。刷新重新读取来源,但不会强制 AI 重新生成,也不会绕过后端六小时的简报缓存。API 和免费账户保持普通调用行为,并拒绝这些付费刷新参数。
简报保留框架实际使用的前 2,000 个字符,仅精确的 allow_stale: true 选择保留的陈旧依据。不完整、保留或格式错误的依据可在同一额度内重试。风险复用保留真实的未跟踪和未知值;CII 时间戳不能证明旅行建议或制裁数据的新鲜度。64 次上限按未缓存工具执行计数,包括每种不同分析。已授权凭据读取查询当前每日计数器,不扣新额度;未知用量不显示数字通知。
已观测的国家 Signals
国家视图的 Signals 章节将独立加载且已授权的军事观测与有界signalsRaw 返回样本组合。样本可增加地震、互联网中断、旅行建议和热活动数值,并保留静态国家分类;数量不证明提供商的完整覆盖。来源范围、原始事件或计算时间、未知快照时间、部分证据及保留但未更新的观测会出现在视图、结构化模型上下文和证据导出中。被拒绝的来源清除其数量,切换国家清除旧的动态观测。其他动态 Signals 及汇总严重度和近期证据仍为未知。本版本不声称已完成生产环境原生验收或来源许可审查。