MCP server for SQL database access with RBAC, cost gating, and audit logging
sql-mcp-server provides 10 tools with complete JSON Schema definitions and descriptions. Naming follows verb_noun convention (read_records, create_record, delete_record). However, descriptions are minimal (10-50 chars), parameter descriptions lack actionable constraints (no enums, ranges, or format guidance), and output schemas are not documented. Error handling is present but generic. No tool annotations (readOnlyHint/destructiveHint) despite clear risk levels. Composition is sound, tools are single-responsibility and chainable via transaction IDs. Security: transaction IDs are passed as parameters (acceptable for stateless operations), but no audit logging or permission gates visible.
Aggregate records from an entity with grouping and aggregate functions
Begin a database transaction
Commit an active database transaction
Create a new record in an entity
Delete records from an entity with filter conditions
Describe available entities and their schema
Execute a stored procedure or function with arguments
Read records from an entity with optional filtering, field projection, expansion, limit, offset, and cursor-based pagination
Descriptions are too brief (10-50 chars). LLMs cannot determine when to select a tool or how it differs from similar tools. E.g., 'Aggregate records from an entity with grouping and aggregate functions' lacks WHEN to use it, what it returns, or prerequisites.
Parameter descriptions lack actionable constraints. 'filter' is described as 'Optional filter conditions' but does not specify: operator syntax (op values), value type expectations, or examples. LLMs cannot construct valid filters without this.
Output schemas are not documented. Tools return results but LLMs do not know what fields to expect, breaking downstream tool chaining. E.g., does read_records return [record_id, ...fields] or {records: [...], total_count: N}?
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 47 | 2026-07-28+ | v2 |
Rollback an active database transaction
Update records in an entity with filter conditions and set values
No tool annotations (readOnlyHint, destructiveHint, idempotentHint) despite clear risk levels. delete_record is DESTRUCTIVE but unmarked; read_records is READ_ONLY but unmarked. Agents cannot infer safety without annotations.
execute_entity is vague. 'Execute a stored procedure or function' does not clarify: what procedures are available? What do they return? Are they read-only or write? LLMs cannot safely invoke without discovery.