SNCF Train MCP Server — Streamable HTTP transport + HTML widget for train journey search, departures, and Dataverse travel demand management
Server has 6 tools with explicit schemas and descriptions. Naming follows verb_noun pattern (searchPlaces, searchJourneys, getDepartures, listDemands, createDemand, updateDemand). Descriptions are present and moderately detailed (100-250 chars), exceeding the 20-char minimum. However, parameter descriptions lack specificity on formats, constraints, and error recovery. Output schemas are not documented, responses return structuredContent but LLMs cannot predict field structure. Error handling is minimal (try/catch with generic messages). No tool annotations (readOnlyHint/destructiveHint) despite clear WRITE vs READ_ONLY risk levels. Composition is reasonable: searchPlaces feeds into searchJourneys/getDepartures; listDemands/createDemand/updateDemand form a coherent demand workflow. Missing: pagination for listDemands, idempotency guidance, and per-parameter type constraints.
Crée une nouvelle demande de voyage dans Dataverse.
Tableau de departs en temps reel d'une gare. Utiliser un stop_area ID retourne par searchPlaces (ex: stop_area:SNCF:87391003 pour Paris Montparnasse).
Récupère et affiche la liste des demandes de voyage depuis Dataverse dans un widget visuel. Peut filtrer par email. Appeler quand l'utilisateur demande à voir ses demandes ou celles d'une personne spécifique.
Calcule les trajets en train entre deux lieux. Utiliser les IDs de searchPlaces. Affiche un widget HTML interactif avec les horaires.
Convertit un nom de ville ou gare en ID technique SNCF/Navitia. TOUJOURS appeler en premier avant searchJourneys ou getDepartures. Pour searchJourneys (trajet ville-à-ville), utiliser l'ID admin (ex: admin:fr:75056 pour Paris, admin:fr:69123 pour Lyon). Pour getDepartures (départs d'une gare précise), utiliser un stop_area (ex: stop_area:SNCF:87391003 pour Paris Montparnasse).
Output schemas not documented. Tools return structuredContent but LLMs cannot predict field names, types, or nesting. searchJourneys returns journey objects with departure/arrival/duration/train/mode/from/to, but this structure is inferred from code, not declared in tool definition.
No tool annotations (readOnlyHint/destructiveHint). createDemand and updateDemand modify state but lack destructiveHint. searchPlaces, searchJourneys, getDepartures are read-only but lack readOnlyHint. Agents cannot distinguish safe from risky calls without explicit hints.
Parameter descriptions lack format/constraint details. datetime is described as 'YYYYMMDDTHHmmss' in text but not enforced via schema pattern. count defaults to 5/10 but no min/max bounds declared. email in listDemands has no validation hint. LLMs cannot self-correct invalid inputs.
Inferred effective spec: 2026-07-28+.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 54 | 2026-07-28+ | v2 |
Met à jour une demande de voyage existante dans Dataverse.
Error handling is generic. catch blocks return 'ERREUR searchPlaces: {err.message}' without recovery guidance. No categorization of retryable vs fatal errors. LLMs receive no actionable next steps when a call fails.
listDemands lacks pagination. No limit/offset or cursor parameters. If many demands exist, response could explode context window. No total count or next_cursor returned.