Navitia MCP Server
Provides access to French national railway (SNCF) public transport data, including journey planning, real-time departures, and schedules, when configured with the SNCF coverage region.
Navitia MCP Server
An MCP server exposing the Navitia public-transport API: journey planning, place search, realtime departures and timetables, usable from Claude Desktop, Claude Code, or any MCP client.
→ Full usage guide — install, client setup, worked examples, tool reference, response shapes and troubleshooting.
Tools
Tool | What it does |
| Geocode / autocomplete stations, addresses, POIs, cities — returns the object ids the other tools need |
| Find networks, lines, routes and stops by name (e.g. "metro 14" → a |
| Stops and POIs within a radius of a coordinate |
| Door-to-door multi-modal itineraries (with disruptions), with optional per-line preferences |
| Realtime departure/arrival boards for a stop |
| Timetable at a stop, grouped by line and direction |
| Station-display board for one line at a stop, grouped by destination (needs a |
| Full timetable grid for a line or route |
The server is scoped to a single coverage region (default Île-de-France, fr-idf) set via the NAVITIA_REGION env var — tools take no region parameter. Set NAVITIA_REGION=fr-se for the southeast (Lyon), sncf for national rail, etc.
Related MCP server: BVG MCP Server
Configuration
Env var | Required | Default | Purpose |
| yes | — | Your Navitia token |
| no |
| Coverage region id the server is scoped to |
| no |
| API root (override for a self-hosted Navitia) |
Setup
You need a Navitia API token (request one via navitia.io / Hove). The server reads it from NAVITIA_API_KEY only — never commit it. For local runs, copy .env.example to .env (gitignored) or export the variable in your shell.
npm install
npm run buildClaude Code
claude mcp add navitia --env NAVITIA_API_KEY=your-token --env NAVITIA_REGION=fr-idf -- node /absolute/path/to/dist/index.jsClaude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"navitia": {
"command": "node",
"args": ["/absolute/path/to/dist/index.js"],
"env": {
"NAVITIA_API_KEY": "your-token",
"NAVITIA_REGION": "fr-idf"
}
}
}
}Line preferences (experimental)
plan_journey can express a taste for or against a line instead of a hard rule:
Parameter | Effect | Typical phrasing |
| Favours the line — itineraries using it rank higher | "I'd rather take metro 14" |
| Proposes the line less, without removing it | "I'd like to avoid metro 14, but not rule it out" |
| Excludes the line outright | "never put me on metro 14" |
All three take ids from search_pt_objects; prefer_lines / avoid_lines reject anything that is not a line: id rather than sending it on.
Preferences map to Navitia's experimental flag, one per line:
_features_flags[]=boost_line({line_id},{boost_factor})with boost_factor = 3 for a preferred line and 0.4 for an avoided one.
Because boosting changes what the default ordering means, a response that used line preferences is re-ordered by the reliability rank in each journey's criteria_ranker — rank 1 first — and carries ordered_by: "reliability" so the client can explain the order it is showing. Without preferences, the API's own order is left untouched and ordered_by is absent.
The flag is experimental and depends on server-side support: an instance that does not implement it may ignore it or return an error, which the tool relays unchanged.
Usage notes
Datetimes are ISO 8601 in the region's local time (e.g.
2026-06-11T17:30); responses use the same format.Ids: find stops/addresses with
search_places(stop_area:…), and lines/networks withsearch_pt_objects(line:…), then feed them to the journey/departure/schedule tools.terminus_schedulesrequires aline_id— resolve it withsearch_pt_objectsfirst (e.g. "metro 14").plan_journeycalls always carry the technical parameter_frontend=gormun, which identifies this caller to Navitia. It is a constant, not a tool input.Line preferences (
prefer_lines/avoid_linesonplan_journey) nudge the ranking;forbidden_urisremoves a line entirely. See Line preferences.All tools are scoped to the
NAVITIA_REGIONcoverage; no per-callregionparameter. To serve several regions, run one instance per region.Responses are deliberately slimmed (no geojson/links) to stay LLM-friendly; large results are truncated at 50 kB.
Output format
Tools return slimmed JSON — Navitia's HATEOAS links, geojson geometries and deep fare/co2 trees are dropped so the payload stays inside a model's context. Presentation is the client's job, not the server's.
Time-sensitive responses (plan_journey, next_departures, next_arrivals, stop_schedules, terminus_schedules, route_schedules) carry a top-level now — the API's own context.current_datetime, in the region's local timezone. Compute countdowns ("dans 3 min") against that field, never against the reader's clock, which may sit in another timezone.
Each journey also carries Navitia's criteria_ranker when the API supplies it — that journey's 1-based rank for asap, less_transfers, less_walking and reliability, 1 being the best on that criterion. It is what the line-preference re-ordering sorts on, and a client can reuse it to tag itineraries.
prompts/agent-system-prompt.md is a ready-to-use strict system prompt for an agent driving this server: it specifies the board layouts (departure boards, journey chains, timetables), the anti-fabrication rules, and the id-resolution protocol.
Development
NAVITIA_API_KEY=your-token npm run dev # run from source
npx @modelcontextprotocol/inspector node dist/index.js # interactive testingSee docs/USAGE.md for the full guide, and docs/USAGE.md#12-troubleshooting when something returns nothing.
Available Tools
9 toolsnext_arrivalsNext arrivalsA
List the next arrivals at a stop (station or platform), with realtime delays when available.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Max results (default 10). | |
| line_id | No | Filter to a single line ('line:...' id). | |
| stop_id | Yes | Stop id from search_places: 'stop_area:...' (station) or 'stop_point:...' (platform). | |
| from_datetime | No | ISO 8601 datetime to start from (local to the region). Defaults to now. | |
| data_freshness | No | 'realtime' (default) includes delays and cancellations; 'base_schedule' is the theoretical timetable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It does state that realtime delays are included when available, which is useful behavioral context beyond a plain listing, and the 'when available' hedge is honest. However, it does not describe ordering, response shape, or how cancellations are surfaced, so it is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single action-first sentence with no filler. It efficiently adds scope ('at a stop'), clarifies accepted location kinds ('station or platform'), and includes the realtime behavior without bloating the description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity, read-only arrival lookup with full parameter coverage in the schema, the description plus schema is sufficient for an agent to invoke the tool correctly. The only notable gap is the lack of explicit differentiation from next_departures, but the term 'arrivals' already narrows the use case enough that this is a minor omission.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter already has a meaningful description and the baseline is 3. The tool description adds no parameter-level detail beyond the phrase 'at a stop', and relies on the schema for count, line_id, from_datetime, and data_freshness semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names an explicit action ('List') and resource ('next arrivals at a stop'), and the word 'arrivals' distinguishes it from the sibling next_departures without needing to open either schema. It also adds realtime delay behavior, making the tool's scope unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The stop-based wording implies this tool is for upcoming arrival boards at a known stop, but it never explicitly states when to prefer it over next_departures, stop_schedules, or plan_journey. With several closely related siblings, a brief exclusion or alternative note would materially improve decision-making.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
next_departuresNext departuresB
List the next departures from a stop (station or platform), with realtime delays when available.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Max results (default 10). | |
| line_id | No | Filter to a single line ('line:...' id). | |
| stop_id | Yes | Stop id from search_places: 'stop_area:...' (station) or 'stop_point:...' (platform). | |
| from_datetime | No | ISO 8601 datetime to start from (local to the region). Defaults to now. | |
| data_freshness | No | 'realtime' (default) includes delays and cancellations; 'base_schedule' is the theoretical timetable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description bears the full burden of disclosing behavioral traits. It does not explicitly state that the operation is read-only, safe, or free of side effects, leaving this crucial information implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that conveys the essential purpose without superfluous words. It is concise and easily scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should at least hint at the return format or fields. It does not, nor does it mention any error conditions, timezone handling, or other contextual details that would help an agent fully understand the tool's behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with all parameters having descriptions, so the baseline is 3. The description adds no additional semantic depth beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: listing next departures from a stop, with realtime delays when available. It is specific and unambiguous about the resource and the information provided.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description does not provide any guidance on when to use this tool versus alternatives such as next_arrivals or stop_schedules. Without explicit differentiation, agents may struggle to select the appropriate tool in a broader context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
places_nearbyFind places nearbyA
List public-transport stops and POIs within a radius of a coordinate. Useful to find the nearest station to a location.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude, e.g. 48.8566 | |
| lon | Yes | Longitude, e.g. 2.3522 | |
| count | No | Max results (default 10). | |
| types | No | Restrict result types (default stop_areas and POIs). | |
| distance | No | Search radius in meters (default 500). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. 'List' clearly indicates a read-only query with no side effects, which is appropriate for a simple listing tool. Still, it does not disclose result ordering, response shape, or any access/rate considerations, though these are less critical for a low-risk query.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler: the first is action-oriented and front-loaded with the operation and scope, and the second adds a concrete use case. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple geospatial listing tool with a fully self-documenting schema, the description conveys the essential operation and intended use. The only notable gap is that there is no output schema and the description does not specify result fields or ordering, but this is a minor limitation for such a straightforward tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all five parameters documented including defaults and bounds. The description adds only the concepts of 'coordinate' and 'radius,' which map onto lat/lon and distance, so it adds no meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'List public-transport stops and POIs within a radius of a coordinate,' giving a specific verb, resource, and query geometry. This clearly distinguishes it from text-search siblings like search_places and search_pt_objects because the search is coordinate- and radius-based.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence, 'Useful to find the nearest station to a location,' provides an implied use case and suggests when this tool fits. However, it does not explicitly compare against alternatives such as search_places or search_pt_objects, nor does it state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
plan_journeyPlan a journeyA
Compute public-transport journeys between two points (multi-modal door-to-door routing). Returns up to 'max_nb_journeys' itineraries with legs, times, transfers and any disruptions. To express a taste for or against a line without ruling it out, pass 'prefer_lines' / 'avoid_lines'; use 'forbidden_uris' to exclude something outright.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Destination. Either 'lon;lat' coordinates (e.g. '2.3522;48.8566') or a Navitia object id from search_places (e.g. 'stop_area:SNCF:87686006'). Prefer object ids for stations. | |
| from | Yes | Origin. Either 'lon;lat' coordinates (e.g. '2.3522;48.8566') or a Navitia object id from search_places (e.g. 'stop_area:SNCF:87686006'). Prefer object ids for stations. | |
| datetime | No | ISO 8601 datetime, local to the region (e.g. 2026-06-11T17:30). Defaults to now. | |
| wheelchair | No | Only wheelchair-accessible journeys. | |
| avoid_lines | No | EXPERIMENTAL. Line ids ('line:...') the traveller would rather not use: they are proposed less but stay in the results, unlike forbidden_uris which removes them. For "I would like to avoid metro 14 without ruling it out". | |
| prefer_lines | No | EXPERIMENTAL. Line ids ('line:...', from search_pt_objects) the traveller would rather use: itineraries taking them are favoured, without discarding the alternatives. For "I prefer taking metro 14". | |
| forbidden_uris | No | Object ids to exclude entirely, e.g. a line ('line:...'), network or commercial_mode ('commercial_mode:Bus'). To merely de-prioritise a line, use 'avoid_lines' instead. | |
| max_nb_journeys | No | Maximum number of itineraries to return (default 8). | |
| max_nb_transfers | No | Maximum number of transfers. | |
| datetime_represents | No | Whether 'datetime' is the departure time (default) or the desired arrival time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly describes what the tool returns (legs, times, transfers, disruptions) and clarifies the behavioral difference between soft preferences (prefer/avoid_lines) and hard exclusion (forbidden_uris). It stops short of describing edge cases or error behavior, but the core computational behavior is transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary function, and every sentence adds information: what it computes, what it returns, and how to express preferences/exclusions. No filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is complex (10 params, no output schema) and the description covers the main outcome and the most nuanced parameter behavior. It doesn't explain defaults like datetime=now, but the schema handles that. The return shape is sufficiently described for an agent to understand what it will receive.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage, baseline is 3. The description adds value by explaining the exact semantics of prefer_lines/avoid_lines vs forbidden_uris, which the schema only hints at, and confirms that max_nb_journeys caps the result set. This goes beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Compute'), a precise resource ('public-transport journeys between two points'), and characterizes the routing as 'multi-modal door-to-door'. The return payload is spelled out (itineraries with legs, times, transfers, disruptions), which clearly separates this journey-planning tool from sibling schedule/stop endpoints.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool is for point-to-point journey planning but never states when to choose it over siblings like next_departures or stop_schedules. It gives no explicit when-not or alternative routing. The parameter guidance (prefer_lines vs forbidden_uris) is a usage guideline for the tool's own options, not for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
route_schedulesRoute schedulesA
Full timetable grid for a line or route: every stop along the way with the times of upcoming vehicles. Heavier output — prefer stop_schedules when you only care about one stop.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | A 'line:...' or 'route:...' id (find lines via search_places or stop_schedules). | |
| from_datetime | No | ISO 8601 datetime to start from (local to the region). Defaults to now. | |
| data_freshness | No | 'realtime' includes delays; 'base_schedule' (default for schedules) is the planned timetable. | |
| items_per_schedule | No | Max upcoming times per line/direction (default 5 here to keep output small). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the output is heavier, which is a behavioral characteristic. However, since no annotations are provided, it lacks explicit statements about side effects or errors, but for a read-only query tool this is adequate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, with useful parenthetical notes. Parameter descriptions are also succinct and informative.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool description covers its purpose, usage relative to alternatives, and output size. It doesn't include an example or output format, but that is not essential for such a simple query tool, so it's reasonably complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All parameters are described in the schema, and the description adds extra context such as how to find the id and that items_per_schedule defaults to 5 to keep output small, going beyond basic schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a full timetable grid for a line or route, distinguishing it from stop_schedules and terminus_schedules. The verb is implicit but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to prefer stop_schedules for single-stop queries, providing clear when-to-use guidance relative to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_placesSearch places (autocomplete)A
Geocode / autocomplete stations, addresses, POIs and cities by free-text query. Returns object ids usable as from/to in plan_journey or as stop_id in departure/schedule tools.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Max results (default 10). | |
| query | Yes | Free-text search, e.g. 'gare de lyon' or '20 rue de rivoli paris'. | |
| types | No | Restrict result types. Use ['stop_area'] when looking for a station. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It usefully discloses that results are object ids usable as from/to or stop_id, and that the input is free-text. It does not describe ranking, result shape, or type-default behavior, but the core non-obvious behavior is covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The action and scope are front-loaded, and the second sentence adds the most important integration detail about returned ids. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search-style tool with fully documented parameters and no output schema, the description is nearly complete: it names supported entity types, input style, and the downstream use of returned ids. It is only slightly incomplete in not clarifying how results are ordered or how it differs from the sibling search_pt_objects.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents query, count, and types with good descriptions. The description adds downstream context about how ids are consumed, but it does not add meaning beyond the schema for the parameters themselves, so the baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb ('Geocode / autocomplete') and a clear resource scope ('stations, addresses, POIs and cities'), and explains that returned object ids feed other tools. This makes the purpose immediately distinguishable from siblings like search_pt_objects or places_nearby.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use the tool: for free-text place search before calling plan_journey or departure/schedule tools. However, it does not explicitly mention alternatives or explain when to prefer search_pt_objects over this tool, leaving some routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_pt_objectsSearch public-transport objectsA
Find public-transport objects (networks, lines, routes, stop_areas, transportation modes) by name and return their ids. Use this to resolve a line to its id — e.g. 'metro 14' -> a 'line:...' id — to pass as line_id in next_departures/stop_schedules, or to forbid a line, transportation mode or network in plan_journey.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Max results (default 10). | |
| query | Yes | Free-text search, e.g. 'metro 14', 'RER A', 'bus 38' or a network name. | |
| types | No | Restrict result types (default: network, commercial_mode, line, route, stop_area). Use ['line'] when looking for a line id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden; it does disclose the core behavior (search by name, return ids) and integration purpose. It omits edge behavior like ordering, match semantics, empty-result handling, or count limits, so it stops at basic transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler; the first sentence defines the operation and scope, and the second gives concrete downstream usage. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple three-parameter search with full schema coverage, the description supplies the missing links: what ids are for and how results feed into other tools. It does not define the response shape, but 'return their ids' plus the schema is sufficient for this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already documents all three parameters, and the description adds little per-parameter detail beyond the same examples already present in the schema ('metro 14', 'RER A'). The downstream line_id use is useful context but not new parameter semantics, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise action ('Find public-transport objects by name and return their ids') and enumerates the object types searched, which separates it from sibling search_places/places_nearby. It also anchors the result with the 'metro 14' → 'line:...' id example.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Tells the agent exactly when to invoke it: resolving a named PT line to an id for next_departures/stop_schedules, or for blocking lines/modes/networks in plan_journey. It does not name alternate tools or include exclusions, but the PT-object scope makes the choice clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
stop_schedulesStop schedulesB
Timetable at a stop, grouped by line and route: for each line/direction serving the stop, the next departure times.
| Name | Required | Description | Default |
|---|---|---|---|
| line_id | No | Filter to a single line ('line:...' id). | |
| stop_id | Yes | Stop id from search_places: 'stop_area:...' or 'stop_point:...'. | |
| from_datetime | No | ISO 8601 datetime to start from (local to the region). Defaults to now. | |
| data_freshness | No | 'realtime' includes delays; 'base_schedule' (default for schedules) is the planned timetable. | |
| items_per_schedule | No | Max upcoming times per line/direction (default 5 here to keep output small). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of explaining behavior. It does add useful context by saying results are grouped by line and route and contain next departure times. However, it does not mention whether there are side effects, auth requirements, response format details, or how filtering inputs affect the result beyond what the schema states.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single dense sentence that front-loads the core behavior and grouping semantics. It avoids filler and meaningfully expands on the title without being verbose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives enough to understand the general purpose, especially the 'grouped by line and route' detail. However, there is no output schema and the description does not specify the exact response fields, how items_per_schedule affects each group, or how this tool should be chosen over next_departures. An agent could still be uncertain about the precise return shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a helpful description (e.g., stop_id source, from_datetime default, data_freshness meaning, items_per_schedule bound). The tool description adds no parameter-level meaning beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies a specific resource ('timetable at a stop') and the key behavior ('next departure times' grouped by line/direction). It is specific enough to understand the tool's function, though it does not explicitly distinguish it from siblings like next_departures or route_schedules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use stop_schedules versus related tools such as next_departures, route_schedules, or terminus_schedules. The description states what the tool returns but does not provide selection criteria, exclusions, or alternative conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
terminus_schedulesTerminus schedulesA
Departure board for one line at a stop, grouped by final destination (terminus) — what you would see on a station display. Both a stop and a line are required: resolve the line id with search_pt_objects first.
| Name | Required | Description | Default |
|---|---|---|---|
| line_id | Yes | Line id ('line:...') from search_pt_objects, e.g. search 'metro 14' -> its line id. Required. | |
| stop_id | Yes | Stop id from search_places: 'stop_area:...' or 'stop_point:...'. | |
| from_datetime | No | ISO 8601 datetime to start from (local to the region). Defaults to now. | |
| data_freshness | No | 'realtime' includes delays; 'base_schedule' (default for schedules) is the planned timetable. | |
| items_per_schedule | No | Max upcoming times per line/direction (default 5 here to keep output small). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It clearly describes the data returned (grouped by terminus, max upcoming times per line/direction) and the effect of data_freshness (realtime vs base_schedule). It does not explicitly state that the operation is read-only, but the nature of a schedule query makes this implicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, consisting of two sentences that deliver the core purpose, required inputs, and a helpful default note. No unnecessary words or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the moderate complexity (5 parameters, no output schema), the description sufficiently explains why this tool exists and how to use it. It lacks an explicit output format description or differentiation from related tools, but the station-display analogy and parameter hints cover most needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema descriptions are comprehensive and cover all parameters (100% coverage). The description adds meaningful context about the items_per_schedule default and the necessity of resolving line_id through search_pt_objects, going slightly beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: a departure board for a specific line at a stop, grouped by terminus, exactly what a station display shows. It also specifies the required inputs (stop and line) and how to obtain them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance to resolve the line ID via search_pt_objects and notes the requirement for both stop and line. It also mentions the default for items_per_schedule to manage output size. However, it does not compare usage to sibling tools like next_departures or stop_schedules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v0.1.0- First observed
next_arrivals - First observed
next_departures - First observed
places_nearby - First observed
plan_journey - First observed
route_schedules - First observed
search_places - First observed
search_pt_objects - First observed
stop_schedules - First observed
terminus_schedules
TDQS
Most tools have clearly distinct purposes: search_places handles geocoding, search_pt_objects resolves PT identifiers, and plan_journey covers routing. The schedule/departure tools overlap somewhat, but their descriptions differentiate granularity well enough for an agent to choose correctly.
Naming is readable and grouped by domain (search_*, *_schedules, next_*), but it does not follow a single consistent verb_noun pattern. places_nearby and plan_journey deviate from the otherwise mostly noun-based tool names.
The 9 tools are well-scoped for a public-transport MCP server. Each tool covers a distinct part of the workflow—place search, PT-object resolution, journey planning, and multiple schedule/departure queries—without unnecessary redundancy.
The set covers the full read-only workflow: resolve places and PT objects to IDs, plan journeys, and query departures, arrivals, or timetables at stop, line, and route granularity. There are no obvious dead ends because the search tools explicitly feed the routing and schedule tools.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Read-only public transit departures, stop search, and city coverage for bus and train users.
Swiss Transport MCP — wraps Transport Open Data API (free, no auth)
Transitland MCP — global GTFS aggregator
Entur MCP — Norway public transport, nationwide, all modes (developer.entur.org)
Related MCP Servers
- AlicenseBqualityDmaintenanceAn MCP service for interacting with Transport NSW's API that enables users to find transport stops around locations and retrieve information about transport alerts and disruptions.3MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for interacting with the Berlin Public Transport (BVG) API to search for locations and plan journeys. It provides real-time access to departures, arrivals, trip details, and vehicle tracking within Berlin's transit network.MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying Swiss public transport data (stations, departures, connections) from the Transport Open Data API via natural language through an MCP gateway.5MIT
- AlicenseAqualityBmaintenanceAn MCP server exposing Greater Helsinki public transport data from Digitransit, enabling LLM hosts to answer live transit queries, plan journeys, and fetch stop departures via natural language.313MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/wassimbenaissa/Navitia-MCP'
If you have feedback or need assistance with the MCP directory API, please join our Discord server