mrbilit-mcp
Unofficial read-only MCP server for comparing travel options in Iran via MrBilit.
Search flights (domestic/international, one-way/round-trip) with prices, seats, baggage, filters, and fare/refund details.
Find cheapest travel days with flight, train, bus, and hotel price calendars.
Search trains with classes, free seats, quotas, detailed passenger pricing, stops, and alternative routes.
Search intercity buses with terminals, companies, VIP options, refund rules, and seat maps showing free/gender-sold seats.
Search private door-to-door intercity taxis with whole-car pricing and car classes.
Search hotels by dates, rooms, exact prices, availability, amenities, ratings, reviews, and city-wide hotel lists.
Resolve place codes, list transport companies, and read site notices, help-center rules, and travel guides.
It is read-only: no booking, seat hold, login, or payment.
Fetches content such as site notices, help-center guides, and travel magazine posts from MrBilit's Directus CMS instance to provide travel-planning context.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mrbilit-mcpcheapest way from Tehran to Mashhad on 20 October?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mrbilit-mcp: MrBilit MCP server for AI agents
Let your AI agent plan trips in Iran with MrBilit (مستربلیط). An unofficial, read-only MCP server for MrBilit, an Iranian travel site for flights, trains, buses, taxis and hotels: find the cheapest option on a date or over a month, see seats, baggage and refund rules, and compare hotel rooms with exact prices, from Claude, Cursor or Copilot.
For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development · Related servers · Disclaimer · License
For AI agents
What: unofficial, read-only MCP server for MrBilit (مستربلیط), an Iranian travel site: flights, trains, intercity buses, private taxis and hotels. Queries work in Persian and English; prices are in Toman.
Install:
claude mcp add mrbilit -- uvx mrbilit-mcp(stdio transport; needs Python 3.10+ and uv).Auth: none, no API key or account. Optional
MRBILIT_MCP_PROXY(HTTP proxy), only if your network cannot reach MrBilit's API servers.Access: read-only (all 22 tools carry
readOnlyHint: true). No login, seat hold, booking or payment, so no confirmation is needed before calling tools.Tools: 22, all prefixed
mb_*. Callmb_find_placefirst for the codes every search takes, then a price calendar (mb_flight_price_calendar,mb_train_price_calendar,mb_bus_price_calendar) →mb_search_flights/mb_search_trains/mb_search_buses→mb_flight_fare_details,mb_train_priceormb_bus_seats. Hotels:mb_search_hotels→mb_hotel_rooms.Use when: comparing the cheapest plane, train, bus or taxi between Iranian cities, or hotel prices, with seats and refund rules.
Do not use when: you need to book, hold a seat or pay (the user does that on mrbilit.com).
Output: compact JSON. Prices in Toman in
*_tomanfields, dates GregorianYYYY-MM-DD, ratings 0-5. Ids such asflight_id,class_idandbus_idcome from a fresh search and expire.Machine-readable:
server.json; catalog of all Iranian MCP servers: iran-mcp (TOOLS.md, servers.json, llms.txt).
Related MCP server: otaghak-mcp
Why
MrBilit (mrbilit.com, مستربلیط) sells flights, trains, intercity buses, private taxis and hotels in one place, but
each one has its own search, calendar and rules. Comparing "plane or train or bus, which day, which seat" means
a dozen page loads. An agent with mrbilit-mcp does it in one go:
You: Cheapest way to get from Tehran to Mashhad on 20 October?
Agent: calls
mb_search_flights(origin="THR", destination="MHD", date="2026-10-20"),mb_train_price_calendar(origin=1, destination=191),mb_search_buses(origin=11320000, destination=31310000, date="2026-10-20", sort="cheapest")
Mode
Cheapest option
Departs
Price (Toman)
Bus
Peyk Saba VIP, Tehran South terminal, 17 seats left
21:00, arrives 09:00
1,313,000
Train
cheapest seat of the day (price calendar)
list with
mb_search_trains760,000
Flight
Mehr Air MEH 4200, Mehrabad, 2 seats left
08:30, arrives 09:30
11,856,000
The train is cheapest; want me to list that day's trains and free seats with
mb_search_trains?
Real tool output from 2026-10-04; prices and seats change all the time. Prices are in Toman.
What it can do
Flights: domestic and international, one-way or round trip, party prices, cabin/airline/direct/time filters
Cheapest day for flights, trains and buses over weeks, and the cheapest nights of a hotel
Trains: every class with free seats, exact price for children, infants or a whole compartment, every stop
Buses and taxis: terminals, companies, VIP, seat maps with women/men seats, private door-to-door cars
Alternatives when trains are full: one-change trips, nearby stations, bus routes and airports
Hotels: available stays with prices, every hotel of a city, guest ratings and reviews, rooms and exact prices
Context: current site notices, official refund and baggage rules, help-center guides, route guides
Read-only by design: no login, no seat hold, no booking, no payment
Example prompts:
"Cheapest day to fly Tehran to Kish in the next month, and the baggage on that flight?"
"Train from Tehran to Mashhad next Friday for 2 adults and a child: which classes have seats and what's the total?"
"4-star hotels in Shiraz for 3 nights from the 20th under 3 million Toman a night, with their reviews."
"The Tehran to Tabriz train is full on Thursday. What else gets me there?"
ارزان‌ترین اتوبوس VIP تهران به اصفهان فردا شب و صندلی‌های خالی آن؟
ارزان‌ترین روز برای پرواز تهران به کیش در ماه آینده کدام است؟
هتل‌های ۴ ستاره مشهد برای سه شب با قیمت دقیق اتاق‌ها را مقایسه کن.
Quick start
You need uv. No API key or account.
claude mcp add mrbilit -- uvx mrbilit-mcpOutside Iran, if MrBilit's API does not answer, add a proxy:
claude mcp add mrbilit -e MRBILIT_MCP_PROXY=http://127.0.0.1:8080 -- uvx mrbilit-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"mrbilit": { "command": "uvx", "args": ["mrbilit-mcp"] }
}
}Need a proxy? Add "env": { "MRBILIT_MCP_PROXY": "http://127.0.0.1:8080" } next to args.
Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json.
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"mrbilit": { "type": "stdio", "command": "uvx", "args": ["mrbilit-mcp"] }
}
}codex mcp add mrbilit -- uvx mrbilit-mcpOr in ~/.codex/config.toml:
[mcp_servers.mrbilit]
command = "uvx"
args = ["mrbilit-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"mrbilit": { "command": "uvx", "args": ["mrbilit-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It's a standard stdio MCP server: run uvx mrbilit-mcp, or pip install mrbilit-mcp and run mrbilit-mcp.
Then ask the prompts above, in Persian or English.
Tools
Every search takes the codes from mb_find_place: IATA codes for flights (THR, MHD, ISTALL), station ids for
trains (Tehran 1, Mashhad 191), 8-digit city ids for buses and taxis (Tehran 11320000), slugs for hotels
(mashhad, mashhad/enghelab).
Tool | What it does |
| City, airport, station or hotel name → the code each search takes (flight, train, bus, taxi, hotel) |
| Airlines, rail operators, bus companies and taxi classes with their codes |
Tool | What it does |
| Flights on a date, one-way or round trip, domestic or international: price per adult and party total, seats, baggage; cabin, airline, direct and time filters |
| Cheapest fare per day over up to 180 days |
| One flight or round-trip package's fares: refund penalties, checked baggage, fare rules, notes, adult/child/infant prices |
Tool | What it does |
| Trains on a date with every class, price per adult and fresh free-seat counts; men/women/general/car quotas |
| Cheapest bookable train per day |
| Exact price of a class for adults, children, infants, foreigners and empty berths, with the total |
| Every stop of a train with date and time |
| Trips with one change (any mix of train and bus) and nearby train, bus and flight routes |
Tool | What it does |
| Buses on a date: company, terminal, times, price per seat, free seats, VIP, stops, refund penalties |
| Cheapest bus seat per day |
| Seat map: free seats, seats sold to women and men, row layout with the aisle |
| Private door-to-door intercity taxis, price per car, by class and pick-up slot |
Tool | What it does |
| Available hotels in a city for dates with the cheapest stay price and cover photo; stars, type, price, refund, amenity (Persian words, e.g. |
| One hotel: cover photo, rating, latest reviews with per-criterion scores, location, landmarks, rules, amenities |
| Every room with its exact price for the dates, per night, rooms left, meals |
| Cheapest one-night price per night, up to ~48 nights ahead |
| Every hotel of a city, sold out ones included, filtered by stars, type or name (no prices) |
Tool | What it does |
| Notices MrBilit shows right now for a service or route |
| Search the official rules, FAQ and help-center guides (refunds, baggage, auto-reserve, ...) |
| Route or city guide (summary, FAQ, article) and travel-magazine posts |
All 22 tools are annotated readOnlyHint: true and return compact structured JSON, so they don't flood the agent's context.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
mrbilit-mcp (runs on your machine)
│
│ HTTPS (REST, optional proxy)
├──────▶ flight.atighgasht.com, train.mrbilit.com, masir.mrbilit.com, bus.mrbilit.ir, hotel.mrbilit.ir
└──────▶ content.mrbilit.ir, directus.mrbilit.ir, mrbilit.com (site lists, magazine)mrbilit-mcp runs locally and calls the same public endpoints the mrbilit.com website uses. There's no hosted
server in between, no API key, and nothing about you is sent anywhere else.
Good to know
Prices are in Toman in every tool (the API sends Rial; values are divided by 10), always in fields named
*_toman. Flightprice_tomanis per adult andtotal_tomanthe whole party; trains per adult; buses per seat; taxis per car; hotels the whole stay for one room.Dates in and out are Gregorian
YYYY-MM-DD; past dates are rejected. Times are local to the place: a flight time at a foreign airport is that airport's local time, although the API puts+03:30on every flight time.Ratings are 0–5;
nullmeans not rated. The site shows hotel ratings ×2 out of 10.Ids expire:
flight_id,class_idandbus_idcome from a fresh search.Sales windows: trains open about 18 days ahead, buses about a month. An empty result often just means "not on sale yet".
Round trips: domestic flights are two separate tickets (two lists); international round trips are priced as one package.
Hotel prices do not depend on the guest count: pick rooms whose
sleepsfits, and add rooms up for a group.Domestic airports and train stations come from the site's own bundled lists, fetched once per run with a copy shipped in the package as a fallback.
Bus and taxi cities come from MrBilit's live city lists, which are fresher than the bundled copies.
Untrusted text: reviews (cut at 400 characters), rules, notices and guides are site content; the server tells the agent to treat them as data, not instructions.
What it does not do: no login or OTP, seat hold, booking, payment, wallet, refund, coupon, price alert or review posting. You book on mrbilit.com.
Reply size: results are compact JSON, kept to roughly 15 KB by default.
Request rate: at most two requests at a time with a short random delay, because the API hosts share one server.
FAQ
mrbilit-mcp is an unofficial MCP server for MrBilit: it exposes the public endpoints of the mrbilit.com website
as 22 read-only tools, so an agent can compare flights, trains, buses, taxis and hotels.
Install it with uvx mrbilit-mcp (see Quick start), then ask in Persian or English, for example
"cheapest way from Tehran to Mashhad on 20 October, plane, train or bus".
It is unofficial and MIT licensed, so free to use. It is read-only: no login, no API key, no booking or payment, and it runs on your machine.
Usually not: direct calls from an Iranian connection work. If your network cannot reach MrBilit's API servers
(connections time out or are reset), set MRBILIT_MCP_PROXY to an HTTP proxy that can reach them.
System proxy variables (HTTPS_PROXY, ...) are ignored on purpose.
No, and that's deliberate. It has no login and never holds a seat, reserves, orders or pays. The agent finds the best option; you book on mrbilit.com.
The server retries timeouts, resets, 5xx and 429 twice with backoff. If it keeps failing, set MRBILIT_MCP_PROXY (see above). The one-change
trip search (mb_alternative_routes) is known to hang now and then; it is retried and its other parts are still returned.
The pricing endpoint prices any class; availability comes from mb_search_trains (seats_left, bookable).
Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.
npx @modelcontextprotocol/inspector uvx mrbilit-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
Safety and network
Read-only: no login or OTP, no seat hold, reservation, order, payment, wallet, price alert or review posting. The only POSTs are searches and price lookups the site itself makes before booking.
Admin fields (
created_by,updated_by) of the content CMS are never passed through.Sends a real Chrome TLS fingerprint and headers (via curl_cffi) and at most two requests at a time with a short random delay, since the API hosts share one server.
If MrBilit serves a bot-check page, the server can clear it in a headless browser:
pip install mrbilit-mcp[browser], thenpatchright install chromium.
فارسی: سرور MCP مستربلیط
mrbilit-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای مستربلیط است؛ سامانه فروش بلیط هواپیما، بلیط قطار، بلیط اتوبوس، تاکسی بین‌شهری و رزرو هتل در ایران. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد ارزان‌ترین پرواز، قطار، اتوبوس یا تاکسی دربستی را برای یک روز یا یک ماه پیدا کند، صندلی‌های خالی، بار مجاز و قوانین استرداد را ببیند و هتل‌ها را با قیمت دقیق اتاق و نظرات مسافران مقایسه کند.
چه کارهایی می‌کند
پرواز: داخلی و خارجی، یک‌طرفه یا رفت و برگشت، با فیلتر ایرلاین، کلاس پروازی و ساعت.
ارزان‌ترین روز برای پرواز، قطار و اتوبوس در چند هفته، و ارزان‌ترین شب هتل.
قطار: همه رده‌ها با صندلی خالی، قیمت دقیق بزرگسال، کودک و نوزاد، و ایستگاه‌های مسیر.
اتوبوس و تاکسی: ترمینال، شرکت، نقشه صندلی با صندلی خانم‌ها و آقایان، و تاکسی دربستی.
مسیر جایگزین وقتی قطار پر است: سفر با یک تعویض، ایستگاه‌ها و مسیرهای نزدیک.
هتل: هتل‌های دارای اتاق خالی با قیمت، امتیاز و نظرات مسافران، و قیمت دقیق هر اتاق.
اعلامیه‌ها و راهنما: اطلاعیه‌های سایت، قوانین استرداد و بار مجاز، راهنمای مسیرها.
نکته‌ها
فقط خواندنی است: وارد حساب نمی‌شود و صندلی رزرو، بلیط صادر یا پرداخت انجام نمی‌دهد؛ خرید را خودتان در سایت مستربلیط انجام می‌دهید.
همه قیمت‌ها به تومان است و تاریخ‌ها میلادی (
YYYY-MM-DD) هستند.کلید API لازم نیست؛ روی سیستم خود شما اجرا می‌شود و به هیچ سرور واسطی داده نمی‌فرستد.
در ایران معمولاً نیازی به پروکسی نیست؛ اگر سرورهای مستربلیط پاسخ ندادند،
MRBILIT_MCP_PROXYرا تنظیم کنید.برای پیدا کردن آن در گوگل یا رجیستری MCP، «سرور MCP مستربلیط»، «ارزان‌ترین بلیط هواپیما»، «بلیط قطار»، «بلیط اتوبوس»، «رزرو هتل» یا «mrbilit mcp» را جستجو کنید.
نصب در Claude Code:
claude mcp add mrbilit -- uvx mrbilit-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید. بعد بپرسید: «ارزان‌ترین راه رفتن از تهران به مشهد در ۲۸ مهر چیست؟»
Development
git clone https://github.com/sepehr071/mrbilit-mcp && cd mrbilit-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q # offline, against recorded responses
uv run python -m pytest -m live -q # real API (set MRBILIT_MCP_PROXY if needed)
uv buildTools live in src/mrbilit_mcp/places.py, flights.py, trains.py, buses.py, hotels.py and content.py; each
is a typed async function with a docstring that tells the agent when to use it. Issues and PRs are welcome,
especially new tools and fixes for API changes.
Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions tests,
publishes to PyPI and the MCP Registry, and creates the GitHub Release.
Related servers
iran-mcp: catalog of all Iranian-service MCP servers
flytoday-mcp for flights, hotels, trains and buses on Flytoday
jabama-mcp for villas, tours and events on Jabama
otaghak-mcp for villa, cottage and apartment stays on Otaghak
If this saves you clicks, a star helps others find it.
Disclaimer
Unofficial and not affiliated with or endorsed by MrBilit. It is read-only and uses the public endpoints of the mrbilit.com website, which can change without notice. Please keep request rates reasonable.
Author
Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.
License
Available Tools
22 toolsmb_alternative_routesAlternative routesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Travel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead. | |
| origin | Yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). | |
| destination | Yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only, idempotent, open-world profile, so the description is freed to add real behavioral context: seat counts may be cached and must be confirmed with a search, and classes_listed is the API's raw class count rather than bookable classes. These caveats materially change how an agent trusts and reports the data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in one clause, then structured field notes for with_one_change and nearby_* routes. Dense but every sentence carries information; slight density could be trimmed but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned sections (with_one_change, nearby_bus_routes, nearby_*), their contents (price, duration, wait at change), and the correct follow-up tools. An agent has everything needed to call it and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters are fully documented in the schema (origin/destination as mb_find_place train station ids, date with the 18-day sales window), so the schema does the heavy lifting and the description adds no parameter-level detail. Baseline 3 is appropriate at 100% coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific purpose: alternatives when direct trains are full or expensive, covering one-change trips plus nearby train/bus/flight routes. It clearly distinguishes itself from direct-search siblings like mb_search_trains by scoping to the 'no good direct option' case.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when this is useful (direct trains full or dear), warns that a direct bus in nearby_bus_routes may be cheaper and faster, and tells the agent to pass the returned ids to mb_search_trains, mb_search_buses or mb_search_flights. That is a complete use/next-step routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_bus_price_calendarBus price calendarARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to cover. | |
| seats | No | Seats needed. | |
| origin | Yes | Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad). | |
| start_date | No | First day YYYY-MM-DD, e.g. '2026-10-10'; default today. | |
| destination | Yes | Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds genuinely non-redundant behavior: absent days mean no buses or not-yet-on-sale, not an error, and the ~1 month booking window explains sparse results. It does not cover pricing units or pagination, but with annotations present this is solid added context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler, front-loading what the tool returns before the follow-up action and the sales-window caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: per-day cheapest seat, listing omitted days, and the booking-window caveat. All five parameters are documented in the schema, so nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so origin/destination/day-range/seats semantics are already fully documented in the schema with examples. The description adds only the implicit notion that the result is per-day and per-seat; baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Cheapest bus seat per day for a route') and its cardinality, and distinguishes itself from mb_train_price_calendar/mb_flight_price_calendar by the bus domain. It also clarifies a non-obvious output property: days with no service are omitted rather than returned as empty.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('Use to find the cheapest day') and what to do next ('then mb_search_buses for that day'), naming the sibling tool. It also warns that bus sales typically open about a month ahead, which tells the agent how to interpret a short or empty calendar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_bus_seatsBus seat mapARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| bus_id | Yes | bus_id from a fresh mb_search_buses result, e.g. 55983988. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, and the description adds substantial context beyond that: the full layout legend (w/m/x/|/--/DR), the note that rule text lives in seat_rules, that price_toman is null for most buses, and that bus_id expires. This is unusually rich behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, and the layout legend, though lengthy, earns its place because there is no output schema to explain the marks. Slightly dense but no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining the return format, and it does so thoroughly via the row-by-row legend and the price/rule pointers. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with a single parameter, so the schema already documents bus_id. The description adds genuine meaning beyond the schema by warning that bus_id expires and must come from a fresh search, which changes how the agent should source the value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Seat map of one bus') and immediately enumerates the returned content: free seats, gender-sold seats, and row layout. It is clearly distinguishable from list/search siblings like mb_search_buses, which the description implicitly references for obtaining a fresh bus_id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it tells the agent to take bus_id from a fresh search and to use the search price when price_toman is null, which is useful operational guidance. However, there is no explicit when-to-use vs. when-not statement or named alternative, so it sits at the minimum-viable level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_city_hotelsAll hotels of a cityARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug from mb_find_place(mode='hotel'), e.g. 'mashhad' or 'kish'. | |
| name | No | Only names containing this text, e.g. 'درویشی'. | |
| page | No | Page of 90 hotels (the site's ranking order). | |
| limit | No | Max hotels returned from the page. | |
| stars | No | Only this star count, e.g. 4. | |
| hotel_type | No | Kind of stay. | any |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's job is to add semantics beyond that, which it does: sold-out hotels are included, there are no prices, and results are paginated at 90 per page. It stops short of describing the ordering or the full return shape, but the added disclosure is substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler: the result set is front-loaded, then usage plus the alternative routing. The 'check `pages`' pointer is compact and actionable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, no-output-schema list tool, the description covers scope, pagination limits, absent fields and alternatives, which is enough to call it correctly. Minor gaps remain around result ordering and what a page object contains, but the essential call-time information is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents city, name, page, limit, stars and hotel_type, making 3 the baseline. The description echoes the star/type filtering and the 90-per-page pagination unit but adds no syntax or edge-case detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (every listed hotel of a city) plus the scope boundary that sold-out hotels are included and prices are absent. It distinguishes itself from mb_search_hotels and mb_hotel_calendar by naming them as the price-oriented alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('to browse or find a hotel by stars or type regardless of dates') and when not to ('Prices: mb_search_hotels (dates) or mb_hotel_calendar (one hotel)'), naming the correct siblings. Nothing about partner-tool selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_companiesTransport companiesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Airlines, rail operators, or bus companies and taxi classes. | |
| limit | No | Max companies. | |
| query | No | Optional name or code filter, e.g. 'ماهان', 'IR' or 'Iran Peyma'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnly, idempotent, openWorld, and non-destructive, so the safety profile is fully declared. The description adds domain-specific behavior beyond the annotations: rail operators repeat under several ids with each row listing all of them, and bus ids 276/278/280 are the taxi classes VIP/Economy/Formal. This is valuable interpretive context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines, front-loaded with the resource list, then usage, then the rail/taxi idiosyncrasies. Every sentence earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-param read-only lookup with no output schema, the description covers purpose, usage routing, and result-interpretation quirks. It could mention output ordering or pagination behavior for the limit parameter, but the essentials an agent needs to call and interpret it are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum for mode is documented. The description adds domain meaning to code fields ('W5' airline, 4 bus company) that helps the agent interpret results, but does not extend the parameter documentation itself. Baseline 3 fits when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource (airlines, rail operators, bus companies) and the return shape (IATA code, id, Persian/English names). This is a reference-lookup tool clearly distinguished from the sibling search_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use it: 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. Names a sibling tool and the routing condition, which is exactly the when-to-use signal an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_find_placeFind place codesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| mode | Yes | Which search the code is for; each mode uses its own ids. | |
| limit | No | Max places per list. | |
| query | Yes | Place name in Persian or English, or a code, e.g. 'مشهد', 'tehran' or 'IST'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely useful domain behavior beyond that: Tehran domestic is THR not IKA, and these codes are preferred over XXXALL for domestic routes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-line purpose, then breaks down by mode with concrete examples. Dense and information-rich, though the multi-clause mode section could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining what is returned, and it does so by describing the code formats per mode. Covers the essential path from name to code and the handoff to search tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds meaning the schema does not: the concrete per-mode id formats and example codes that let an agent interpret and choose `mode` correctly. It goes beyond the terse enum description without fully documenting limit behavior.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific transformation ('Turn a city, airport, station or hotel name into the code a search takes'), naming both the input resource and the output artifact. This clearly distinguishes it from the mb_search_* siblings that consume those codes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly maps each mode to the id type it needs (flight→airports/cities, train→station ids, bus/taxi→8-digit city ids, hotel→slugs) and closes with a concrete 'Next:' routing to the five search tools. Both when-to-use and the downstream alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_flight_fare_detailsFlight fare detailsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Gregorian date YYYY-MM-DD, e.g. '2026-10-20'. | |
| adults | No | Adults (12+). | |
| origin | Yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). | |
| infants | No | Infants (under 2). | |
| children | No | Children (2-11). | |
| flight_id | Yes | flight_id from mb_search_flights, e.g. '21919377' (international round trip: '21894997+21924108'). | |
| full_text | No | Return long texts uncut instead of clipped. | |
| destination | Yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). | |
| return_date | No | Only for an international round-trip package: its return date YYYY-MM-DD, e.g. '2026-10-23'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the call re-executes a full search (implying latency/cost), and it explains how to interpret the returned baggage_checked_with_airline flag and the refund penalty formula. It omits any note on rate limits or result size/pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight blocks: the first sentence front-loads what the tool returns, the second covers the re-run behavior and the two non-obvious output fields. No filler or restated title text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry return-value meaning, and it does so for the two fields most likely to be misread (baggage_checked_with_airline, refund_penalties). Other returned data (fare rules, notes, per-passenger price structure) is named but not explained, which is a minor gap for a 9-parameter read tool with full schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (including the 'ALL' city-code pattern and flight_id format) is already documented in the schema — the baseline is 3. The description only indirectly reinforces this by saying the search must be re-run with the same route, date and party; it adds no syntax or format detail of its own.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Every fare of one flight with refund penalties, confirmed baggage, fare rules, notes and per-passenger prices.' This clearly separates it from mb_search_flights (which finds flights) and mb_flight_price_calendar (which shows price trends) without needing to open any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Re-runs the mb_search_flights search (same route, date, party)' tells the agent the prerequisite (a prior search producing flight_id) and that the route/date/party inputs must match that search. It does not explicitly state when to prefer mb_flight_price_calendar or other siblings, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_flight_price_calendarFlight price calendarARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to cover. | |
| origin | Yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). | |
| start_date | No | First day YYYY-MM-DD, e.g. '2026-10-15'; default today. | |
| destination | Yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, it discloses that values are the site's cached minimums and may diverge from a live search, and that days with no known fare are omitted for three distinct reasons (no flights, sold out, not cached). That is exactly the caveat an agent needs before trusting the numbers.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler. The purpose and the headline caveat (cached, not live) are front-loaded, with the omission rule last where it belongs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the burden of explaining returns – and it does: one value per day, cheapest one-adult fare, days missing when unavailable. Nothing an agent needs to interpret or act on the result is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% – origin, destination, days and start_date are all documented with patterns, defaults and formats in the schema. The description adds only that the fare basis is one adult, which is result semantics rather than parameter guidance, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+granularity: 'Cheapest one-adult fare per day for a route over a date range, in one call.' That immediately distinguishes it from the sibling mb_search_flights, which returns live itineraries rather than per-day minimums.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use to find the cheapest day to fly, then call mb_search_flights for that day.' It names the follow-up tool and the condition that selects it, so the workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_helpHelp center searchARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| limit | No | Max passages. | |
| query | Yes | Question or keywords in Persian, e.g. 'استرداد بلیط قطار' or 'رزرو خودکار'. | |
| source | No | terms = official rules (refunds, baggage, ID), faq = general FAQ, support = help-center guides and request forms. | all |
| full_text | No | Return long texts uncut instead of clipped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds genuine behavioral context beyond them: the response is plain-text passages tagged with their source section. It stops short of mentioning result quality, ranking, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, purpose front-loaded, usage examples second, sibling routing last. No filler and nothing repeated from the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully explains the return shape (matching passages with source sections) and covers source routing, which is the main ambiguity for this tool. Only minor gaps remain around ranking or result volume, which the limit parameter already bounds.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the enum semantics for source and the Persian-language expectation for query, so the schema already does the heavy lifting. The description's mention of rules/FAQ/guides loosely mirrors the terms/faq/support enum but adds no new parameter-level detail. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search MrBilit's official rules, FAQ and help-center guides') plus the return type ('best matching passages'). It also distinguishes itself from fare-specific siblings by naming mb_flight_fare_details / mb_search_trains / mb_search_buses as the correct route for per-fare rules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly enumerates the question classes it is for (refunds/cancellation, ID and baggage, auto-reserve, change requests) and gives an explicit exclusion routing fare rules to three named siblings. Both the when and the when-not are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_hotelHotel detailsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| hotel | Yes | Hotel as 'city_slug/hotel_slug' (e.g. 'mashhad/enghelab') or its numeric id (e.g. '8778'). | |
| reviews | No | How many of the latest guest reviews to include. | |
| full_text | No | Return long texts uncut instead of clipped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive/open-world, so the safety profile is covered. The description still adds genuinely useful behavioral context beyond the schema: the returned rating is on a 0-5 scale while the site displays it doubled out of 10, review text is clipped at 400 characters unless full_text is set, and landmark distances are in km with drive minutes in parentheses.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence carries information — return contents first, then scale/truncation caveats, then routing to the three related tools. The only blemish is the awkward line breaking that splits sentences ('...unless full_text. For room prices...'), which slightly hurts front-loading and readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does so: it lists the returned sections, flags the rating-scale conversion, and states the review truncation rule and the flag that lifts it. Combined with explicit routing to mb_hotel_rooms/mb_hotel_calendar/mb_find_place, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the two accepted identifier forms (numeric id vs 'city/hotel' slug) and how to obtain the slug form via mb_find_place, which is a workflow detail the schema pattern alone does not convey. It also implies the effects of reviews and full_text on the response.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a single, concrete resource and enumerates exactly what is returned (stars, rating, reviews, location, landmarks, check-in rules, amenities, FAQ), and it clearly distinguishes itself from siblings by routing price/calendar queries elsewhere. The only shortfall is that the retrieval verb is implicit — it reads as a noun list ('One hotel: ...') rather than stating 'Returns details for one hotel'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names alternatives and the conditions that select them: mb_hotel_rooms for room prices on dates, mb_hotel_calendar for cheapest nights, and mb_find_place(mode='hotel') to obtain the 'city/hotel' ref. This is exactly the when/when-not/alternatives guidance the dimension asks for.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_hotel_calendarHotel price calendarARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| hotel | Yes | Hotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive, open-world, so the safety profile is covered. The description nonetheless adds real behavioral context: the ~48-day horizon, that missing interior nights mean no availability, and that trailing gaps mean 'not loaded yet' rather than 'sold out' — a genuinely non-obvious distinction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the return semantics, then usage, then the edge-case interpretation. Every sentence carries information an agent would otherwise have to guess.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly compensates by characterizing the result (per-night cheapest price), its range limit, and how to interpret gaps. That is exactly the missing structure an agent needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'hotel' parameter is fully documented in the schema (format 'city_slug/hotel_slug', pattern, maxLength, example, and where to obtain it). The description adds no parameter-level detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource+scope: the cheapest one-night room price per night, starting today and running up to ~48 days. It is immediately distinguishable from mb_hotel_rooms (exact prices) and from the train/bus/flight calendar siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('to find the cheapest or the next free nights') and names the follow-up tool ('then mb_hotel_rooms for exact prices') for the precision case. Nothing is left to inference about tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_hotel_roomsHotel rooms and pricesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| hotel | Yes | Hotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'. | |
| guests | No | Only rooms that sleep at least this many (with extra beds), e.g. 3. | |
| check_in | Yes | Check-in date YYYY-MM-DD, e.g. '2026-10-20'. | |
| check_out | Yes | Check-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish this as a safe, idempotent, read-only lookup, so the description is free to add domain semantics instead: price is post-discount whole-stay, prices are independent of guest count, rooms_left 0 means full, and cancellation is the hotel's refund rule. It does not cover auth, rate limits, or pagination, so it stops short of a full 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and date scope are front-loaded in the first sentence, followed by field semantics in short, dense clauses. Every line carries information, though the parenthetical about guest count and multi-room groups is packed enough to need a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on return-value explanation (price_toman, rooms_left, cancellation, meals) and the empty-list edge case, which is what an agent needs to interpret results. It is nearly complete for a 4-parameter read tool; only structural details of the rooms list itself are absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema by clarifying that guest count does not affect price and that guests instead selects rooms whose capacity fits ('choose rooms whose sleeps fits'). The date-range parameter semantics (1-30 nights) remain schema-only.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific resource and scope: 'Every room of a hotel with its exact price for the dates', plus the fields returned (whole stay, per night, rooms left, meals). It partially differentiates from siblings by routing empty results to mb_hotel_calendar, but never states how it differs from mb_hotel or mb_search_hotels, which an agent must infer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear use condition (fetch room-level availability and prices for a hotel/date range) and an explicit fallback with its trigger: 'Empty rooms list = nothing free for these dates (try mb_hotel_calendar)'. Prerequisites are only implied through the schema's reference to mb_search_hotels/mb_city_hotels for the hotel slug.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_noticesSite noticesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| origin | No | Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab'). | |
| service | No | Which pages; any = every active notice. | any |
| destination | No | Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the bar is lower. The description still adds real value by explaining how route codes map to site paths, but it also references `search_mode` and `site_wide_active`, which do not exist in the schema — useful-sounding context that an agent cannot act on.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose in one clean sentence, then a second block on route codes and behavior. Slightly dense but every sentence is doing work; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-parameter lookup with full schema coverage and no output schema, the definition covers when and how to call it. It omits any hint of the notice payload shape and references params the schema lacks, which are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so origin/destination format rules and the service enum are already documented, making 3 the baseline. The path-construction explanation adds some framing, but the mention of undeclared parameters (search_mode, site_wide_active) creates confusion rather than clarity.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (site notices for disruptions, rule changes, payment options) and its scope (per service or route). It is immediately distinguishable from every sibling, which are all search/price/lookup tools rather than notice retrieval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use before recommending a trip, alongside the search tools" gives a clear usage context and positions it relative to siblings. It does not state exclusions or when not to call it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_search_busesSearch busesARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Departure date YYYY-MM-DD, e.g. '2026-10-20'. | |
| sort | No | Order of the buses. | earliest |
| limit | No | Max buses. | |
| origin | Yes | Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad). | |
| vip_only | No | Only VIP buses. | |
| companies | No | Only these company ids, from `companies` of a result or mb_companies(mode='bus'), e.g. [4, 16]. | |
| destination | Yes | Bus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad). | |
| depart_after | No | Local time HH:MM, e.g. '18:00'. | |
| depart_before | No | Local time HH:MM, e.g. '18:00'. | |
| include_sold_out | No | Also list buses with no free seat. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds real domain behavior beyond that: a city id spans all its terminals while a terminal id is exclusive, price_toman is per seat, and refund penalties apply per bus unless overridden. Auth requirements and result pagination are not addressed, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense and front-loaded: the first sentence states exactly what comes back, then constraints, then next steps. The refund_penalties sentence is long and slightly run-on, but every clause carries distinct information, so there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, no output schema, and several domain-specific terms (price_toman, refund_penalties, city vs terminal ids), the description supplies exactly the missing context an agent needs: return field inventory, id semantics, and the refund-penalty field meanings. Nothing essential is left undocumented.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so a 3 is the baseline, but the description genuinely clarifies parameter meaning beyond the schema: origin/destination take either a city id (all terminals) or a terminal id (that terminal only), which is the single most error-prone input decision. It also clarifies the price_toman unit semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource and scope ('Intercity buses on a date') and enumerates the returned fields (company, terminal, times, price per seat, free seats, bus type, stops, refund penalties). It also distinguishes itself from mb_bus_seats and mb_bus_price_calendar, so an agent can tell it apart from siblings without opening their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes follow-on needs: 'Next: mb_bus_seats with a bus_id for seat numbers and women/men seats; other days: mb_bus_price_calendar.' That covers adjacent alternatives clearly, but it never states when NOT to use this tool (e.g. vs mb_search_taxis or mb_alternative_routes for the same route), so it falls short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_search_flightsSearch flightsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Gregorian date YYYY-MM-DD, e.g. '2026-10-20'. | |
| sort | No | Order of the flights. | cheapest |
| cabin | No | Cabin class filter (applied here; the API itself ignores it). | any |
| limit | No | Max flights per list. | |
| adults | No | Adults (12+). | |
| origin | Yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). | |
| infants | No | Infants (under 2). | |
| airlines | No | Only these airline codes, e.g. ['IR', 'W5'] (codes from results or mb_companies). | |
| children | No | Children (2-11). | |
| destination | Yes | IATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports). | |
| direct_only | No | Only flights without a connection. | |
| return_date | No | Return date YYYY-MM-DD for a round trip, e.g. '2026-10-23'; omit for one-way. | |
| depart_after | No | Local time HH:MM, e.g. '06:00'. | |
| depart_before | No | Local time HH:MM, e.g. '06:00'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent/openWorld annotations, the description discloses real hidden behavior: international flights from Tehran may actually depart IKA when THR is requested (segments show real airports), off-sale flights are counted in not_on_sale, and domestic round trips return two separate ticket lists while international ones return a two-way package whose flight_id names both legs. These are non-obvious traits an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core purpose and no filler; each clause carries information. The middle sentence is dense with parenthetical asides (outbound/return, flight_id leg naming, IKA/THR), which costs some parseability but every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description must explain return values, and it does: fare fields, the two-list vs. package round-trip shapes, and the not_on_sale bucket. Combined with the forward routing to fare details and the calendar, nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already carries parameter meaning and the baseline is 3. The description goes slightly further by explaining that price_toman is one adult's fare with taxes while total_toman covers the whole party, which clarifies how the adults/children/infants parameters affect pricing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search flights for a date') and immediately enumerates what the result set contains (price, seats left, baggage, times), which no sibling such as mb_search_trains or mb_search_buses provides. An agent can distinguish this from the train/bus/taxi/hotel searchers without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent forward explicitly: use mb_flight_fare_details with the returned flight_id for refunds/baggage/rules, and mb_flight_price_calendar if the day must be chosen first. That is clear conditional guidance, but it never states when this tool is the wrong choice (e.g. vs. the calendar or fare-details tools as entry points) and gives no prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_search_hotelsSearch hotelsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| city | Yes | City slug from mb_find_place(mode='hotel'), e.g. 'mashhad' or 'kish'. | |
| sort | No | Order; rating is the site's default. | rating |
| limit | No | Max hotels. | |
| check_in | Yes | Check-in date YYYY-MM-DD, e.g. '2026-10-20'. | |
| amenities | No | Only hotels with an amenity whose Persian title contains each word, e.g. ['استخر'] (pool, jacuzzi or sauna), ['پارکینگ']. | |
| check_out | Yes | Check-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights). | |
| min_stars | No | Only hotels with at least this many stars, e.g. 4. | |
| hotel_type | No | Kind of stay. | any |
| breakfast_only | No | Only stays whose cheapest room includes breakfast. | |
| refundable_only | No | Only refundable stays. | |
| max_price_per_night_toman | No | Highest price per night for one room in Toman, e.g. 3000000. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world and non-destructive behavior, so the bar is lower. The description adds genuinely useful traits beyond them: that guest count does not alter prices, that sold-out properties are dropped from results, and what each returned price field means. Nothing is contradicted, though pagination/limit interplay and result ordering semantics are left to the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, followed by output-field definitions and then a compact routing block. Every section carries information, though the middle field-by-field paragraph reads as a run-on list and could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 11 parameters and no output schema, the description carries an unusual burden, and it does supply the meaning of the key returned price/occupancy fields plus the consumer chain. It still omits the overall result shape (e.g. hotel identity fields), limit/pagination behavior, and sort interaction, which an agent must infer.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 11 parameters, which sets the baseline at 3. The description's extra detail (price_toman, per_night_toman, cheapest_room_sleeps, photo) describes returned fields rather than parameter meaning, and adds only the guest-count invariant that no parameter here controls.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource (hotels/stays) with a clear scope: availability for the given dates plus the cheapest whole-stay price. It explicitly contrasts itself with the sibling mb_city_hotels by noting sold-out hotels are excluded here, so an agent can distinguish the two without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives routing conditions rather than just context: guest count doesn't affect price so room fitting belongs to mb_hotel_rooms(guests=...), and sold-out filtering is contrasted with mb_city_hotels. It also names the natural follow-up chain (mb_hotel, mb_hotel_rooms, mb_hotel_calendar) with the reason for each.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_search_taxisSearch intercity taxisARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Departure date YYYY-MM-DD, e.g. '2026-10-20'. | |
| limit | No | Max offers. | |
| origin | Yes | City id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht). | |
| car_class | No | Car class: economy (Samand/Peugeot), vip, formal (top cars). | any |
| destination | Yes | City id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht). | |
| depart_after | No | Local time HH:MM, e.g. '18:00'. | |
| depart_before | No | Local time HH:MM, e.g. '18:00'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly, idempotent, openWorld), the description discloses critical behavioral traits: capacity (up to 3 passengers), pricing scope (price_toman is for the whole car, not per person), empty-result behavior, and the summary structure of `classes` (cars, cheapest price, slots). This is rich domain-specific context that annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the tool's purpose and packs useful details into four sentences without repetition. The pricing and classes notes are output-related and sit alongside parameter guidance, slightly blurring structure, but overall it is concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters, no output schema, and full schema descriptions, the description covers purpose, usage, behavioral caveats, and return-format hints (empty results, `classes` summary). It omits any explanation of authentication or rate limits, but those may not be relevant; for the domain, it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds a cross-reference to mb_find_place(mode='taxi') for origin/destination, but that is already in the schema; it also clarifies pricing (an output field, not a parameter) and output summarization. It does not add parameter-specific syntax or defaults beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource—private door-to-door intercity taxis—and specifies scope (whole car, up to 3 passengers) and granularity (one offer per pick-up slot). This clearly differentiates it from sibling transport-search tools like buses, trains, and flights.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a prerequisite (city IDs via mb_find_place(mode='taxi')) and a when-not (many city pairs have no taxis), but does not explicitly compare this tool to alternative sibling searches such as mb_search_buses or mb_search_trains. The context is still clear enough for an agent to know when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_search_trainsSearch trainsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| date | Yes | Travel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead. | |
| sort | No | Order of the trains. | earliest |
| limit | No | Max trains. | |
| quota | No | Seat quota: general (families, mixed), men only, women only, or car transport. | general |
| origin | Yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). | |
| destination | Yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). | |
| available_only | No | Hide sold-out classes and trains with no free seat. | |
| outbound_class_id | No | 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). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile, and the description adds real behavioral context beyond them: seat counts are fresh (not cached), price_toman is per adult, refund_penalties apply to every class unless overridden, and round-trip return legs are constrained to the same rail company.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core capability leads, followed by routing and round-trip mechanics. Nearly every sentence earns its place, though the compressed multi-clause routing block is slightly hard to parse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter, no-output-schema search tool, the description covers the return shape (class, price per adult, free seats, refund penalties), data freshness, and cross-tool routing. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema description coverage, baseline is 3, but the description adds meaning beyond the schema — it explains the per-adult basis of pricing, the refund_penalty inheritance rule, and the company-locking behavior of outbound_class_id, which the schema only states mechanically.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource+scope: trains between two stations on a date, returning every class with price per adult and free seats. It is clearly distinguishable from siblings like mb_train_price, mb_train_stops, and mb_search_buses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: children/infants/whole compartments go to mb_train_price with class_id, stops and times to mb_train_stops, sold-out dates to mb_train_price_calendar or mb_alternative_routes, and round trips are described as two calls using outbound_class_id. When-to-use and alternatives are both spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_train_priceTrain ticket priceARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| adults | No | Adults (12+). | |
| infants | No | Infants (under 2). | |
| children | No | Children (2-11). | |
| class_id | Yes | class_id of a train class from a fresh mb_search_trains result, e.g. 9847134. | |
| foreigners | No | Foreign passengers (priced separately). | |
| empty_seats | No | Empty berths to buy for a whole (exclusive) compartment, e.g. 1 for 3 people in a 4-berth. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), yet the description adds non-obvious session semantics (class_id expiry), a misleading-success case (sold-out classes still priced), and a data quirk (breakdown parts do not sum to the charged price). These are exactly the behaviours an agent cannot infer from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: what it returns first, then the prerequisite, then the sold-out caveat, with the breakdown note last. No filler, no restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries return-value disclosure and does so reasonably ('per adult, child, infant, foreigner and empty berth, and the total'), plus it warns about the breakdown's non-additivity. It omits error behaviour (e.g. expired class_id) and currency, minor gaps for a read-only price lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, and the description meaningfully exceeds it by explaining that the party composition (adult/child/infant/foreigner/empty berth) drives the returned breakdown. It adds interpretive value but no syntax or unit detail (e.g. currency) beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('Exact price of one train class for a party') and enumerates the pricing dimensions returned, so an agent knows precisely what it computes. It also points at the source of class_id (mb_search_trains), which separates it from the search tool, though it never contrasts itself with the sibling mb_train_price_calendar or mb_flight_fare_details.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a real precondition and a trap to avoid: class_id comes from mb_search_trains and expires with the search, and a sold-out class still returns a price so seats_left should be checked first. It does not state when to prefer the calendar variant or any explicit when-not case, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_train_price_calendarTrain price calendarARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| days | No | Number of days to cover. | |
| quota | No | Seat quota: general (families, mixed), men only, women only, or car transport. | general |
| seats | No | Seats needed; days without that many free seats are left out. | |
| origin | Yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). | |
| start_date | No | First day YYYY-MM-DD, e.g. '2026-10-10'; default today. | |
| destination | Yes | Train station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: only days with free seats are returned, and sales open only ~18 days ahead, so later days are absent. That explains partial results an agent would otherwise misread as an error.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short lines with zero waste; the core purpose and the free-seat constraint are front-loaded, and the sequencing hint plus sales-window caveat follow compactly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description conveys the return shape (per-day cheapest fare for a route) and the data-coverage limit, which is the main thing an agent needs to interpret results. Only the relationship to mb_train_price is left unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the six parameters including the quota enum, seats, days and station-id hints are already fully documented. The description adds only the '(one adult)' framing and does not clarify how seats interacts with the free-seat filtering, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific resource and scope: cheapest train ticket per day for a route, restricted to days with free seats. It clearly reads as a calendar-style tool distinct from mb_search_trains, but it never distinguishes itself from the sibling mb_train_price (single-day price), which an agent would need to choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('find the cheapest or the next bookable day') and routes the agent to mb_search_trains for the chosen day. It stops short of naming the alternative price tool or any when-not condition, so it is strong but not fully closed-loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_train_stopsTrain stopsARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| class_id | Yes | class_id of a train class from a fresh mb_search_trains result, e.g. 9847134. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the bar is lower, and the description still adds genuinely non-obvious behavior: the first stop may precede the user's boarding station (Tehran-Mashhad train starting in Qom), and sold-out classes remain queryable. Return format is conveyed in one clause.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler, and the payload description is front-loaded before the parameter sourcing and the Qom caveat. Every sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and a single 100%-covered parameter, the description supplies exactly the missing pieces: what comes back, where the argument comes from, and a counterintuitive ordering caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already defines class_id, so baseline would be 3; the description goes beyond it by constraining the value's provenance (from a fresh mb_search_trains result) and warning against passing a train number instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb+resource ('every station a train stops at, in order') and even characterizes the return payload (date and local time per stop), which cleanly separates it from mb_search_trains and the other train siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the prerequisite explicitly (pass a class_id from mb_search_trains) plus two exclusions: sold-out classes are usable and a train number never is. It stops short of naming an alternative tool for any other case, so it is clear context rather than a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mb_travel_guideTravel guideARead-onlyIdempotent
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 | Required | Description | Default |
|---|---|---|---|
| limit | No | Max magazine posts. | |
| query | No | Magazine search, e.g. 'کیش' or 'جاهای دیدنی مشهد'. | |
| origin | No | Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab'). | |
| service | No | Route guide for this service; needs destination. | |
| full_text | No | Return long texts uncut instead of clipped. | |
| destination | No | Flight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab'). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that — editorial text may quote out-of-date prices or rules, and live data must come from search tools — which is exactly the kind of caveat annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose leads, followed by compact mode-specific clauses; every sentence carries information and nothing is repeated. The telegraphic 'service + origin + destination' fragments are efficient but slightly terse, keeping it just below a 5.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does address what comes back (summary, FAQ, article, magazine posts) and flags content-staleness, so an agent can call it correctly. It could say more about how many results or clipped-vs-full-text behavior, but the essentials are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes slightly beyond the per-parameter schema by tying parameters together — which combination (service+origin+destination vs. query) activates each mode and the special rule that hotel only needs the destination city slug — which is cross-parameter semantics the schema fields do not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a concrete resource — MrBilit's guide content (summary, FAQ, article) plus travel-magazine posts — so an agent knows this returns editorial content rather than prices or availability. It implicitly separates itself from the search/booking siblings via the 'use the search tools for live prices' line, but it does not differentiate from other content-ish siblings such as mb_find_place, mb_notices, or mb_help.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear selection rules: route-guide mode requires service + origin + destination, while magazine mode takes a query, and it redirects agents to search tools for live prices. There is no explicit 'do not use this for X' or contrast against the other non-search siblings, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
22 tool updates
v0.3.0- Changed
mb_alternative_routes4 fields changed- removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_alternative_routesDictOutput", - "type": "object" -}New value: +null
- Changed
mb_bus_price_calendar6 fields changed- removed
Input schema / properties / days / titleRemoved value: -"Days" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / seats / titleRemoved value: -"Seats" - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_bus_price_calendarDictOutput", - "type": "object" -}New value: +null
- Changed
mb_bus_seats2 fields changed- removed
Input schema / properties / bus_id / titleRemoved value: -"Bus Id" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_bus_seatsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_city_hotels8 fields changed- removed
Input schema / properties / city / titleRemoved value: -"City" - removed
Input schema / properties / hotel_type / titleRemoved value: -"Hotel Type" - changed
Input schema / properties / limit / defaultPrevious value: -40New value: +20 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / name / titleRemoved value: -"Name" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / stars / titleRemoved value: -"Stars" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_city_hotelsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_companies4 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_companiesDictOutput", - "type": "object" -}New value: +null
- Changed
mb_find_place4 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / mode / titleRemoved value: -"Mode" - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_find_placeDictOutput", - "type": "object" -}New value: +null
- Changed
mb_flight_fare_details10 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / flight_id / titleRemoved value: -"Flight Id" - added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return long texts uncut instead of clipped.", + "type": "boolean" +} - removed
Input schema / properties / infants / titleRemoved value: -"Infants" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / return_date / titleRemoved value: -"Return Date" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_flight_fare_detailsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_flight_price_calendar5 fields changed- removed
Input schema / properties / days / titleRemoved value: -"Days" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_flight_price_calendarDictOutput", - "type": "object" -}New value: +null
- Changed
mb_help5 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return long texts uncut instead of clipped.", + "type": "boolean" +} - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / source / titleRemoved value: -"Source" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_helpDictOutput", - "type": "object" -}New value: +null
- Changed
mb_hotel4 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return long texts uncut instead of clipped.", + "type": "boolean" +} - removed
Input schema / properties / hotel / titleRemoved value: -"Hotel" - removed
Input schema / properties / reviews / titleRemoved value: -"Reviews" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_hotelDictOutput", - "type": "object" -}New value: +null
- Changed
mb_hotel_calendar2 fields changed- removed
Input schema / properties / hotel / titleRemoved value: -"Hotel" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_hotel_calendarDictOutput", - "type": "object" -}New value: +null
- Changed
mb_hotel_rooms5 fields changed- removed
Input schema / properties / check_in / titleRemoved value: -"Check In" - removed
Input schema / properties / check_out / titleRemoved value: -"Check Out" - removed
Input schema / properties / guests / titleRemoved value: -"Guests" - removed
Input schema / properties / hotel / titleRemoved value: -"Hotel" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_hotel_roomsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_notices4 fields changed- removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / service / titleRemoved value: -"Service" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_noticesDictOutput", - "type": "object" -}New value: +null
- Changed
mb_search_buses11 fields changed- removed
Input schema / properties / companies / titleRemoved value: -"Companies" - removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / depart_before / titleRemoved value: -"Depart Before" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / include_sold_out / titleRemoved value: -"Include Sold Out" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / vip_only / titleRemoved value: -"Vip Only" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_search_busesDictOutput", - "type": "object" -}New value: +null
- Changed
mb_search_flights15 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / airlines / titleRemoved value: -"Airlines" - removed
Input schema / properties / cabin / titleRemoved value: -"Cabin" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / depart_before / titleRemoved value: -"Depart Before" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / direct_only / titleRemoved value: -"Direct Only" - removed
Input schema / properties / infants / titleRemoved value: -"Infants" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / return_date / titleRemoved value: -"Return Date" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_search_flightsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_search_hotels12 fields changed- removed
Input schema / properties / amenities / titleRemoved value: -"Amenities" - removed
Input schema / properties / breakfast_only / titleRemoved value: -"Breakfast Only" - removed
Input schema / properties / check_in / titleRemoved value: -"Check In" - removed
Input schema / properties / check_out / titleRemoved value: -"Check Out" - removed
Input schema / properties / city / titleRemoved value: -"City" - removed
Input schema / properties / hotel_type / titleRemoved value: -"Hotel Type" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / max_price_per_night_toman / titleRemoved value: -"Max Price Per Night Toman" - removed
Input schema / properties / min_stars / titleRemoved value: -"Min Stars" - removed
Input schema / properties / refundable_only / titleRemoved value: -"Refundable Only" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_search_hotelsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_search_taxis8 fields changed- removed
Input schema / properties / car_class / titleRemoved value: -"Car Class" - removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / depart_after / titleRemoved value: -"Depart After" - removed
Input schema / properties / depart_before / titleRemoved value: -"Depart Before" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_search_taxisDictOutput", - "type": "object" -}New value: +null
- Changed
mb_search_trains9 fields changed- removed
Input schema / properties / available_only / titleRemoved value: -"Available Only" - removed
Input schema / properties / date / titleRemoved value: -"Date" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / outbound_class_id / titleRemoved value: -"Outbound Class Id" - removed
Input schema / properties / quota / titleRemoved value: -"Quota" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_search_trainsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_train_price7 fields changed- removed
Input schema / properties / adults / titleRemoved value: -"Adults" - removed
Input schema / properties / children / titleRemoved value: -"Children" - removed
Input schema / properties / class_id / titleRemoved value: -"Class Id" - removed
Input schema / properties / empty_seats / titleRemoved value: -"Empty Seats" - removed
Input schema / properties / foreigners / titleRemoved value: -"Foreigners" - removed
Input schema / properties / infants / titleRemoved value: -"Infants" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_train_priceDictOutput", - "type": "object" -}New value: +null
- Changed
mb_train_price_calendar7 fields changed- removed
Input schema / properties / days / titleRemoved value: -"Days" - removed
Input schema / properties / destination / titleRemoved value: -"Destination" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / quota / titleRemoved value: -"Quota" - removed
Input schema / properties / seats / titleRemoved value: -"Seats" - removed
Input schema / properties / start_date / titleRemoved value: -"Start Date" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_train_price_calendarDictOutput", - "type": "object" -}New value: +null
- Changed
mb_train_stops2 fields changed- removed
Input schema / properties / class_id / titleRemoved value: -"Class Id" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_train_stopsDictOutput", - "type": "object" -}New value: +null
- Changed
mb_travel_guide7 fields changed- removed
Input schema / properties / destination / titleRemoved value: -"Destination" - added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return long texts uncut instead of clipped.", + "type": "boolean" +} - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / origin / titleRemoved value: -"Origin" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / service / titleRemoved value: -"Service" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mb_travel_guideDictOutput", - "type": "object" -}New value: +null
1 tool update
v0.2.1- Changed
mb_search_hotels2 fields changed- added
Input schema / properties / amenitiesAdded value: +{ + "anyOf": [ + { + "items": { + "maxLength": 30, + "minLength": 2, + "type": "string" + }, + "maxItems": 5, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Only hotels with an amenity whose Persian title contains each word, e.g. ['استخر'] (pool, jacuzzi or sauna), ['پارکینگ'].", + "title": "Amenities" +} - added
Input schema / properties / breakfast_onlyAdded value: +{ + "default": false, + "description": "Only stays whose cheapest room includes breakfast.", + "title": "Breakfast Only", + "type": "boolean" +}
22 tool updates
v0.1.0- First observed
mb_alternative_routes - First observed
mb_bus_price_calendar - First observed
mb_bus_seats - First observed
mb_city_hotels - First observed
mb_companies - First observed
mb_find_place - First observed
mb_flight_fare_details - First observed
mb_flight_price_calendar - First observed
mb_help - First observed
mb_hotel - First observed
mb_hotel_calendar - First observed
mb_hotel_rooms - First observed
mb_notices - First observed
mb_search_buses - First observed
mb_search_flights - First observed
mb_search_hotels - First observed
mb_search_taxis - First observed
mb_search_trains - First observed
mb_train_price - First observed
mb_train_price_calendar - First observed
mb_train_stops - First observed
mb_travel_guide
TDQS
Scored across 22 tools
Each tool targets a distinct service+action (train search vs price calendar vs stops vs party price; flight search vs fare details vs price calendar; hotel search vs single hotel vs rooms vs calendar), and the descriptions explicitly cross-reference each other, steering agents to the right follow-up. The search/calendar/price pattern repeats per vertical but is clearly scoped within each, so boundaries are unambiguous.
Everything uses a predictable mb_ prefix with snake_case, which is highly uniform. There is a minor convention split between mb_search_{service} for primary searches and mb_{service}_{detail} for follow-ups, but both are readable and inferable.
22 tools span five distinct verticals (flights, trains, buses, taxis, hotels) plus help/notices/guides, so roughly 3-5 tools per domain — each earns its place. It sits just above the ideal band but is justified by the breadth of the platform.
Coverage is strong: search, cheapest-day calendars, seat maps, stops, fare/refund details, hotel rooms, place resolution, help and notices are all present, giving full search-to-decision flows. No booking/purchase or round-trip orchestration tool exists, but the surface is otherwise a complete planning/booking-decision set.
Maintenance
Related MCP Connectors
Travel tools for AI agents: plan and edit real trips, search stays and tours, import travel videos.
Give AI assistants access to real-time data. Search the web, compare flights, find hotels, and more.
Flight search & booking for AI agents. 400+ airlines, $20-50 cheaper than OTAs.
Live flight prices and working booking links for AI agents and travel apps.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides tools to query flight and train information including flight searches, train tickets, weather forecasts, and transfer options between different transportation modes.932 npm3ISC
- AlicenseAqualityAmaintenanceEnables AI agents to search Iranian villas, cottages, and apartments, check nightly availability, calculate exact stay totals for dates and guests, and read reviews and host statistics. It is a read-only stdio MCP server with no login, booking, payment, or SMS endpoints.15584 PyPI2MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search Iranian doctors by speciality, city, neighborhood, insurance and visit type, compare office and online consultation fees, check free appointment times up to a month ahead, and read reviews. Also covers hospitals, clinics, labs, pharmacies, fixed-price clinic offers and health articles, all read-only so booking happens on the site via a returned link.14554 PyPI2MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to compare and find the cheapest domestic and international flights, hotels, villas, trains and buses in Iran, with exact Toman prices, fare and cancellation rules, baggage details, seats left and hotel reviews. Also covers CIP lounges, eSIM plans, visas and tours, and is read-only, so it never books, holds seats or pays.425 PyPI2MIT