photo-mcp demonstrates solid fundamentals with well-structured tool definitions, comprehensive schemas, and consistent use of tool annotations. All five tools follow a clear verb_noun naming convention (search_, get_), include detailed descriptions (150-250 chars each), and have proper JSON Schema definitions with type constraints and descriptions for all parameters. Tool annotations (readOnlyHint, destructiveHint, idempotentHint) are uniformly applied. However, output schemas are not formally documented, responses are serialized to JSON strings without explicit field descriptions or reference documentation. Error handling is minimal (basic HTTP error throws with no recovery guidance). The server lacks pagination support despite tools returning lists (search_photos returns 5-20 results; get_collection_photos returns 10-30), and relationship-building between tools is weak (search_photos returns photo IDs, but no guidance on how to chain to get_photo or get_related_photos). Per-tool scores range from 68-76, averaging 72.
Get all photos from an Unsplash collection by collection ID.
Get full details for a specific Unsplash photo by ID. Returns dimensions, EXIF data, tags, download count, and high-res URLs.
Get photos from the same series or collection as a given photo. Useful for finding cohesive image sets from the same photoshoot.
Find photos visually similar to a given Unsplash photo. Use for 'more like this' functionality.
Search Unsplash for high-quality stock photos. Returns photo URLs and photographer attribution. Use for hero images, backgrounds, and product photos.
Output schemas not formally documented. Response objects are JSON-serialized strings with no explicit field type definitions or description. LLMs must infer structure from runtime examples rather than declarative schema. This violates pattern:tool and complicates tool-chaining reasoning.
No error recovery guidance. HTTP errors (e.g. 'Unsplash search failed: 404') provide status codes but no next steps for the LLM. Errors should suggest alternatives: 'Photo not found. Try search_photos() to find related images.' Violates pattern:recovery-guide.
No pagination or cursor support despite tools returning variable-length lists (max 5-30 results). Large Unsplash searches can exceed token budgets. Tools should support offset/limit or next_cursor parameters and return total counts to enable multi-page iteration. Violates pattern:paginated-result.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 54 | - | v1 |
Tool-chaining information missing. search_photos returns photo.id, but descriptions do not explain that IDs can be passed to get_photo, get_related_photos, get_photo_series. LLMs must infer chaining relationships. Violates pattern:tool-chain.
No input validation or constraint enforcement for ID parameters. 'id' and 'collectionId' accept any string but will fail at Unsplash API if malformed. Descriptions should specify format requirements, e.g. 'Unsplash photo ID: 8-12 alphanumeric characters'. Violates review:param-validation-rules.