Model Context Protocol (MCP) server exposing the Unsplash API as tools.
Solid foundation with complete schemas and descriptions for all 11 tools. All tools use proper verb_noun naming (search_*, get_*, list_*, track_*). Zod schemas are well-defined with type constraints (enums, min/max bounds). However, parameter descriptions are sparse or missing for many tools (search_collections, search_users, list_photos lack per-param descriptions). Output schemas are not documented, LLMs cannot predict response structure. Error handling returns raw API errors without recovery guidance. No tool annotations (readOnlyHint/destructiveHint) despite clear read/write distinction. Average tool description ~100 chars, below the 194-char baseline for A+ tools.
Retrieve a single photo by its id.
Retrieve a single (or a batch of) random photo(s) with optional filters.
Get an Unsplash topic by id or slug.
Get a user's public profile by username.
List the Unsplash editorial photo feed.
List Unsplash topics.
List photos uploaded by a given user.
Missing parameter descriptions for 6 tools (search_collections, search_users, list_photos, get_user, list_topics, get_topic). Parameters like 'query', 'page', 'per_page' lack context explaining their purpose or constraints.
No output schema documentation. LLMs cannot predict response structure (e.g., what fields are in a photo object, pagination format). This forces agents to guess and wastes tokens on exploratory calls.
Error handling returns raw UnsplashError with status and body JSON, but no recovery guidance. LLMs receive 'Unsplash API error 400: ...' with no hint on what to do next (retry, adjust params, call a different tool).
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 57 | 2026-07-28+ | v2 |
Search Unsplash collections by keyword.
Search Unsplash photos by keyword. Returns a paginated list of photos.
Search Unsplash users by keyword.
Trigger Unsplash download tracking for a photo (required by API guidelines when a user downloads).
No tool annotations (readOnlyHint/destructiveHint). track_photo_download is a WRITE operation but unmarked. LLMs cannot distinguish safe-to-retry reads from irreversible writes without explicit hints.
Tool descriptions are brief (avg ~60 chars for simple tools). Baseline for A+ is 194 chars. Descriptions lack context on WHEN to use each tool vs. similar ones (e.g., when to call search_photos vs. get_random_photo).