Israel Weather MCP
Enables natural language weather queries for Israeli cities with real-time data extracted via Playwright, plus USA weather alerts and forecasts via NWS API, all orchestrated by Groq LLM.
README
Israel Weather MCP - Groq + Playwright Integration
A production-ready Model Context Protocol (MCP) implementation that provides real-time weather forecasts for Israeli cities using Groq LLM and Playwright browser automation.
Overview
This project demonstrates an advanced MCP architecture combining:
- Groq for fast, cost-effective LLM inference
- Playwright for reliable web automation and data extraction
- Weather2Day (https://www.weather2day.co.il) as the data source
- MCP (Model Context Protocol) for standardized tool integration
The system provides a natural language interface to weather queries, automatically navigating the Weather2Day website and extracting real-time forecast data.
Architecture
┌─────────────────┐
│ User Query │
│ "Weather in │
│ Jerusalem?" │
└────────┬────────┘
│
▼
┌─────────────────────────────┐
│ Groq LLM │
│ (llama-3.1-8b-instant) │
│ - Orchestrates workflow │
│ - Calls MCP tools │
│ - Generates final answer │
└────────┬────────────────────┘
│
▼
┌─────────────────────────────────┐
│ MCP Host (host.py) │
│ - Manages tool registry │
│ - Routes tool calls │
│ - Handles MCP protocols │
└────────┬──────────────────┬─────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ Israel │ │ USA │
│ Weather │ │ Weather │
│ MCP │ │ MCP │
└────┬─────┘ └────┬─────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Playwright │ │ NWS API │
│ Automation │ │ (REST) │
└────┬─────────┘ └──────────────┘
│
▼
┌──────────────────────────┐
│ Weather2Day Website │
│ (weather2day.co.il) │
└──────────────────────────┘
│
▼
┌──────────────────┐
│ Weather Content │
│ (Real Data) │
└────────┬─────────┘
│
▼
┌──────────────────────────────────┐
│ Groq Final Response │
│ "Today in Jerusalem: │
│ Partly cloudy, 31.7°C..." │
└──────────────────────────────────┘
Key Features
✅ Real-Time Data Extraction
- Navigates Weather2Day.co.il automatically using Playwright
- Extracts actual forecasts, temperatures, and weather alerts
- No static data or fallbacks
✅ Natural Language Interface
- Ask questions in Hebrew or English
- Groq processes context and automatically executes the right tool sequence
- Intelligent tool orchestration
✅ Dual MCP Servers
- Israel Weather MCP (
weather_Israel.py): Playwright-based extraction - USA Weather MCP (
weather_USA.py): REST API integration (NWS)
✅ Multi-City Support
- Jerusalem, Tel Aviv, Haifa, and 60+ Israeli cities
- Any US state (via NWS weather alerts)
✅ Production-Ready Error Handling
- Timeout management for network reliability
- Fallback selectors for dynamic page content
- SSL/TLS proxy compatibility (Netfree, corporate networks)
Technologies
| Component | Technology | Version |
|---|---|---|
| LLM | Groq | llama-3.1-8b-instant |
| MCP SDK | mcp | ≥1.27.0 |
| Browser | Playwright | ≥1.44.0 |
| HTTP Client | httpx | ≥0.24.0 |
| Config | python-dotenv | ≥1.2.2 |
| Language | Python | ≥3.13 |
Installation
Step 1: Clone Repository
git clone <repo-url>
cd weather-chat_mcp
Step 2: Install Python Dependencies
uv pip install -r pyproject.toml
Or using uv directly:
uv sync
Step 3: Install Playwright Chromium
Important: Playwright requires the Chromium browser to be installed.
playwright install chromium
On Linux, you may also need system dependencies:
# Ubuntu/Debian
sudo apt-get install libglib2.0-0 libdbus-1-3 libfontconfig1 libxrender1
# RHEL/CentOS
sudo dnf install glib2 dbus libxrender fontconfig
Step 4: Configure Groq API Key
-
Get your Groq API key from: https://console.groq.com/keys
-
Create
.envfile in project root:
cp .env.example .env
- Edit
.envand add your key:
GROQ_API_KEY=your_actual_groq_api_key_here
Security: The .env file is automatically excluded from git (see .gitignore).
Running the Project
Start the Interactive Chat Interface
python host.py
You'll see:
MCP Client Started!
Type your queries or 'quit' to exit.
Connected to server with tools: ['open_weather_forecast_israel', 'enter_weather_forecast_city_israel', 'select_weather_forecast_city_israel', 'get_weather_forecast_content_israel']
Connected to server with tools: ['get_alerts_in_USA', 'get_forecast_in_USA']
Example Queries
Hebrew:
Query: מה מזג האוויר בירושלים?
Query: מה התחזוקה עבור תל אביב?
English:
Query: What is the weather in Jerusalem?
Query: Show me the forecast for Haifa
Query: What are the weather alerts in California?
MCP Tools
Israel Weather MCP (weather_Israel.py)
1. open_weather_forecast_israel()
Opens the Weather2Day forecast website and initializes browser session.
- Input: None
- Output: Status message or error
- Purpose: Step 1 of workflow
2. enter_weather_forecast_city_israel(city: str)
Enters city name in the search field and waits for suggestions.
- Input:
city- City name (e.g., "Jerusalem", "ירושלים") - Output: Confirmation or error
- Purpose: Step 2 of workflow
3. select_weather_forecast_city_israel()
Selects the first city suggestion and loads the forecast page.
- Input: None
- Output: Confirmation that page loaded
- Purpose: Step 3 of workflow
4. get_weather_forecast_content_israel()
Extracts and returns the actual weather forecast content from Weather2Day.
- Input: None
- Output: Full weather data including temperatures, forecasts, alerts
- Purpose: Step 4 of workflow (final extraction)
Workflow: Always execute in order: open → enter(city) → select → extract
USA Weather MCP (weather_USA.py)
1. get_alerts_in_USA(state: str)
Fetches active weather alerts for a US state from NWS API.
- Input:
state- Two-letter state code (e.g., "CA", "NY") - Output: Active alerts with severity and description
2. get_forecast_in_USA(lat: float, lon: float)
Gets weather forecast for coordinates from NWS API.
- Input:
lat,lon- Latitude and longitude - Output: Forecast data
Browser Automation Details
Playwright Features Used
- Headless Chromium for lightweight browser instances
- Multiple selector strategies for robust DOM interaction
- Network idle detection for page load validation
- Async/await for non-blocking execution
- Global page state persists across tool calls
Selector Strategies (Weather_Israel.py)
The implementation uses multiple CSS selector fallbacks:
- ID-based selectors (most stable)
- Placeholder-based selectors (Hebrew attributes)
- Class-based selectors
- Generic fallbacks (input, button elements)
This approach handles dynamic page updates and unknown DOM structures.
Network Configuration
- SSL verification disabled for proxy compatibility (Netfree, corporate networks)
- Configurable timeout (30s for navigation, 15s for interactive elements)
- Error recovery with fallback mechanisms
Environment Variables
Required
- GROQ_API_KEY - Your Groq API key from https://console.groq.com/keys
Optional (internally configured)
- All proxy settings are handled automatically via httpx
- Playwright runs in headless mode by default
Project Structure
weather-chat_mcp/
├── host.py # Main orchestrator (Groq + MCP coordination)
├── client.py # MCP client implementation (stdio transport)
├── weather_Israel.py # Israel Weather MCP server (Playwright)
├── weather_USA.py # USA Weather MCP server (REST API)
├── pyproject.toml # Dependencies and project metadata
├── .env.example # Environment variable template
├── .env # Actual config (not committed, use .env.example)
├── .gitignore # Git ignore rules
└── README.md # This file
Test Files (Reference)
test_groq_tools.py- Integration testingtest_israel_tools.py- Israel MCP tool testingtest_groq.py- Groq API testingdebug_schemas.py- Tool schema debugging
How It Works
Workflow Example: "What is the weather in Jerusalem?"
1. User Input
└─> "What is the weather in Jerusalem?"
2. Groq LLM Processing
├─> Reads system prompt (Hebrew instructions)
├─> Analyzes user query
└─> Decides to call Israel Weather tools
3. Tool Execution (Groq orchestrates)
├─> Call: open_weather_forecast_israel()
│ └─> Result: Browser navigates to weather2day.co.il
│
├─> Call: enter_weather_forecast_city_israel(city="Jerusalem")
│ └─> Result: City name entered, suggestions available
│
├─> Call: select_weather_forecast_city_israel()
│ └─> Result: Page loads with forecast
│
└─> Call: get_weather_forecast_content_israel()
└─> Result: Raw Weather2Day content
├─> Temperatures: 31.7°C (Jerusalem)
├─> Forecast: "Partly cloudy to clear"
├─> Alerts: Thunderstorm warnings
└─> Tomorrow: "Partly cloudy, slight temp drop"
4. LLM Final Answer
└─> "The forecast in Jerusalem shows partly cloudy weather
with a high of 31.7°C. There's a risk of isolated
thunderstorms in eastern areas. Tonight will be partly cloudy..."
Groq's Role
- Understands context from system prompt (Hebrew instructions)
- Selects appropriate tools (Israel vs USA weather tools)
- Orchestrates tool sequence (open → enter → select → extract)
- Processes extracted data and generates natural language response
- Implements reasoning to handle follow-up questions
Key Design Decisions
1. Global Browser State
Why: Playwright browser instances are expensive to create. Global browser and page variables persist across tool calls, enabling the sequential workflow (open → enter → select → extract).
Alternative: Creating new browser instances per tool would be ~10-20x slower.
2. Multiple Selector Strategies
Why: Weather2Day's HTML structure is dynamic and selectors change with page updates. Multiple fallback strategies ensure reliability.
Example:
search_selectors = [
"#city_search_forecast", # Try ID first
"input[placeholder*='עיר']", # Try Hebrew placeholder
"input[type='search']", # Generic search input
"input", # Last resort
]
3. Groq Over OpenAI
Why:
- Groq's inference is 100-200x faster than OpenAI
- 10x cheaper for equivalent performance
- Ideal for MCP tool orchestration where latency matters
- llama-3.1-8b-instant is sufficient for weather context
4. Playwright Over Selenium
Why:
- Native async/await support (non-blocking)
- Better event-driven architecture
- Modern browser support (Chromium, Firefox, WebKit)
- Simpler API for DOM interaction
5. SSL Verification Disabled
Why: Corporate and school networks (e.g., Netfree in Israel) use intercepting proxies that break standard SSL verification. This is a known issue and verify=False is the standard workaround in such environments.
Security Note: This is safe for our use case (public APIs, no credential exchange in transit) and appropriate for enterprise deployments with internal CAs.
Troubleshooting
"GROQ_API_KEY not found"
Error: RuntimeError: GROQ_API_KEY not found in environment...
Solution: Create .env file with your Groq key:
cp .env.example .env
# Edit .env and add your GROQ_API_KEY
"Playwright not installed"
Error: TimeoutError: Timeout opening Weather2Day
Solution: Install Chromium:
playwright install chromium
"Connection refused" on other ports
If you get connection errors, the MCP server might be using a different stdio configuration. Ensure host.py and MCP servers are using stdio transport (default).
Weather2Day page structure changed
If selectors stop working:
- The extraction tool uses multiple fallback selectors
- If all fail, review
weather_Israel.pylines 240-260 - Update selectors based on actual page HTML (use browser DevTools)
Timeout errors for certain cities
Some cities (Tel Aviv) occasionally timeout due to page rendering delays. Retry or use different cities. This is a known limitation of browser automation on dynamic pages.
Performance Characteristics
| Operation | Time | Notes |
|---|---|---|
| Browser launch | 2-3s | One-time, cached |
| Page navigation | 3-5s | Network dependent |
| City selection | 1-2s | DOM interaction |
| Content extraction | 0.5-1s | DOM traversal |
| Groq inference | 1-3s | LLM processing |
| Total end-to-end | 8-15s | Varies by network |
Limitations
Current
- One city at a time - Each query handles single city (by design)
- Hebrew-optimized - System prompt is in Hebrew; English queries work but less optimized
- Dynamic page timing - Some cities have page rendering delays causing timeouts
- Static browser session - Playwright browser persists; restart required to clear state
Not Implemented
- Historical weather data
- Detailed NOAA integration for USA
- Multi-language support (Hebrew/English only)
- Caching or rate limiting
- User session management
Contributing
To Add Support for New Cities
No changes needed - Weather2Day covers 60+ Israeli cities automatically.
To Add New Data Sources
- Create new MCP server (e.g.,
weather_external_source.py) - Register in
host.pymcp_clients list - Add tools with
@mcp.tool()decorator - Update system prompt if needed
To Change LLM Provider
- Replace Groq with any OpenAI-compatible API
- Change
self.groq.chat.completions.create()in host.py - Ensure tool format is maintained (OpenAI schema)
License
This project is provided as-is for educational purposes.
References
- Groq: https://console.groq.com
- MCP Specification: https://modelcontextprotocol.io
- Playwright Documentation: https://playwright.dev
- Weather2Day: https://www.weather2day.co.il
- NWS API: https://www.weather.gov/documentation/services-web-api
Last Updated: 2026-08-16
Status: Production-Ready ✅
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.