Two tools with clear verb-noun naming (search, fetch_page_content) and reasonable descriptions (194 and 180 chars respectively). Both have documented input schemas with types and descriptions. However, output schemas are not formally documented, responses are free-text strings rather than structured objects. Parameter descriptions lack constraints (e.g., max_results range, URL format validation). Error handling returns plain strings without recovery guidance. No tool annotations (readOnlyHint, idempotentHint). Composition is sound: search feeds into fetch_page_content. Rate limiting is implemented but not exposed to the agent.
Retrieves the main text content from a specific URL. Use this to read the details of a specific search result.
Performs a web search using DuckDuckGo (via ddgs). Returns titles, URLs, and snippets. Rate-limited to ~30 requests per minute to be respectful to DuckDuckGo.
Output schemas not documented. Both tools return plain strings instead of structured objects. LLMs cannot reliably extract fields (title, URL, snippet for search; content length for fetch) without parsing unstructured text.
Parameter constraints missing. max_results and max_length lack min/max bounds. No validation guidance for URL format. LLMs may pass invalid values (negative numbers, malformed URLs) without clear error recovery.
Error responses are generic strings without recovery guidance. 'Search error: ...' and 'Error fetching page content: ...' do not tell the LLM what to do next or whether to retry.
No tool annotations. Tools lack readOnlyHint (both are read-only) and idempotentHint (both are idempotent). Agents cannot infer safety properties without explicit hints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Rate limiting is server-side but not exposed to the agent. If rate limit is hit, the error message does not indicate backoff time or retry strategy, forcing blind retries.