pixabay-mcp has well-structured tool definitions with complete input schemas and reasonable descriptions. All 8 tools are explicitly registered via @mcp.tool() decorator with type-annotated parameters. Descriptions are present and contextual (avg ~120 chars), explaining what each tool does and when to use it. However, descriptions lack actionable recovery guidance for errors, parameter enums are missing (e.g., image_type, video_type, order, size should be enums not free strings), and output schemas are not formally documented. Error handling uses a _guard wrapper that returns structured error dicts, but does not guide the LLM on next steps. Naming is clear and verb-driven (search_, paginate, get_, download_, library_). No security issues detected, API key is injected server-side via Config.from_env(). Composition is sound: tools chain logically (search → paginate → get_detail → download_asset → library_list/remove). Missing: enum constraints, output schema documentation, and error recovery hints.
Download one asset to the server library and return its path + attribution. Image sizes: preview, web, large, fullhd, original, vector (last three need a full-API-access account). Video sizes: large, medium, small, tiny.
Full raw record for one hit, straight from cache (no API call).
List assets already downloaded to the server library.
Remove one downloaded asset (by entry_id, e.g. '12345-web') from the library.
Return the next slim slice for a prior search's result_id. Free from the 24h cache when possible; only calls the API if the cursor runs past the cached hits and more exist server-side.
Search Pixabay images. Returns ~12 slim hits plus a result_id for paging. image_type: all|photo|illustration|vector. orientation: all|horizontal|vertical. order: popular|latest. category e.g. nature, backgrounds, people (see Pixabay docs). colors: comma list e.g. red,blue,grayscale. Use paginate(result_id) for more.
Parameter enums not declared. image_type, video_type, order, size, and orientation accept free strings instead of constrained enums. LLMs will hallucinate invalid values like 'image_type=photo_only' or 'order=trending'.
Output schemas not documented. Tools return Dict[str, Any] with no schema specification. LLMs cannot plan downstream calls or extract fields reliably. E.g., search_images returns 'hits' and 'result_id' but this is not formally declared.
Error messages lack recovery guidance. _guard() returns {'error': 'ResultExpired', 'message': '...'} but does not tell the LLM what to do next. E.g., 'result_id expired, call search_images() again to refresh.'
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 58 | 2026-07-28+ | v2 |
Search Pixabay videos. Each hit lists its available renditions/sizes. video_type: all|film|animation. order: popular|latest. Use paginate() for more.
Report key mode, cache/library location, and current rate-limit headers.
Descriptions lack dependency hints. search_images and search_videos do not state 'Call paginate() to fetch more results' or 'Use result_id from this call in paginate()'. Agents must infer the workflow.
download_asset lacks dry-run or confirmation. This is a WRITE operation that downloads files to disk. No confirmation step or preview before committing. Agents could accidentally download hundreds of assets.