Skip to main content
Glama

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.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

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_*. Call mb_find_place first 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_price or mb_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 *_toman fields, dates Gregorian YYYY-MM-DD, ratings 0-5. Ids such as flight_id, class_id and bus_id come 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_trains

760,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-mcp

Outside 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-mcp

Settings → 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-mcp

Or 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

mb_find_place

City, airport, station or hotel name → the code each search takes (flight, train, bus, taxi, hotel)

mb_companies

Airlines, rail operators, bus companies and taxi classes with their codes

Tool

What it does

mb_search_flights

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

mb_flight_price_calendar

Cheapest fare per day over up to 180 days

mb_flight_fare_details

One flight or round-trip package's fares: refund penalties, checked baggage, fare rules, notes, adult/child/infant prices

Tool

What it does

mb_search_trains

Trains on a date with every class, price per adult and fresh free-seat counts; men/women/general/car quotas

mb_train_price_calendar

Cheapest bookable train per day

mb_train_price

Exact price of a class for adults, children, infants, foreigners and empty berths, with the total

mb_train_stops

Every stop of a train with date and time

mb_alternative_routes

Trips with one change (any mix of train and bus) and nearby train, bus and flight routes

Tool

What it does

mb_search_buses

Buses on a date: company, terminal, times, price per seat, free seats, VIP, stops, refund penalties

mb_bus_price_calendar

Cheapest bus seat per day

mb_bus_seats

Seat map: free seats, seats sold to women and men, row layout with the aisle

mb_search_taxis

Private door-to-door intercity taxis, price per car, by class and pick-up slot

Tool

What it does

mb_search_hotels

Available hotels in a city for dates with the cheapest stay price and cover photo; stars, type, price, refund, amenity (Persian words, e.g. ['استخر']) and breakfast filters

mb_hotel

One hotel: cover photo, rating, latest reviews with per-criterion scores, location, landmarks, rules, amenities

mb_hotel_rooms

Every room with its exact price for the dates, per night, rooms left, meals

mb_hotel_calendar

Cheapest one-night price per night, up to ~48 nights ahead

mb_city_hotels

Every hotel of a city, sold out ones included, filtered by stars, type or name (no prices)

Tool

What it does

mb_notices

Notices MrBilit shows right now for a service or route

mb_help

Search the official rules, FAQ and help-center guides (refunds, baggage, auto-reserve, ...)

mb_travel_guide

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. Flight price_toman is per adult and total_toman the 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:30 on every flight time.

  • Ratings are 0–5; null means not rated. The site shows hotel ratings ×2 out of 10.

  • Ids expire: flight_id, class_id and bus_id come 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 sleeps fits, 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-mcp

Configuration

Variable

Default

Meaning

MRBILIT_MCP_PROXY

unset

HTTP proxy for every request, e.g. http://user:pass@host:port; a comma-separated list is used one at a time and rotated on a block or connect error. Usually not needed in Iran

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], then patchright 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 build

Tools 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.

  • 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

MIT

Available Tools

22 tools
mb_alternative_routesAlternative routesA
Read-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.

NameRequiredDescriptionDefault
dateYesTravel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead.
originYesTrain station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
destinationYesTrain station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 calendarA
Read-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.

NameRequiredDescriptionDefault
daysNoNumber of days to cover.
seatsNoSeats needed.
originYesBus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
start_dateNoFirst day YYYY-MM-DD, e.g. '2026-10-10'; default today.
destinationYesBus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 mapA
Read-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.

NameRequiredDescriptionDefault
bus_idYesbus_id from a fresh mb_search_buses result, e.g. 55983988.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 cityA
Read-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).

NameRequiredDescriptionDefault
cityYesCity slug from mb_find_place(mode='hotel'), e.g. 'mashhad' or 'kish'.
nameNoOnly names containing this text, e.g. 'درویشی'.
pageNoPage of 90 hotels (the site's ranking order).
limitNoMax hotels returned from the page.
starsNoOnly this star count, e.g. 4.
hotel_typeNoKind of stay.any

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 companiesA
Read-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.

NameRequiredDescriptionDefault
modeYesAirlines, rail operators, or bus companies and taxi classes.
limitNoMax companies.
queryNoOptional name or code filter, e.g. 'ماهان', 'IR' or 'Iran Peyma'.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 codesA
Read-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.

NameRequiredDescriptionDefault
modeYesWhich search the code is for; each mode uses its own ids.
limitNoMax places per list.
queryYesPlace name in Persian or English, or a code, e.g. 'مشهد', 'tehran' or 'IST'.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 detailsA
Read-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.

NameRequiredDescriptionDefault
dateYesGregorian date YYYY-MM-DD, e.g. '2026-10-20'.
adultsNoAdults (12+).
originYesIATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
infantsNoInfants (under 2).
childrenNoChildren (2-11).
flight_idYesflight_id from mb_search_flights, e.g. '21919377' (international round trip: '21894997+21924108').
full_textNoReturn long texts uncut instead of clipped.
destinationYesIATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
return_dateNoOnly for an international round-trip package: its return date YYYY-MM-DD, e.g. '2026-10-23'.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 calendarA
Read-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).

NameRequiredDescriptionDefault
daysNoNumber of days to cover.
originYesIATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
start_dateNoFirst day YYYY-MM-DD, e.g. '2026-10-15'; default today.
destinationYesIATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 searchA
Read-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.

NameRequiredDescriptionDefault
limitNoMax passages.
queryYesQuestion or keywords in Persian, e.g. 'استرداد بلیط قطار' or 'رزرو خودکار'.
sourceNoterms = official rules (refunds, baggage, ID), faq = general FAQ, support = help-center guides and request forms.all
full_textNoReturn long texts uncut instead of clipped.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 detailsA
Read-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.

NameRequiredDescriptionDefault
hotelYesHotel as 'city_slug/hotel_slug' (e.g. 'mashhad/enghelab') or its numeric id (e.g. '8778').
reviewsNoHow many of the latest guest reviews to include.
full_textNoReturn long texts uncut instead of clipped.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines5/5

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 calendarA
Read-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).

NameRequiredDescriptionDefault
hotelYesHotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 pricesA
Read-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).

NameRequiredDescriptionDefault
hotelYesHotel as 'city_slug/hotel_slug' from mb_search_hotels, mb_city_hotels or mb_find_place, e.g. 'mashhad/enghelab'.
guestsNoOnly rooms that sleep at least this many (with extra beds), e.g. 3.
check_inYesCheck-in date YYYY-MM-DD, e.g. '2026-10-20'.
check_outYesCheck-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights).

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 noticesA
Read-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.

NameRequiredDescriptionDefault
originNoFlight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').
serviceNoWhich pages; any = every active notice.any
destinationNoFlight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 busesA
Read-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.

NameRequiredDescriptionDefault
dateYesDeparture date YYYY-MM-DD, e.g. '2026-10-20'.
sortNoOrder of the buses.earliest
limitNoMax buses.
originYesBus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
vip_onlyNoOnly VIP buses.
companiesNoOnly these company ids, from `companies` of a result or mb_companies(mode='bus'), e.g. [4, 16].
destinationYesBus city or terminal id from mb_find_place(mode='bus'), e.g. 11320000 (Tehran, all terminals) or 31310000 (Mashhad).
depart_afterNoLocal time HH:MM, e.g. '18:00'.
depart_beforeNoLocal time HH:MM, e.g. '18:00'.
include_sold_outNoAlso list buses with no free seat.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 flightsA
Read-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.

NameRequiredDescriptionDefault
dateYesGregorian date YYYY-MM-DD, e.g. '2026-10-20'.
sortNoOrder of the flights.cheapest
cabinNoCabin class filter (applied here; the API itself ignores it).any
limitNoMax flights per list.
adultsNoAdults (12+).
originYesIATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
infantsNoInfants (under 2).
airlinesNoOnly these airline codes, e.g. ['IR', 'W5'] (codes from results or mb_companies).
childrenNoChildren (2-11).
destinationYesIATA airport or city code from mb_find_place(mode='flight'), e.g. 'THR', 'MHD', 'IKA' or 'ISTALL' (all Istanbul airports).
direct_onlyNoOnly flights without a connection.
return_dateNoReturn date YYYY-MM-DD for a round trip, e.g. '2026-10-23'; omit for one-way.
depart_afterNoLocal time HH:MM, e.g. '06:00'.
depart_beforeNoLocal time HH:MM, e.g. '06:00'.

TDQS

A4.6/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 hotelsA
Read-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).

NameRequiredDescriptionDefault
cityYesCity slug from mb_find_place(mode='hotel'), e.g. 'mashhad' or 'kish'.
sortNoOrder; rating is the site's default.rating
limitNoMax hotels.
check_inYesCheck-in date YYYY-MM-DD, e.g. '2026-10-20'.
amenitiesNoOnly hotels with an amenity whose Persian title contains each word, e.g. ['استخر'] (pool, jacuzzi or sauna), ['پارکینگ'].
check_outYesCheck-out date YYYY-MM-DD, e.g. '2026-10-23' (1 to 30 nights).
min_starsNoOnly hotels with at least this many stars, e.g. 4.
hotel_typeNoKind of stay.any
breakfast_onlyNoOnly stays whose cheapest room includes breakfast.
refundable_onlyNoOnly refundable stays.
max_price_per_night_tomanNoHighest price per night for one room in Toman, e.g. 3000000.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 taxisA
Read-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').

NameRequiredDescriptionDefault
dateYesDeparture date YYYY-MM-DD, e.g. '2026-10-20'.
limitNoMax offers.
originYesCity id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht).
car_classNoCar class: economy (Samand/Peugeot), vip, formal (top cars).any
destinationYesCity id from mb_find_place(mode='taxi'), e.g. 11320000 (Tehran) or 54310000 (Rasht).
depart_afterNoLocal time HH:MM, e.g. '18:00'.
depart_beforeNoLocal time HH:MM, e.g. '18:00'.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 trainsA
Read-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.

NameRequiredDescriptionDefault
dateYesTravel date YYYY-MM-DD, e.g. '2026-10-14'. Sales open about 18 days ahead.
sortNoOrder of the trains.earliest
limitNoMax trains.
quotaNoSeat quota: general (families, mixed), men only, women only, or car transport.general
originYesTrain station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
destinationYesTrain station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
available_onlyNoHide sold-out classes and trains with no free seat.
outbound_class_idNoRound 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

A4.8/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 priceA
Read-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).

NameRequiredDescriptionDefault
adultsNoAdults (12+).
infantsNoInfants (under 2).
childrenNoChildren (2-11).
class_idYesclass_id of a train class from a fresh mb_search_trains result, e.g. 9847134.
foreignersNoForeign passengers (priced separately).
empty_seatsNoEmpty berths to buy for a whole (exclusive) compartment, e.g. 1 for 3 people in a 4-berth.

TDQS

A4.3/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 calendarA
Read-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.

NameRequiredDescriptionDefault
daysNoNumber of days to cover.
quotaNoSeat quota: general (families, mixed), men only, women only, or car transport.general
seatsNoSeats needed; days without that many free seats are left out.
originYesTrain station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).
start_dateNoFirst day YYYY-MM-DD, e.g. '2026-10-10'; default today.
destinationYesTrain station id from mb_find_place(mode='train'), e.g. 1 (Tehran) or 191 (Mashhad).

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 stopsA
Read-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).

NameRequiredDescriptionDefault
class_idYesclass_id of a train class from a fresh mb_search_trains result, e.g. 9847134.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 guideA
Read-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.

NameRequiredDescriptionDefault
limitNoMax magazine posts.
queryNoMagazine search, e.g. 'کیش' or 'جاهای دیدنی مشهد'.
originNoFlight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').
serviceNoRoute guide for this service; needs destination.
full_textNoReturn long texts uncut instead of clipped.
destinationNoFlight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 22 tool updatesv0.3.0
    • Changedmb_alternative_routes4 fields changed
      • removedInput schema / properties / date / title
        Removed value: -"Date"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_alternative_routesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_bus_price_calendar6 fields changed
      • removedInput schema / properties / days / title
        Removed value: -"Days"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / seats / title
        Removed value: -"Seats"
      • removedInput schema / properties / start_date / title
        Removed value: -"Start Date"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_bus_price_calendarDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_bus_seats2 fields changed
      • removedInput schema / properties / bus_id / title
        Removed value: -"Bus Id"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_bus_seatsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_city_hotels8 fields changed
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • removedInput schema / properties / hotel_type / title
        Removed value: -"Hotel Type"
      • changedInput schema / properties / limit / default
        Previous value: -40New value: +20
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / stars / title
        Removed value: -"Stars"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_city_hotelsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_companies4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / mode / title
        Removed value: -"Mode"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_companiesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_find_place4 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / mode / title
        Removed value: -"Mode"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_find_placeDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_flight_fare_details10 fields changed
      • removedInput schema / properties / adults / title
        Removed value: -"Adults"
      • removedInput schema / properties / children / title
        Removed value: -"Children"
      • removedInput schema / properties / date / title
        Removed value: -"Date"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / flight_id / title
        Removed value: -"Flight Id"
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts uncut instead of clipped.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / infants / title
        Removed value: -"Infants"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / return_date / title
        Removed value: -"Return Date"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_flight_fare_detailsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_flight_price_calendar5 fields changed
      • removedInput schema / properties / days / title
        Removed value: -"Days"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / start_date / title
        Removed value: -"Start Date"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_flight_price_calendarDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_help5 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts uncut instead of clipped.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / source / title
        Removed value: -"Source"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_helpDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_hotel4 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts uncut instead of clipped.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / hotel / title
        Removed value: -"Hotel"
      • removedInput schema / properties / reviews / title
        Removed value: -"Reviews"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_hotelDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_hotel_calendar2 fields changed
      • removedInput schema / properties / hotel / title
        Removed value: -"Hotel"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_hotel_calendarDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_hotel_rooms5 fields changed
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • removedInput schema / properties / guests / title
        Removed value: -"Guests"
      • removedInput schema / properties / hotel / title
        Removed value: -"Hotel"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_hotel_roomsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_notices4 fields changed
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / service / title
        Removed value: -"Service"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_noticesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_search_buses11 fields changed
      • removedInput schema / properties / companies / title
        Removed value: -"Companies"
      • removedInput schema / properties / date / title
        Removed value: -"Date"
      • removedInput schema / properties / depart_after / title
        Removed value: -"Depart After"
      • removedInput schema / properties / depart_before / title
        Removed value: -"Depart Before"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / include_sold_out / title
        Removed value: -"Include Sold Out"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / properties / vip_only / title
        Removed value: -"Vip Only"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_search_busesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_search_flights15 fields changed
      • removedInput schema / properties / adults / title
        Removed value: -"Adults"
      • removedInput schema / properties / airlines / title
        Removed value: -"Airlines"
      • removedInput schema / properties / cabin / title
        Removed value: -"Cabin"
      • removedInput schema / properties / children / title
        Removed value: -"Children"
      • removedInput schema / properties / date / title
        Removed value: -"Date"
      • removedInput schema / properties / depart_after / title
        Removed value: -"Depart After"
      • removedInput schema / properties / depart_before / title
        Removed value: -"Depart Before"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / direct_only / title
        Removed value: -"Direct Only"
      • removedInput schema / properties / infants / title
        Removed value: -"Infants"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / return_date / title
        Removed value: -"Return Date"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_search_flightsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_search_hotels12 fields changed
      • removedInput schema / properties / amenities / title
        Removed value: -"Amenities"
      • removedInput schema / properties / breakfast_only / title
        Removed value: -"Breakfast Only"
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • removedInput schema / properties / hotel_type / title
        Removed value: -"Hotel Type"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / max_price_per_night_toman / title
        Removed value: -"Max Price Per Night Toman"
      • removedInput schema / properties / min_stars / title
        Removed value: -"Min Stars"
      • removedInput schema / properties / refundable_only / title
        Removed value: -"Refundable Only"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_search_hotelsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_search_taxis8 fields changed
      • removedInput schema / properties / car_class / title
        Removed value: -"Car Class"
      • removedInput schema / properties / date / title
        Removed value: -"Date"
      • removedInput schema / properties / depart_after / title
        Removed value: -"Depart After"
      • removedInput schema / properties / depart_before / title
        Removed value: -"Depart Before"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_search_taxisDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_search_trains9 fields changed
      • removedInput schema / properties / available_only / title
        Removed value: -"Available Only"
      • removedInput schema / properties / date / title
        Removed value: -"Date"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / outbound_class_id / title
        Removed value: -"Outbound Class Id"
      • removedInput schema / properties / quota / title
        Removed value: -"Quota"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_search_trainsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_train_price7 fields changed
      • removedInput schema / properties / adults / title
        Removed value: -"Adults"
      • removedInput schema / properties / children / title
        Removed value: -"Children"
      • removedInput schema / properties / class_id / title
        Removed value: -"Class Id"
      • removedInput schema / properties / empty_seats / title
        Removed value: -"Empty Seats"
      • removedInput schema / properties / foreigners / title
        Removed value: -"Foreigners"
      • removedInput schema / properties / infants / title
        Removed value: -"Infants"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_train_priceDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_train_price_calendar7 fields changed
      • removedInput schema / properties / days / title
        Removed value: -"Days"
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / quota / title
        Removed value: -"Quota"
      • removedInput schema / properties / seats / title
        Removed value: -"Seats"
      • removedInput schema / properties / start_date / title
        Removed value: -"Start Date"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_train_price_calendarDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_train_stops2 fields changed
      • removedInput schema / properties / class_id / title
        Removed value: -"Class Id"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_train_stopsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmb_travel_guide7 fields changed
      • removedInput schema / properties / destination / title
        Removed value: -"Destination"
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts uncut instead of clipped.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / origin / title
        Removed value: -"Origin"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / service / title
        Removed value: -"Service"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mb_travel_guideDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 1 tool updatev0.2.1
    • Changedmb_search_hotels2 fields changed
      • addedInput schema / properties / amenities
        Added 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"
        +}
      • addedInput schema / properties / breakfast_only
        Added value: +{
        +  "default": false,
        +  "description": "Only stays whose cheapest room includes breakfast.",
        +  "title": "Breakfast Only",
        +  "type": "boolean"
        +}
  3. 22 tool updatesv0.1.0
    • First observedmb_alternative_routes
    • First observedmb_bus_price_calendar
    • First observedmb_bus_seats
    • First observedmb_city_hotels
    • First observedmb_companies
    • First observedmb_find_place
    • First observedmb_flight_fare_details
    • First observedmb_flight_price_calendar
    • First observedmb_help
    • First observedmb_hotel
    • First observedmb_hotel_calendar
    • First observedmb_hotel_rooms
    • First observedmb_notices
    • First observedmb_search_buses
    • First observedmb_search_flights
    • First observedmb_search_hotels
    • First observedmb_search_taxis
    • First observedmb_search_trains
    • First observedmb_train_price
    • First observedmb_train_price_calendar
    • First observedmb_train_stops
    • First observedmb_travel_guide

TDQS

A4.2/5.0

Scored across 22 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count4/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    15
    584 PyPI
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    14
    554 PyPI
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables 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 PyPI
    2
    MIT