MCP server wrapper for the Open Bus Stride API, providing access to Israeli public transportation data including stops, lines, rides, and related entities
This server dynamically generates tools from an OpenAPI spec at runtime. While the approach is clever, it creates severe definition quality issues: (1) Tool names are operationIds from the OpenAPI spec, which are not visible in the source code provided, we cannot verify they follow verb_noun conventions or are action-oriented. (2) Descriptions are pulled from OpenAPI 'description' or 'summary' fields, which are often generic or missing in public APIs. (3) Parameter schemas are derived from OpenAPI schemas via a basic zodTypeFromSchema() function that maps only primitive types (integer, number, boolean, string), complex objects, arrays, and nested structures are collapsed to z.any(), losing all schema information. (4) No output schema is documented, responses are returned as raw text from the upstream API. (5) No error handling guidance, failures return raw fetch errors or HTTP status text. (6) The single 'tool' entry in the server definition is a meta-description, not an actual tool registration; the real tools are inferred at runtime from the OpenAPI spec. Per the hard rules, inferred tool definitions cap at 50; this server's actual tools are entirely inferred, so individual tool scores are capped at 50. The average of inferred tools scoring 50 yields a definitionQuality score of ~28 after accounting for the complete absence of output documentation, error guidance, and schema completeness.
Tools are dynamically generated from OpenAPI specification at https://open-bus-stride-api.hasadna.org.il/openapi.json. Each GET endpoint in the OpenAPI spec becomes a tool with operationId as the tool name, description/summary as the tool description, and parameters from the spec as input schema.
Tool definitions are entirely inferred from runtime OpenAPI fetch; actual tool names, descriptions, and schemas are not visible in source code. Cannot verify naming conventions, description quality, or schema completeness.
Parameter schema mapping via zodTypeFromSchema() only handles primitives (integer, number, boolean, string). Complex objects, arrays, and nested structures default to z.any(), losing all type information. No enum constraints, min/max bounds, or format validation.
No output schema documented. Tool responses are raw text from the upstream API (JSON stringified). LLMs cannot parse structure, extract fields for chaining, or plan downstream calls. Violates response-shaper and tool-chain patterns.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | F | 30 | 2026-07-28+ | v2 |
Error handling returns raw fetch errors or HTTP status text with no recovery guidance. LLMs cannot determine if errors are retryable, user-fixable, or fatal. No actionable error messages.
No pagination support visible in tool definitions. OpenAPI endpoints may return large result sets; no limit/offset parameters enforced or documented. Risk of context window exhaustion.