Skip to main content
Glama

🌤️ Agente Meteorológico MCP

Python 3.13+ OpenAI MCP Playwright

Un asistente meteorológico inteligente y multirregional impulsado por OpenAI y el Protocolo de Contexto de Modelo (MCP).

Obtén pronósticos y alertas meteorológicas en tiempo real para Israel y Estados Unidos a través de una interfaz de chat en lenguaje natural. El agente enruta inteligentemente las preguntas a la fuente de datos adecuada y compila respuestas a partir de datos web en vivo y API meteorológicas oficiales.


✨ Características

  • 🤖 Chat impulsado por IA: Consultas meteorológicas conversacionales usando GPT-4o-mini

  • 🌍 Dos fuentes de datos:

    • 🇮🇱 Israel: Extracción web en vivo de Weather2day mediante Playwright

    • 🇺🇸 EE. UU.: API oficial del Servicio Meteorológico Nacional

  • 🔄 Enrutamiento inteligente de herramientas: El agente selecciona automáticamente la herramienta adecuada según tu pregunta

  • 💬 Lenguaje natural: Haz preguntas en inglés sencillo; el agente entiende el contexto y la intención

  • 🔐 Seguro: Las claves de API se almacenan en .env y se excluyen del control de versiones

  • 🎯 Interactivo: Bucle de chat en tiempo real con automatización visible del navegador para consultas de Israel


Related MCP server: MCP Weather Assistant

📋 Tabla de Contenidos


🚀 Inicio Rápido

Ponte en marcha en 3 minutos:

# 1. Install dependencies
uv sync
uv run playwright install chromium

# 2. Create .env file with your OpenAI API key
copy .env.example .env
# Edit .env and add: OPENAI_API_KEY=sk-...

# 3. Run the agent
uv run .\host.py

# 4. Ask a weather question!
# Example: "What is the weather forecast for Jerusalem?"

📦 Requisitos

Componente

Versión

Propósito

Python

3.13+

Entorno de ejecución

Clave de API de OpenAI

—

Acceso al modelo GPT-4o-mini

uv

Última

Gestor de paquetes de Python rápido

Chromium

Última

Automatización del navegador (Playwright)

Internet

—

Acceso a API y extracción web


🔧 Configuración

1. Instalar Dependencias

Abre una terminal en el directorio del proyecto y ejecuta:

# Install Python dependencies
uv sync

# Download Chromium browser for Playwright (required for Israel weather)
uv run playwright install chromium

¿La primera vez tarda mucho? Sí—Playwright descarga Chromium (~300 MB). Esta es una operación única.

2. Configurar la Clave de API de OpenAI

Crea un archivo .env en la raíz del proyecto:

# Option A: Copy the template
copy .env.example .env

# Option B: Create manually
echo OPENAI_API_KEY=your_openai_api_key > .env

Reemplaza your_openai_api_key con tu clave real de API de OpenAI desde platform.openai.com/account/api-keys.

⚠️ Importante: Nunca hagas commit de .env ni compartas tu clave de API. El .gitignore ya la excluye.

3. Verificar la Instalación

Prueba la configuración:

uv run .\host.py

Deberías ver:

Connected to server with tools: [...]

MCP Client Started!
Type your queries or 'quit' to exit.

Query:

Presiona Ctrl+C o escribe quit para salir.


▶️ Ejecutar el Agente

Inicia el chat interactivo:

uv run .\host.py

El agente se lanza en modo interactivo. Escribe una pregunta meteorológica y presiona Enter. El agente:

  1. ✅ Analiza tu pregunta

  2. 🔍 Enruta a la herramienta meteorológica adecuada (Israel o EE. UU.)

  3. 🌐 Obtiene datos en tiempo real (puede abrir una ventana del navegador para Israel)

  4. 📊 Procesa y formatea la respuesta

  5. 💬 Devuelve la respuesta

Escribe quit para salir.

Para consultas de Israel: Se abre automáticamente una ventana del navegador Chromium. Esto es normal—el agente usa Playwright para interactuar con Weather2day. La ventana se cierra cuando la consulta se completa.


🏗️ Arquitectura

┌─────────────────────────────────────────────────────────────────┐
│                        OpenAI (GPT-4o-mini)                     │
│                      (Tool Selection & Reasoning)               │
└────────────────────────────┬────────────────────────────────────┘
                             │
                ┌────────────┴────────────┐
                │                         │
        ┌───────▼────────┐       ┌───────▼────────┐
        │  MCP Host      │       │   MCP Host     │
        │  (client.py)   │       │   (client.py)  │
        └───────┬────────┘       └───────┬────────┘
                │                         │
        ┌───────▼──────────────┐  ┌──────▼─────────────┐
        │ weather_Israel.py    │  │ weather_USA.py    │
        │ (Playwright + Web)   │  │ (NWS API)         │
        └───────┬──────────────┘  └──────┬─────────────┘
                │                         │
        ┌───────▼──────────────┐  ┌──────▼─────────────┐
        │   Weather2day.co.il  │  │    api.weather.gov│
        │  (Live Web Browser)  │  │   (REST API)      │
        └──────────────────────┘  └───────────────────┘

Flujo de datos:

  1. Haces una pregunta en el chat

  2. El host la envía a OpenAI con las herramientas disponibles

  3. OpenAI selecciona qué herramienta llamar según la pregunta

  4. El servidor MCP correspondiente ejecuta y devuelve los datos

  5. El host formatea y devuelve la respuesta


💬 Consultas de Ejemplo

🇮🇱 Clima en Israel

What is the weather forecast for Jerusalem?
Give me the forecast for Tel Aviv.
What is the weather like in Haifa today?
Show me the forecast for Eilat.
What is the weather in Beer Sheva?
Is it going to rain in Kfar Saba tomorrow?
Tell me about the weather in Nazareth.
What's the forecast for Tiberias?

Ciudades compatibles: Jerusalén, Tel Aviv, Haifa, Eilat, Beer Sheva, Kfar Saba, Tiberíades, Nazaret y la mayoría de las principales ciudades israelíes reconocidas por Weather2day.

🇺🇸 Clima en EE. UU.

What is the weather forecast for New York City? (40.7128, -74.0060)
What's the weather at latitude 34.0522, longitude -118.2437? (Los Angeles)
Are there any active weather alerts in California?
What weather alerts are in effect in New York?
Give me the forecast for Chicago coordinates. (41.8781, -87.6298)
Are there any severe weather warnings in Texas?

Formato:

  • Pronósticos: Usa coordenadas de latitud/longitud

  • Alertas: Usa códigos de estado de dos letras (CA, NY, TX, etc.)

🎯 Comportamiento Inteligente del Agente

El agente entiende el contexto:

  • ✅ "¿Cómo está el clima en Jerusalén?" → Usa la herramienta de Israel

  • ✅ "Voy a visitar Nueva York, ¿cuál es el pronóstico?" → Usa la herramienta de EE. UU. (40.71, -74.01)

  • ✅ "Cuéntame sobre el clima en Tel Aviv y Los Ángeles" → Llama a ambas herramientas

  • ✅ "¿Está lloviendo en Chicago ahora mismo?" → Enruta a la herramienta de EE. UU.


📂 Estructura del Proyecto

MCP Weather/
├── host.py                  # Main chat host (OpenAI + tool orchestration)
├── client.py                # MCP client connector
├── weather_Israel.py        # Israel MCP server (Playwright + Web)
├── weather_USA.py           # USA MCP server (NWS API)
├── pyproject.toml           # Dependencies and project metadata
├── uv.lock                  # Locked dependency versions
├── .env.example             # Template for environment variables
├── .env                     # Your API keys (git-ignored)
├── README.md                # This file
└── .gitignore               # Git exclusion rules

🐛 Solución de Problemas

❌ OPENAI_API_KEY is missing

Problema: El agente no encuentra tu clave de API.

Solución:

  1. Verifica que .env exista en la raíz del proyecto (misma carpeta que host.py)

  2. Comprueba que el archivo contenga: OPENAI_API_KEY=sk-your-actual-key-here

  3. Reinicia el host: uv run .\host.py

❌ El navegador Chromium no se inicia

Problema: Error "Failed to launch browser".

Solución:

uv run playwright install chromium

Si sigue fallando, verifica el espacio en disco (Chromium necesita ~500 MB).

❌ Tiempo de espera agotado o errores de API

Problema: "net::ERR_CONNECTION_RESET" o fallos en las solicitudes.

Solución:

  • Comprueba tu conexión a internet

  • Verifica que tu clave de API de OpenAI sea válida en platform.openai.com

  • Revisa el uso y la facturación de la API

❌ El navegador de Israel se abre pero la búsqueda falla

Problema: La búsqueda de ciudades no devuelve sugerencias.

Explicación: El autocompletado de Weather2day solo funciona en la página /forecast. La herramienta vuelve automáticamente a esa página antes de cada búsqueda, pero si falla:

Solución:

  • Verifica que Chromium esté actualizado: uv run playwright install --with-deps chromium

  • Asegúrate de tener conectividad a weather2day.co.il

  • Comprueba si hay ventanas emergentes o banners de cookies (el agente los maneja, pero las conexiones muy lentas pueden agotar el tiempo)

❌ "A server fails to connect"

Problema: Error de conexión del servidor MCP.

Solución:

# Run from the project directory
Set-Location .\project-template
uv run .\host.py

❓ Preguntas Frecuentes

P: ¿Cómo decide el agente qué herramienta usar?
R: GPT-4o-mini de OpenAI lee tu pregunta y selecciona la mejor herramienta según el contexto (país/región mencionado, coordenadas proporcionadas, etc.). No se basa en reglas—usa comprensión del lenguaje.

P: ¿Puedo preguntar sobre varias regiones en una sola consulta?
R: ¡Sí! El agente puede llamar a múltiples herramientas. Prueba: "¿Cómo está el clima en Tel Aviv y Nueva York?"

P: ¿Por qué el navegador de Israel se abre visiblemente?
R: Playwright automatiza Weather2day escribiendo en la búsqueda en vivo, seleccionando resultados y leyendo la página. El modo headless (invisible) no funciona con el autocompletado con mucho JavaScript de este sitio, por lo que el navegador se ejecuta visiblemente.

P: ¿Cuánto cuesta esto?
R: OpenAI te factura según las llamadas a la API. Cada consulta cuesta ~$0.001–$0.01 dependiendo de la longitud de la respuesta. La extracción web de Israel es gratuita; la API de EE. UU. es gratuita (NWS es público).

P: ¿Qué pasa si quiero añadir más regiones?
R: Crea un nuevo servidor MCP (por ejemplo, weather_Europe.py) y regístralo en host.py bajo self.mcp_clients. Consulta los servidores existentes para ver el patrón.

P: ¿Mi clave de API está segura?
R: Sí. Tu .env está excluido de Git y se almacena solo localmente. Nunca pegues tu clave en código o en chats públicos.

P: ¿Puedo usar esto en producción?
R: Este es un proyecto de demostración. Para producción:

  • Usa colas de solicitudes asíncronas

  • Añade registro y recuperación de errores

  • Almacena en caché los pronósticos (el clima cambia cada hora, no por consulta)

  • Configura monitoreo y alertas

  • Usa configuración basada en variables de entorno


🔒 Seguridad

⚠️ Hacer

❌ No hacer

✅ Mantén .env local y privado

❌ Hacer commit de .env a Git

✅ Rota las claves de API regularmente

❌ Compartir tu clave de API

✅ Usa variables de entorno en producción

❌ Hardcodear secretos en código

✅ Revisa los límites de facturación de la API

❌ Dejar la cuota ilimitada

✅ Usa HTTPS para las llamadas a la API

❌ Usar HTTP en producción

Si tu clave de API queda expuesta:

  1. Revócala inmediatamente en el Panel de OpenAI

  2. Genera una nueva clave

  3. Actualiza .env


📝 Licencia

Este proyecto se proporciona tal cual con fines educativos. Consulta LICENSE para más detalles.


🤝 Contribuciones

¿Tienes ideas para mejorar el agente? ¡Las contribuciones son bienvenidas!

  1. Haz un fork del repositorio

  2. Crea una rama de características (git checkout -b feature/amazing-feature)

  3. Haz commit de tus cambios (git commit -m 'Add amazing feature')

  4. Empuja a la rama (git push origin feature/amazing-feature)

  5. Abre una Pull Request


📞 Soporte

  • 🐛 Reporta errores a través de GitHub Issues

  • 💡 Sugiere características en Discussions

  • 📧 Para problemas de seguridad, envía un correo privado (no abras un issue público)


¡Felices pronósticos! 🌦️☀️

Available Tools

4 tools
enter_weather_forecast_city_israelC

מקבל שם עיר ומזין אותו בשדה החיפוש באתר מזג האוויר.

:param city_name: שם העיר בחיפוש (למשל: 'ירושלים', 'תל אביב')

NameRequiredDescriptionDefault
city_nameYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses only that it fills a search field; it does not say whether the search is submitted, what happens if the city is not found, whether the site must already be open, or what state the page is left in for the next sibling call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short lines with the action stated first and the parameter documented in a conventional :param block; nothing is padded. It is efficient, though the colon-prefixed param line is stylistically thin for a tool with a workflow dependency.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. However, for a browser-automation step in a four-tool sequence, the description omits the ordering/state assumptions an agent needs, leaving a real gap despite the adequate parameter hint.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single parameter, so the description must compensate, and it partially does by explaining that city_name is the search string and giving examples ('ירושלים', 'תל אביב'). It adds useful illustrative meaning but no format or validation constraints beyond that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a concrete verb and resource: it receives a city name and types it into the search field of the weather site. That is specific enough to distinguish a UI-entry step, though it never names or contrasts the sibling tools (select_weather_forecast_city_israel, open_weather_forecast_israel), so an agent must infer the ordering itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no prerequisites, and no mention of the sibling steps that presumably follow. The workflow role (enter search text, then select the city, then read content) is only implied by the tool names, not stated in the description.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_weather_forecast_content_israelA

מחלקץ את הטקסט הגלוי מתוך דף התחזית הנוכחי שנפתח בדפדפן, מנקה רווחים מיותרים ומחזיר את התוכן ל-LLM לצורך מתן תשובה.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses the extraction behavior and whitespace cleanup, which is useful, but omits what happens when no page is open, failure/error behavior, and any permission considerations. Adequate but incomplete for a zero-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence stating the action, with no wasted preamble. The trailing clause about returning content 'to the LLM to provide an answer' is mildly redundant but not harmful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and there are no parameters to document. The main remaining gap is state-dependence (what it requires the browser to already be showing), which is only implied rather than guaranteed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has zero parameters, so the baseline of 4 applies. Nothing about parameters needs explaining and the description does not confuse the matter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: it extracts the visible text from the current forecast page open in the browser and returns a cleaned version. That is clear and distinguishable from open/enter/select siblings in the pipeline, though it never explicitly names how it differs from them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it works on the page 'opened in the browser', so the agent can infer it must run after opening and selecting a city. There is no explicit statement of prerequisites, exclusions, or what to do instead if the page is not ready.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

open_weather_forecast_israelA

פותח את דפדפן האינטרנט ומנווט לדף הבית של אתר מזג האוויר הישראלי.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses the side effect that a browser window is opened, which is meaningful for an agent. It does not mention state (new tab vs. existing), auth, or what the user sees next, leaving gaps for a no-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the action and destination are stated immediately. Nothing needs trimming.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple (0 params, output schema present so return values need no explanation) and the description adequately covers the action. The remaining gap is routing context against the sibling tools, which is a moderate omission rather than a fatal one.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, and the schema coverage is 100%, so there is nothing for the description to disambiguate. Baseline 4 applies since no parameter semantics are needed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a concrete verb+resource in Hebrew: it opens the browser and navigates to the Israeli weather site's homepage. An agent can tell what the tool does. However, it never distinguishes itself from the three sibling tools (enter/select/get_weather_forecast_*), so it stops at 4.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The mention of navigating to the 'homepage' implies this is the entry/starting step before the city-selection and content siblings, but there is no explicit statement of when to use it versus enter_weather_forecast_city_israel or get_weather_forecast_content_israel. Usage is only inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_weather_forecast_city_israelA

בוחר את התוצאה הראשונה ברשימת הערים שנפתחה בעקבות החיפוש.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full disclosure burden. It usefully reveals that selection is deterministic ('first result'), meaning the agent cannot choose a specific city, but it omits what happens if the list is empty, whether it navigates to a new page, and any auth or error behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, tight sentence with no padding, and the key constraint ('first result') is placed prominently. Appropriate length for a zero-argument UI step.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be explained, and there are no parameters. What remains unstated is the workflow contract (what must precede this call, what state follows it), which matters for a sequential UI-automation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate. The baseline for a parameterless tool is 4, and the description adds no misleading parameter claims.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (selects) and a specific target (the first result in the city list opened by the search), which distinguishes it from siblings like enter_weather_forecast_city_israel or open_weather_forecast_israel. It stops short of explicitly naming the alternative tools, but the action and target are clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'the city list that was opened following the search' implies this step follows a search and a list-opening step, giving sequencing context. However, it never states when to use this versus entering a city directly, nor any preconditions or failure conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.0
    • First observedenter_weather_forecast_city_israel
    • First observedget_weather_forecast_content_israel
    • First observedopen_weather_forecast_israel
    • First observedselect_weather_forecast_city_israel

TDQS

B3.4/5.0

Scored across 4 tools

Disambiguation4/5

Each tool maps to a distinct browser-automation step (open site, enter city, select result, extract content), so they are separable in principle. However, they form a rigid ordered pipeline with no way to tell from the names alone that they must be chained, and enter vs. select could be momentarily confused by a hurried agent.

Naming Consistency4/5

All names are snake_case and share a predictable verb_..._israel suffix (open/enter/select/get_weather_forecast_..._israel). Minor structural deviation: open_weather_forecast_israel omits the 'city' segment the other three include, but the pattern is still readable and consistent.

Tool Count4/5

Four tools is a reasonable count for this narrow scraping workflow. It is slightly granular, since a single 'fetch forecast for city' operation is split into four browser steps, but each step is individually actionable and the set stays well-scoped.

Completeness3/5

The surface covers the happy path open -> search -> select -> extract, but has no tool to close/reset the browser session, no error or no-result handling, and despite the generic server name 'MCP Weather Agent' it only supports Israeli locations. Agents can complete the core task but will hit dead ends on edge cases.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers