A read-only Model Context Protocol (MCP) server that exposes a SQLite database to LLMs through safe, read-only tools with schema introspection capabilities.
Three well-named, read-only tools with clear descriptions and proper input schemas. Naming follows verb_noun convention (list_tables, describe_table, read_query). All tools have descriptions (34 - 194 chars, within baseline 34 - 392 range). Input schemas present with type definitions and parameter descriptions. Output formats documented in descriptions (Markdown table, schema text, list). Main gaps: no output schema formally documented in JSON Schema; no error handling guidance (e.g., 'table not found' should suggest alternatives); no pagination for read_query results despite MAX_ROWS cap; missing tool annotations (readOnlyHint). Security is strong (read-only by construction, input validation via _ensure_read_only regex), but error messages could guide recovery better.
Return the schema (columns, types, keys) of a given table.
List the names of all user tables in the database.
Run a read-only SELECT query and return the rows as a Markdown table.
Output schemas not formally documented. Tools return strings (Markdown, schema text, list) but no JSON Schema defines the structure. LLMs cannot plan downstream operations or validate responses.
Error messages lack recovery guidance. When describe_table raises 'Unknown table', it should suggest available tables. When read_query fails validation, it should show allowed query patterns.
read_query lacks pagination metadata. Despite MAX_ROWS cap and truncation warning, no next_cursor or total_count returned. Large result sets risk context window exhaustion.
Tool annotations missing. No readOnlyHint, destructiveHint, or idempotentHint declared. Clients cannot infer safety properties without reading descriptions.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 64 | 2026-07-28+ | v2 |
read_query description mentions 'capped at the server's MAX_ROWS' but does not state the actual cap value (100 by default). LLMs cannot reason about result size without knowing the limit.