MCP server for managing and searching an image library with OAuth authentication, auto-tagging via Claude vision, and Supabase storage integration
Two read-only tools with clear naming (search_images, list_images) and proper Zod schemas. Descriptions are adequate (90-110 chars) but lack actionable context for LLM selection. Parameters are well-typed with enums and defaults, but descriptions are minimal (10-30 chars), below the 72-char baseline for A+ tools. Output is unstructured text rather than typed objects, forcing LLM parsing. No error recovery guidance. Tool annotations present (readOnlyHint=true) but no destructiveHint or idempotentHint usage.
List all images in the library with their URLs, purpose, and tags. Supports pagination.
Search the image library by purpose and/or tags. Returns matching images with their public URLs, purpose, tags, and description.
Parameter descriptions are too brief (10-30 chars vs 72-char baseline). 'Max results' and 'Offset for pagination' lack context on valid ranges, defaults, or when to use pagination.
Output is unstructured text (markdown-like strings) rather than typed JSON objects. LLMs must parse 'URL: ${img.file_path}' from text instead of accessing img.file_path directly. Wastes tokens and invites parsing errors.
No error recovery guidance. If Supabase query fails, response is 'Error querying images: <message>' with no hint on what the LLM should do next (retry, check auth, call a different tool).
search_images accepts tags array but description says 'returns images that have ALL of these tags', unclear if this is AND or OR logic. Undocumented parameter relationship.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No documented output schema. Tool descriptions do not specify what fields are returned (id, name, file_path, purpose, tags, description, created_at, etc.) or their types. LLMs cannot plan downstream calls without knowing available fields.