A simple SQLite MCP server that provides tools for executing SQL queries, managing tables, and interacting with SQLite databases
Server has 5 tools with basic schemas and descriptions, but significant gaps limit production readiness. All tools have descriptions (10-100 chars) and input schemas with type definitions, meeting baseline requirements. However, descriptions are terse (avg 65 chars vs baseline 194), lack WHEN/WHY context, and omit error guidance. Parameter descriptions are minimal or absent. Output schemas are undocumented. No tool annotations (readOnlyHint/destructiveHint). Error handling returns raw exceptions without recovery guidance. Security concern: write_query accepts arbitrary SQL without validation, risking injection attacks.
Create a new table in the SQLite database
Get the schema information for a specific table
List all tables in the SQLite database
Execute a SELECT query on the SQLite database
Execute an INSERT, UPDATE, or DELETE query on the SQLite database, You can only execute one statement at a time
No output schemas documented. LLMs cannot predict response structure, forcing them to parse unstructured results. read_query returns list[dict] but structure is unknown; write_query returns affected_rows but format is undocumented.
write_query and create_table accept arbitrary SQL strings without validation or parameterization. Vulnerable to SQL injection if LLM is prompt-injected. No input sanitization visible in _execute_query().
Descriptions lack WHEN/WHY context and error guidance. 'Execute a SELECT query' does not explain when to use read_query vs describe_table, or what to do if the query fails. Baseline: 194 chars; actual: 50-65 chars.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 46 | <=2025-11-25 | v2 |
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). LLMs cannot distinguish safe reads from destructive writes without explicit hints. write_query and create_table should be marked destructiveHint=true.
Error handling returns raw exceptions without recovery guidance. _execute_query() logs errors but does not return actionable messages. LLM receives 'Database error executing query: ...' with no hint on what to try next.