@mcp.tool()
def search(query: str, categories: Optional[str] = None, engines: Optional[str] = None,
language: Optional[str] = None, page: int = 1, time_range: Optional[str] = None,
safe_search: int = 1) -> Dict[str, Any]:
"""
Search using SearXNG
Args:
query: The search query
categories: Optional comma-separated list of categories
engines: Optional comma-separated list of engines
language: Optional language code
page: Page number (default: 1)
time_range: Optional time range (day, month, year)
safe_search: Safe search level (0, 1, 2)
"""
logger.info(f"Received search request - Query: {query}")
params = {
"q": query,
"format": "json",
"pageno": page,
"safesearch": safe_search
}
if categories:
params["categories"] = categories
logger.debug(f"Categories specified: {categories}")
if engines:
params["engines"] = engines
logger.debug(f"Engines specified: {engines}")
if language:
params["language"] = language
logger.debug(f"Language specified: {language}")
if time_range:
params["time_range"] = time_range
logger.debug(f"Time range specified: {time_range}")
logger.debug(f"Making request to SearXNG with params: {params}")
try:
response = client.get(urljoin(SEARXNG_URL, "/search"), params=params)
response.raise_for_status()
result = response.json()
logger.info(f"Search completed successfully - Found {len(result.get('results', []))} results")
return result
except httpx.HTTPError as e:
logger.error(f"HTTP error occurred during search: {str(e)}")
raise
except Exception as e:
logger.error(f"Unexpected error during search: {str(e)}")
raise