RedAlert MCP Server
by ozba
README.md
# RedAlert MCP Server
An MCP (Model Context Protocol) server for Israel's RedAlert emergency alert system. Provides real-time rocket alerts, historical statistics, shelter search, and city data through 12 MCP tools.
## Features
- **Real-time alerts** via Socket.IO with buffered polling model
- **Historical statistics** - summaries, per-city stats, alert history, distribution
- **Shelter search** - find nearby shelters by coordinates or city name
- **City catalog** - lookup cities with translations, coordinates, and countdown times
- **Test mode** - connect to the test server for simulated alerts
## Tools
### REST API Tools (8)
| Tool | Description |
|------|-------------|
| `get_active_alerts` | Real-time snapshot of cities currently under alert |
| `get_stats_summary` | Alert totals, top cities/zones/origins, timeline, peak hour |
| `get_stats_cities` | Per-city alert statistics with pagination and search |
| `get_stats_history` | Historical alert records with city filtering |
| `get_stats_distribution` | Alert distribution by category or origin |
| `search_shelters` | Find nearby shelters by coordinates or city name |
| `get_cities` | City catalog with translations, coordinates, countdown |
| `health_check` | API health check |
### Real-time Tools (4)
| Tool | Description |
|------|-------------|
| `subscribe_alerts` | Connect to Socket.IO and start receiving alerts |
| `poll_alerts` | Retrieve buffered alerts (peek or acknowledge) |
| `unsubscribe_alerts` | Disconnect and clear buffer |
| `get_alert_subscription_status` | Check connection state and buffer size |
## Setup
### Prerequisites
- Node.js 18+
- A RedAlert API key (get one at [redalert.orielhaim.com](https://redalert.orielhaim.com))
### Configure in Claude Code
Add to `~/.claude.json` under your project's `mcpServers`:
```json
{
"redalert": {
"type": "stdio",
"command": "npx",
"args": ["-y", "redalert-mcp-server"],
"env": {
"REDALERT_API_KEY": "your-api-key-here"
}
}
}
```
### Configure in Claude Desktop
Add to `claude_desktop_config.json`:
```json
{
"mcpServers": {
"redalert": {
"command": "npx",
"args": ["-y", "redalert-mcp-server"],
"env": {
"REDALERT_API_KEY": "your-api-key-here"
}
}
}
}
```
## Usage Examples
Once configured, you can ask Claude:
- "Show me active alerts right now"
- "Find all missile alerts in Kfar Saba in the last 24 hours"
- "Search for shelters near Tel Aviv"
- "Get alert statistics summary with top cities"
- "Subscribe to test alerts and poll for updates"
- "Compare missile alerts between Kfar Saba and Shoham in the last 2 months"
### Example: City Comparison
> **Prompt:** "Compare the missile alerts in the last 2 months between Kfar Saba and Shoham"
```
┌──────────────────────────┬───────────────┬───────────────┐
│ │ Kfar Saba │ Shoham │
├──────────────────────────┼───────────────┼───────────────┤
│ Zone │ Sharon │ Yarkon │
├──────────────────────────┼───────────────┼───────────────┤
│ Missile alerts │ 64 │ 77 │
├──────────────────────────┼───────────────┼───────────────┤
│ Total alerts (all types) │ 205 │ 217 │
├──────────────────────────┼───────────────┼───────────────┤
│ Last missile alert │ Mar 14, 12:43 │ Mar 13, 21:22 │
└──────────────────────────┴───────────────┴───────────────┘
Shoham had ~20% more missile alerts than Kfar Saba over this period (77 vs 64).
Both cities had a similar ratio of missile alerts to total alerts (~31-35%).
```
Claude automatically uses `get_stats_cities` and `get_stats_history` to gather and compare data across cities.
### Example: Weekly Alert Summary (Hebrew)
> **Prompt:** "תראה לי את כל ההתראות שהיו לכפר סבא בשבוע האחרון"
```
הנה כל ההתראות בכפר סבא בשבוע האחרון (7-14 במרץ):
| תאריך ושעה (UTC) | סוג התראה |
|-------------------|----------------------|
| 14/3, 13:04 | טילים |
| 14/3, 12:43 | טילים |
| 14/3, 12:39 | ידיעה מקדימה |
| 14/3, 00:30 | ידיעה מקדימה |
| 13/3, 21:22 | טילים |
| 13/3, 17:31 | טילים |
| 13/3, 17:26 | ידיעה מקדימה |
| 13/3, 14:58 | ידיעה מקדימה |
| 13/3, 11:26 | ידיעה מקדימה |
| 13/3, 08:49 | חדירת כלי טיס עוין |
| 12/3, 19:42 | טילים |
| 12/3, 19:38 | ידיעה מקדימה |
| 12/3, 15:19 | חדירת כלי טיס עוין |
| 12/3, 13:03 | טילים |
| 12/3, 12:57 | ידיעה מקדימה |
| 12/3, 07:22 | ידיעה מקדימה |
| 12/3, 02:13 | טילים |
| 12/3, 02:07 | ידיעה מקדימה |
סיכום השבוע בכפר סבא:
- 8 התראות טילים
- 8 ידיעות מקדימות
- 2 חדירות כלי טיס עוין
```
Claude uses `get_stats_history` with Hebrew city search, automatically filtering results to show only Kfar Saba. Works in any language.
### Example: Nearest Shelters
> **Prompt:** "תראה לי את שלושת המקלטים הכי קרובים לתיאטרון הבימה בתל אביב"
```
שלושת המקלטים הקרובים ביותר לתיאטרון הבימה:
| # | מרחק | כתובת | שם | סוג | שטח |
|---|--------|---------------------------|----------------------|----------------------|-----------|
| 1 | 143 מ' | הוברמן 4 (כיכר הבימה) | הבימה/שד' בן ציון | מקלט בשטח חניון | 2,000 מ"ר |
| 2 | 154 מ' | הוברמן 1 | היכל התרבות | חניון מחסה לציבור | 37,200 מ"ר|
| 3 | 260 מ' | ביל"ו 54 | - | מקלט ציבורי | 92 מ"ר |
- מקלט 1 - ממש בכיכר הבימה, גישה ציבורית
- מקלט 2 - היכל התרבות, החניון הגדול משמש כמחסה לציבור
- מקלט 3 - ביל"ו 54 פינת מרמורק 20, מתחת לבית כנסת
```
Claude resolves the landmark to coordinates and uses `search_shelters` to find the nearest shelters with full details.
## Testing
```bash
# Unit tests (91 tests)
npm test
# E2E tests against live API (56 tests)
REDALERT_API_KEY=your-key node e2e/run-e2e.mjs
```
## Architecture
```
src/
api/ # HTTP client and API endpoint wrappers
tools/ # MCP tool handlers (one per endpoint)
realtime/ # Socket.IO connection manager and alert buffer
__tests__/ # Unit tests (vitest)
config.ts # Configuration and API key
errors.ts # Error handling and MCP error mapping
server.ts # MCP server setup
index.ts # Entry point with stdio transport
e2e/ # End-to-end test runner and test plans
```
## API Reference
Based on [RedAlert API](https://redalert.orielhaim.com/docs/api-reference) by Oriel Haim.
## License
MIT
TDQS
A3.9/5.0
Scored across 12 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: current alerts, historical stats, real-time subscription, shelters, health check. No two tools overlap in functionality.
Naming Consistency4/5
Tools mostly follow a verb_noun snake_case pattern (e.g., get_active_alerts, subscribe_alerts). 'health_check' deviates slightly, but overall consistent.
Tool Count5/5
12 tools cover the domain well—real-time alerts, stats, shelters, health—without being excessive or sparse.
Completeness5/5
The toolset covers all essential operations: viewing active alerts, subscribing/polling real-time data, accessing historical statistics, and finding shelters. No obvious gaps.
Maintenance
ActivityInactive
ResponsivenessNo issues