# MrBilit (pypi · mrbilit-mcp)

Unofficial read-only MrBilit: Iranian flights, trains, buses, taxis and hotels, seats and prices.

- Trust score: 63/100 (medium)
- Change this week: 0
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-10-22

## Components

- pypi · `mrbilit-mcp`: 63/100 (this document), [markdown](https://verifymcp.io/servers/sepehr071-mrbilit-mcp/mrbilit-mcp.md), [page](https://verifymcp.io/servers/sepehr071-mrbilit-mcp/mrbilit-mcp)

## Channel facts

- Registry: `pypi`
- Package: `mrbilit-mcp`
- Version: `0.4.1`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-10-22.

- **Supply Chain Security**: 50/100
  - Malware scan not yet available for this package.
  - No known CVEs affecting this package version or its production dependencies.
  - Runs hatchling.build at install time, a recognised build step with no custom scripting around it.
  - 1 of 35 dependencies flagged as unhealthy.
- **Provenance & Transparency**: 97/100
  - Source repository is publicly reachable at the declared URL.
  - Cryptographically verified build provenance (signed, bound to sepehr071/mrbilit-mcp).
  - Clear OSI-approved license (MIT).
  - Actively maintained (last published 0 days ago).
  - Disclosure check failed: no security disclosure policy was found in the source repository.
- **Schema Quality & AI Usability**: 60/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 5675 tokens (~257/item across 22 items; 22 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 0/100
  - Stability check failed: the tool surface changed between 0.2.2 and 0.4.1: 0 tool removals, 22 breaking changes, 0 additions.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the MrBilit MCP server?

MrBilit runs locally as a PyPI package, launched with uvx mrbilit-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add sepehr071-mrbilit-mcp -- uvx mrbilit-mcp
```

### Cursor

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

### VS Code

```json
{
  "servers": {
    "sepehr071-mrbilit-mcp": {
      "command": "uvx",
      "args": [
        "mrbilit-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add sepehr071-mrbilit-mcp -- uvx mrbilit-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "sepehr071-mrbilit-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "mrbilit-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add sepehr071-mrbilit-mcp --command uvx --arg mrbilit-mcp
```

### Hermes

```yaml
mcp_servers:
  sepehr071-mrbilit-mcp:
    command: "uvx"
    args: ["mrbilit-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "sepehr071-mrbilit-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "mrbilit-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add sepehr071-mrbilit-mcp -t stdio -c uvx -a mrbilit-mcp
```

### Other

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

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-10-22 (score 63, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 0.4.0 → 0.4.1

### 2026-10-20 (score 78, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-19 (score 63, −15)

- [security regression] Malware scan: pass → unverified
- [functional] Package version: 0.2.2 → 0.4.0

### 2026-10-18 (score 78, 0)

- [security regression] Stability: fail → unverified
- [security regression] Tool safety: pass → unverified
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Package version: 0.3.0 → 0.4.0

### 2026-10-17 (score 78, 0)

- [functional] Package version: 0.2.2 → 0.3.0

### 2026-10-16 (score 78, +15)

- [security regression] Stability: unverified → fail
- [security regression] Tool safety: pass → unverified
- [security improvement] Malware scan: unverified → pass
- [security] Stability: Stability not yet verified: we do not have a sandbox capture of the MCP schema this version of the package serves yet.
- [functional regression] Capabilities: pass → unverified
- [functional regression] Tool coverage: 100 → unverified
- [functional] Schema quality: excellent → good
- [functional] Package version: 0.2.2 → 0.3.0

### 2026-10-14 (score 63, +14)

- [security regression] Malware scan: pass → unverified
- [security improvement] Injection markers: unverified → pass
- [security] First check of Judged manipulation: pass
- [security] Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window).
- [functional improvement] Tool coverage: unverified → 100
- [functional improvement] MCP protocol: unverified → pass
- [functional] First check of Schema quality: fail
- [functional] First check of Schema quality: excellent
- [functional] First check of Destructive annotations: pass
- [functional] First check of Schema quality: fail
- [functional] First check of Tool coverage: 100
- [functional] First check of Tool coverage: 100

### 2026-10-13 (score 49, +15)

- [security improvement] Malware scan: unverified → pass
- [functional] Package version: 0.2.1 → 0.2.2

## MCP tools (22)

### `mb_search_buses` (~372 tokens)

Search buses

Intercity buses on a date: company, terminal, times, price per seat, free seats, bus type, stops, refund penalties.

A city id covers all its terminals; a terminal id only that terminal. price_toman is per
seat (a party pays it once per seat). refund_penalties apply to every bus unless a bus lists
its own: until_hours_before = the step applies until that many hours before departure
(null = up to departure); free_cancel_minutes = free cancellation within that many minutes
after purchase. Next: mb_bus_seats with a bus_id for seat numbers and women/men seats; other
days: mb_bus_price_calendar.

Input parameters:

- `companies`: Only these company ids, from `companies` of a result or mb_companies(mode='bus'), e.g. [4, 16].
- `date` (string, required): Departure date YYYY-MM-DD, e.g. '2026-10-20'.
- `depart_after`: Local time HH:MM, e.g. '18:00'.
- `depart_before`: Local time HH:MM, e.g. '18:00'.
- `destination` (integer, required): Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
- `include_sold_out` (boolean): Also list buses with no free seat.
- `limit` (integer): Max buses.
- `origin` (integer, required): Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
- `sort` (string): Order of the buses.
- `vip_only` (boolean): Only VIP buses.

### `mb_bus_price_calendar` (~189 tokens)

Bus price calendar

Cheapest bus seat per day for a route; days without buses (or not on sale yet) are left out.

Use to find the cheapest day, then mb_search_buses for that day. Bus sales usually open
about a month ahead.

Input parameters:

- `days` (integer): Number of days to cover.
- `destination` (integer, required): Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
- `origin` (integer, required): Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
- `seats` (integer): Seats needed.
- `start_date`: First day YYYY-MM-DD, e.g. '2026-10-10'; default today.

### `mb_bus_seats` (~174 tokens)

Bus seat map

Seat map of one bus: free seat numbers, seats sold to women and to men, and a row-by-row layout.

layout: one line per row from the front; each seat is its number plus a mark: none = free,
w = sold to a woman, m = sold to a man, x = not sold online; '|' = the aisle (seats on the
same side of it are neighbours), '--' = no seat, 'DR' = driver. Rule text (who may sit
where) is in seat_rules. price_toman is null for most buses: use the search price. bus_id
expires: take it from a fresh search.

Input parameters:

- `bus_id` (integer, required): bus_id from a fresh mb_search_buses result, e.g. 55983988.

### `mb_search_taxis` (~275 tokens)

Search intercity taxis

Private door-to-door intercity taxis (whole car, up to 3 passengers) for a date, one offer per pick-up slot.

price_toman is for the whole car, not per person. `classes` summarises each car class
(cars, cheapest price, slots). Many city pairs have no taxis (Tehran-Mashhad, Tehran-Qom):
the empty result then says so. Taxi cities: mb_find_place(mode='taxi').

Input parameters:

- `car_class` (string): Car class: economy (Samand/Peugeot), vip, formal (top cars).
- `date` (string, required): Departure date YYYY-MM-DD, e.g. '2026-10-20'.
- `depart_after`: Local time HH:MM, e.g. '18:00'.
- `depart_before`: Local time HH:MM, e.g. '18:00'.
- `destination` (integer, required): City id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht).
- `limit` (integer): Max offers.
- `origin` (integer, required): City id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht).

### `mb_find_place` (~240 tokens)

Find place codes

Turn a city, airport, station or hotel name into the code a search takes.

flight: `airports` (Iranian, IATA code; Tehran domestic is THR, not IKA; prefer these to
XXXALL for domestic routes) and `cities` (any country; `XXXALL` = all its airports).
train: station ids (Tehran 1, Mashhad 191). bus / taxi: 8-digit city ids (Tehran 11320000 =
all terminals; 11321006 = Tehran South). hotel: city slugs (mb_search_hotels,
mb_city_hotels) and hotel slugs (mb_hotel, mb_hotel_rooms).
Next: mb_search_flights, mb_search_trains, mb_search_buses, mb_search_taxis or mb_search_hotels.

Input parameters:

- `limit` (integer): Max places per list.
- `mode` (string, required): Which search the code is for; each mode uses its own ids.
- `query` (string, required): Place name in Persian or English, or a code, e.g. 'مشهد', 'tehran' or 'IST'.

### `mb_companies` (~157 tokens)

Transport companies

List airlines (IATA code), rail operators or bus companies (id) with Persian and English names.

Use to name a code seen in results (airline 'W5', bus company 4) or to find an airline code
for the `airlines` filter of mb_search_flights. Rail operators repeat under several ids; each
row lists all of them. Bus ids 276/278/280 are the taxi classes VIP/Economy/Formal.

Input parameters:

- `limit` (integer): Max companies.
- `mode` (string, required): Airlines, rail operators, or bus companies and taxi classes.
- `query`: Optional name or code filter, e.g. 'ماهان', 'IR' or 'Iran Peyma'.

### `mb_notices` (~216 tokens)

Site notices

Notices MrBilit currently shows on its pages (disruptions, rule changes, payment options), for a service or route.

Route codes build the site path the notice rules match against: /flights/THR-MHD,
/trains/tehran-mashhad, /hotel/mashhad. search_mode limits a flight notice to domestic or
international searches; site_wide_active counts every active notice, not only these. Use
before recommending a trip, alongside the search tools.

Input parameters:

- `destination`: Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').
- `origin`: Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').
- `service` (string): Which pages; any = every active notice.

### `mb_help` (~181 tokens)

Help center search

Search MrBilit's official rules, FAQ and help-center guides; returns the best matching passages.

Use for refund and cancellation rules, ID and baggage rules, how auto-reserve works, how to
request a change, etc. Passages are plain text with the section they come from. Rules of
one fare are in mb_flight_fare_details / mb_search_trains / mb_search_buses instead.

Input parameters:

- `full_text` (boolean): Return long texts uncut instead of clipped.
- `limit` (integer): Max passages.
- `query` (string, required): Question or keywords in Persian, e.g. 'استرداد بلیط قطار' or 'رزرو خودکار'.
- `source` (string): terms = official rules (refunds, baggage, ID), faq = general FAQ, support = help-center guides and request forms.

### `mb_travel_guide` (~251 tokens)

Travel guide

MrBilit's guide for a route or city (summary, FAQ, article) and matching travel-magazine posts.

Route guide: service + origin + destination (flight IATA codes, train/bus English slugs such
as 'tehran'; hotel: destination city slug only). Magazine: query. Editorial text: prices or
rules quoted in it can be out of date; use the search tools for live prices.

Input parameters:

- `destination`: Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').
- `full_text` (boolean): Return long texts uncut instead of clipped.
- `limit` (integer): Max magazine posts.
- `origin`: Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').
- `query`: Magazine search, e.g. 'کیش' or 'جاهای دیدنی مشهد'.
- `service`: Route guide for this service; needs destination.

### `mb_search_flights` (~455 tokens)

Search flights

Search flights for a date: every bookable flight with price, seats left, baggage and times.

price_toman is one adult's fare (taxes included); total_toman the whole party. Domestic round
trips come back as two lists (`outbound`, `return`, separate tickets); international ones as
packages priced for both ways (flight_id names both legs). International flights from Tehran
can leave from IKA when THR is asked (segments show the real airports). Flights not on sale
are counted in not_on_sale. Next: mb_flight_fare_details with the flight_id (refunds, exact
baggage, rules); to pick the day first, mb_flight_price_calendar.

Input parameters:

- `adults` (integer): Adults (12+).
- `airlines`: Only these airline codes, e.g. ['IR', 'W5'] (codes from results or mb_companies).
- `cabin` (string): Cabin class filter (applied here; the API itself ignores it).
- `children` (integer): Children (2-11).
- `date` (string, required): Gregorian date YYYY-MM-DD, e.g. '2026-10-20'.
- `depart_after`: Local time HH:MM, e.g. '06:00'.
- `depart_before`: Local time HH:MM, e.g. '06:00'.
- `destination` (string, required): IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
- `direct_only` (boolean): Only flights without a connection.
- `infants` (integer): Infants (under 2).
- `limit` (integer): Max flights per list.
- `origin` (string, required): IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
- `return_date`: Return date YYYY-MM-DD for a round trip, e.g. '2026-10-23'; omit for one-way.
- `sort` (string): Order of the flights.

### `mb_flight_price_calendar` (~210 tokens)

Flight price calendar

Cheapest one-adult fare per day for a route over a date range, in one call.

Use to find the cheapest day to fly, then call mb_search_flights for that day. The values
are the site's cached minimums and can differ from a live search; days with no known fare
are left out (no flights, sold out or not cached).

Input parameters:

- `days` (integer): Number of days to cover.
- `destination` (string, required): IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
- `origin` (string, required): IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
- `start_date`: First day YYYY-MM-DD, e.g. '2026-10-15'; default today.

### `mb_flight_fare_details` (~340 tokens)

Flight fare details

Every fare of one flight with refund penalties, confirmed baggage, fare rules, notes and per-passenger prices.

Re-runs the mb_search_flights search (same route, date, party). baggage_checked_with_airline
true = re-checked with the airline (false = search value, usually right). refund_penalties:
penalty percent per window before departure, refund = paid x (100 - penalty_pct) / 100;
penalty_text when there is no percent.

Input parameters:

- `adults` (integer): Adults (12+).
- `children` (integer): Children (2-11).
- `date` (string, required): Gregorian date YYYY-MM-DD, e.g. '2026-10-20'.
- `destination` (string, required): IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
- `flight_id` (string, required): flight_id from mb_search_flights, e.g. '21919377' (international round trip: '21894997+21924108').
- `full_text` (boolean): Return long texts uncut instead of clipped.
- `infants` (integer): Infants (under 2).
- `origin` (string, required): IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
- `return_date`: Only for an international round-trip package: its return date YYYY-MM-DD, e.g. '2026-10-23'.

### `mb_search_hotels` (~385 tokens)

Search hotels

Hotels and stays with a free room in a city for the dates, with the cheapest room price for the whole stay.

price_toman is the cheapest room for all nights (one room, after discount); per_night_toman
divides it by the nights; cheapest_room_sleeps is how many that room sleeps (often 1); photo is the cover image.
Guest count does not change prices: pick a room that fits with mb_hotel_rooms(guests=...). Sold-out hotels are not listed (mb_city_hotels lists every hotel). Next:
mb_hotel (reviews, location), mb_hotel_rooms (every room and exact price),
mb_hotel_calendar (cheapest nights).

Input parameters:

- `amenities`: Only hotels with an amenity whose Persian title contains each word, e.g. ['استخر'] (pool, jacuzzi or sauna), ['پارکینگ'].
- `breakfast_only` (boolean): Only stays whose cheapest room includes breakfast.
- `check_in` (string, required): Check-in date YYYY-MM-DD, e.g. '2026-10-20'.
- `check_out` (string, required): Check-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights).
- `city` (string, required): City slug from mb_find_place(mode='hotel'), e.g. 'mashhad' or 'kish'.
- `hotel_type` (string): Kind of stay.
- `limit` (integer): Max hotels.
- `max_price_per_night_toman`: Highest price per night for one room in Toman, e.g. 3000000.
- `min_stars`: Only hotels with at least this many stars, e.g. 4.
- `refundable_only` (boolean): Only refundable stays.
- `sort` (string): Order; rating is the site's default.

### `mb_hotel` (~194 tokens)

Hotel details

One hotel: stars, guest rating (0-5) and latest reviews, location, landmarks, check-in rules, amenities, FAQ.

The site shows ratings x2 out of 10. landmarks: distance in km (drive minutes). Review text is cut at
400 characters unless full_text. For room
prices on dates call mb_hotel_rooms with `hotel` (null after a numeric id: get the
'city/hotel' ref from mb_find_place(mode='hotel') with the name); for the cheapest nights
mb_hotel_calendar.

Input parameters:

- `full_text` (boolean): Return long texts uncut instead of clipped.
- `hotel` (string, required): Hotel as 'city_slug/hotel_slug' (e.g. 'mashhad/enghelab') or its numeric id (e.g. '8778').
- `reviews` (integer): How many of the latest guest reviews to include.

### `mb_hotel_rooms` (~225 tokens)

Hotel rooms and prices

Every room of a hotel with its exact price for the dates: whole stay, per night, rooms left, meals.

price_toman is the whole stay for one room after discount (prices do not depend on the
guest count; choose rooms whose sleeps fits, and add up several rooms for a group).
rooms_left 0 = full. cancellation is the hotel's refund rule. Empty rooms list = nothing
free for these dates (try mb_hotel_calendar).

Input parameters:

- `check_in` (string, required): Check-in date YYYY-MM-DD, e.g. '2026-10-20'.
- `check_out` (string, required): Check-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights).
- `guests`: Only rooms that sleep at least this many (with extra beds), e.g. 3.
- `hotel` (string, required): Hotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'.

### `mb_hotel_calendar` (~122 tokens)

Hotel price calendar

Cheapest one-night room price per night from today, up to about 48 days (often fewer).

Use to find the cheapest or the next free nights, then mb_hotel_rooms for exact prices.
Nights missing inside the range have no free room; nights after the last one listed are
not loaded yet (not the same as sold out).

Input parameters:

- `hotel` (string, required): Hotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'.

### `mb_city_hotels` (~188 tokens)

All hotels of a city

Every listed hotel of a city, sold out ones included, with stars, rating and address; no prices.

Use to browse or find a hotel by stars or type regardless of dates; filters apply to one
page of 90 hotels at a time, so check `pages`. Prices: mb_search_hotels (dates) or
mb_hotel_calendar (one hotel).

Input parameters:

- `city` (string, required): City slug from mb_find_place(mode='hotel'), e.g. 'mashhad' or 'kish'.
- `hotel_type` (string): Kind of stay.
- `limit` (integer): Max hotels returned from the page.
- `name`: Only names containing this text, e.g. 'درویشی'.
- `page` (integer): Page of 90 hotels (the site's ranking order).
- `stars`: Only this star count, e.g. 4.

### `mb_search_trains` (~328 tokens)

Search trains

Trains between two stations on a date with every class (wagon), its price per adult and free seats.

Seat counts are fresh (not cached). price_toman is per adult; for children, infants or a
whole compartment call mb_train_price with the class_id. refund_penalties apply to every
class unless a class lists its own. Stops and times: mb_train_stops. No seats left: try
mb_train_price_calendar for other days or mb_alternative_routes. A round trip is two calls:
the return leg with outbound_class_id.

Input parameters:

- `available_only` (boolean): Hide sold-out classes and trains with no free seat.
- `date` (string, required): Travel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead.
- `destination` (integer, required): Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
- `limit` (integer): Max trains.
- `origin` (integer, required): Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
- `outbound_class_id`: Round trip, return leg only: the class_id chosen on the outbound leg, e.g. 9847134 (limits the return to the same rail company, as the site does).
- `quota` (string): Seat quota: general (families, mixed), men only, women only, or car transport.
- `sort` (string): Order of the trains.

### `mb_train_price_calendar` (~214 tokens)

Train price calendar

Cheapest train ticket per day (one adult) for a route, only days with free seats.

Use to find the cheapest or the next bookable day, then mb_search_trains for that day.
Train sales open only about 18 days ahead, so later days are missing.

Input parameters:

- `days` (integer): Number of days to cover.
- `destination` (integer, required): Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
- `origin` (integer, required): Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
- `quota` (string): Seat quota: general (families, mixed), men only, women only, or car transport.
- `seats` (integer): Seats needed; days without that many free seats are left out.
- `start_date`: First day YYYY-MM-DD, e.g. '2026-10-10'; default today.

### `mb_train_price` (~213 tokens)

Train ticket price

Exact price of one train class for a party: per adult, child, infant, foreigner and empty berth, and the total.

class_id comes from mb_search_trains (it expires with the search). A sold-out class still
returns a price here, so check seats_left in the search first. breakdown is the adult
fare's parts (they do not add up exactly to the price; the price is what is paid).

Input parameters:

- `adults` (integer): Adults (12+).
- `children` (integer): Children (2-11).
- `class_id` (integer, required): class_id of a train class from a fresh mb_search_trains result, e.g. 9847134.
- `empty_seats` (integer): Empty berths to buy for a whole (exclusive) compartment, e.g. 1 for 3 people in a 4-berth.
- `foreigners` (integer): Foreign passengers (priced separately).
- `infants` (integer): Infants (under 2).

### `mb_train_stops` (~101 tokens)

Train stops

Every station a train stops at, in order, with the date and local time at each.

Pass a class_id from mb_search_trains (sold-out classes work too; never a train number).
The first stop can be before your station (a Tehran-Mashhad train may start in Qom).

Input parameters:

- `class_id` (integer, required): class_id of a train class from a fresh mb_search_trains result, e.g. 9847134.

### `mb_alternative_routes` (~255 tokens)

Alternative routes

Alternatives when direct trains are full or dear: trips with one change, and nearby train, bus and flight routes.

with_one_change: up to 7 journeys with one change, any mix of train and bus (bus+bus too;
price per adult, total duration, wait at the change); a direct bus in nearby_bus_routes can
be cheaper and faster. nearby_*: routes from or to stations, bus cities and airports near the
two stations, with the cheapest price where known (classes_listed is the API's raw count,
not the bookable classes); pass their ids to mb_search_trains, mb_search_buses or
mb_search_flights. Seat counts here can be cached: confirm with a search.

Input parameters:

- `date` (string, required): Travel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead.
- `destination` (integer, required): Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
- `origin` (integer, required): Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/sepehr071-mrbilit-mcp/mrbilit-mcp#diagnostics

## Score history

- 2026-10-22: 63
- 2026-10-21: 78
- 2026-10-20: 78
- 2026-10-19: 63
- 2026-10-18: 78
- 2026-10-17: 78
- 2026-10-16: 78
- 2026-10-15: 63
- 2026-10-14: 63
- 2026-10-13: 49
- 2026-10-12: 34
- 2026-10-07: 34

## Common questions

### What is the MrBilit MCP server?

MrBilit is an MCP server listed in the public MCP registry as io.github.sepehr071/mrbilit-mcp. Unofficial read-only MrBilit: Iranian flights, trains, buses, taxis and hotels, seats and prices. This page covers its PyPI package (mrbilit-mcp).

### Is the MrBilit MCP server safe to use?

MrBilit scores 63 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 22 October 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the MrBilit MCP server expose?

MrBilit exposes 22 tools: mb_search_buses, mb_bus_price_calendar, mb_bus_seats, mb_search_taxis, mb_find_place, and 17 more. Their descriptions and schemas cost roughly 5,285 tokens of context every time the server is loaded.

### Is the MrBilit MCP server still maintained?

MrBilit is still listed as active in the MCP registry. We last reached this channel on 22 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the MrBilit MCP server under?

MrBilit declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

## Links

- PyPI project: https://pypi.org/project/mrbilit-mcp/
- Socket report: https://socket.dev/pypi/package/mrbilit-mcp
- Repository: https://github.com/sepehr071/mrbilit-mcp
- Changelog RSS feed: https://verifymcp.io/servers/sepehr071-mrbilit-mcp/mrbilit-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/sepehr071-mrbilit-mcp/mrbilit-mcp.json
- HTML version of this page: https://verifymcp.io/servers/sepehr071-mrbilit-mcp/mrbilit-mcp
