Looking for tools that operate the dashboard already open in a Chrome tab? See WebMCP. WebMCP is page-local, experimental, and human-in-the-loop; it does not replace this persistent hosted MCP server or its data tools.
Pro and API tiers can both connect via OAuth — no API key required. Pro subscribers click “Sign in with WorldMonitor Pro” on the consent page; API Starter / Business / Enterprise users may sign in the same way OR paste a
wm_… key. A confirmed free account also completes the OAuth flow: its token is restricted to free-account tools and metered by the free allowance. A provider-confirmed lapse follows that same free-account path because the shared gate treats ended coverage as a confirmed free state. Retryable verification failures still return 503; an expired or disabled paid row without that provider-confirmed lapse, or another genuinely insufficient entitlement, is refused with the Pro-required page.OAuth is not needed for get_sources: it is the sole credential-free, daily-quota-free data tool. Anonymous calls use a separate fail-closed limit of 10 requests/minute/IP. Other data tools require a user-bound credential. Tools marked free-account (direct cache reads) can use the small confirmed-free allowance; tools marked subscription (everything with server-side execute logic — live fetches, plus a few local-compute tools) require Pro.get_country_brief, and 5 for get_airspace (up to four downstream requests across the dateline). Both the OAuth and wm_… doors resolve the same budget, so the credential you use does not change the cap. Enterprise carries a fair-use ceiling of 25,000 units/day on both doors, and legacy operator keys explicitly allowlisted by the deployment reserve on their own per-key counter with a ceiling of 10,000 units/day. Every authenticated context also passes a per-minute burst limiter, set by plan: 60 requests/minute on Pro, Pro Business and API Starter, 300 on API Business, 1,000 on Enterprise. get_sources, describe_tool, and get_mcp_allowance are exempt from the daily quota. The protected allowance tool uses the shared 192/minute protocol bucket. Full weight table: MCP calls against an API plan.
Pro subscribers can connect Claude Desktop / Cursor / claude.ai without ever pasting an API key — see Pro sign-in flow below. API Starter+ holders may continue to paste a wm_… key on the consent page (the original flow), or use the same OAuth path as Pro.
Endpoints
Server identifier:
worldmonitor v1.32.0.
Registry listings: the server is published in the official MCP registry as app.worldmonitor/mcp — a domain-verified namespace, so clients that resolve servers through the registry get the same endpoint and metadata as the server card above — and listed on Smithery and mcp.so.
Protocol negotiation
WorldMonitor’s static server card at/.well-known/mcp/server-card.json advertises protocol version 2025-11-25, and the live initialize handshake negotiates it by default — so the advertised floor and the negotiated version stay in lock-step:
- By default,
initializesupports2025-03-26,2025-06-18, and2025-11-25. - Clients requesting one of those receive it unchanged; a client requesting any other version receives
2025-11-25. - On
2025-11-25, atools/callwhose arguments fail validation returns anisErrortool result the model can read and correct, instead of the-32602error earlier versions receive (see the error catalog). - Setting
MCP_PROTOCOL_2025_11_25=offdrops2025-11-25again, andMCP_PROTOCOL_FLOOR_2025_06_18=offpins the server back to the legacy2025-03-26-only floor. - The handshake-free
2026-07-28revision is off by default. While it is off, its clients fall back toinitializeas above. - With
MCP_PROTOCOL_2026_07_28=on, a request whoseparams._metacarriesio.modelcontextprotocol/protocolVersionis served per request on the2026-07-28rules:server/discover, the requiredMCP-Protocol-Version,Mcp-MethodandMcp-Nameheaders,resultTypeand cache hints on results, and a minimalsubscriptions/listen. On/mcp, an anonymous2026-07-28request gets the sign-in challenge except the freeget_sourcescall andui://app reads; the machine-discovery aliases stay anonymous. Requests without that envelope keep the behavior above. The error catalog lists the error codes these requests can receive.
outputSchema metadata is emitted on tools/list regardless of the negotiated protocol version. Older 2025-03-26 clients should ignore unknown fields, while newer clients can use the schema immediately. Every successful tools/call also returns the payload as structuredContent, which strict clients require once a schema is advertised; the tools reference describes how projections and soft envelopes are represented.
Streamable HTTP responses
WorldMonitor supports the Streamable HTTP POST flow with either JSON or SSE responses:- Clients that omit
text/event-streamfromAcceptreceive the standard JSON-RPC JSON response body. - Clients that send
Accept: application/json, text/event-streamcan receive atext/event-streamresponse for successful JSON-RPC POSTs. initializeSSE responses includeMcp-Session-Id; follow-up POSTs should send that sameMcp-Session-Idheader.- Each SSE response carries the JSON-RPC result as a single
messageevent with an eventid. There is no leading empty priming event — per the WHATWG SSE spec an emptydata:field still dispatches amessage(withdata === ""), which causes strict handshake scanners to fail onJSON.parse(""). - If the client disconnects after the sole event, it can reconnect by sending
GET /mcpwithAccept: text/event-stream, the sameMcp-Session-Id, andLast-Event-ID; resuming after the delivered event returns an empty stream. A client that dropped before receiving the event has no acknowledgedLast-Event-IDand re-issues the POST instead. - A
GET /mcpwithAccept: text/event-streambut noLast-Event-IDis a client opening the optional standalone server→client SSE stream. This stateless edge route offers no server-initiated stream, so it answers405 Method Not Allowed(advertisingAllow), which the MCP spec defines as the graceful “no standalone stream” signal. MCP SDK clients handle this transparently and complete the handshake. - A plain browser-style
GET /mcp— no SSEAccept, noLast-Event-ID— returns200with a human/agent-readable markdown server guide (the same document as/mcp-server.md), so pasting the endpoint URL into a browser orcurlexplains the server instead of erroring.
Last-Event-ID resume as loss-tolerant transport recovery, not durable message storage — a missed cursor returns -32004 at HTTP 404; re-issue the POST.
Authentication
An MCP client signs in when it connects. The transport answers an unauthenticatedinitialize with 401, JSON-RPC -32001, and a WWW-Authenticate challenge naming the protected-resource document for that path, with the request id echoed. initialize is the handshake every interactive client opens with, and hosted connectors (Cursor Agents, Grok, ChatGPT) decide from its answer whether a server needs sign-in: answered with 200, they record “nothing to authenticate” and have no authorization server to send you to when a paid tool later refuses the call. A free account is enough to sign in. A full anonymous handshake remains available to agent-readiness scanners on the machine-discovery aliases /.well-known/mcp and /.well-known/mcp.json; point MCP clients at /mcp.
Stateless catalog reads stay public. tools/list, prompts/list, prompts/get, skills/list, skills/get, resources/list, resources/templates/list, ping, logging/setLevel, and the notifications/initialized notification are servable without credentials, which is how the keyless worldmonitor CLI and the SDKs list tools without ever sending initialize. Any agent (or agent-readiness scanner) can reach https://worldmonitor.app/mcp, read the server identity, and enumerate the full tool, prompt, and resource catalogs before authenticating — the same metadata already published in the static server card. These methods return only public catalog metadata (names, descriptions, URIs / URI templates, static workflow-template prose — no data, no quota); every capability advertised by the anonymous initialize is anonymously exercisable, so a strict MCP client (Claude Desktop, mcp-remote, the reference SDKs) completes its full post-connect enumeration without stalling on an auth wall. resources/read of a public resource (a concrete, metadata-only freshness/health probe surfaced by resources/list, such as worldmonitor://seed-meta/freshness) is also public and quota-free — an anonymous agent can read it cleanly. Anonymous discovery is rate-limited to 60 requests/minute per client IP. get_sources is the sole credential-free, daily-quota-free data tool; its anonymous path has a separate fail-closed ceiling of 10 calls/minute/IP. Other data-bearing calls require credentials. Every tools/list and describe_tool entry carries _meta["worldmonitor/access"]: "free" means anonymous and quota-free, "free-account" means available to a signed-in free account (cache-backed data calls spend its allowance; describe_tool and get_mcp_allowance do not), and "subscription" means Pro-only. Resource templates carry the same marker as their backing tool. A credential presented on a discovery method is still validated (a bad key returns 401, never a silent anonymous downgrade).
The MCP handler accepts two auth modes, in priority order:
- OAuth 2.1 bearer —
Authorization: Bearer <token>where<token>was issued by/api/oauth/token. This is what Claude Desktop, claude.ai, Cursor, and MCP Inspector use automatically. Required for any client that hits MCP from a browser origin. - Direct API key —
X-WorldMonitor-Key: wm_0123456789abcdef0123456789abcdef01234567for user-issued keys, or an opaque operator-issued enterprise key. Intended for server-side scripts,curl, and custom integrations. Do not send an API key as aBearertoken — it will fail OAuth resolution and return401 invalid_token.
free-account path; an expired or disabled paid entitlement without that confirmed lapse, or another genuinely insufficient non-free state, is denied on the next request. Dashboard-issued X-WorldMonitor-Key: wm_… requests validate the key owner and active entitlement, then use the same per-user minute bucket and the same plan-resolved budget as the OAuth path. Legacy deployment-allowlisted operator keys use a per-key minute bucket and skip the daily reservation.
Redirect URI allowlist
Dynamic Client Registration is not open to arbitrary redirects. Aredirect_uri must be http://localhost:<port>, http://127.0.0.1:<port>, or http://[::1]:<port> (any port, any path), or exactly match a hosted MCP client callback below, as the client sends it. Links point to the vendor’s own documentation where one exists.
Claude Code, Cursor desktop, VS Code desktop, Codex, Gemini CLI, goose, Zed, and MCP Inspector use the loopback form. Notion, Linear, Lovable, Factory, Conductor, Skydive, and MCPJam prefer Client ID Metadata Documents and now connect that way (see below); their callbacks stay listed for clients that still register. A registration may list up to 8
redirect_uris, and one unlisted entry rejects the whole request with 400 invalid_redirect_uri. Clients with per-user or per-tenant callbacks, such as Gemini custom apps and Microsoft Copilot Studio, cannot be exact-matched and are not supported.
Client ID Metadata Documents
A client can skip registration and send the HTTPS URL of its published Client ID Metadata Document asclient_id. The AS metadata advertises client_id_metadata_document_supported: true next to registration_endpoint, and a client picks one method at discovery. Existing registrations and their refresh tokens keep working; a client that switches to CIMD signs in again as a new connection.
WorldMonitor accepts only the document URLs below, matched exactly, and fetches no other URL. A request is accepted when:
- the document’s
client_idequals the URL it was fetched from; - the
redirect_uriis one of the document’sredirect_uris, exactly, except that anhttp://localhost,http://127.0.0.1, orhttp://[::1]callback may use any port (RFC 8252 §7.3); - the
redirect_uriishttps:or http loopback, with no credentials or fragment; - the document offers
token_endpoint_auth_methodnone(public client with PKCES256), has noclient_secret, and includes theauthorization_codegrant when it lists grants.
Cache-Control lifetime, at most one hour (private and no-store are not cached), so a vendor’s change reaches WorldMonitor within that time. A failed fetch is never cached. A missing document (404 or 410) is an unknown client; any other failure, such as a timeout, a 5xx or 403, an HTML page, or a body that is not valid JSON, is retryable, and the token endpoint keeps the authorization code or refresh token for the retry. For an exact listed URL, a retryable failure falls back to a vetted copy of the document captured when it was listed; chatgpt.com answers every fetch from WorldMonitor’s servers with a 403 page, so ChatGPT and Codex connect this way. The copy is never cached, so the live document is tried on every request, and a missing or invalid live document still rejects the client. A per-connector document such as Vercel Connect’s has no copy. The consent page shows the client name from the document, the host that published it, and the redirect host, and warns when the authorization goes to a localhost callback.
ChatGPT’s document prefers
private_key_jwt but also lists none; WorldMonitor advertises only none, so ChatGPT uses PKCE without a client assertion. Make.com’s published client URL redirects instead of serving a document, so it is not on the list. A client whose document is not listed gets an “Unknown Client” error; ask for it to be added.
The authorization response carries iss (RFC 9207), set to the issuer of the host where the flow started. ChatGPT requires it to use its stable callback.
Token lifetimes
Pro sign-in flow
Pro subscribers (and API Starter+ users who’d rather not paste a key) can authorize MCP clients via their existing WorldMonitor account — no API key needed.-
Add the server URL in your MCP client. The canonical entrypoint is:
This is the only product MCP transport endpoint. Listed production aliases (
www,api, and the dashboard variants) are not additional servers. Ordinary GET/HEAD/mcpand/api/mcpon those hosts redirect (308) tohttps://worldmonitor.app/mcp; ordinary GET/HEAD/.well-known/mcpand/.well-known/mcp.jsonredirect (308) tohttps://worldmonitor.app/.well-known/mcpandhttps://worldmonitor.app/.well-known/mcp.json. Query is not forwarded. A transport POST/SSE/replay receives HTTP 410 with JSON-RPC-32000telling the client to usehttps://worldmonitor.app/mcp. -
Click “Sign in with WorldMonitor Pro” on the consent page. This is the default CTA. You’ll bounce through
worldmonitor.app/mcp-grant(Clerk-protected — sign in if needed), then back toapi.worldmonitor.app/oauth/authorize-pro, then to your client’s redirect. -
Done. No
wm_…key is created or stored on your machine. The client receives a standard OAuth 2.1 access token (1 h TTL, refresh token valid for 30 days after the last refresh).
If the sign-in step reports that your subscription could not be verified — a
503 page, or 503 TIER_VERIFICATION_UNAVAILABLE from the grant endpoints — that is transient and says nothing about your subscription. Wait the advertised Retry-After and start the connection again from your client; the authorization session is single-use, so restart it rather than reloading the page. A confirmed account with an expired or disabled paid entitlement without a provider-confirmed lapse gets 403 INSUFFICIENT_TIER instead. A confirmed free account, including a provider-confirmed lapse reclassified by the shared gate, completes the flow with a restricted, allowance-metered token. See Error handling.wm_ user key or operator-issued enterprise key — that path is unchanged.
Daily limit (Pro tier)
- 50 quota-consuming calls per UTC day on Pro and 250 on Pro Business, reset at 00:00 UTC. Both plans meter on a dedicated MCP counter and every call costs one unit, whatever the tool does.
- Data-bearing
tools/callandresources/readof a data-bearing URI-template instantiation consume the Pro daily quota, exceptget_sourcesand the metadata helperdescribe_tool. initialize,tools/list,prompts/list,prompts/get,skills/list,skills/get,resources/list,resources/templates/list,logging/setLevel,notifications/initialized,ping,describe_tool,get_mcp_allowance, andget_sourcesdo not count against the daily cap.resources/readof a public resource (a metadata-only freshness/health probe, e.g.worldmonitor://seed-meta/freshness) and the authenticated account status resourceworldmonitor://account/mcp-allowanceare likewise exempt.- Hitting the cap returns JSON-RPC error
-32029plus HTTP429with aRetry-Afterheader pointing at the next UTC midnight. - The cap is hard. Concurrent
tools/callorresources/readrequests near the boundary use an atomic Redis reservation, so exactly the call that crosses the limit rejects.
wm_… key option plus a much larger daily budget (1,000 and 10,000 units/day) that their MCP calls and REST requests share, at 60 and 300 requests/minute/user. A cached MCP read costs 1 unit and a live downstream fetch costs 2, get_country_brief costs 3, and get_airspace costs 5, so batch workloads still go further over REST. Enterprise lifts the daily cap entirely. See Plans & limits.
Connected MCP clients
Each authorization mints a separate row, so revoking Claude Desktop does not affect Cursor.- Sign in to the dashboard. Select Settings → MCP Clients to manage connected clients.
- See the live
clientName(e.g. “Claude”, “Cursor”),lastUsedAt, andcreatedAtper token. - A revoke takes effect on the next MCP request (no positive cache).
- Up to 5 active tokens per user. Authorizing beyond the cap silently revokes the oldest-created existing token (creation order, not recency of use; enforcement is eventually consistent under concurrent authorizations).
Plans & limits
Per-minute throttling protects against burst storms across paid tiers. Ordinary data calls use the account’s plan burst from the table above. Recognized data-free protocol methods, including
initialize, notifications/initialized, ping, catalog methods and public resource reads, use a separate 192 requests/minute/user bucket. Both OAuth and dashboard keys share that bucket across sessions. It supports 64 panel-read connections with three setup calls each. A validated paid MCP panel receipt has separate 64 uncached reads/minute/panel and 64 cached replays/minute/panel buckets, one daily allocation per opening and at most 64 uncached executions per admission. Unsupported methods, account status reads and data-bearing resource reads retain the ordinary account burst. Legacy operator keys and anonymous discovery retain their combined 60/minute limits. Anonymous get_sources retains its fail-closed 10/minute/IP ceiling. The daily-quota cap applies to subscription data reservations. See Daily limit (Pro tier) and the Error Catalog.
The OAuth and dashboard-key burst is per-USER, so a user with 3 Claude installations or multiple wm_… keys shares one pool at their plan’s rate. Legacy operator-key limiting is per-KEY.
Hitting the MCP daily quota returns JSON-RPC error -32029 plus HTTP 429 with a Retry-After header pointing at the next UTC midnight. Hitting the per-minute limit returns the same error code with a short Retry-After.
WorldMonitor also surfaces current MCP plan-limit notices in Settings and sends a bounded-cadence email when a paid user approaches or exceeds their plan allowance. Notices are informational and action-oriented: they offer retry/reset guidance, checkout when the next tier is self-serve, or support contact when it is not. They do not automatically upgrade the account or create overage charges.
Other rate limits
- OAuth authorize: 10 requests / minute / IP
- OAuth token: 10 requests / minute / IP
- Dynamic registration: 5 registrations / minute / IP
429 with a Retry-After header.
Client setup
Step-by-step setup with screenshots for Claude, ChatGPT, Codex, Claude Code and Cursor is in the MCP Quickstart.Claude (desktop app, claude.ai, mobile)
Add via Customize → Connectors → + Add → Add custom connector:- Name:
WorldMonitor - URL:
https://worldmonitor.app/mcp
claude_desktop_config.json launches local (stdio) servers only, so a remote url entry there is not a supported way to connect; use the connector, or the mcp-remote bridge below.
The mcp-remote bridge (stdio-only clients)
Stdio-only MCP clients connect through the mcp-remote bridge:
- With an API key, pass it as a header. A request that carries a valid key is not challenged; an invalid, expired or revoked key gets
401. Use the single-argument formX-WorldMonitor-Key:wm_…with no space after the colon — it sidesteps client/npxargument-escaping bugs with spaces insideargs(documented bymcp-remotefor Cursor and Claude Desktop on Windows). - Prefer OAuth? Omit
--header. The server answersmcp-remote’s openinginitializewith the401challenge, which opens its browser consent flow at connect time (dynamic client registration works on bothworldmonitor.appandwww.worldmonitor.app). A free account can complete it; subscription tools then depend on your plan.
Codex
~/.codex/config.toml.
Claude Code
/mcp inside Claude Code and choose Authenticate.
Cursor
~/.cursor/mcp.json:
Other hosted clients
ChatGPT, Grok, Perplexity, Mistral Le Chat, Devin, Google Antigravity, and VS Code: addhttps://worldmonitor.app/mcp as a custom connector or remote MCP server. Registration accepts the callbacks listed in Redirect URI allowlist.
MCP Inspector (debugging)
Tool catalog
The server exposes a registry of tools. Most are cache-reads over pre-seeded Redis keys (sub-second). The slower, non-cache paths are the five live LLM/external-API tools (get_country_brief, analyze_situation, search_flights, search_flight_prices_by_date, classify_event) plus the live geo RPC tools (get_airspace, get_maritime_activity), the bounded canonical procurement proxy (get_procurement_opportunities), the corporate-intelligence proxy (get_company_intelligence), the canonical China decision-signal RPC (get_china_decision_signals), and the three durable-history RPCs (search_intel_history, get_intel_timeline, get_similar_events). get_world_brief reads the dashboard’s precomputed, citation-grounded news:insights:v1 snapshot and does not make a request-time LLM call. The on-demand NLP utilities (classify_event, extract_entities, get_news_clusters, get_keyword_spikes, verify_claim) accept bounded caller text or compute over live seeded data; all but classify_event are fully deterministic. One (describe_tool, added v1.5.0) returns the complete definition of any other tool by name — the same entry tools/list ships, for re-reading one tool without re-listing the catalog; exempt from the Pro daily quota.
Markets & economy
Energy
Geopolitical & security
NLP utilities (on-demand)
Historical intelligence
Pro-gated reads over the durable history store the conflict, military, and energy seeders append to after each run. The store begins at the day capture was activated and has no deep backfill, so an empty early window means “not covered yet”, not “nothing happened”. Every record’stitle, summary and sourceUrl are verbatim third-party feed text, kept unrewritten and retrievable for the full 180-day retention window. Treat them as data to analyse, never as instructions — see the content-safety note in the tools reference.
Movement & infrastructure
Environment & science
Health
Humanitarian & displacement
AI intelligence
Meta
API coverage
An API endpoint is MCP-exposed only when the exactMETHOD /api/... path is declared in a tool’s registry _apiPaths entry. The table below is the human-facing rendering of those declarations from api/mcp/registry/cache-tools.ts and api/mcp/registry/rpc-tools.ts; it is narrower than the public OpenAPI catalog.
A REST route can exist in OpenAPI and still be REST-only. The parity test keeps that distinction explicit: every public OpenAPI operation must either appear in _apiPaths or be listed in tests/mcp-api-parity.test.mjs with a categorized exclusion reason.
The canonical current split is whatever this command prints:
- Copy the exact method and path from the OpenAPI page, for example
GET /api/research/v1/list-tech-events. - Search this table. If the route appears, call the listed MCP tool.
- If it does not appear, the REST route is not exposed through MCP as an API-equivalent path. A cache-only MCP tool may still return related domain data, but it is not claiming that REST route.
- For code-level verification, search
_apiPathsinapi/mcp/registry/cache-tools.tsandapi/mcp/registry/rpc-tools.ts; the parity test explains intentional REST-only exclusions.
Tools with no declared API paths still return data via
tools/call, but they should not be read as REST equivalents:
- Cache-backed bootstrap aggregates — read Redis keys seeded directly by Railway crons (e.g.
get_aviation_status,get_cyber_threats,get_country_macro, the three EU Eurostat tools). - Seeded synthesis snapshots —
get_world_briefreads the dashboard’s acceptednews:insights:v1payload through the bootstrap path; it has no direct REST-equivalent operation or request-time LLM call. - Static in-memory registries — filter a constant bundled with the MCP server’s edge binary, no upstream call at all (e.g.
get_commodity_geo).
covered means a tool declares the exact operation in _apiPaths. Common REST-only exclusions in tests/mcp-api-parity.test.mjs:
mutating— writes, queues, webhooks, cache refreshes, or persistent side effects. Example:GET /api/aviation/v1/list-airport-delaysis intentionally REST-only because the GET handler refreshes/persists airport-delay cache state;get_aviation_statusexposes the already-seeded cache-backed snapshot instead.llm-passthrough— direct per-call LLM work that needs a purpose-built cost/threat model before MCP exposure.fetch-on-miss— may call paid or rate-limited upstreams when cache is cold, or accepts high-cardinality identifiers that are not cache-bundle friendly. Exclusion reasons must include one enforced secondary signal:high-cardinality-input,paid-upstream, orllm-cost. Examples:GET /api/conflict/v1/list-acled-events,GET /api/infrastructure/v1/list-service-statuses,GET /api/supply-chain/v1/get-critical-minerals, andGET /api/aviation/v1/get-flight-status.admin— internal-only operations behind an explicit admin boundary, such as an admin key, internal-only middleware, or cron-only path.manual-mapping— parameterized cache keys or inline Redis/Convex handlers need human triage. Examples:GET /api/research/v1/list-arxiv-papers,GET /api/research/v1/list-trending-repos, andGET /api/research/v1/list-hackernews-items;get_research_signalsdeclares onlyGET /api/research/v1/list-tech-events.deferred-to-future-tool— pure reads whose cache keys are not yet exposed by an MCP bundle. Example:GET /api/cyber/v1/list-cyber-threatsis slated for a future expanded-domain tool rather than claimed by today’s cache-backedget_cyber_threats.
- #4525 — pure-read deferred MCP coverage candidates.
- #4526 — manual mapping and fetch-on-miss triage.
Prompts and resources
In addition to the live tool registry, WorldMonitor exposes MCP prompts and resources so clients can discover common workflows and address stable data slices without inventing tool plans from scratch.Prompts
prompts/list returns the workflow templates below. prompts/get renders the selected template into a user message with the right tools/call sequence and pre-baked JMESPath projections.
prompts/list and prompts/get are metadata/workflow discovery methods. They are exempt from the Pro daily quota, though they still count toward your plan’s per-minute burst.
Resources
Resources have three access classes. Public concrete resources are surfaced by anonymousresources/list and read anonymously and quota-free. The account allowance resource appears in resources/list only for a user-bound authenticated client and is also quota-free. URI templates (parameterised, data-bearing) are surfaced by resources/templates/list; their _meta["worldmonitor/access"] marker states whether a signed-in free account or a Pro subscription can read each concrete instantiation.
resources/list — concrete, anonymously readable, quota-free:
Authenticated
resources/list additionally exposes worldmonitor://account/mcp-allowance. Its read returns the current account’s used, limit, remaining, resetsAt, and sharedWithRestApi fields. sharedWithRestApi is true when the budget being reported is the account’s REST allowance, which means used counts REST requests as well as tool calls — read it before treating that number as your own call history. Free accounts also receive request-window usage, remaining windows, the idle-gap duration, and the active-window expiry. The read uses the enforcement counters directly and never reserves an allowance slot. Hosts that expose tools without resources/read can call get_mcp_allowance({}) for the same snapshot. It requires verified user-bound OAuth or wm_… credentials, accepts only optional jmespath, and rejects account selectors and panel_request before admission. It remains available at the daily cap, spends no daily allowance, and uses the shared 192/minute protocol bucket. Unreadable counters return an error instead of a zero snapshot. Account totals do not identify individual callers.
resources/templates/list — parameterised URI templates. Substitute the placeholder, then resources/read the concrete URI. Follow the template’s _meta["worldmonitor/access"] marker: free-account templates use the authenticated free-account allowance, while subscription templates require Pro. Each read consumes the same caller-applicable allowance or quota slot as the equivalent tools/call:
resources/list and resources/templates/list are metadata and do not consume the daily allowance. resources/read of a template instantiation consumes the same caller-applicable slot as the equivalent tools/call; it routes through the same dispatcher so a data-bearing resource cannot bypass the free-account or subscription limit. Reads of the public freshness resource and authenticated account allowance resource are quota-free. As with every MCP method, all of these still count toward your plan’s per-minute burst. For the exact -32029 status/header differences between per-minute throttling and daily quota exhaustion, see the MCP Error Catalog.
MCP Apps (interactive UI)
The server supports MCP Apps (extensionio.modelcontextprotocol/ui, spec 2026-01-26) — interactive views a host renders in a sandboxed iframe when a linked tool is called. Three wire signals drive it:
initializedeclares support in the handshake. The response’scapabilities.extensionsnames the extension:{"io.modelcontextprotocol/ui": {}}. This is the negotiation signal a host (or agent-readiness scanner) reads to classify the endpoint as an MCP-App surface — thetools/listandresources/listentries below are the content it then renders.tools/listadvertises the linkage on the tool. Each UI-linked tool carries_meta.ui.resourceUri(and the deprecated flatui/resourceUrialias) pointing at its UI resource.resources/listsurfaces the UI resources themselves, alongside the concrete data resource (the parameterised data templates live inresources/templates/list):
Country Risk v2 preserves supplied original and projected objects, including nested CII components and upstream availability. Missing or malformed advisory values remain unknown; an explicit empty native string still means no advisory. Result replacement clears prior risk details. The original
ui://worldmonitor/country-risk.html remains a private read alias for installed metadata and can be removed when that metadata is retired.
All UI resources share mimeType: text/html;profile=mcp-app.
resources/read on a ui:// URI returns an HTML view. Unlike the data resources, a ui:// read is public and quota-exempt — the template carries no data and spends no upstream data call, so a host can preload it (and an agent-readiness scanner can fetch it) without credentials and without touching the Pro daily cap. Statically bundled widgets are self-contained. The news, country and market views load their current JavaScript and CSS from https://www.worldmonitor.app, as permitted by their resource metadata. All views communicate with the host over the standard MCP Apps postMessage bridge (ui/initialize → ui/notifications/tool-result → ui/notifications/size-changed).
The compact Country Brief view accepts the original response and supported object projections. Retained news digest coverage shows a neutral notice without claiming that the assessment used retained grounding. Reported snapshot age and a valid UTC refresh-attempt time appear only when supplied. Missing or malformed coverage makes no freshness claim. Replacing a result clears prior paragraphs, evidence, source links, generation time and retained notice. Hosts advertise country-brief-v3.html; country-brief-v2.html and the original country-brief.html remain private read aliases until older installed metadata is retired. Ordinary country asks still open the full country view.
For the full MCP Apps contract — host flow, security posture, per-widget inventory, source files, and docs-stat drift checks — see MCP Apps.
JSON-RPC example
Server-side with a direct API key — send it asX-WorldMonitor-Key, not as a bearer token.
/api/oauth/token, pass it as Authorization: Bearer $TOKEN.
Response shape
Tool responses use the standard MCP content block format:cached_at (ISO timestamp of the oldest contributing data point) and stale (boolean — true when any contributing seed exceeded its per-key freshness budget) so the model can reason about freshness.
A few more fields appear only when relevant:
activationUnknown: truewhen a content-freshness activation marker could not be read, sostalewas computed without knowing whether the producer has ever published.freshnessUnknown: truewhen a freshness record could not be read, sostaleistruebecause freshness is unknown, not because the data is known to be old.unreadable(a list ofdatalabels) when some cache reads failed. Those sections arenullbecause they could not be read, not because the dataset is empty, and retrying shortly usually fills them.contentFreshnessPendingUntil(ISO timestamp) when a never-published seed is inside its deployment grace window. Content-age checks start counting againststaleafter that deadline.
limit is omitted; pass limit: 0 only when you need the full payload, and project it with jmespath to keep the response small.
Telemetry (for operators)
Everytools/call emits a structured telemetry line tagged mcp.toolcall with latency, payload bytes (pre and post JMESPath), jmespath_used, and budget_exceeded. initialize emits mcp.tools_list_emitted with tool-count and tools-list byte metrics. Caller-facing behaviour is unaffected.
Data freshness
All cache tools read from Redis keys written by Railway cron seeders. Typical freshness:
Seed-level health per key: status.worldmonitor.app.
Errors
The MCP handler signals failure on three independent layers — HTTP status, JSON-RPCerror.code, and soft-behavior envelopes inside result.content[0].text — and a single failure can touch any combination.
Triage from the outside in: HTTP status → JSON-RPC code → soft envelope. The full per-shape reference (trigger, paired status, recovery, example payload) lives in the MCP Error Catalog. A few high-frequency callouts:
- 401 +
-32001carries aWWW-Authenticateheader withresource_metadatapointing at the document for the path you called —/.well-known/oauth-protected-resource/mcp, or/api/mcpunder the deployed route. RFC 9728-aware clients re-run the OAuth flow on this header automatically. - 429 +
-32029is the plan-resolved daily cap (Retry-After: <seconds-until-UTC-midnight>), so the number in the message is whichever budget rejected, not always 50. The per-minute rate limit returns-32029inside HTTP 200, not 429 — see the catalog for the distinction. - Soft envelopes return HTTP 200 with no JSON-RPC
errorfield — clients that inspect only the JSON-RPC layer will silently treat them as successes. Always parseresult.content[0].textand check for a leading-underscore discriminator key (_budget_exceeded,_jmespath_error) before consuming the payload as data.
Related
- WebMCP — experimental, tab-bound tools that operate the visible WorldMonitor website
- MCP Quickstart — connect Claude, ChatGPT, Codex or Cursor in about a minute
- JMESPath guide — projection grammar + 12 worked examples
- MCP Tools Reference — per-tool parameters and
curlexamples - MCP Error Catalog — every JSON-RPC code, HTTP status, and soft envelope the server emits
- Authentication overview — browser vs bearer vs OAuth
- API Reference — the same data via REST
- Pro features
Natural Disasters Panel Requests
On Pro and Pro Business,get_natural_disasters opens one Natural Disasters allocation. Repeated opens and dataset, magnitude, activity and limit filters reuse that admission within five minutes. Use its returned panelRequest.token as panel_request for bounded reads. Explicit refresh needs refresh: true, a UUID request_id, and no reader token; the same UUID retries the refresh allocation. API and free-account callers keep ordinary per-tool charging and existing filter coercions, and reject the paid refresh controls.
Each uncached execution reads three fixed data keys and the existing seismology metadata key as one logical read within the 64-read admission. Exact successful filtered originals replay before summary or JMESPath only until the earliest observable source or EONET retention deadline. A new filter or unavailable, malformed, known degraded or unknown-clock observation can reread under the same allocation. Blocked regional source decisions remain readable but uncached, including zero-request preflight decisions. This does not establish complete provider coverage. The existing news token still permits only its exact hazard dataset list and limits 100, 20 or 1; it cannot use standalone magnitude or activity filters. Source data and internal deadlines do not add public metadata fields. Confirmed current usage accompanies authorized reads; an unknown counter omits the numeric notice.
News Intelligence panel admission
On Pro and Pro Business,get_news_intelligence opens one News Intelligence allocation. Repeated opens, filters, summary and JMESPath views reuse the same complete original within the admission window. The returned panelRequest.token is a closed panel_request for this tool only; news and country receipts cannot authorize it. Explicit refresh uses refresh: true, a UUID request_id, and no reader token. The same UUID retries that allocation. Authorized receipt reads query current usage without a new allocation; unknown usage omits the numeric notice. API and free-account calls retain ordinary per-tool charging and reject these paid controls.
Reuse uses the existing four dataset GETs and three metadata GETs. It expires at the earliest of the 30/45/60-minute metadata deadlines, the shared 60-minute Insights generation limit, the assessed GDELT content-age deadline, and admission expiry. Advisory publication time is validated, but this source graph has no independent advisory freshness assessment. Missing, degraded, malformed, old, future or unassessed sources remain retryable. Paid reads expose proven stale generation through stale and unassessed clocks through freshnessUnknown; source values remain intact. The cross-source producer permits an observed empty signal list; empty Insights and advisory bootstrap lists are not reusable. The 64-read limit counts uncached tool executions, not individual Redis GETs. This does not prove complete provider coverage.
Chokepoint panel admission
On Pro and Pro Business,get_chokepoint_status opens one signed chokepoints allocation. Repeated filters, summary and JMESPath views share that allocation. Complete effective requested source subsets reuse their uncapped originals; changing the normalized dataset subset or chokepoint selector can reacquire sources under the same allocation. Unknown-only dataset selectors use the full bundle. A keyed filter with no match retains the original map, so it cannot manufacture complete empty coverage. Sparse AIS, unavailable today counts and partial modeled flows remain visible and retryable.
Use the returned panelRequest.token as panel_request only for this tool. Explicit refresh: true requires a UUID request_id and no reader token; the same UUID retries that allocation. Authorized receipt reads report current usage without reserving another allocation; unknown usage omits the numeric notice. API and free-account calls retain per-tool accounting and reject these paid controls.
An uncached execution uses the existing six dataset GETs, six metadata GETs and one activation EXISTS command. The 64-read admission bound counts tool executions, not those 13 Redis commands. Reuse checks selected source shapes, availability, publication clocks and CN/HK critical content age, both after lookup and before cache storage. Partial, malformed, unassessed or expired originals are not cached as complete. Reference-year baselines and modeled flow publication dates do not prove current metered oil or fresh underlying history. The private wrapped cache remains 512 KiB; tool output remains 128 KiB. This admission change does not add website details, histories, warnings or provider reads.
World Brief panel admission
On Pro and Pro Business,get_world_brief opens one signed world-brief allocation. Repeated questions, compatibility geo_context changes and JMESPath views share that allocation. The RPC ignores summary; it does not summarize the brief. Reuse retains the accepted original prose, evidence and citation order before presentation. It ends at the earlier of admission expiry and generatedAt plus 60 minutes; replay recomputes the content age. This is a retained accepted generation, not an attestation that the latest producer attempt succeeded.
Use panelRequest.token as panel_request only for this tool. Explicit refresh: true requires a UUID request_id and no reader token; the same UUID retries that allocation. Authorized receipt reads query current usage without reserving another allocation. Unknown usage omits the numeric notice. API allowances retain per-tool billing, and free accounts retain the existing subscription denial.
Valid content aged 60 minutes to less than three hours remains available with stale: true but is not retained for fresh replay. Failed, missing, malformed and expired originals can retry under the same allocation. The 64-read bound counts uncached tool executions. Acquisition uses the existing authenticated bootstrap gateway path; it adds no provider call or producer-health transport. The private wrapped cache remains 512 KiB and tool output remains 64 KiB.