MrBilit
PYPI · MRBILIT-MCP
Unofficial read-only MrBilit: Iranian flights, trains, buses, taxis and hotels, seats and prices.
Available components
Last scanned (12 hours ago)
Scores higher than 62% of PyPI servers
Category Maps and Location
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. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs hatchling.build at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 1 of 35 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to sepehr071/mrbilit-mcp). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 0 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability60
- AI-judged instruction clarity (good).Pass
- 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. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
- Stability check failed: the tool surface changed between 0.2.2 and 0.4.1: 0 tool removals, 22 breaking changes, 0 additions. See how to fix → Fail
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 22 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 23 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 22 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 0.4.0 → 0.4.1 functional
- 20 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- 19 Oct 26 −15
- Malware scan: pass → unverified ▼ security
- Package version: 0.2.2 → 0.4.0 functional
- 18 Oct 26 0
- Stability: fail → unverified ▼ security
- Tool safety: pass → unverified ▼ security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Package version: 0.3.0 → 0.4.0 functional
- 17 Oct 26 0
- Package version: 0.2.2 → 0.3.0 functional
- 16 Oct 26 +15
- Stability: unverified → fail ▼ security
- Tool safety: pass → unverified ▼ security
- 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. security
- Capabilities: pass → unverified ▼ functional
- Tool coverage: 100 → unverified ▼ functional
- Schema quality: excellent → good functional
- Package version: 0.2.2 → 0.3.0 functional
- 14 Oct 26 +14
- Malware scan: pass → unverified ▼ security
- 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). security
- Tool coverage: unverified → 100 ▲ functional
- 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 functional
- 13 Oct 26 +15
- Malware scan: unverified → pass ▲ security
- Package version: 0.2.1 → 0.2.2 functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 22 Oct 2026 · Analysed pypi/mrbilit-mcp@0.4.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | sepehr071/mrbilit-mcp |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/sepehr071/mrbilit-mcp/.github/workflows/publish.yml@refs/tags/v0.4.1 |
| Rekor log index | 3390406809 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:9c581c2cce729e8a20f85eac0b03b00f822cf3f7d92f56a9c081298d8abed40a |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | hatchling.build |
Background: Why install scripts are a supply-chain risk →
Dependencies 35 packages
| Packages resolved | 35 |
|---|---|
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
mb_alternative_routes Alternative routes ~255
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.
| Name | Type | Req | Description |
|---|---|---|---|
| date | string | yes | Travel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead. |
| destination | integer | yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). |
| origin | integer | yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). |
No output schema declared.
No examples provided.
mb_bus_price_calendar Bus price calendar ~189
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.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of days to cover. |
| destination | integer | yes | Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad). |
| origin | integer | yes | 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. |
No output schema declared.
No examples provided.
mb_bus_seats Bus seat map ~174
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.
| Name | Type | Req | Description |
|---|---|---|---|
| bus_id | integer | yes | bus_id from a fresh mb_search_buses result, e.g. 55983988. |
No output schema declared.
No examples provided.
mb_city_hotels All hotels of a city ~188
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).
| Name | Type | Req | Description |
|---|---|---|---|
| city | string | yes | 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. |
No output schema declared.
No examples provided.
mb_companies Transport companies ~157
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max companies. |
| mode | string | yes | Airlines, rail operators, or bus companies and taxi classes. |
| query | – | – | Optional name or code filter, e.g. 'ماهان', 'IR' or 'Iran Peyma'. |
No output schema declared.
No examples provided.
mb_find_place Find place codes ~240
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.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | – | Max places per list. |
| mode | string | yes | Which search the code is for; each mode uses its own ids. |
| query | string | yes | Place name in Persian or English, or a code, e.g. 'مشهد', 'tehran' or 'IST'. |
No output schema declared.
No examples provided.
mb_flight_fare_details Flight fare details ~340
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.
| Name | Type | Req | Description |
|---|---|---|---|
| adults | integer | – | Adults (12+). |
| children | integer | – | Children (2-11). |
| date | string | yes | Gregorian date YYYY-MM-DD, e.g. '2026-10-20'. |
| destination | string | yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). |
| flight_id | string | yes | 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 | yes | 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'. |
No output schema declared.
No examples provided.
mb_flight_price_calendar Flight price calendar ~210
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).
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of days to cover. |
| destination | string | yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). |
| origin | string | yes | 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. |
No output schema declared.
No examples provided.
mb_help Help center search ~181
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.
| Name | Type | Req | Description |
|---|---|---|---|
| full_text | boolean | – | Return long texts uncut instead of clipped. |
| limit | integer | – | Max passages. |
| query | string | yes | 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. |
No output schema declared.
No examples provided.
mb_hotel Hotel details ~194
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.
| Name | Type | Req | Description |
|---|---|---|---|
| full_text | boolean | – | Return long texts uncut instead of clipped. |
| hotel | string | yes | 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. |
No output schema declared.
No examples provided.
mb_hotel_calendar Hotel price calendar ~122
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).
| Name | Type | Req | Description |
|---|---|---|---|
| hotel | string | yes | Hotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'. |
No output schema declared.
No examples provided.
mb_hotel_rooms Hotel rooms and prices ~225
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).
| Name | Type | Req | Description |
|---|---|---|---|
| check_in | string | yes | Check-in date YYYY-MM-DD, e.g. '2026-10-20'. |
| check_out | string | yes | 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 | yes | Hotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'. |
No output schema declared.
No examples provided.
mb_notices Site notices ~216
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
mb_search_buses Search buses ~372
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.
| Name | Type | Req | Description |
|---|---|---|---|
| companies | – | – | Only these company ids, from `companies` of a result or mb_companies(mode='bus'), e.g. [4, 16]. |
| date | string | yes | 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 | yes | 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 | yes | 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. |
No output schema declared.
No examples provided.
mb_search_flights Search flights ~455
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | 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 | yes | 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 | yes | 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. |
No output schema declared.
No examples provided.
mb_search_hotels Search hotels ~385
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).
| Name | Type | Req | Description |
|---|---|---|---|
| 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 | yes | Check-in date YYYY-MM-DD, e.g. '2026-10-20'. |
| check_out | string | yes | Check-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights). |
| city | string | yes | 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. |
No output schema declared.
No examples provided.
mb_search_taxis Search intercity taxis ~275
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').
| Name | Type | Req | Description |
|---|---|---|---|
| car_class | string | – | Car class: economy (Samand/Peugeot), vip, formal (top cars). |
| date | string | yes | 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 | yes | City id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht). |
| limit | integer | – | Max offers. |
| origin | integer | yes | City id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht). |
No output schema declared.
No examples provided.
mb_search_trains Search trains ~328
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.
| Name | Type | Req | Description |
|---|---|---|---|
| available_only | boolean | – | Hide sold-out classes and trains with no free seat. |
| date | string | yes | Travel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead. |
| destination | integer | yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). |
| limit | integer | – | Max trains. |
| origin | integer | yes | 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. |
No output schema declared.
No examples provided.
mb_train_price Train ticket price ~213
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).
| Name | Type | Req | Description |
|---|---|---|---|
| adults | integer | – | Adults (12+). |
| children | integer | – | Children (2-11). |
| class_id | integer | yes | 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). |
No output schema declared.
No examples provided.
mb_train_price_calendar Train price calendar ~214
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.
| Name | Type | Req | Description |
|---|---|---|---|
| days | integer | – | Number of days to cover. |
| destination | integer | yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). |
| origin | integer | yes | 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. |
No output schema declared.
No examples provided.
mb_train_stops Train stops ~101
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).
| Name | Type | Req | Description |
|---|---|---|---|
| class_id | integer | yes | class_id of a train class from a fresh mb_search_trains result, e.g. 9847134. |
No output schema declared.
No examples provided.
mb_travel_guide Travel guide ~251
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.
| Name | Type | Req | Description |
|---|---|---|---|
| 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. |
No output schema declared.
No examples provided.
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.
pypi · mrbilit-mcp
claude mcp add sepehr071-mrbilit-mcp -- uvx mrbilit-mcp
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.