A Supabase MCP server exposing database CRUD operations and RPC calls via Dedalus MCP framework
This Supabase MCP server provides 8 database-oriented tools with consistent naming (verb_noun pattern: db_select, db_insert, db_update, db_delete, db_upsert, db_get_by_id, db_rpc, smoke_ping) and reasonable descriptions. All tools have documented input schemas with parameter types and descriptions. However, several dimensions fall short of A-grade quality: (1) descriptions are generic and lack context about when to use each tool vs alternatives (e.g., db_select vs db_get_by_id distinction unclear), (2) output schemas are completely undocumented, no indication of what fields are returned, (3) parameter descriptions lack concrete constraints (e.g., 'PostgREST filter string' mentions a format but gives no validation rules or examples of what happens on malformed input), (4) error handling guidance is absent, no indication of retryable vs fatal errors, (5) no pagination guidance for tools that could return large result sets (db_select with limit parameter is present but no documentation of max results or truncation behavior). The server is functional and safe (READ_ONLY and WRITE operations properly classified), but lacks the polish and LLM-optimization expected of production-grade agent tools.
Delete rows from a Supabase table matching the specified filters
Get a single row by primary key from a Supabase table
Insert one or more rows into a Supabase table
Call a Supabase RPC (stored procedure/function)
Select rows from a Supabase table with optional filters, ordering, and pagination
Update rows in a Supabase table matching the specified filters
Output schemas completely undocumented across all data-returning tools (db_select, db_insert, db_update, db_delete, db_upsert, db_get_by_id, db_rpc). LLMs cannot plan downstream tool calls or extract required fields without knowing what is returned.
Parameter descriptions lack constraint information. 'filters' references 'PostgREST filter string' but provides only two examples. LLMs cannot reliably compose valid filters without explicit constraint documentation, regex patterns, or examples of what invalid input produces.
No pagination or result limiting guidance. db_select accepts 'limit' parameter but does not document maximum result size, truncation behavior, or when pagination is required. Large result sets will bloat context and degrade LLM reasoning.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 58 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 48 | - | v1 |
Upsert rows into a Supabase table (insert or update on conflict)
Smoke test ping (no enclave dispatch required)
Error handling and recovery guidance completely absent. No indication of which errors are retryable (e.g., transient database failure) vs user-fixable (e.g., constraint violation) vs fatal (e.g., table not found). Destructive tools (db_delete, db_update) lack warnings or confirmation patterns.
Tool descriptions lack disambiguation guidance. When to use db_select vs db_get_by_id? When to use db_insert vs db_upsert? Descriptions do not explain distinguishing factors (performance, semantics, side effects), forcing LLM to reason from names alone.
db_rpc is dangerously underspecified. No discovery mechanism for available functions, no guidance on required vs optional parameters, no examples of expected return types. This tool invites hallucinations.
Partial failure behavior undefined. What if db_insert succeeds for 8 of 10 rows? Is it an error, partial success, or silent? No guidance on recovery (retry? inspect results? rollback?).