MCP server exposing four tools for querying the Berlin transport database: list tables, describe table schema, run read-only SQL queries, and compute line reliability metrics
Four tools with complete schemas and docstrings, but descriptions lack LLM-optimization guidance. Tool names follow verb_noun convention (list_, describe_, run_, line_). All parameters have type definitions and descriptions. However, descriptions are generic and do not explain WHEN to use each tool or dependencies between them. Output schemas are not documented. Error handling is minimal, no recovery guidance or actionable error messages. The run_read_query tool accepts arbitrary SQL, creating injection risk without validation guidance in the description.
Get the columns and data types for one table.
On-time reliability per line over the last N days. Average delay, max delay, on-time percentage and sample count, computed from scheduled versus actual departures.
List the tables in the Berlin transport database with their row counts. Use this first when you are unsure what data is available.
Run a single read-only SQL SELECT against the Berlin transport database. Use for any custom question about the data.
run_read_query accepts arbitrary SQL with no input validation or injection prevention guidance in description. Description does not warn about SQL injection risk or document allowed query patterns.
No output schemas documented. LLMs cannot predict return structure (field names, types, nesting) for any tool. Baseline: 100% of A+ tools document return types.
Descriptions lack WHEN-to-use guidance and inter-tool dependencies. E.g., describe_table description does not say 'Call list_tables first to discover available tables.' Baseline: 194 chars avg, these are 50-100 chars.
line_reliability 'days' parameter lacks explicit bounds in description. Code enforces 1-365, but description does not state this constraint. LLMs cannot read code validation, they rely on description text.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | 2026-07-28+ | v2 |
No error handling guidance. If run_read_query receives invalid SQL or describe_table receives non-existent table, no recovery hints provided. Baseline: errors must tell LLM what to do next.