SITUROOM MCP Server
Enables agents to fetch real-time earthquake, natural events, conflict headlines, market data, and tension index from free public sources via tools like get_quakes, get_events, get_headlines, get_tension, get_markets.
README
SITUROOM
The zero-backend global situation room — real-time earthquakes, conflicts, hazards and markets in one static page. No server. No API keys. No paywall.

Live demo: https://nguyenminhduc9988.github.io/situroom/
Why
Most "world monitor" intel dashboards are hosted products: a big server fleet renders the picture, the scoring is a black box, and the useful parts (APIs, agent access) sit behind a paid key. SITUROOM is the opposite bet — everything a situation dashboard needs is available from free, keyless, CORS-friendly public APIs, so the entire product can be one static folder.
| SITUROOM | Typical hosted intel dashboards | |
|---|---|---|
| License | MIT, no commercial tier | AGPL + commercial-license upsell |
| Backend | none — static files | fleets of edge functions + Redis + relays |
| API / agent access | free local MCP server, included | paid API keys |
| Scoring | documented client-side formula (js/score.js) — recompute it in devtools | opaque, server-side |
| Offline | PWA + committed data snapshot fallback | online-only |
| Setup | open one URL, or python3 -m http.server |
cloud deployment |
Six free sources today, PRs for more welcome.
Quick start
1. Just open it — https://nguyenminhduc9988.github.io/situroom/
2. Run it locally (any static server works; no install, no build):
git clone https://github.com/nguyenminhduc9988/situroom
cd situroom
python3 -m http.server 8080
# open http://localhost:8080
3. Host your own — fork the repo, enable GitHub Pages (deploy from main, root). Done: it's static files.
Features
-
Canvas world map — vendored d3-geo projection, graticule, country hover, magnitude-scaled quake markers, category-colored natural events, tension heat blobs. Toggleable layers, pulse animations (disabled under
prefers-reduced-motion). -
Tension index — transparent per-country score over the current news window, top-10 bars colored green→amber→red. The formula is documented below and in the UI ("formula?" button).

-
Headlines — conflict-flavored world news from GDELT (English sources by default, all-languages toggle in settings).
-
Quakes / Events / Tech panels — USGS earthquakes, NASA EONET natural events, Hacker News front page.
-
Markets ticker — BTC/ETH/SOL with 24h change, USD FX reference rates.
-
Status chips per source — LIVE / STALE (cached) / SNAPSHOT / ERROR, so you always know what you're looking at.
-
Watchlist — pin countries you care about to the top of the tension board.
-
Responsive — panels stack on narrow viewports; the six status chips collapse into one aggregate chip.
<img src="docs/mobile.png" alt="SITUROOM on a phone-sized viewport" width="320">
Data sources
All free, keyless, fetched directly from your browser (CORS-friendly). Attribution and thanks:
| Source | Data | Refresh |
|---|---|---|
| USGS Earthquake Hazards Program | earthquakes, past 24h | 5 min |
| NASA EONET | open natural events (wildfires, storms, volcanoes…) | 10 min |
| GDELT Project DOC 2.0 | conflict/military/sanctions/protest headlines, ~6h window | 15 min |
| CoinGecko | BTC / ETH / SOL spot + 24h change | 2 min |
| Frankfurter | USD→EUR/JPY/GBP/CNY reference rates | 60 min |
| HN Algolia | Hacker News front page | 10 min |
Every source degrades independently: live fetch → last good response from localStorage (STALE) → committed capture in data/snapshot.json (SNAPSHOT) → ERROR chip. The dashboard never renders blank.
The tension index formula
No black box — the entire computation runs in your browser over the raw GDELT article list, in js/score.js:
- volume(C) — articles published in country C or naming C (or a common alias) in the headline
- severity(C) — mean headline keyword weight:
3war/strike/attack/missile…,2sanctions/military/nuclear…,1protest/unrest/clashes…, floor0.5 - score(C) =
100 × norm(0.6·log1p(volume) + 0.4·severity)— the hottest country of the moment reads 100, everything else is relative
Honesty note: GDELT's article-list API doesn't expose its per-article tone field, so severity is a documented keyword proxy — cruder than GDELT tone, but fully auditable, which is the point. The full country/alias gazetteer and keyword table are plain data at the top of the file; the unit tests in test/score.test.js pin the behavior.
AI sitrep (optional, bring your own key)
Off by default and never required. If you point settings (gear icon) at any OpenAI-compatible endpoint — including a local Ollama at http://localhost:11434/v1 — an AI SITREP button appears that summarizes the current headlines + tension board into a 5-bullet brief. Your endpoint, key and model live only in your browser's localStorage and are sent nowhere except the endpoint you configured.

MCP server (agents get the feeds for free)
mcp/situroom_mcp.py is a zero-dependency Python 3.10+ stdio MCP server exposing the same feeds as tools: get_quakes, get_events, get_headlines, get_tension, get_markets — normalized to the web app's shapes, tension formula faithfully ported from js/score.js. Config snippets for Claude Desktop/Code and Cursor in mcp/README.md.
claude mcp add situroom -- python3 /path/to/situroom/mcp/situroom_mcp.py
Architecture
Vanilla ES modules. No framework, no build step, no npm install. The only third-party code is vendored and committed: d3 v7 + topojson-client (plus the world-atlas 110m topology) in vendor/, so the app runs with zero network access to any CDN.
index.html
├── css/app.css dark ops theme (system fonts only)
├── js/app.js boot, source registry, 60s scheduler, panels
│ ├── js/map.js canvas map (offscreen-cached base + marker layer)
│ ├── js/score.js tension index (pure, documented, tested)
│ ├── js/store.js localStorage cache + settings
│ ├── js/brief.js optional BYOK sitrep
│ └── js/sources/*.js one module per feed: fetchX() + pure normalizeX()
├── sw.js PWA: precached shell, network-first API fallback
└── data/snapshot.json committed real capture — the floor of the chain:
live fetch ──fail──▶ localStorage last-good ──miss──▶ committed snapshot ──miss──▶ ERROR chip
(LIVE) (STALE) (SNAPSHOT)
Run the tests (pure functions only, fully offline):
node --test test/*.test.js # or: npm test — 44 tests, zero dependencies
Contributing
PRs welcome — especially new free, keyless, CORS-friendly data sources. The bar for a source module: one file in js/sources/, export a pure normalizeX() (unit-tested against a captured payload in data/snapshot.json) and a fetchX() that returns null on any failure. Open an issue first for anything bigger than a source or a fix.
License
MIT © 2026 Minh-Duc Nguyen
Built by BigWinner.work — AI Tools & Consulting
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.