Skip to main content
Glama
README.md
# 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

Il modo consigliato รจ `uvx` (richiede [uv](https://docs.astral.sh/uv/)), che
esegue il server in un ambiente isolato senza installarlo a mano.

**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`
su macOS, `%APPDATA%\Claude\claude_desktop_config.json` su Windows):

```json
{
  "mcpServers": {
    "viaggiatreno": {
      "command": "uvx",
      "args": ["viaggiatreno-mcp"]
    }
  }
}
```

**Kiro** (`~/.kiro/settings/mcp.json`) e altri client con lo stesso formato
(Cursor, Windsurf, VS Code MCP):

```json
{
  "mcpServers": {
    "viaggiatreno": {
      "command": "uvx",
      "args": ["viaggiatreno-mcp"],
      "disabled": false,
      "autoApprove": []
    }
  }
}
```

In alternativa, se hai giร  fatto `pip install viaggiatreno-mcp`, usa
`"command": "viaggiatreno-mcp"` (o `"command": "python", "args": ["-m", "viaggiatreno_mcp"]`).
Riavvia il client dopo aver salvato la configurazione.

Dettagli completi in [packages/viaggiatreno_mcp/README.md](./packages/viaggiatreno_mcp/README.md).

---

## ๐Ÿ› ๏ธ 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

Il publish usa **Trusted Publishing (OIDC)** โ€” nessun token da gestire. Configurazione una tantum:

1. PyPI account (https://pypi.org)
2. Per **ciascun** pacchetto (`viaggiatreno`, `viaggiatreno-mcp`), aggiungi un Trusted Publisher:
   owner `matteoredaelli`, repo `pyviaggiatreno`, workflow `publish-pypi.yml`, environment `pypi`
3. Crea l'environment `pypi` in GitHub (Settings โ†’ Environments)

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

B3.4/5.0

Scored across 21 tools

Disambiguation3/5

Most tools target distinct resources or actions, but station lookup overlaps: autocompleta_stazione and cerca_stazione both search stations by prefix, and autocompleta_stazione_nts adds a related NTS variant. The infomobility trio also differs mainly by detail level, so descriptions help but boundaries are not perfectly sharp.

Naming Consistency4/5

All names use Italian lowercase snake_case, so casing and delimiters are predictable throughout. However, most are noun phrases while a few are verb-first (cerca_, autocompleta_), so the verb_noun pattern is not fully uniform.

Tool Count3/5

21 tools is above the typical 3-15 sweet spot and feels heavy for an MCP surface. The breadth is partly justified by the domain (boards, stations, routes, alerts, weather, dictionary), but several endpoints could likely be consolidated.

Completeness4/5

Coverage is broad: real-time departure/arrival boards, train status, route segments, station metadata, infomobility, weather and utility endpoints. The main gap is journey planning beyond direct trains plus some overlapping station-search behavior, but core ViaggiaTreno workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues