Local MCP server that imports large CSV files into SQLite and exposes safe read-only SQL to a desktop AI client
Tabulite demonstrates solid tool design with clear naming (verb_noun pattern), comprehensive descriptions (avg 180 chars), and well-structured schemas. All 9 tools have input schemas with typed parameters and descriptions. However, output schemas are not documented in the visible code, and error handling lacks recovery guidance. Tool composition is clean (single responsibility), but some parameter descriptions could be more prescriptive about constraints and formats. Security is well-handled (read-only SQL validation, path sanitization, confirmation gates for destructive ops). Naming is consistent and action-oriented (list_, import_, query_, delete_). This is a B-grade server, good fundamentals, minor gaps in output documentation and error messaging.
Delete an imported table and its data from the database.
Run a read-only SQL query and stream the complete result to a file.
Import a CSV file into SQLite and profile its columns. The file is streamed, so size is limited by disk rather than memory. Every field is stored as TEXT; configured missing-value markers (by default "", NULL, null, N/A, NA) become SQL NULL while other unparseable values are kept verbatim. Identity is the SHA-256 of the file contents, computed during the same pass. Re-importing identical content — even under a different filename — reuses the existing table instead of duplicating it. Pass force=True to re-import anyway.
Peek at a CSV file without importing it or reading all of it. Reads only a small prefix of the file and returns the detected delimiter, the column names (both as written in the header and as they will be stored) and a handful of sample rows.
List the CSV files available under the project source directory. Returns each file's relative path, size and modification time, plus — when the catalog recognizes it — the source_id and the table it was imported into. Nothing outside the source directory is ever listed.
Output schemas not documented in tool definitions. LLMs cannot plan downstream operations or extract fields without knowing what each tool returns.
profile_table description is too brief (27 chars). Does not explain what 'type information' means, when to call it, or what output structure to expect.
query_sql and export_query lack explicit row limits and pagination guidance in descriptions. Large result sets could exhaust context windows.
Error handling lacks recovery guidance. ToolError exceptions do not indicate whether failures are retryable, user-fixable, or fatal.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | <=2025-11-25 | v2 |
List the tables currently in the analytical database.
Analyze the columns of an imported table and return type information.
Run a read-only SQL query against the analytical database.
Render a query result as a chart using matplotlib.
visualize_data parameter descriptions lack format constraints. 'chart_type' accepts 6 values but description does not enumerate them; 'x_format' and 'y_format' lack valid option lists.