Thermal Sentinel MCP Server
by 0xConsole
README.md
# ๐ก๏ธ Thermal Sentinel
> Heat-risk monitoring agent powered by the **FortyGuard Temperature API**. Detects heat waves and temperature anomalies, generates alerts with urban-planning recommendations, and exposes an MCP tool interface. Built for the [FortyGuard Hackathon'26](https://www.fortyguard.com/hackathon26) (Agentic AI track).
**Live demo:** [https://thermal-sentinel-agent.vercel.app](https://thermal-sentinel-agent.vercel.app) ยท **GitHub:** [0xConsole/thermal-sentinel-agent](https://github.com/0xConsole/thermal-sentinel-agent)
## What It Does
Thermal Sentinel is an AI agent that:
1. **Queries** the FortyGuard Temperature API for real-time urban temperature data
2. **Detects** heat waves and anomalies using Sentinel-style multi-signal anomaly detection (WHO heat bands + z-score + sustained-heat + rate-of-change)
3. **Generates** heat-risk alerts with actionable urban-planning recommendations
4. **Exposes** 11 tools via the MCP (Model Context Protocol) โ any AI agent can call them
5. **Displays** a live dashboard with city grid, alerts, charts, and one-click demo
## Quick Start
```bash
# Clone
git clone https://github.com/0xConsole/thermal-sentinel-agent.git
cd thermal-sentinel-agent
# Install deps
pip install -r requirements.txt
# Run locally (no API key needed โ mock data works out of the box)
uvicorn app.main:app --reload --port 8000
# Open dashboard
open http://localhost:8000
```
### With Real FortyGuard API
```bash
export FORTYGUARD_API_KEY="your-api-key"
export FORTYGUARD_API_BASE="https://api.fortyguard.com" # default
uvicorn app.main:app --reload --port 8000
```
## Architecture
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Dashboard UI (static) โ
โ REST API + MCP Tool Interface โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ FastAPI (app/main.py) โ
โ /api/* routes + /mcp/tools /mcp/call โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ Agent (app/agent.py) โ
โ scan_cities โ monitor_city โ heat_risk_report โ
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโค
โ FortyGuard โ Anomaly Detector โ Store (SQLite) โ
โ Client โ (Sentinel-style) โ /tmp persistence โ
โ Real or mock โ 4 signals + score โ readings + alerts โ
โโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโดโโโโโโโโโโโโโโโโโโโโโโโ
```
## MCP Tools (11)
| Tool | Endpoint | Description |
|------|----------|-------------|
| `scan_cities` | `POST /mcp/call` | Scan multiple cities for heat risk |
| `get_temperature` | `POST /mcp/call` | Current temperature for a city |
| `get_temperature_history` | `POST /mcp/call` | Hourly temperature history |
| `detect_heat_anomaly` | `POST /mcp/call` | Run anomaly detection |
| `monitor_city` | `POST /mcp/call` | Deep single-city monitoring |
| `get_heat_risk_report` | `POST /mcp/call` | Consolidated risk report |
| `get_alerts` | `POST /mcp/call` | Active alerts from log |
| `acknowledge_alert` | `POST /mcp/call` | Dismiss an alert |
| `list_monitored_cities` | `POST /mcp/call` | List monitorable cities |
| `get_monitoring_stats` | `POST /mcp/call` | Monitoring statistics |
| `run_demo` | `POST /mcp/call` | One-click demo scan |
List tools: `GET /mcp/tools`
Call tool: `POST /mcp/call` with `{"name": "scan_cities", "arguments": {"cities": ["Dubai", "Phoenix"]}}`
## REST API
| Method | Path | Description |
|--------|------|-------------|
| `GET` | `/` | Dashboard UI |
| `GET` | `/health` | Health check (shows live/mock mode) |
| `POST` | `/api/scan` | Scan cities |
| `GET` | `/api/temperature/{city}` | Current temperature |
| `GET` | `/api/history/{city}?hours=24` | Temperature history |
| `GET` | `/api/monitor/{city}?hours=24` | Deep city monitoring |
| `GET` | `/api/report?city=...` | Heat-risk report |
| `GET` | `/api/alerts?city=...&limit=50` | Active alerts |
| `POST` | `/api/alerts/{id}/ack` | Acknowledge alert |
| `GET` | `/api/stats` | Monitoring stats |
| `GET` | `/api/cities` | List cities |
| `POST` | `/api/demo` | One-click demo |
## Anomaly Detection
Multi-signal, composite 0-100 risk score:
| Signal | Max Points | Catches |
|--------|-----------|---------|
| WHO heat-risk band | 40 | Absolute heat level |
| Z-score (vs 24h baseline) | 25 | Statistical outlier |
| Sustained heat-wave (consecutive โฅ38ยฐC) | 20 | Heat wave declaration |
| Rate-of-change (โฅ5ยฐC/hr) | 15 | Rapid shifts |
Severity: `info โ low โ medium โ high โ critical`
## Project Structure
```
thermal-sentinel-agent/
โโโ api/
โ โโโ index.py # Vercel entry
โโโ app/
โ โโโ __init__.py
โ โโโ main.py # FastAPI app + routes
โ โโโ fortyguard_client.py # API client + mock transport
โ โโโ anomaly_detector.py # Sentinel-style detection
โ โโโ agent.py # Orchestration
โ โโโ mcp_server.py # MCP tool registry
โ โโโ store.py # SQLite persistence
โโโ static/
โ โโโ index.html # Dashboard UI
โโโ CONCEPT.md
โโโ README.md
โโโ vercel.json
โโโ requirements.txt
โโโ .gitignore
```
## What's Real vs Mocked
- โ
**Real:** FortyGuard API integration (when `FORTYGUARD_API_KEY` set), anomaly detection engine, MCP tool protocol, alert generation, dashboard UI, Vercel deployment
- ๐ถ **Mock (fallback):** When no API key, temperature data is generated from per-city climate baselines with realistic diurnal variation and anomaly injection โ for zero-credential demos
## Deploy
```bash
# Vercel (auto-creates project on first deploy)
vercel --prod --yes --token "$VERCEL_TOKEN"
# Or set env var on Vercel
vercel env add FORTYGUARD_API_KEY production
```
## License
MIT
## Built For
**FortyGuard Hackathon'26** โ Agentic AI track
- Prize: $6K + NVIDIA Jetson
- Judging: Impact (40%), Technical Execution (35%), Innovation (15%), Communication (10%)
- See [CONCEPT.md](CONCEPT.md) for full concept and judging-criteria alignment
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues