Skip to main content
Glama

✈️ mrbilit-mcp

Let your AI agent plan trips in Iran with MrBilit. Find the cheapest flight, train, bus or private taxi on a date or over a month, see seats, baggage and refund rules, and compare hotels with exact room prices, all from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

Quick start · What it can do · Tools · FAQ · فارسی


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 that day

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.

Related MCP server: perun-mcp

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

Quick start

You need uv.

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"] }
  }
}

It's a standard stdio MCP server: run uvx mrbilit-mcp, or pip install mrbilit-mcp and run mrbilit-mcp.

Then just ask:

  • "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."

  • ارزان‌ترین اتوبوس VIP تهران به اصفهان فردا شب و صندلی‌های خالی آن؟

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.

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; stars, type, price and refund filters

mb_hotel

One hotel: 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.

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.

FAQ

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 a reset connection once. 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. Usually not needed in Iran

Safety

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

  • Always sends a browser User-Agent and at most two requests at a time, since the API hosts share one server.

فارسی

mrbilit-mcp به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در مستربلیط ارزان‌ترین پرواز، قطار، اتوبوس یا تاکسی دربستی را برای یک روز یا یک ماه پیدا کند، صندلی‌های خالی، بار مجاز و قوانین استرداد را ببیند و هتل‌ها را با قیمت دقیق اتاق و نظرات مسافران مقایسه کند.

  • فقط خواندنی است: وارد حساب نمی‌شود و صندلی رزرو یا بلیط صادر نمی‌کند.

  • همه قیمت‌ها به تومان است.

  • روی سیستم خود شما اجرا می‌شود و به هیچ سرور واسطی داده نمی‌فرستد.

  • در ایران معمولاً نیازی به پروکسی نیست؛ اگر سرورهای مستربلیط پاسخ ندادند، MRBILIT_MCP_PROXY را تنظیم کنید.

نصب در Claude Code:

claude mcp add mrbilit -- uvx mrbilit-mcp

بعد بپرسید: «ارزان‌ترین راه رفتن از تهران به مشهد در ۲۸ مهر چیست؟»

Development

git clone https://github.com/sepehr071/mrbilit-mcp && cd mrbilit-mcp
uv sync
uv run pytest            # offline, against recorded responses
uv run pytest -m live    # real API (set MRBILIT_MCP_PROXY if needed)
uv run ruff check .

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.

Disclaimer

Unofficial and not affiliated with or endorsed by MrBilit. It uses the public endpoints of the mrbilit.com website, which can change without notice. Please keep request rates reasonable.

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.

ParametersJSON Schema
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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/non-destructive, so the bar is lower, and the description adds real behavioral context: seat counts may be cached and should be confirmed with a search, and classes_listed is the API's raw count rather than bookable classes. It does not mention rate limits, result caps beyond 'up to 7', or freshness of prices beyond the caching note.

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-loaded with the core purpose, then organized by output section (with_one_change, nearby_*). It is dense and slightly run-on in the middle, but every sentence carries information; 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?

With an output schema present, the description need not enumerate return fields, yet it usefully explains what each section means and how to act on the ids. Coverage of caveats (cached seats, raw class counts) is good; a note on result freshness or pagination would make it 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% for all three parameters, so origin/destination/date semantics are fully documented in the schema. The description adds no input-parameter detail of its own (its content is about output sections), 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?

The opening sentence states a specific purpose: finding alternative journeys (one-change trips, nearby train/bus/flight routes) when direct trains are full or expensive. The named result sections (with_one_change, nearby_*) make it easy to distinguish from mb_search_trains and mb_search_buses, which it explicitly points to as follow-ups.

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 clearly states the trigger condition ('when direct trains are full or dear') and routes the agent onward ('pass their ids to mb_search_trains, mb_search_buses or mb_search_flights'), plus a comparative hint that a direct bus may be cheaper/faster. There is no explicit statement of when *not* to use it (e.g., when a direct train exists and is available), so it falls just 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_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.

ParametersJSON Schema
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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 genuinely non-obvious behavior beyond that: days with no buses or not yet on sale are omitted rather than returned as errors, which prevents the agent from misreading a sparse calendar. It does not mention rate limits or pagination, keeping it short of 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with what the tool returns, followed by the routing advice. No filler; every clause carries 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?

An output schema exists, so return-value explanation is unnecessary, and annotations cover the safety profile. The description supplies the one thing neither structured field carries: the omission semantics of missing days and the sales-window caveat.

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 all five parameters carry inline descriptions (origin/destination ids from mb_find_place, days default 30, seats, start_date default today). 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 and resource: 'Cheapest bus seat per day for a route.' An agent can immediately distinguish this calendar-style price lookup from mb_search_buses (actual itineraries) and from the flight/train 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 gives the workflow ('Use to find the cheapest day, then mb_search_buses for that day') and names the alternative tool with the condition that selects it. It also warns that sales typically open about a month ahead, which tells the agent when this tool will return thin results.

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld/non-destructive, but the description adds substantial behavioral detail beyond them: exact layout symbol semantics (none, w, m, x, |, --, DR), the fact that price_toman is null for most buses, the location of seating rules, and the expiration of bus_id. This is unusually thorough output and precondition disclosure.

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?

Front-loads the purpose in the first clause, then uses compact legend-style formatting. Every sentence carries necessary interpretation detail for a complex seat-map output, with no wasted wording.

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 a single-parameter read tool with an output schema and safety annotations, the description supplies everything needed to interpret and use the result correctly: layout marks, rule pointer, price caveat, and bus_id expiration. Nothing material 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% and the schema already explains bus_id comes from a fresh mb_search_buses result. The description adds the important nuance that bus_id expires and must be taken from a fresh search, giving an operational reason to re-fetch beyond the schema text.

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 ("Seat map of one bus") and enumerates exactly what the output contains: free seat numbers, seats sold to women and men, and a row-by-row layout. This clearly distinguishes it from sibling search tools like 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 Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear operational context: bus_id comes from a fresh mb_search_buses result because it expires, and rule text is found in seat_rules. It does not name when-not-to-use cases or explicit alternative tools, but the context for correct invocation is well established.

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

ParametersJSON Schema
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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld). The description adds real behavior beyond them: sold-out hotels are included, no price data is returned, and filters apply to one 90-hotel page at a time so callers must check `pages`.

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?

Front-loads the scope sentence, then a single tight usage paragraph with a clear alternative-routing clause. Zero 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 an output schema present, return values need no explanation; the description still notes the returned fields and the pagination cap. Nothing needed to call this 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 coverage is 100%, so field meanings (city slug, name substring, page, limit, stars, hotel_type) are already documented in the schema. The description only echoes stars/type filtering and page behavior, adding little syntax or format detail beyond it.

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') with scope details (sold-out included, stars/rating/address, no prices). This clearly separates it from sibling mb_search_hotels, which is date-bound.

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 ('browse or find a hotel by stars or type regardless of dates') and routes price-related needs to mb_search_hotels and mb_hotel_calendar by name. No inference required.

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/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 non-obvious data quirks beyond the annotations: rail operators repeat across several ids with each row listing all of them, and bus ids 276/278/280 are the VIP/Economy/Formal taxi classes. Pagination behavior is left to the schema's limit field.

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?

Front-loads the resource list, then the two usage cases, then the data caveats. Three tight sentences with no filler; every clause carries information an agent needs.

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?

An output schema exists, so return-format explanation is unnecessary. Between the mode enum, the code/id semantics, the rail-duplication caveat, and the taxi-class mapping, an agent has everything needed to call and interpret this tool.

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 3 baseline is met by the schema alone. The description adds meaning the schema does not: concrete id/code examples ('W5', bus id 4) and the bus-id-to-taxi-class mapping, which clarifies what the `mode: bus` results actually contain.

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 ('List airlines ... rail operators or bus companies') and enumerates the identifier each entity carries (IATA code for airlines, id for rail/bus). The agent immediately knows this is a reference/lookup table rather than a search tool, distinguishing it from mb_search_flights 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?

Explicitly names two use cases: 'to name a code seen in results (airline 'W5', bus company 4)' and 'to find an airline code for the `airlines` filter of mb_search_flights'. This routes the agent from a raw code back to this tool and from this tool forward to a sibling, with concrete examples.

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 airports, IATA code for domestic flights; Tehran domestic is THR, not IKA; prefer these to XXXALL codes for domestic routes) and cities (any country, XXXALL city code = all its airports, plus each airport). train: station ids (Tehran 1, Mashhad 191). bus / taxi: 8-digit city ids (Tehran 11320000 = all terminals; terminal ids such as 11321006 Tehran South). hotel: city slugs for mb_search_hotels / mb_city_hotels and hotel slugs for mb_hotel / mb_hotel_rooms. Next: mb_search_flights, mb_search_trains, mb_search_buses, mb_search_taxis or mb_search_hotels.

ParametersJSON Schema
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'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, open-world, idempotent, non-destructive behavior, so the description is not burdened with safety disclosure. It adds substantial domain-specific behavior: output ID shapes per mode, IATA versus city codes, railroad station IDs, 8-digit bus/taxi city IDs, and hotel slug conventions. These details go well beyond the annotations.

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?

The description is front-loaded with the core purpose, then organized by mode with specific examples. Despite its density, every sentence provides useful information for invoking the tool correctly. There is no filler or repetition.

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?

Given the complexity of five modes and differing ID formats, the description is complete enough for correct invocation. Annotations, full schema descriptions, and an output schema are present, so the description need not explain return structure or safety. It covers mode-specific semantics and next steps well.

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 baseline is 3. The description adds meaningful semantics for the mode parameter by explaining what each mode returns and giving examples, though it does not add much for limit and query beyond the schema examples. This justifies a score above baseline but not perfect.

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 verb and resource: turning a place name into the code a search takes. It clearly distinguishes this lookup/resolution tool from sibling search tools such as mb_search_flights and mb_search_hotels. The mode-specific breakdown further clarifies what the tool produces.

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?

The description gives clear context and mode-specific routing, including Next tools to use after obtaining codes. It does not explicitly state when not to use this tool or what alternative exists if the code is already known. Still, the mapping from mode to downstream search tool is strong guidance.

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 search of mb_search_flights (same route, date and party) and returns the chosen flight. baggage_checked_with_airline is true when the site re-checked the baggage with the airline (false = the search value, usually right). refund_penalties: penalty percent of the ticket price per time window before departure, refund = paid x (100 - penalty_pct) / 100; penalty_text when there is no percent (e.g. the supplier's terms).

ParametersJSON Schema
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').
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'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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/destructive=false, so the safety profile is covered. The description adds genuinely useful behavior: that it re-runs the prior search, the meaning of baggage_checked_with_airline, and the refund formula (paid x (100 - penalty_pct) / 100) plus penalty_text fallback.

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-loaded with the core purpose in the first sentence, followed by dense semantic detail. The second paragraph is information-rich rather than padded, though the inline field semantics make it slightly denser than ideal.

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 fare-detail lookup with 8 params, an output schema, and full annotation coverage, the description supplies enough context (search dependency, field semantics, refund math) to call it correctly. It would be stronger with an explicit note on when to use it versus sibling fare tools.

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 every parameter is already documented, including the flight_id format and the ALL-suffix codes. The description only indirectly references the party (adults/children/infants) and round-trip context, adding little beyond the schema, 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 ('every fare of one flight') and enumerates what is returned (refund penalties, baggage, fare rules, notes, per-passenger prices). It also names the sibling mb_search_flights and explains the relationship, so an agent can distinguish it from the search tool.

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?

The description clarifies this re-runs the mb_search_flights search with the same route/date/party and returns the chosen flight, which tells the agent when it applies. However, it does not explicitly state when to prefer this over other fare-related siblings (e.g. mb_flight_price_calendar) or any prerequisites.

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

ParametersJSON Schema
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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), so the description's job is added context — which it does well: it discloses that values are cached site minimums that can differ from live results, and that days with no known fare are omitted (no flights, sold out, or not cached). It does not mention rate limits or pagination, but for a calendar endpoint that is a minor gap.

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, front-loaded with the core definition, then the workflow, then the caveat. No filler and nothing buried.

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?

Output schema exists, so return values need not be explained; annotations cover safety; the description supplies the provenance/staleness caveat that the structured fields cannot express. An agent has everything needed to call this correctly and interpret gaps in 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?

Schema description coverage is 100%, so the baseline is 3; the description adds only the fare basis ('one-adult') and per-day granularity, without format, default, or range guidance (those live in the schema). Not enough added meaning to exceed the baseline.

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: 'Cheapest one-adult fare per day for a route over a date range, in one call.' This cleanly separates it from sibling tools like mb_search_flights (live fare search) and mb_flight_fare_details (single-fare breakdown).

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?

'Use to find the cheapest day to fly, then call mb_search_flights for that day' gives an explicit use case plus the follow-up tool. The caveat that values are cached minimums that may differ from a live search effectively tells the agent when this tool is not the right source for an exact/live fare.

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.

ParametersJSON Schema
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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, openWorld and non-destructive, so the safety profile is covered structurally. The description adds useful behavioral context beyond that: results are plain-text passages accompanied by their source section, and it notes the content domain it indexes. It does not discuss result limits or ranking behavior, but the output schema covers the return shape.

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 compact sentences, front-loaded with the purpose, then usage, then the exclusion. Each sentence carries distinct information, though the source-category phrasing mildly duplicates the enum documentation.

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 a read-only search tool, the description covers purpose, invocation contexts, exclusions, and result format, while annotations carry safety and an output schema exists for return values. Nothing an agent needs to select or call this 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% and the schema already documents query (with Persian examples), limit, and the source enum values in detail. The description only loosely echoes the source categories ('rules', 'FAQ', 'help-center guides') without adding syntax or format guidance, so the baseline of 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 (Search) and resource (official rules, FAQ, help-center guides) plus the return shape (best matching passages). It also names the sibling tools that own adjacent content (mb_flight_fare_details / mb_search_trains / mb_search_buses), so an agent can distinguish it 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 Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly enumerates when to use it (refund and cancellation rules, ID and baggage rules, auto-reserve behavior, change requests) and gives a clear when-not with named alternatives for fare-specific rules. Nothing 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_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). 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.

ParametersJSON Schema
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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/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 goes further by disclosing data conventions not in structured fields: ratings are shown x2 out of 10, landmarks are in km with drive minutes, and the id-vs-slug distinction.

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 core purpose is front-loaded in the first clause and the routing notes follow compactly. The dense parenthetical about numeric ids is slightly awkward to parse but every sentence carries useful information.

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?

An output schema exists, so return values need no explanation. The description covers the resource, the returned field groups, format quirks, and sibling routing, leaving little an agent needs for a correct call.

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 by clarifying the `hotel` workflow: after a numeric id you must obtain the 'city/hotel' ref via mb_find_place(mode='hotel'). That is genuine param guidance 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?

The description names the resource (a single hotel) and enumerates exactly what is returned: stars, guest rating, reviews, location, landmarks, check-in rules, amenities, FAQ. This clearly separates it from mb_search_hotels and mb_city_hotels, though it opens with a field list rather than an explicit verb.

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 explicitly routes the agent to siblings with conditions: 'For room prices on dates call mb_hotel_rooms' and 'for the cheapest nights mb_hotel_calendar'. The primary use case for this tool itself is only implied, but the alternative-tool guidance is concrete and actionable.

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/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 the domain semantics an agent actually needs: missing nights mean no free room, and nights past the last entry mean 'not loaded yet' rather than sold out. That is exactly the kind of non-obvious behavior 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with what the tool returns and its range, followed by usage routing and the edge-case semantics. No filler or restatement of the name.

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?

An output schema exists so return formatting needn't be explained, and the description covers the remaining gaps an agent would hit: the range limit, gaps meaning no availability, and truncation meaning unloaded rather than sold out. Nothing needed 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%, and the schema itself documents the 'city_slug/hotel_slug' format with an example and regex. The description adds nothing about the parameter, 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 and resource ('cheapest one-night room price per night') plus an explicit scope ('from today, up to about 48 days'). The 'hotel' framing plus the sibling set (bus/flight/train calendars) makes the domain unambiguous.

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 ('find the cheapest or the next free nights') and routes the agent to the follow-up tool ('then mb_hotel_rooms for exact prices'). The distinction between the calendar (cheapest/availability overview) and the rooms tool (exact prices) is spelled out, not inferred.

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

ParametersJSON Schema
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/non-destructive, so the bar is lower. The description still adds real behavioral context: rooms_left 0 means full, cancellation reflects the hotel's refund rule, and an empty rooms list means no availability rather than an error. It does not discuss rate limits or data freshness, 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?

It is short and front-loads the core definition before the field explanations, with no filler sentences. The telegraphic fragment style ('rooms_left 0 = full') is efficient but slightly terse for an unfamiliar reader.

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?

An output schema exists, so return-value documentation is not required, and the description still interprets the important output fields (price_toman, rooms_left, cancellation). Combined with the empty-result guidance, an agent has enough to call and interpret this correctly; only edge cases like multi-room pricing mechanics are left implicit.

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 genuinely adds meaning: prices are independent of guest count, guests acts as a 'sleeps at least' filter, and price_toman is the post-discount whole-stay total for one room. This clarifies interpretation of both guests and the returned price beyond the schema text.

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 opening sentence names the specific resource (every room of a hotel) and what it returns (exact price for the dates), with the key outputs enumerated (whole stay, per night, rooms left, meals). An agent can distinguish this from mb_hotel (hotel details) and mb_hotel_calendar (availability calendar) without opening the 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 explicitly to mb_hotel_calendar when the rooms list comes back empty, and gives the group-booking procedure ('add up several rooms for a group'). It does not spell out the broader when-to-use vs mb_hotel or the prerequisite that the hotel slug comes from mb_search_hotels, though that is covered in the schema.

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.

ParametersJSON Schema
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').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.9/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 safety is covered. The description adds real behavioral context beyond that: how route codes build the site path that notice rules match against, and that site_wide_active counts every active notice rather than only the filtered set.

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 clause, followed by the route-path mechanics and usage note. Three sentences with concrete examples, only mildly dense; the trailing reference to non-schema parameters is the one piece that does not clearly earn its place.

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?

An output schema exists, so return values need not be explained, and the annotations cover the safety profile. The description supplies the route-matching model an agent needs to form valid origin/destination values, but its mention of search_mode/site_wide_active parameters absent from the schema leaves a small unresolved ambiguity.

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/service are already documented with patterns and examples. The description contributes path-construction examples (/flights/THR-MHD, /trains/tehran-mashhad), but it also discusses search_mode and site_wide_active, which appear nowhere in the input schema, muddying rather than clarifying parameter meaning.

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 specific resource (MrBilit's site notices) and enumerates what they cover (disruptions, rule changes, payment options) plus the scoping axis (service or route). It is clearly a retrieval tool distinct from the search siblings, though it never states the retrieval verb explicitly.

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 concrete when-to-use and points to the sibling family. There is no when-not guidance or named alternative, 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.

ParametersJSON Schema
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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/openWorld, so the description's job is added context — and it delivers: price_toman is charged once per seat, refund_penalties apply to every bus unless overridden, and the until_hours_before / free_cancel_minutes semantics are spelled out, including that null means up to departure. That is genuine behavior an agent could not infer from the annotations.

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, then the id semantics, then the pricing/refund rules, then next-step routing — a sensible order with no filler. The refund-penalty sentence is dense and reads as a spec dump, which costs it the top mark.

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 a 10-parameter search tool with a full schema and an output schema, the description covers the id-type rule, the money and cancellation semantics, and the follow-up calls, so an agent has everything needed to call it and interpret results. Return-value explanation is not required since an output schema exists.

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 baseline is 3; the description adds real meaning on top by explaining that a city id covers all its terminals while a terminal id covers only that one — a non-obvious distinction for origin/destination. The per-seat pricing and refund-penalty notes describe output fields rather than input parameters, so it does not go further than a 4.

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 ('Intercity buses on a date') and enumerates the returned attributes (company, terminal, times, price, free seats, bus type, stops, refund penalties). The resource noun 'buses' cleanly separates it from mb_search_flights, mb_search_trains, and mb_search_taxis.

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 the agent forward: 'Next: mb_bus_seats with a bus_id for seat numbers and women/men seats; other days: mb_bus_price_calendar.' That covers the two most likely adjacent needs, but it never says when NOT to use this tool (e.g. vs mb_alternative_routes) or that ids must come from mb_find_place.

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 is the whole party (adult, child and infant fares). Fares without enough seats for the party are dropped by the site. Domestic round trips come back as two lists (outbound, return, each its own ticket); international round trips as packages whose price covers both ways (flight_id names both legs). Times are local to each airport, even though they all carry the API's +03:30 suffix; international flights from Tehran can leave from IKA when THR is asked (segments show the real airports). Flights not on sale (sold out or auto-reserve only) are counted in not_on_sale. For refund penalties, exact baggage and fare rules call mb_flight_fare_details with the flight_id; for the cheapest day use mb_flight_price_calendar first.

ParametersJSON Schema
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'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly/idempotent/openWorld/non-destructive) by disclosing non-obvious behavior: fares without enough seats are dropped by the site, sold-out/auto-reserve flights land in not_on_sale, domestic round trips return two separate tickets while international ones return a combined package, and times are local despite the +03:30 suffix. It also warns that IKA can be substituted when THR is requested.

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-loaded with the core purpose in the first sentence, then dense but informative semantics. Every sentence carries a distinct fact (pricing, party sizing, round-trip shapes, timezone quirk, sibling routing); the parentheticals are compact though somewhat packed.

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 a 14-parameter search tool with an output schema, the description supplies exactly the missing operational context: fare semantics, round-trip list shapes, timezone behavior, and airport substitution. Nothing an agent needs to call it correctly or interpret results 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%, so the schema already documents all 14 parameters, making 3 the baseline. The description adds only indirect meaning by explaining that total_toman covers the whole party (adult/child/infant fares) and that fares lacking enough seats for the party are dropped, which loosely informs the party-size parameters.

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 with scope: 'Search flights for a date: every bookable flight with price, seats left, baggage and times.' It also distinguishes itself from siblings by routing detail work to mb_flight_fare_details and cheapest-day work to mb_flight_price_calendar.

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?

Explicit follow-up routing is given: use mb_flight_fare_details for refund penalties, exact baggage and fare rules, and mb_flight_price_calendar first for the cheapest day. It does not state explicit when-not-to-use-this-tool conditions for the same job, but the alternative-selection guidance is clear.

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

ParametersJSON Schema
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'.
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
refundable_onlyNoOnly refundable stays.
max_price_per_night_tomanNoHighest price per night for one room in Toman, e.g. 3000000.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description goes beyond them by disclosing that sold-out hotels are excluded, that guest count does not affect prices, and how the returned price fields relate to each other. It does not mention pagination behavior despite the limit parameter, so it stops short of 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?

Front-loaded with the core purpose, then dense but purposeful sentences that each add routing or semantics. The telegraphic style ('Next: mb_hotel (reviews, location)') is efficient but sacrifices some readability, keeping it just short of a 5.

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 a 9-parameter search tool with an output schema, annotations, and many siblings, the description covers exclusions, price interpretation, guest-count behavior, and next-step tools. 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.

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 adds real meaning beyond the schema by clarifying price semantics (cheapest room for all nights vs. per-night, after discount) and that guest count is not a pricing input, which is non-obvious and affects how the agent should combine this with mb_hotel_rooms.

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 ('Hotels and stays with a free room in a city for the dates, with the cheapest room price for the whole stay'), including the scope constraint that only hotels with availability are returned. It explicitly contrasts itself with siblings (mb_city_hotels lists every hotel; mb_hotel_rooms gives exact prices), so an agent can distinguish it without opening another 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?

Explicitly routes the agent: use mb_hotel_rooms(guests=...) to pick a room that fits, mb_hotel for reviews/location, mb_hotel_calendar for cheapest nights, and mb_city_hotels when sold-out properties matter. It also states the condition under which this tool omits results, which is exactly the when-not guidance needed.

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

ParametersJSON Schema
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'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only/idempotent/non-destructive profile, and the description adds genuinely new behavior: whole-car capacity (up to 3 passengers), one offer per pick-up slot, price_toman is for the whole car not per person, and the shape of the `classes` summary. It does not cover pagination or auth requirements, so not 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?

Purpose and the pricing model are front-loaded in the first two lines, with the caveats about empty results and the city-id prerequisite following efficiently. Slightly fragmented layout but no wasted sentences.

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 7-parameter search with a full output schema and complete annotations, the description supplies the extra context an agent needs: capacity, per-car pricing, empty-result behavior, and the companion tool for city ids. Output format details are rightly delegated to the output schema.

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% – every parameter (date, limit, origin, car_class, depart_after/before) is already documented in the schema. The description's price and classes notes relate to the response, not to parameter syntax or meaning, so 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?

The opening sentence states a specific verb+resource: private door-to-door intercity taxis for a date, whole car up to 3 passengers, one offer per pick-up slot. This distinguishes it from the bus, train and flight search siblings by mode and by capacity/pricing model.

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 prerequisite (city ids must come from mb_find_place(mode='taxi')) and warns that many city pairs return no taxis. It stops short of explicitly saying when to prefer this over mb_search_buses/trains for the same route, so it is clear context without full alternative routing.

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.

ParametersJSON Schema
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/destructive annotations, it discloses that seat counts are fresh (not cached), that price_toman is per adult, and how refund_penalties apply across classes. These are non-obvious behavioral traits an agent cannot infer from the schema or annotations.

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-loaded with what the tool returns, then dense but purposeful routing sentences; every clause points to a concrete alternative or behavioral fact. Slightly telegraphic in places but no dead weight.

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 search tool with an output schema and full coverage, the description covers selection guidance, output semantics, cross-tool routing, and round-trip composition. Nothing an agent needs 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?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning to outbound_class_id (return leg only, limits to the same rail company) and clarifies the per-adult pricing dimension. It's meaningful added context, though most parameters are still schema-documented.

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 ('Trains between two stations on a date') and enumerates the returned payload ('every class (wagon), its price per adult and free seats'). It also distinguishes itself from siblings by explicitly routing stops/pricing/calendar lookups elsewhere.

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 names alternatives with the condition that selects them: children/infants/whole-compartment pricing -> mb_train_price, stops/times -> mb_train_stops, sold-out days -> mb_train_price_calendar or mb_alternative_routes. It even spells out the round-trip pattern (two calls, return leg via outbound_class_id).

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

ParametersJSON Schema
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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish that this is a safe, idempotent, read-only lookup, and the description adds genuinely non-obvious behavior: class_id expiry, prices returned even for sold-out classes, and the warning that breakdown components do not sum exactly to the price because the price is what is actually paid. These are exactly the surprises an agent needs surfaced before calling.

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, front-loaded with what the tool returns before the prerequisites and caveats. Every sentence carries information: the price composition, the input provenance, and the sold-out/gap-in-breakdown warnings.

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?

An output schema exists so return values need no explanation, and the description still covers the two things an agent must know to call correctly: where class_id comes from and its expiry, and the sold-out caveat. Nothing material is missing for a six-parameter pricing 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 description coverage is 100%, so the per-parameter meanings (adult, child, infant, foreigner, empty berth) are already documented; the description adds aggregation semantics — that the returned figure is per party category plus a total — which the schema does not express. Modest but real value above the baseline.

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 verb and resource — the exact price of one train class for a party — and enumerates what the price breaks down into (adult, child, infant, foreigner, empty berth, total). An agent can tell this apart from mb_search_trains, but nothing explicitly distinguishes it from the sibling mb_train_price_calendar, which is the nearest competing option.

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 concrete prerequisite (class_id must come from a fresh mb_search_trains result, since it expires with the search) and an important caveat (a sold-out class still returns a price, so check seats_left in the search first). It stops short of naming an explicit exclusion or alternative for calendar-style pricing.

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.

ParametersJSON Schema
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).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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/non-destructive, so safety is covered. The description adds genuine behavioral context beyond them: rows are omitted on days without enough free seats, and the window is truncated because sales open only ~18 days ahead, so later days will be missing. The one gap is currency/price units and whether results are cached.

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, all front-loaded: what it returns, how to use it, and the availability caveat. Every sentence earns its place with no repetition of schema or annotation content.

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?

An output schema exists, so return structure need not be explained, and the description supplies the important domain caveats (free-seat filtering, ~18-day sales horizon). What is missing is minor: price currency/units and whether the calendar is cached or live.

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 days, quota, seats, start_date, origin and destination, including the mb_find_place(mode='train') id hint. The description only adds '(one adult)', which is marginal and slightly at odds with the seats parameter allowing up to 10. Baseline 3 is correct.

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 train ticket per day for a route, one adult, filtered to days with free seats. It is immediately distinguishable from mb_train_price (single price) and mb_search_trains (actual bookings) by the per-day calendar framing.

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 the agent: 'Use to find the cheapest or the next bookable day, then mb_search_trains for that day.' That names the follow-up tool and the condition that triggers it. It stops short of stating when NOT to use it (e.g. versus mb_train_price for a single departure), so it is strong but not fully closed.

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/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 value beyond them: it states the return shape (ordered stops with date and local time), that sold-out classes still work, and warns that the first stop may precede the queried station. That is meaningful behavioral context, not restatement.

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?

Purpose is front-loaded in one sentence, then parameter caveats follow. Three short sentences, none wasted, 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 an output schema present the description need not explain return values, and annotations carry the safety profile. For a single-parameter read tool, the description plus schema cover what an agent needs, including the non-obvious edge case that the first stop can precede the queried station.

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 schema already documents the class_id format. The description adds disambiguation the schema lacks - 'never a train number' - plus the sold-out tolerance, which genuinely improves correct invocation.

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 verb and resource - 'Every station a train stops at, in order, with the date and local time at each.' It positions itself relative to the sibling mb_search_trains as the producer of the class_id, so an agent can distinguish it from search and pricing tools 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 Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives the workflow source ('a class_id from mb_search_trains') and a useful edge-case note ('sold-out classes work too'), but never states when to prefer this over siblings like mb_train_price_calendar or why an agent would request stops. Usage is implied by the purpose rather than explicitly routed.

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.

ParametersJSON Schema
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.
destinationNoFlight: IATA code ('THR'); train, bus, taxi: English city slug ('tehran'); hotel destination: city slug or 'city/hotel' ('mashhad/enghelab').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

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, and non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: editorial text may contain stale prices/rules and search tools should be used for live data, plus the per-service identifier format requirements.

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 paragraphs with no waste; the purpose leads, the two operating modes follow, and the freshness caveat is placed last. Every sentence earns its place.

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 an output schema present, return values need no explanation, and the description covers the two invocation modes, identifier formats, and the staleness caveat. It is essentially complete, though it does not state what happens with no parameters at all (all params are optional).

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% (baseline 3), but the description adds cross-parameter meaning the per-field schema does not: which combination of service/origin/destination constitutes a route guide versus a magazine lookup, and that hotel routes use destination-only slugs. That mode grouping is real added value.

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 verb+resource: it returns MrBilit's guide content (summary, FAQ, article) for a route or city plus matching magazine posts. That is concrete and distinguishable from the sibling search tools, though it never names a sibling directly to sharpen the boundary.

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 splits usage into two explicit modes — 'Route guide: service + origin + destination' and 'Magazine: query' — and redirects to search tools for live prices. This gives clear context, but there are no explicit when-not conditions or named alternatives beyond the price caveat.

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

A3.9/5.0

Scored across 22 tools

Disambiguation4/5

Tools are mostly distinct by service and action (search, calendar, details, seats), and descriptions explicitly cross-reference next steps. However, some overlap exists among hotel price tools (mb_search_hotels vs mb_hotel_rooms vs mb_hotel_calendar) and between search and price-calendar tools, which could cause occasional misselection.

Naming Consistency3/5

All tools use a consistent mb_ prefix and snake_case, but the naming pattern mixes verb_noun (mb_search_flights, mb_find_place) with noun phrases (mb_bus_price_calendar, mb_train_stops, mb_hotel_rooms). The convention is readable but not a predictable verb_noun pattern throughout.

Tool Count3/5

22 tools cover five transport/accommodation services plus support utilities, so each service gets search, calendar, and detail tools. This is at the upper end of reasonable; some consolidation (e.g., fewer calendars) could reduce the surface without losing capability.

Completeness3/5

The search/planning surface is broad: flights, trains, buses, taxis, hotels, alternatives, places, companies, notices, help, and guides are covered. However, no tool performs booking, reservation, or order management, leaving a notable lifecycle gap for a travel-booking domain.

Maintenance

ActivityNo data
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI assistants to search live travel inventory for flights, stays, and car hire through typed tools, with place resolution and price details while deliberately exposing no booking or payment surface.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI assistants to search and compare vacation rentals across Jabama, Jajiga and Otaghak at once, normalizing prices, Jalali/Gregorian dates, amenities, ratings, calendars and full guest reviews into one schema. It runs read-only and locally, providing merged results with direct booking links while withholding host and reviewer identities.
    6
    MIT