Skip to main content
Glama
README.md
# šŸŒ¦ļø Weather MCP — Israel via Browser Automation, USA via API

An MCP (Model Context Protocol) project demonstrating two ways to extend an LLM's context with live weather data:

- **`weather_USA.py`** — a "classic" MCP server: fetches forecasts and alerts from the US National Weather Service API (api.weather.gov).
- **`weather_Israel.py`** — an MCP server that puts the LLM's hand on the mouse šŸ–±ļø: it launches a real Chromium browser with **Playwright**, navigates to [weather2day.co.il](https://www.weather2day.co.il/forecast), types a city name into the search box, picks it from the autocomplete list — and extracts the page content so the LLM can answer the question itself (RAG).

## 🧩 Project Structure

```
ā”œā”€ā”€ client.py           # Generic MCP client — connects to any MCP server over stdio
ā”œā”€ā”€ host.py             # Terminal chat: connects Gemini to all MCP servers
ā”œā”€ā”€ weather_USA.py      # MCP server for US forecasts (API)
ā”œā”€ā”€ weather_Israel.py   # MCP server for Israeli forecasts (Playwright)
└── test_israel_flow.py # Smoke test for the full Israeli flow
```

### The Israeli Server's Tools

| Tool | What it does |
|---|---|
| `open_weather_forecast_israel` | Opens a browser and navigates to the forecast page |
| `enter_weather_forecast_city_israel` | Types a city name into the search field (and reports the suggestions) |
| `select_weather_forecast_city_israel` | Selects the first item in the autocomplete list |
| `get_weather_forecast_content_israel` | Extracts the forecast page content and feeds it to the LLM |

## šŸš€ Setup & Run

Prerequisites: Python 3.11+, [uv](https://docs.astral.sh/uv/).

```bash
# 1. Install dependencies
uv sync

# 2. Install Chromium for Playwright
uv run playwright install chromium

# 3. Gemini API key (free, no credit card) — https://aistudio.google.com/apikey
copy .env.example .env    # then edit: GEMINI_API_KEY=...

# 4. Run the chat
uv run host.py
```

Quick check of the Israeli server without an LLM:

```bash
uv run test_israel_flow.py
```

## šŸ’¬ Example Questions

- `מה ×”×Ŗ×—×–×™×Ŗ להיום ×‘×Ŗ×œ אביב?` (What's today's forecast in Tel Aviv?)
- `כדאי ×œ×§×—×Ŗ ×ž×˜×Ø×™×” ×ž×—×Ø ×‘×™×Ø×•×©×œ×™×?` (Should I take an umbrella tomorrow in Jerusalem?)
- `מה מזג האוויר בחיפה בהוף השבוע?` (What's the weather in Haifa this weekend?)
- `What's the forecast in Chicago?` (routed to the US server)
- `Are there weather alerts in California?`

While the question is being processed you'll see the browser open, type the city name, and select it from the list — then the model answers based on the page content.

## āš™ļø How It Works

1. The **Host** (`host.py`) launches each MCP server as a child process and opens a stdio session with it (via the generic **Client** in `client.py`).
2. The Host discovers each server's tools and attaches them to every LLM (Gemini) call.
3. When the model detects a question about weather in Israel, it invokes the four tools one after another: open browser → type city → select from list → extract content.
4. The page content comes back to the model as a tool result, and it composes an answer from it — RAG over a live web page.

## šŸ”— Connecting to Other Hosts (e.g. ChatBox)

The MCP servers are host-agnostic. Connect one to any MCP-capable app with a command like:

```
uv --directory C:\path\to\project run weather_Israel.py
```

TDQS

A4.1/5.0

Scored across 4 tools

Disambiguation5/5

Each tool handles a distinct, sequential step: open site, enter city, select suggestion, extract content. No overlap or ambiguity between them.

Naming Consistency5/5

All names follow a predictable action_weather_forecast_..._israel pattern with snake_case. The pattern is consistent and readable.

Tool Count5/5

4 tools perfectly cover the browser-based workflow for this narrow purpose. Not too sparse, not bloated.

Completeness5/5

The tool set forms a complete, linear workflow from opening the site to extracting forecast content. No obvious gaps for the stated domain.

Maintenance

ActivityStale
ResponsivenessNo issues