Server has 4 tools with complete input schemas and descriptions. Naming follows verb_noun pattern (search_*, save_*, batch_*). Descriptions are adequate (100-200 chars) and explain WHEN to use each tool. However, parameter descriptions lack detail on constraints, formats, and dependencies. Output schemas are not documented. Error handling converts exceptions to RuntimeError without actionable recovery guidance. The batch_save_images tool combines multiple concerns (search + save in a loop) and lacks per-item error reporting.
Search and save multiple stock photos in one call. Pass an array of {query, output_path, orientation?} objects to fill an entire landing page with real photos at once.
Download an image from a URL and save it to a local file path. Use after search_images to save a specific result into the project.
Search for a stock photo and save it directly to a local file. Combines search + download in one step — ideal for adding a hero image or section photo to a project.
Search Unsplash for real stock photos and return image URLs. Use this when a frontend task needs a hero image, team photo, or any real-world photo instead of placeholders.
search_and_save_image and batch_save_images combine search + download in one tool. This violates single-responsibility principle. Agents cannot compose search-only or save-only workflows. Split into separate tools or offer a composition helper.
batch_save_images accepts a generic array of objects with optional fields (index, orientation, width, height). The schema does not enforce required vs optional fields per item. LLMs may omit required fields like output_path, causing runtime validation errors instead of schema-time rejection.
Parameter descriptions lack actionable constraints. 'width' and 'height' say 'Maximum width/height in pixels' but do not specify valid ranges (e.g., 100 - 4000), units, or what happens if both are omitted. LLMs cannot infer these details.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | 2026-07-28+ | v2 |
Error handling converts all exceptions to RuntimeError(str(exc)). No recovery guidance. If search fails due to rate limit, the LLM sees 'RuntimeError: ...' with no hint to retry, wait, or try a different query. Errors should categorize as retryable, user-fixable, or fatal.
Output schemas are not documented. search_images returns a dict but the structure (fields, types, example) is not specified. LLMs cannot plan downstream calls or extract image URLs without guessing the response format.