ViaggiaTreno MCP Server
# pyviaggiatreno
Python library + MCP server for ViaggiaTreno APIs (Italian Railways)
## ๐ฆ Packages
### `viaggiatreno` - Core Library โญ
Pure Python client library for ViaggiaTreno APIs. No MCP dependencies.
```bash
pip install viaggiatreno
```
**Usage**:
```python
from viaggiatreno import ViaggiaTrenoClient
import asyncio
async def main():
client = ViaggiaTrenoClient()
# Get station suggestions
stations = await client.autocompleta_stazione("milano")
print(stations)
# Get departures
departures = await client.partenze("S01700", datetime.now())
for train in departures:
print(f"{train.compNumeroTreno} โ {train.destinazione} ({train.ritardo} min delay)")
asyncio.run(main())
```
### `viaggiatreno-mcp` - MCP Server
Model Context Protocol server for Claude, pi, and other AI agents.
```bash
pip install viaggiatreno-mcp
```
**Start server**:
```bash
viaggiatreno-mcp
```
Configure in Claude, pi, or other AI tools to use these tools:
- `autocompleta_stazione` - Station autocomplete
- `cerca_stazione` - Search stations
- `dettaglio_stazione` - Station details
- `partenze` - Departures board
- `arrivi` - Arrivals board
- `stato_treno` - Train status & full route
- E altri...
---
## โจ Features
### Core Library
- ๐ Async/await HTTP client with `httpx`
- ๐ Strongly-typed Pydantic models
- ๐ Intelligent parsing (JSON, plain text, HTML fragments)
- โก Handles ViaggiaTreno quirks (204 No Content, JS date formats, etc.)
- ๐ฎ๐น Full coverage of Italian railways
### MCP Server
- ๐ค AI-ready tool registration
- ๐ Automatic parameter resolution (derive trip details from train number)
- ๐ฑ Works with Claude, pi, and other MCP clients
- ๐งต Async concurrent tool execution
---
## ๐ Documentation
See main documentation files:
- [VIAGGIATRENO.md](./VIAGGIATRENO.md) - API reference (20+ endpoints)
- [TRENORD.md](./TRENORD.md) - GTFS Trenord structure
- [ENTITA.md](./ENTITA.md) - Data model & schema
- [GLOSSARIO.md](./GLOSSARIO.md) - Railway terminology
- [COPERTURA_GEOGRAFICA.md](./COPERTURA_GEOGRAFICA.md) - Geographic coverage
---
## ๐ Quick Start
### Installation
```bash
# Core library only
pip install viaggiatreno
# With MCP server
pip install viaggiatreno-mcp
```
### Using the Library
```python
from viaggiatreno import ViaggiaTrenoClient
from datetime import datetime
client = ViaggiaTrenoClient()
# Get train departures from Milano Centrale
trains = await client.partenze("S01700", datetime.now())
for train in trains:
print(
f"{train.numeroTreno}: {train.destinazione} at {train.compOrarioPartenza} (delay: {train.ritardo}m)"
)
```
### Using MCP Server
1. Install: `pip install viaggiatreno-mcp`
2. Start: `viaggiatreno-mcp`
3. Configure your AI tool (Claude, pi, etc.) to connect to the MCP server
---
## ๐ ๏ธ Development
```bash
# Clone repo
git clone https://github.com/matteoredaelli/pyviaggiatreno.git
cd pyviaggiatreno
# Install dev dependencies
uv pip install -e ".[dev]"
# Run tests
pytest
# Run MCP server
python -m viaggiatreno_mcp.server
```
---
## ๐ License
MIT
---
## ๐ค Contributing
Contributions welcome! Please:
1. Fork the repo
2. Create a feature branch
3. Submit a PR
---
## ๐ Support
- ๐ [Bug reports](https://github.com/matteoredaelli/pyviaggiatreno/issues)
- ๐ฌ [Discussions](https://github.com/matteoredaelli/pyviaggiatreno/discussions)
- ๐ง Email: matteo.redaelli@gmail.com
---
## ๐ GitHub Actions Workflow
La repo ha 3 workflow automatici:
### 1. **Tests & Linting** (`tests.yml`)
- โ
Ruff linting
- โ
Pyright type checking
- โ
Pytest unit tests
- ๐ Trigger: Ogni commit su `main`/`dev` e PR
- ๐ฏ Purpose: Verifica codice quality
### 2. **Test Build** (`test-build.yml`)
- โ
Build entrambi i pacchetti
- โ
Testa installazione wheel
- ๐ Trigger: Commit su `packages/` o workflow_dispatch
- ๐ฏ Purpose: Verifica che la build funzioni (senza pubblicare)
### 3. **Publish to PyPI** (`publish-pypi.yml`)
- โ
Build entrambi i pacchetti
- โ
Pubblica su PyPI
- โ
Crea GitHub Release con artifacts
- ๐ Trigger: Tag push (e.g. `git push origin v0.1.0`)
- ๐ฏ Purpose: Pubblica su PyPI (una sola volta)
**Vedi [RELEASE.md](./RELEASE.md) per istruzioni dettagliate.**
---
## ๐ฆ Publishing to PyPI
### Prerequisites
1. PyPI account (https://pypi.org)
2. Generate token from PyPI
3. Add token to GitHub Secrets: `PYPI_TOKEN`
### Release Process
```bash
# 1. Commit & push
git add .
git commit -m "feature: add X"
git push origin main
# 2. Create tag (triggers publish workflow)
git tag v0.2.0
git push origin v0.2.0
# 3. GitHub Actions automatically publishes both packages
```
Both `viaggiatreno` and `viaggiatreno-mcp` will be published to PyPI with the same version.
---
TDQS
Scored across 19 tools
Most tools target distinct resources (departures vs arrivals, status vs itinerary, three infomobility detail levels), but there is real overlap: autocompleta_stazione and cerca_stazione both search stations by prefix and differ mainly in output shape, and autocompleta_stazione_nts overlaps the former. The descriptions mitigate this somewhat by explicitly noting output differences, but an agent could still easily misselect.
All names are lowercase snake_case Italian, which is highly consistent. However the convention mixes verb-led forms (autocompleta_stazione, cerca_numero_treno, elenco_tratte_ferroviarie) with pure noun phrases (tabellone_partenze, stato_treno, meteo_stazioni), so the pattern is readable but not strictly uniform.
19 tools is on the heavy side but justified by the broad domain: station lookup, boards, train status/tracking, network segments, statistics, infomobility, weather, and localization. Each tool maps to a genuinely distinct API capability, so few feel redundant.
The surface is comprehensive for a read-only public rail-data service: station search/detail/region listing, real-time arrivals and departures, train status and itinerary, network segments and occupancy, plus infomobility and weather. No obvious lifecycle gaps given it is inherently read-only, though nothing covers tickets or personal/favorites data.