google-mcp/lib/__init__.py
Jarian Cottingham 645d8820f1 fix: repair middleware wiring, input validation, and resource lifecycle
- Wrap RateLimitMiddleware in Middleware() - bare class broke all requests (500)
- Clamp/validate num param - ?num=abc no longer returns 500
- Query length cap (500), result counts clamped to 1..20
- Wire lifespan into Starlette so shared httpx client closes on shutdown
- Purge stale per-IP rate limit entries to bound memory growth
- URL-encode queries in the Playwright scraper path
- Lazy lib imports so the package works without optional playwright
- Add pyproject.toml (activates ruff/pytest/bandit in CI), README, LICENSE
- Remove committed __pycache__, add .gitignore/.dockerignore
- Fix SearXNG healthcheck path (/health -> /healthz) and compose docs
2026-08-20 23:27:27 +00:00

26 lines
766 B
Python

"""Shared search utilities.
Playwright-based scrapers are imported lazily so the package (and its
rate limiter) works without the optional ``playwright`` dependency.
"""
from lib.rate_limiter import RateLimiter
__all__ = ["PlaywrightManager", "RateLimiter", "GoogleSearch", "DuckDuckGoSearch"]
def __getattr__(name):
if name == "PlaywrightManager":
from lib.playwright_manager import PlaywrightManager
return PlaywrightManager
if name == "GoogleSearch":
from lib.google_search import GoogleSearch
return GoogleSearch
if name == "DuckDuckGoSearch":
from lib.duckduckgo_search import DuckDuckGoSearch
return DuckDuckGoSearch
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")