# Reported issues for World Monitor

Pod holds 13 of 13 problems reported by people outside the maintainer team. Issues filed by the project's own owners, members and collaborators are excluded entirely — a maintainer's release checklist is not a warning to a prospective user.

Back to [World Monitor](/mcp/world-monitor).

## Most discussed

### get_conflict_events: limit=0 returns nothing (docs say "no cap"), and large limit silently empties on output-budget overflow

## Summary

`get_conflict_events` documents its `limit` parameter as:

> `limit`: Cap each event list to at most this many items (**default 30, pass 0 for no cap**).

`limit: 0` does not mean "no cap" — it returns **zero events**. And separately, a large `limit`
returns **zero events** too, silently, once `_outputBudgetBytes` is exceeded.

Both failure modes return a well-formed, successful-looking response with empty lists, so a caller
cannot distinguish "no conflicts matched" from "your reques

[Read the thread](https://github.com/koala73/worldmonitor/issues/5797) · 2026-07-29 · closed · outside contributor · 0 comments

### /api/mcp is unauthenticatable in the Docker self-host: the sidecar forwards its own LOCAL_API_TOKEN as the caller's Authorization header

### Summary

On a self-hosted Docker install, every request to `/api/mcp` is rejected with
`-32001 Invalid or expired OAuth token`, including requests carrying a valid
OAuth token minted seconds earlier by `/api/oauth/token`. The `X-WorldMonitor-Key`
fallback cannot be reached either. As far as I can tell the MCP endpoint has no
working authentication path in this deployment mode.

The MCP implementation itself is fine. The token never reaches it.

### Environment

- `docker compose up -d --buil

[Read the thread](https://github.com/koala73/worldmonitor/issues/5471) · 2026-07-23 · closed · external user · 0 comments

### docs(agent): published MCP inventory alternates between 39, 40, and 41 tools

## Summary

Published first-party surfaces simultaneously advertise **39**, **40**, and **41** MCP tools. The executable registry and its exact-count tests currently establish **41** as the source-of-truth value.

## Evidence at `396efb905fadda74c4ae77080a1e72658c37aa0e`

- 39: [`pro-test/src/locales/en.json`](https://github.com/koala73/worldmonitor/blob/396efb905fadda74c4ae77080a1e72658c37aa0e/pro-test/src/locales/en.json#L633-L654), [`public/home.md`](https://github.com/koala73/worldmonitor/bl

[Read the thread](https://github.com/koala73/worldmonitor/issues/5389) · 2026-07-20 · closed · external user · 1 comment

### Cloudflare "Block AI training bots" policy breaks core worldmonitor.app/mcp initialization

<img width="802" height="340" alt="Image" src="https://github.com/user-attachments/assets/466aa77c-821e-43fa-ac51-6acf67dd8ec4" />

### Variant

worldmonitor.app (Full / Geopolitical)

### Affected area

Map / Globe

### Bug description

The WorldMonitor MCP server is completely failing to run, initialize, or register tools generally because requests to `https://worldmonitor.app/mcp` are being intercepted by Cloudflare. 

Instead of completing the standard MCP handshake, server capability exchan

[Read the thread](https://github.com/koala73/worldmonitor/issues/4348) · 2026-06-19 · closed · external user · 2 comments

### feat: dashboard tabs — named, persistent panel workspaces

## Summary

This proposes adding a **tab system** to the dashboard, letting users maintain multiple named panel workspaces without losing their configurations when switching between them.

## Motivation

Power users often want to monitor very different data sets simultaneously — for example, a macro economics view alongside a commodities view. Today, switching panel layouts means losing the previous one. Tabs solve this cleanly within the existing panel/storage model.

## What it does

- **Multi

[Read the thread](https://github.com/koala73/worldmonitor/issues/4306) · 2026-06-13 · closed · outside contributor · 2 comments

### contributor-trust.yml uses pull_request_target with write permissions and an unvalidated outbound call to api.brin.sh

## Summary

`.github/workflows/contributor-trust.yml` uses the `pull_request_target` trigger — which runs with write permissions to the repository — and makes an unauthenticated outbound HTTP call to `api.brin.sh` with the contributor's GitHub username interpolated into the URL path. The workflow's security posture depends on the availability, integrity, and continued trustworthiness of a third-party external API with no pinned endpoint, no SLA, and no response integrity verification.

## Eviden

[Read the thread](https://github.com/koala73/worldmonitor/issues/3813) · 2026-05-18 · closed · external user · 1 comment

### MCP proxy forwards user-supplied Authorization headers to arbitrary external servers — credential relay via WorldMonitor infrastructure

## Summary

The MCP proxy (`api/mcp-proxy.ts`) forwards user-supplied `customHeaders` — including arbitrary `Authorization` headers — to any external MCP server that passes SSRF validation. A Pro subscriber can use WorldMonitor's outbound IP reputation to make authenticated requests to third-party systems using credentials they supply, with no logging or restriction on which credential types are forwarded.

## Evidence

**`api/mcp-proxy.ts`:**
```typescript
let customHeaders = {};
if (rawHeaders

[Read the thread](https://github.com/koala73/worldmonitor/issues/3805) · 2026-05-18 · closed · external user · 1 comment

### Real-time streaming: SSE/WebSocket push for breaking news and alerts

## Summary

Upgrade from HTTP polling to Server-Sent Events (SSE) for real-time push of breaking news, alerts, and data updates to the browser.

## Current State

All browser-to-backend communication uses HTTP polling via SmartPollLoop:
- Telegram Intel: 60s polling
- OREF Alerts: 120s polling  
- RSS News: 15min polling
- AIS Vessels: 5min polling (WebSocket upstream exists on Railway relay, but frontend polls HTTP)

## Proposed Architecture

```
Railway relay ──SSE──→ Browser
  - Breaking news

[Read the thread](https://github.com/koala73/worldmonitor/issues/1227) · 2026-03-07 · open · external user · 3 comments

## Most recent

### fix(local-api): get_world_brief's internal fetch to get-bootstrap-data lacks X-WorldMonitor-Local-Token and is rejected by the sidecar's own auth gate

### Variant

worldmonitor.app (Full / Geopolitical)

### Affected area

AI Insights / World Brief

### Bug description

### Summary

On a self-hosted install, the `get_world_brief` MCP tool fails with an auth error the operator cannot fix from outside. The tool makes an internal, in-process fetch to the sidecar's own bootstrap endpoint (`/api/infrastructure/v1/get-bootstrap-data`). That endpoint sits behind `local-api-server.mjs`'s global auth gate, which expects `X-WorldMonitor-Local-Token` — a

[Read the thread](https://github.com/koala73/worldmonitor/issues/6538) · 2026-08-13 · closed · external user · 0 comments

### fix(compose): RELAY_SHARED_SECRET is never plumbed into the app or relay containers — fresh self-host installs crash-loop

### Variant

worldmonitor.app (Full / Geopolitical)

### Affected area

Other

### Bug description

### Summary

The self-host docs require `RELAY_SHARED_SECRET` in `.env`, but `docker-compose.yml` does not pass it into the environment of any service — not `worldmonitor`, not `ais-relay`. As of `main` HEAD, no `environment:` entry, `env_file`, or `${RELAY_SHARED_SECRET}` reference exists anywhere in the compose file.

Before #3815 this failed open (the vulnerability that issue fixed). Since #381

[Read the thread](https://github.com/koala73/worldmonitor/issues/6537) · 2026-08-13 · closed · external user · 0 comments

### feat(economic): CII confidence scoring + anomaly detection panel

### Feature area

AI / Intelligence analysis

### Description

Add a CII Confidence & Anomaly Alert panel that surfaces two signals per country:

1. **Confidence score (0–100)** — based on data freshness, source diversity, and country-type variance — displayed as 🟢 High / 🟡 Medium / 🔴 Low badge.

2. **Anomaly alerts** — triggered when CII deviates beyond rolling 30-day statistical thresholds (±2σ):
   - 🔥 Thermal Spike — CII up 15+ pts in 24h
   - 📉 Rapid Cooling — CII down 10+ pts in 24h
   - 📈

[Read the thread](https://github.com/koala73/worldmonitor/issues/4061) · 2026-06-02 · open · external user · 0 comments

### Unauthenticated /health endpoint exposes auth configuration, rate-limit parameters, and heap memory to any caller

## Summary

The relay's `/health` endpoint is declared as a public route and returns auth configuration state, Telegram polling status, OREF alert history counts, WebSocket connection state, rate-limit parameters, and heap memory — without requiring any credential. This provides free reconnaissance to anyone probing the relay.

## Evidence

**`scripts/ais-relay.cjs` lines ~9041–9095:**
```javascript
const isPublicRoute = pathname === '/health' || pathname === '/' || isRssRoute || ...

// Respons

[Read the thread](https://github.com/koala73/worldmonitor/issues/3802) · 2026-05-18 · closed · external user · 0 comments

### security: MCP proxy endpoint has no authentication — CORS check passes on requests with no Origin header, allowing unauthenticated callers to proxy arbitrary external MCP servers with custom headers

## Location

`api/mcp-proxy.js`, handler entry point:

```javascript
export default async function handler(req) {
  if (isDisallowedOrigin(req))
    return new Response('Forbidden', { status: 403 });
  // ... accepts GET/POST with no further auth check
```

`api/_cors.js`:

```javascript
export function isDisallowedOrigin(req) {
  const origin = req.headers.get('origin');
  if (!origin) return false;  // ← no Origin = not disallowed
  return !isAllowedOrigin(origin);
}
```

## Impact

A `curl` r

[Read the thread](https://github.com/koala73/worldmonitor/issues/3723) · 2026-05-16 · closed · external user · 0 comments

The remaining reports are on [the project's issue tracker](https://github.com/koala73/worldmonitor/issues).
