MCP server for exploring SQLite databases with query execution and schema inspection capabilities
SQLite Explorer has 4 tools with complete input schemas and descriptions. Naming follows verb_noun convention (read_query, list_tables, describe_table, health_check). Descriptions are present and adequate (100-200 chars), exceeding the 10-char minimum. However, parameter descriptions lack actionable constraints (e.g., row_limit has no min/max bounds stated in description; query lacks injection warnings). Output schemas are documented in docstrings but not formally in JSON Schema. Error handling is basic, tools raise ValueError/FileNotFoundError but lack recovery guidance. No tool annotations (readOnlyHint, idempotentHint) despite all being read-only. Missing pagination support on read_query despite row_limit parameter suggesting large result sets are possible.
Get detailed information about a table's schema. Args: table_name: Name of the table to describe Returns: List of dictionaries containing column information: - name: Column name - type: Column data type - notnull: Whether the column can contain NULL values - dflt_value: Default value for the column - pk: Whether the column is part of the primary key
Check if the server and database are working properly.
List all tables in the SQLite database. Returns: List of table names in the database
Execute a query on the SQLite database. Args: query: SELECT SQL query to execute params: Optional list of parameters for the query fetch_all: If True, fetches all results. If False, fetches one row. row_limit: Maximum number of rows to return (default 1000) Returns: List of dictionaries containing the query results
read_query lacks SQL injection safeguards in description and no input validation guidance for LLMs. Code validates query type (SELECT/WITH only) but description does not warn about injection risks or mention validation.
row_limit parameter has no min/max bounds in description. Unbounded numeric parameters let LLMs pass absurd values (e.g., 999999999) that could timeout or exhaust memory.
No tool annotations despite all 4 tools being read-only. Missing readOnlyHint would help agents understand these tools are safe to call without side effects.
Error messages are generic (ValueError, FileNotFoundError). No recovery guidance, e.g., 'Table not found. Call list_tables() to see available tables.' LLMs cannot self-correct.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | <=2025-11-25 | v2 |
read_query returns raw dict list without pagination metadata. If result hits row_limit, LLM has no way to know if more rows exist or how to fetch them.