get_weather_page_content
Retrieves and cleans raw weather data from weather2day.co.il to provide real-time Israel weather information for LLM responses.
Instructions
שלב 4 (RAG): שולף את הטקסט מהדף ומנקה אותו עבור ה-LLM. מחזיר את המידע הגולמי כדי שהמודל יוכל לענות למשתמש.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Output Schema
| Name | Required | Description | Default |
|---|---|---|---|
| result | Yes |
Implementation Reference
- weather_Israel.py:116-151 (handler)The main tool handler - async function decorated with @mcp.tool() that extracts weather forecast content from the page. It waits for body, tries specific CSS selectors (.forecast-text, .temp-value, .city-title, h1, .forecast-content), falls back to full body text if none found, cleans whitespace, and returns up to 4500 chars.
@mcp.tool() async def get_weather_page_content() -> str: """ שלב 4 (RAG): שולף את הטקסט מהדף ומנקה אותו עבור ה-LLM. מחזיר את המידע הגולמי כדי שהמודל יוכל לענות למשתמש. """ page = await browser_mgr.ensure_page() try: # המתנה לטעינת התוכן המרכזי await page.wait_for_selector("body", timeout=10000) # חילוץ אלמנטים רלוונטיים (כותרות וטקסט תחזית) # ננסה לחלץ סלקטורים ספציפיים לתחזית בישראל selectors = [".forecast-text", ".temp-value", ".city-title", "h1", ".forecast-content"] extracted_texts = [] for selector in selectors: elements = await page.query_selector_all(selector) for el in elements: txt = await el.inner_text() if txt.strip(): extracted_texts.append(txt.strip()) # אם לא מצאנו סלקטורים ספציפיים, ניקח את כל ה-body if not extracted_texts: raw_text = await page.inner_text("body") else: raw_text = "\n".join(extracted_texts) # ניקוי רווחים כפולים ושורות ריקות לחיסכון ב-Tokens clean_text = "\n".join([line.strip() for line in raw_text.splitlines() if line.strip()]) # החזרת התוכן (מוגבל באורך כדי לא להעמיס על הקונטקסט) return f"--- נתוני תחזית גולמיים ---\n{clean_text[:4500]}\n--- סוף נתונים ---" except Exception as e: return f"ERROR: חילוץ התוכן נכשל: {str(e)}" - weather_Israel.py:116-116 (registration)Tool registered via @mcp.tool() decorator on the async function, using FastMCP framework.
@mcp.tool() - weather_Israel.py:117-117 (schema)The handler takes no parameters and returns a string (str return type annotation). No Pydantic or validation schema defined.
async def get_weather_page_content() -> str: - weather_Israel.py:44-45 (helper)Shared global WeatherBrowserManager instance (browser_mgr) used by the handler to get the Playwright page.
# יצירת מופע גלובלי לניהול הדפדפן browser_mgr = WeatherBrowserManager() - weather_Israel.py:10-35 (helper)WeatherBrowserManager class with ensure_page() helper that manages browser lifecycle and page creation for Playwright.
class WeatherBrowserManager: """מנהל דפדפן יציב שתומך בשימוש חוזר בדף ובמעקף חסימות""" def __init__(self): self.playwright = None self.browser = None self.context = None self.page = None async def ensure_page(self): """מוודא שהדפדפן והדף פתוחים ומוכנים לעבודה""" if self.page is None or self.browser is None: self.playwright = await async_playwright().start() # headless=False כדי שנוכל לראות את הקסם קורה self.browser = await self.playwright.chromium.launch(headless=False) # הגדרות קריטיות לנטפרי (ignore_https_errors) ולזיהוי בוטים self.context = await self.browser.new_context( ignore_https_errors=True, user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" ) self.page = await self.context.new_page() # הגנה נוספת מפני זיהוי כבוט await self.page.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") return self.page