Skip to main content
Glama
Cihatata

YHT Bilet MCP Server

by Cihatata
README.md
# YHT Bilet MCP Server

A Model Context Protocol (MCP) server for searching Turkish train (YHT/High-Speed Train) tickets via TCDD API.

> Built with [MCP TypeScript SDK](https://modelcontextprotocol.io/docs/develop/build-server#typescript)

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.7-blue.svg)](https://www.typescriptlang.org/)
[![MCP](https://img.shields.io/badge/MCP-1.0-green.svg)](https://modelcontextprotocol.io/)

## ✨ Features

- 🚄 **Real-time ticket availability** from TCDD API
- 🗺️ **Station name to ID mapping** - automatic station resolution
- 📅 **Smart date formatting** - automatically formats dates for API (1 day prior at 21:00)
- 👥 **Passenger count support** - search for multiple passengers
- ♿ **Wheelchair accessibility filter** - option to include/exclude wheelchair-accessible seats
- ✅ **Schema validation** with Zod
- 🎯 **Future train filtering** - only shows trains that haven't departed yet
- 📦 **Object-oriented architecture** - clean, maintainable, and testable code

## 📋 Table of Contents

- [Quick Start](#quick-start)
- [Installation](#installation)
- [Usage](#usage)
- [License](#license)

## 🚀 Quick Start

```bash
# 1. Clone the repository
git clone https://github.com/yourusername/yht-bilet-mcp.git
cd yht-bilet-mcp

# 2. Install dependencies
npm install

# 3. Create environment file
cp .env.example .env

# 4. Add your TCDD authorization token to .env
# (See "Getting Authorization Token" section below)

# 5. Build the project
npm run build

# 6. Add to Claude Desktop config (see Configuration section)
```

## 📦 Installation

### Prerequisites

- Node.js 18+ 
- npm or yarn
- Claude Desktop or any MCP-compatible client

### Steps

#### 1. Install Dependencies

```bash
npm install
```

#### 2. Set Up Environment Variables

Copy the example environment file:

```bash
cp .env.example .env
```

#### 3. Get Your Authorization Token

1. Visit [TCDD E-Ticket Website](https://ebilet.tcddtasimacilik.gov.tr)
2. Open your browser's Developer Tools (F12)
3. Go to the Network tab
4. Perform a ticket search
5. Find the `train-availability` request
6. Copy the `Authorization` header value from Request Headers
7. Paste it into your `.env` file:

```env
AUTH_TOKEN=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldU...
```

**Note:** Authorization tokens expire after some time. If you get authentication errors, get a fresh token.

#### 4. Build the Project

```bash
npm run build
```

## 🎮 Usage

### Adding to Claude Desktop

Add the server to your MCP client configuration:

**macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`

**Windows**: `%APPDATA%\Claude\claude_desktop_config.json`

```json
{
  "mcpServers": {
    "yht-bilet": {
      "command": "node",
      "args": [
        "/absolute/path/to/yht-bilet-mcp/build/index.js"
      ]
    }
  }
}
```

**Important:** Use absolute paths, not relative paths!

### Available Tools

The server provides one tool: `search_train_ticket`

#### Parameters

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `from` | string | Yes | - | Departure station name (e.g., "Ankara") |
| `to` | string | Yes | - | Arrival station name (e.g., "Eskişehir") |
| `date` | string | Yes | - | Travel date in YYYY-MM-DD format (e.g., "2025-12-25") |
| `passengerCount` | number | No | 1 | Number of passengers |
| `includeWheelchairSeats` | boolean | No | true | Include wheelchair-accessible seats in results |

#### Example Usage

**In Claude Desktop, you can ask:**

```
Are there any train tickets from Ankara to Eskişehir on December 25, 2025 for 2 passengers?
```

**MCP client will translate this to:**

```json
{
  "from": "Ankara",
  "to": "Eskişehir",
  "date": "2025-12-25",
  "passengerCount": 2,
  "includeWheelchairSeats": true
}
```

**To exclude wheelchair seats:**

```
Find train tickets from Ankara to Eskişehir on December 25, 2025, but don't show wheelchair seats.
```

#### Response Format

The server returns a formatted text response with:
- ✅/✗ Success/failure indicator
- 🚂 Train commercial name
- ⏰ Departure and arrival times
- 💰 Minimum price
- 📍 Available cabin classes with seat counts

**Example Response:**

```
✓ Ankara - Eskişehir arası 27.12.2025 tarihi için 3 adet tren sefer bulundu.

🚂 YHT ESKİŞEHİR - ANKARA (11:30 - 12:54):
   Minimum Fiyat: 390 TL
   
   📍 Müsait Kabinler:
      • BUSİNESS: 39 koltuk
      • EKONOMİ: 86 koltuk
      • TEKERLEKLİ SANDALYE: 2 koltuk
...
```

## 📝 License

MIT License - see [LICENSE](LICENSE) file for details

---

**Made with ❤️ for the Turkish rail community**

Need help? [Open an issue](https://github.com/yourusername/yht-bilet-mcp/issues)