Skip to main content
Glama

oebb-mcp-server

PyPI Python License: MIT

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-server

From 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

query

string

required

Station name (e.g. "Wien Hbf")

max_results

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

station_id

string

OeBB station ID (e.g. "1190100")

station_name

string

Station name (auto-resolved)

board_type

string

"DEP"

"DEP" for departures, "ARR" for arrivals

max_journeys

int

10

Maximum journeys

Search train connections between two stations. Supports time planning and direct-only filtering.

Parameter

Type

Default

Description

from_station_id

string

Departure station ID

from_station_name

string

Departure station name

to_station_id

string

Arrival station ID

to_station_name

string

Arrival station name

max_connections

int

5

Maximum connections

time

string

now

ISO 8601 time (e.g. "2026-04-15T08:00:00")

time_mode

string

"departure"

"departure" or "arrival"

direct_only

bool

false

Only direct connections

service_alerts

Fetch current OeBB service alerts and disruptions.

Parameter

Type

Default

Description

max_alerts

int

20

Maximum alerts

product_filter

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 integration

License

MIT

Available Tools

4 tools
search_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)
ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes
max_resultsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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
ParametersJSON Schema
NameRequiredDescriptionDefault
max_alertsNo
product_filterNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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)
ParametersJSON Schema
NameRequiredDescriptionDefault
board_typeNoDEP
station_idNo
max_journeysNo
station_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updatesv0.1.0
    • First observedsearch_station
    • First observedservice_alerts
    • First observedstation_board
    • First observedtrip_search

TDQS

A4.3/5.0

Scored across 4 tools

Disambiguation5/5

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.

Naming Consistency3/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

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

Related MCP Servers