Custom search engine results page (SERP) API using Selenium for web scraping across multiple search engines (DuckDuckGo, Brave, Google, Bing) with anti-detection fingerprinting
Single tool 'search' has severe definitional gaps. While the tool name is action-verb compliant and a description exists, the parameter schema is incomplete with missing type constraints, and the output schema is entirely undocumented. The description, though present, provides only a basic example without guidance on when to use the tool, what prerequisites exist, or what fields the response contains. Critical patterns for parameter validation, schema documentation, and LLM-optimized descriptions are absent.
Perform a search on the specified search engine and return results. Example: /search?q=ai+tools&engine=brave&limit=5
Output schema completely undocumented. LLM has no visibility into response structure, fields, or data types returned by search results.
Input parameter 'engine' lacks enum constraint. Accepts 'duckduckgo, brave, google, bing' per description, but schema does not enforce this, LLM can hallucinate invalid engine names.
Parameter descriptions are minimal. 'Search query' and 'Maximum number of results to return' provide no guidance on format, length limits, or constraints. 'Search engine to use' lists options in description but doesn't explain when to prefer one over another.
Tool description lacks actionable context. No statement of WHAT the tool does (returns search results), WHEN to use it (vs a different search method), or WHAT fields are in the response. Description is 135 chars; should be 50-200 chars with clear purpose and usage guidance.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 41 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 36 | - | v1 |
Limit parameter lacks bounds validation. Default is 5, but schema does not declare minimum/maximum. LLM could pass limit=10000, wasting tokens and API resources.
No error handling guidance. Tool implementation uses Selenium with retry logic and timeouts (visible in scraper.py MAX_RETRIES, backoff), but no documented error responses for LLM to act on (e.g., 'Search timeout. Try with a simpler query' or 'Engine unavailable. Try a different engine').