Minimal MCP server bridging SearXNG's JSON API to MCP tools. Serves streamable-HTTP so the llama.cpp WebUI (browser MCP client) can use it.
Single tool 'search' has a well-structured schema with all parameters typed and described. Description is clear and actionable (194 chars), explaining what the tool does, parameters, and return format. However, output schema is documented only in prose, not as a formal JSON Schema structure. No error handling guidance for common failures (SearXNG unavailable, timeout, invalid query). Parameter descriptions include examples ('general', 'news') which could be replaced with enums. Missing tool annotations (readOnlyHint, idempotentHint). The tool is read-only and idempotent, but these properties are not declared.
Search the web via a private SearXNG instance. Args: query: The search query. max_results: Maximum number of results to return (default 10). categories: Comma-separated SearXNG categories, e.g. "general", "news", "science", "it". Omit for the default. language: Language code such as "en" or "en-US". Omit for any. time_range: One of "day", "week", "month", "year". Omit for any time. Returns: A list of results, each with title, url, content (snippet), and engine.
Output schema not formally documented. Description states 'A list of results, each with title, url, content (snippet), and engine' but no JSON Schema structure provided. LLMs cannot reliably parse unstructured prose output.
No error handling guidance. Tool description does not explain what happens if SearXNG is unreachable, query times out, or returns malformed data. LLM has no recovery path.
Parameter 'categories' uses prose examples ('general', 'news', 'science', 'it') instead of enum constraint. LLMs may hallucinate invalid category values.
Missing tool annotations. 'search' is read-only and idempotent, but readOnlyHint and idempotentHint are not declared in the tool definition.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
Parameter 'time_range' description lists valid values as prose ('day', 'week', 'month', 'year') rather than enum. Should be a constrained enum for clarity.