MCP server for context-aware royalty-free image search from Pexels and Unsplash
The server has 5 well-defined tools with solid naming conventions and reasonably complete schemas. All tools start with action verbs (search_, extract_, get_, resolve_) following pattern:tool guidance. Descriptions are present and contextual, averaging ~100-120 chars (within the 10-1024 char band). Input schemas use Zod with proper type constraints including enums, minLength, min/max bounds. However, output schemas are undocumented, responses are JSON-stringified but the structure of that JSON (fields, types, nesting) is never declared. Error handling is minimal: no recovery guidance, no actionable error messages, no categorization of retryable vs fatal errors. Parameter dependencies (e.g., orientation applies to search but not extraction) are not explicitly documented. The batch variant (search_images_batch) is a good composition pattern, but there is no guidance on when to use it vs search_images. Overall: solid foundation with gaps in output documentation and error guidance.
Transform free-form text (e.g. UI copy, context) into an optimized image search query using noun extraction.
Return a single best image for a query.
Generate provider-compliant attribution text for an image (e.g. Photo by X on Pexels).
Search for royalty-free images from Pexels and Unsplash. Supports limit, page, and orientation filters.
Run multiple image searches in parallel. Returns results keyed by query.
Output schemas are not documented. Tools return JSON-stringified text, but the structure, field names, and types of that JSON are never declared. LLMs cannot parse responses predictably or plan downstream tool chains.
No error handling guidance or recovery hints. If Pexels API fails with 429 (rate limit) or 401 (invalid key), the error message is thrown but the LLM receives no actionable next step. Should categorize errors as retryable vs user-fixable and suggest corrective actions.
get_best_image description is vague: 'Return a single best image for a query.' Does it filter by rating, recency, or popularity? What makes one 'best'? Clarify the ranking logic.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | B | 71 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 49 | - | v1 |
search_images_batch lacks guidance on when to use it vs looping search_images. Description says 'in parallel' but does not explain the latency/token trade-off or mention the 10-query limit. Should clarify: 'Use this for 2-10 queries to reduce latency; for 1 query, use search_images.'
API credentials (Pexels API key, Unsplash API key) are not shown in the source, suggesting they may be passed or stored outside the tool definitions. Verify they are injected server-side via environment variables and NOT exposed as tool parameters.