oebb-mcp-server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@oebb-mcp-serverFind train connections from Wien Hbf to Salzburg Hbf leaving tomorrow at 9 AM"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
oebb-mcp-server
MCP server for OeBB (Austrian Federal Railways) train data. Query Austrian train stations, departures, connections, and service alerts directly from LLMs via the Model Context Protocol.
Installation
Claude Desktop
Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"oebb": {
"command": "uvx",
"args": ["oebb-mcp-server"]
}
}
}Claude Code
claude mcp add oebb -- uvx oebb-mcp-serverFrom source (development)
{
"mcpServers": {
"oebb": {
"command": "uvx",
"args": ["--from", "/path/to/oebb-mcp-server", "oebb-mcp-server"]
}
}
}Related MCP server: swiss-public-transport-mcp
Tools
search_station
Search OeBB stations by name. Returns matching stations with IDs, coordinates, and types.
Parameter | Type | Default | Description |
| string | required | Station name (e.g. "Wien Hbf") |
| int | 10 | Maximum results |
station_board
Fetch live departures or arrivals at a station. Provide either station_id or station_name.
Parameter | Type | Default | Description |
| string | — | OeBB station ID (e.g. "1190100") |
| string | — | Station name (auto-resolved) |
| string | "DEP" | "DEP" for departures, "ARR" for arrivals |
| int | 10 | Maximum journeys |
trip_search
Search train connections between two stations. Supports time planning and direct-only filtering.
Parameter | Type | Default | Description |
| string | — | Departure station ID |
| string | — | Departure station name |
| string | — | Arrival station ID |
| string | — | Arrival station name |
| int | 5 | Maximum connections |
| string | now | ISO 8601 time (e.g. "2026-04-15T08:00:00") |
| string | "departure" | "departure" or "arrival" |
| bool | false | Only direct connections |
service_alerts
Fetch current OeBB service alerts and disruptions.
Parameter | Type | Default | Description |
| int | 20 | Maximum alerts |
| int | 65535 | Product bitmask (1=ICE/RJX, 2=IC/EC, 4=NJ, 8=D/EN, 16=REX/R, 32=S-Bahn, 64=Bus, 128=Ferry, 256=U-Bahn, 512=Tram, 4096=private operators like Westbahn/RegioJet, 65535=all) |
Development
# Install dependencies
uv sync
# Lint & format
ruff check .
ruff format .
# Run unit tests
pytest tests/ -v -m "not integration"
# Run integration tests (hits real OeBB API)
pytest tests/ -v -m integrationLicense
MIT
Available Tools
4 toolssearch_stationA
Search OeBB stations by name.
Use this to find station IDs needed for other tools.
Returns matching stations with IDs, coordinates, and types.
Args:
query: Station name to search for (e.g. "Wien Hbf", "Salzburg")
max_results: Maximum number of results to return (default 10)
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| max_results | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states that it returns matching stations with IDs, coordinates, and types, and includes the max_results default. It does not mention limitations like rate limits or search specificity, but for a simple read-only search, it covers the essential behavior.
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 and well-structured, with a clear introduction, usage note, return summary, and parameter list. Every sentence serves a purpose, and it is front-loaded with the primary action.
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 tool's low complexity, the presence of an output schema, and the description covering purpose, usage, returns, and parameters, the description is complete enough for an agent to correctly select and invoke the tool. No critical information is missing.
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 has 0% description coverage, so the description must fully compensate. It provides detailed Args explanations, including an example for query and the default for max_results, adding meaningful context beyond the bare schema titles.
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 searches OeBB stations by name, with a specific verb and resource. It also distinguishes itself from sibling tools (station_board, trip_search, service_alerts) by highlighting its role in retrieving station IDs for other tools.
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 explicitly says to use this tool to find station IDs needed for other tools, providing clear context for when to use it. However, it does not explicitly mention exclusions or alternative tools, so it misses the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
service_alertsA
Fetch current OeBB service alerts and disruptions.
Returns active alerts with headlines, descriptions, affected stations,
and date ranges.
Args:
max_alerts: Maximum number of alerts to return (default 20)
product_filter: Product bitmask — 1=ICE/RJX, 2=IC/EC, 4=NJ,
8=D/EN, 16=REX/R, 32=S-Bahn, 64=Bus,
4096=private operators (Westbahn/RegioJet), 65535=all
| Name | Required | Description | Default |
|---|---|---|---|
| max_alerts | No | ||
| product_filter | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral disclosure burden. It states that the tool returns active alerts with headlines, descriptions, affected stations, and date ranges, but it does not mention pagination, sorting, or any potential side effects. For a read-only fetch, this is adequate but not thorough.
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 well-structured, starting with a clear purpose, then a brief summary of return fields, and ending with parameter details. The bitmask list is lengthy but necessary for usability.
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?
Because an output schema exists, the description need not detail return values, but it still summarizes them helpfully. The parameter semantics and purpose give enough context to invoke the tool correctly, though there is some room to mention behavior like result ordering or time windows.
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 Args section fully explains both parameters despite the schema having 0% description coverage. It defines max_alerts as a limit and provides a complete product_filter bitmask with numeric values, which is essential for correct invocation.
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 'Fetch current OeBB service alerts and disruptions,' using a specific verb and resource. This clearly distinguishes it from the sibling tools, which handle station search, station boards, and trip search.
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 purpose implies when to use the tool, but there is no explicit guidance about when not to use it or how it compares to alternatives. The sibling tools are semantically distinct, so the intended context is mostly clear without further explanation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
station_boardA
Fetch live departures or arrivals at an OeBB station.
Provide either station_id or station_name (name is auto-resolved).
Returns train products, directions, planned/real times, and platforms.
Args:
station_id: OeBB station ID (e.g. "1190100" for Wien Hbf)
station_name: Station name to search for (e.g. "Wien Hbf")
board_type: "DEP" for departures (default), "ARR" for arrivals
max_journeys: Maximum number of journeys to return (default 10)
| Name | Required | Description | Default |
|---|---|---|---|
| board_type | No | DEP | |
| station_id | No | ||
| max_journeys | No | ||
| station_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosing behavior. It states that data is live and includes return fields, and that station name is auto-resolved. However, it does not specify behavior when both station_id and station_name are provided, error handling, or any side effects (though it is clearly read-only). This is adequate but not deeply 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?
The description is well-structured with a clear opening sentence and a parameter list. It is reasonably concise, though some redundancy exists between the opening guidance and the parameter details. It remains easy to scan and front-loads the core purpose.
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 that an output schema exists (so return format is covered), the description covers all essential usage aspects: station identification, board type, and result count. It could be more complete by addressing ambiguity (e.g., what if both station_id and station_name are given) or error cases, but overall it is solid for a read-only 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?
The schema provides zero description for parameters (0% coverage), so the description fully compensates by explaining each parameter with examples and default behavior. It clarifies board_type values, station_id format, and max_journeys semantics, adding significant meaning beyond the 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 fetches live departures or arrivals at an OeBB station, with a specific verb (fetch) and resource (station board). It distinguishes itself from siblings like search_station and trip_search by focusing on real-time station-level data.
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 gives clear context for when to use this tool (live departures/arrivals) and explains how to specify the station via ID or name. However, it does not explicitly mention alternatives or when not to use it, so it lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
trip_searchA
Search train connections between two OeBB stations.
Provide station IDs or names for departure and arrival stations.
Supports future trip planning via time/time_mode parameters.
Returns connections with departure/arrival times, duration, changes, and legs.
Args:
from_station_id: Departure station ID (e.g. "1190100")
from_station_name: Departure station name (e.g. "Wien Hbf")
to_station_id: Arrival station ID (e.g. "8100002")
to_station_name: Arrival station name (e.g. "Salzburg Hbf")
max_connections: Maximum connections to return (default 5)
time: ISO 8601 time (e.g. "2026-04-15T08:00:00"), defaults to now
time_mode: "departure" (default) or "arrival"
direct_only: Only show direct connections without changes (default false)
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | ||
| time_mode | No | departure | |
| direct_only | No | ||
| to_station_id | No | ||
| from_station_id | No | ||
| max_connections | No | ||
| to_station_name | No | ||
| from_station_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden, and it does well by stating what the tool returns ('departure/arrival times, duration, changes, and legs') and mentioning defaults for time/time_mode. It does not discuss error cases or rate limits, but for a search tool, this is adequate and transparent about core behavior.
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 relatively long but well-structured: an executive summary, a usage note, a return description, and a numbered Args list. Every sentence adds value, though a tiny bit of redundancy exists (e.g., 'Provide station IDs or names' repeated in Args). It earns a 4, not a 5, due to slight verbosity.
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 tool's complexity (8 params, no schema descriptions, no annotations), this description is comprehensive. It covers all parameters, defaults, supported time modes, and returned data. It also hints at the relationship between IDs and names. However, it does not explain what happens if both an ID and name are provided (which takes precedence) or mention sibling tools for alternative use cases, so it is not a perfect 5.
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 0%, so the description fully compensates by explaining every parameter with examples ('Wien Hbf', '2026-04-15T08:00:00'), clarifying that station IDs or names can be used, and specifying defaults and modes. This goes far beyond the raw schema and gives the AI agent everything needed to correctly fill parameters.
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 and resource: 'Search train connections between two OeBB stations.' This clearly distinguishes it from siblings like station_board (which likely shows departures for a single station) or search_station (which finds stations). The scope is 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 description gives clear context by mentioning 'Supports future trip planning via time/time_mode parameters,' implying when to use this for planning versus real-time lookups. However, it does not explicitly name sibling tools or state when not to use it, so it falls short of a 5.
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.
4 tool updates
v0.1.0- First observed
search_station - First observed
service_alerts - First observed
station_board - First observed
trip_search
TDQS
Scored across 4 tools
Each tool targets a distinct domain action: searching stations, retrieving station boards, planning trips, and fetching service alerts. There is no functional overlap between them.
Names use snake_case consistently but mix word orders: 'search_station' is verb_noun, 'station_board' is noun_noun, 'trip_search' is noun_verb, and 'service_alerts' is noun_noun. This makes the pattern less predictable, though still readable.
With only 4 tools, the server is tightly scoped to the core use cases of a railway information service: station lookup, live board, journey planning, and alerts. Each tool earns its place.
The surface covers the essential needs: finding stations, viewing live departures/arrivals, planning trips with advanced options, and checking disruptions. No obvious dead ends or missing operations for its stated purpose.
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
MCP server for China Railway 12306 ticket availability: schedules and seats by Chinese station name.
Swiss Transport MCP — wraps Transport Open Data API (free, no auth)
An MCP server for weather information by @kulybaba
An MCP server for weather information by @kulybaba
Related MCP Servers
- AlicenseAqualityDmaintenanceA zero-authentication MCP server for Swiss public transport, enabling users to query train connections, disruptions, station facilities, and plan journeys using natural language.12MIT
- AlicenseAqualityDmaintenanceMCP server for Swiss public transport — connections, stationboards, real-time delays, and direct booking links for SBB.41MIT
- FlicenseAqualityDmaintenanceMCP server for querying German public transport information, including station search, live departures/arrivals, and journey planning.51-
- FlicenseNot gradedqualityDmaintenanceMCP server for real-time German public transport data (HAFAS/VBN network). Enables querying departures, arrivals, journeys, and nearby stops using natural language.-