MCP server for Supabase upload app management - provides tools for blog posts, broadcasts, subscribers, and more
This server has moderate definition quality with several consistent weaknesses. All 8 tools are explicitly registered with Zod schemas and descriptions. Naming follows verb_noun conventions (get_*, create_*) which is correct. However, descriptions are universally terse (8-27 characters), well below the baseline of 194 chars and the actionable range of 50-200 chars. Parameter descriptions exist but are minimal. Output schemas are not documented, responses are returned as unstructured JSON text wrapped in content[0].type='text'. No tool has error recovery guidance. The server lacks tool annotations (readOnlyHint, destructiveHint, idempotentHint). One write tool (create_blog_post) has no confirmation or dry-run mechanism. Parameter defaults are safe. The codebase shows proper error handling with try-catch and isError flags, but error messages are generic and not actionable.
Create new blog post
Get application statistics
Get blog posts
Get broadcast groups
Get email broadcasts
Get uploaded images
Get newsletter subscribers
Tool descriptions are uniformly terse (8 - 30 chars), far below the 194-char baseline and actionable 50 - 200 char range. Descriptions like 'Get blog posts' and 'Get newsletter subscribers' provide no context for LLM selection, no 'when to use it' guidance, and no prerequisite information.
Output schemas are not documented. All tools return responses as unstructured JSON text (content[0].type='text'), wrapped in generic 'text' content blocks. LLMs cannot infer output field names, types, or required fields for downstream tool chaining.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 52 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Get user profiles
No tool annotations present. The create_blog_post tool (a destructive write operation) lacks destructiveHint, and read-only tools lack readOnlyHint. Without annotations, LLMs cannot distinguish which tools are safe to retry vs. which have irreversible side effects.
Error handling is generic and non-actionable. Error messages (e.g., 'Error fetching blog posts: {error.message}') do not tell the LLM what to try next, whether the error is retryable, or what the constraint violation was. Per the rubric, errors must guide recovery.
Pagination implemented inconsistently. get_broadcasts and get_images accept 'offset' and 'limit', but get_blog_posts and get_subscribers only accept 'limit' with no offset. This inconsistency forces the LLM to reason about different pagination styles and invites misuse.
No confirmation or dry-run mechanism for the destructive create_blog_post tool. Agents can invoke irreversible publish=true operations without verification. Per the rubric, irreversible operations should support confirmation steps.
Parameter descriptions lack constraint details. The 'limit' parameter appears in 4 tools but is not constrained by min/max bounds. The 'status' enum in get_broadcasts has 5 values, but the description does not explain what each status means (e.g., is 'scheduled' for future or pending?).