Skip to main content
Glama

alibaba-ir-mcp: Alibaba (علی‌بابا) Iran train, bus, flight, hotel, villa and tour search MCP server for AI agents

alibaba-ir-mcp is an unofficial, read-only MCP server that gives AI agents the train, bus, flight, hotel, villa and tour listings of Alibaba (alibaba.ir), Iran's largest travel site. Its 14 tools look up city codes, search trains, buses, domestic and international flights, hotels, holiday homes and tour packages with prices and availability, show bus seat maps and find the cheapest day to travel. No API key or Alibaba account is needed. It works in Claude, Cursor, Copilot and any other MCP client.

PyPI Python CI License: MIT

For AI agents · Quick start · Tools · FAQ · فارسی


For AI agents

  • What: unofficial MCP server (model context protocol) for alibaba.ir: train tickets (company, class, compartments, price, seats left, round trips), intercity buses (company, bus type, terminals, price, free seats), domestic and international flights (airline, times, fare classes, baggage, refund fees, round trips), hotels, villa and holiday-home rentals, tour packages and the cheapest day per route.

  • Install: uvx alibaba-ir-mcp or claude mcp add alibaba -- uvx alibaba-ir-mcp. Transport: stdio. Needs uv (Python 3.10+).

  • Auth: none, no API key or account. Optional ALIBABA_IR_MCP_PROXY (HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.

  • Access: read-only. It cannot log in, book, hold seats or pay, so no confirmation is needed before calling any tool.

  • Tools: 14, all prefixed al_. Typical sequences: al_trains / al_buses / al_flights / al_flights_international for one day; al_*_cheapest then the search for the chosen day; al_stays then al_stay_detail; al_cities when unsure of a city code.

  • Use when: the user asks for train, bus or flight options, prices or seats, a hotel, a villa to rent or a tour package, or the cheapest day to travel.

  • Do not use when: the user wants to buy or book (send them to alibaba.ir), or asks about visas and insurance (not covered).

  • Output: compact JSON. Prices are Toman (Alibaba's API uses Rial; the tools divide by 10 as the site does): per adult for transport, for the whole stay for hotels, villas and tours. Dates are accepted as Gregorian 2026-11-11 or Jalali 1405-08-20; times are Iran local time.

  • Machine-readable: server.json.

Related MCP server: otaghak-mcp

Quick start

claude mcp add alibaba -- uvx alibaba-ir-mcp

Other clients: {"command": "uvx", "args": ["alibaba-ir-mcp"]}.

Tools

Tool

What it does

al_cities

City and airport names to the codes the other tools take (THR, MHD, SYZ...); international=true searches airports worldwide.

al_trains

Trains on one day (or a round trip): company, class and compartment, departure and arrival, price, seats left, discount; filter by class, passengers, women-only or men-only compartments.

al_trains_cheapest

Lowest train price for each of the next days.

al_buses

Intercity buses on one day: company, bus type, departure, price, seats, terminals, stops; says when a route has no buses and the next date that has.

al_buses_cheapest

Lowest bus price and bus count for each of the next days.

al_bus_seats

Free seats of one bus: counts per status, seat numbers and rows.

al_flights

Domestic flights on one day (or round trip): airline, flight number, times, aircraft, fare class, price per adult, child and infant, seats, baggage, cancellation fees.

al_flights_cheapest

Lowest domestic fare for each of the next days.

al_flights_international

International flights (any city Alibaba sells): airline, segments, stops, duration, baggage, price, round trip.

al_stays

Villas, suites, cottages and other holiday homes in a city: price, rating, capacity, filters for type, price, rating.

al_stay_detail

One holiday home: beds, amenities, house rules, cancellation terms, nightly price calendar, reviews.

al_hotels

Hotels in a city (Iran and abroad): stars, rating, price for the stay, meal plan, perks.

al_tours

Tour packages (travel plus hotel) to Kish, Mashhad, Istanbul, Dubai and more: hotel, room, price per person.

al_tours_cheapest

Lowest tour price per person for 11 days around a date.

Example: "cheapest way from Tehran to Mashhad next Thursday" -> al_trains_cheapest, al_flights_cheapest, then al_trains / al_flights / al_buses for that day.

FAQ

Is this official? No. It reads the same public JSON the alibaba.ir web app loads for anyone without an account.

Why does a train search sometimes fail? The rail suppliers go offline for maintenance for a while, usually just after midnight Tehran time. The site shows the same message; try again in a few minutes.

Why are there several rows for one flight? Each fare class is its own row; the site hides the repeats by default.

Where do the villas come from? Alibaba resells Jabama's listings; al_stays shows the same places and prices as alibaba.ir/accommodation.

Does it work outside Iran? Yes on most networks, directly or through ALIBABA_IR_MCP_PROXY.

فارسی

سرور MCP غیررسمی و فقط‌خواندنی برای علی‌بابا (alibaba.ir): جستجوی قطار، اتوبوس، پرواز داخلی و خارجی، هتل، ویلا و تور با قیمت و ظرفیت، نقشه صندلی اتوبوس و ارزان‌ترین روز سفر. نصب: uvx alibaba-ir-mcp. قیمت‌ها به تومان و تاریخ‌ها به شمسی (۱۴۰۵-۰۸-۲۰) یا میلادی پذیرفته می‌شود. خرید بلیت از طریق این ابزار ممکن نیست.

MIT License. Sepehr Radmard (سپهر رادمرد): github.com/sepehr071

Available Tools

14 tools
al_busesBus ticketsA
Read-onlyIdempotent

Search intercity bus tickets between two Iranian cities on one day: company, bus type, times, price, seats.

Use for "buses from Tehran to Shiraz tomorrow". Prices are Toman per adult. from_terminal is the terminal of that departure (Tehran has several). Bus tickets carry no arrival time on the site.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
sortNoOrder of the results.departure
limitNoMaximum number of results.
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
only_availableNoHide buses with no free seat.

TDQS

A3.7/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 non-obvious behavior: prices are Toman per adult, the departure terminal field matters because Tehran has several terminals, and the source site provides no arrival time. Those caveats are exactly what an agent would otherwise discover only from the results.

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 capability and scope land in the first clause, and the following sentences are short and load-bearing rather than filler. Minor structural oddity: the `from_terminal` note concerns an output field but sits mid-description, slightly interrupting the input-oriented flow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so: it lists the result fields and flags the missing arrival time. Currency units are stated. It stops short of describing pagination or total-count behavior behind `limit`, which is a modest gap for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so origin/destination formats, date patterns, sort enum, limit bounds and only_available are already fully documented. The description's only additional detail, `from_terminal` and per-adult Toman pricing, describes return values rather than inputs. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ("Search intercity bus tickets") and bounds the scope precisely: two Iranian cities, one day. It also enumerates the returned fields (company, bus type, times, price, seats). It does not distinguish itself from the sibling al_buses_cheapest, so an agent must infer the split.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

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

Usage is conveyed only through an example query ("buses from Tehran to Shiraz tomorrow"), which implies the when-to-use context. There is no statement about when not to use it, and no routing to al_buses_cheapest or al_bus_seats even though both are close alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_buses_cheapestCheapest bus per dayA
Read-onlyIdempotent

List the lowest bus price and the number of buses for each day from a start date (the site has no bus calendar).

Use before al_buses when the date is flexible. It runs one search per day, so keep days small. Prices are Toman per adult for buses with a free seat; a day with none shows no price.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
daysNoHow many days to check, starting at `date`.
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), and the description adds genuinely non-structured behavior: each call fans out into one search per day (a latency/cost signal), prices are in Toman per adult, only buses with a free seat are counted, and days with no qualifying bus return no price rather than an error.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

Three short sentences, front-loaded with the output shape and then the routing rule. The only blemish is the mid-sentence parenthetical '(the site has no bus calendar)', which interrupts the main clause and could be folded into the following sentence without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description must carry the return contract, and it does: per-day lowest price, per-day bus count, currency and unit (Toman per adult), the free-seat filter, and the empty-day representation. Nothing an agent needs to interpret a result or size its request 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 all four parameters are already documented, making 3 the floor. The description still adds value by framing `days` as a cost dial ('keep `days` small') and by situating `date` as the anchor for the per-day walk, which the schema's 'starting at `date`' only partly conveys.

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 opens with a concrete verb and result shape: 'List the lowest bus price and the number of buses for each day from a start date.' It also names the exact sibling it competes with (al_buses) and states the condition that selects this one, so an agent can route without opening either 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?

Explicit routing guidance: 'Use before al_buses when the date is flexible' tells the agent both the alternative and the deciding condition (date flexibility). It adds a practical constraint — 'It runs one search per day, so keep `days` small' — that governs how to invoke it, not just whether to.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_bus_seatsBus seat mapA
Read-onlyIdempotent

Show which seats are free on one bus: counts per status and the free seat numbers (no booking).

Use after al_buses when the user cares where they sit or asks how full a bus is. Pick the bus by its departure time (and company). layout gives each seat's row and column (columns 1-2 left of the aisle, 4-5 right) so pairs can be found; statuses mean Available, booked for a male or female passenger, or Blocked (not for sale).

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
companyNoPart of the company name, to pick one when several buses leave at that time.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
departure_timeYesDeparture time of the bus from al_buses, HH:MM.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (read-only, idempotent, non-destructive, open-world), so the description's job is to add the rest — and it does: the tool does not book, statuses mean available/male-booked/female-booked/blocked, and blocked seats are not for sale. It stops short of describing response shape or edge cases like a bus with no seat data, but adds solid behavior beyond 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 the return content, then usage, then the layout/status decoding — no filler sentences. The layout explanation is dense and could be slightly crisper, but every clause carries operational meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, yet the description explains what comes back (counts per status, free seat numbers, per-seat row/column layout), what the statuses mean, and how the aisle splits columns. For a single-object lookup tool with fully documented params, nothing essential to correct invocation 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 every parameter is already documented with format, patterns and examples. The description corroborates that departure_time and company disambiguate the bus, but repeats what the schema already states rather than adding new semantics; 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: show free seats on one bus, returning counts per status and free seat numbers, and explicitly says no booking occurs. This clearly separates it from al_buses, which finds/list buses rather than inspecting a single bus's seat map.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

Gives an explicit trigger ('Use after al_buses when the user cares where they sit or asks how full a bus is') plus the sequencing prerequisite and how to pick the bus among several (departure time plus company). The agent knows both when to call it and what data it needs first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_citiesCity and airport codesA
Read-onlyIdempotent

Look up the city codes the other tools take (THR for Tehran, MHD for Mashhad) and what is sold for each city.

Use first when the user names a city: pass the returned code to al_trains, al_buses or al_flights. train is true for cities with a station, flight for cities with a domestic airport. Buses use the same codes (a tiny train stop may have no buses). With international=true it searches the whole world (Dubai, Istanbul, Paris) and returns airports; whole_city rows (code ending in ALL) cover every airport of a city.

NameRequiredDescriptionDefault
limitNoMaximum number of results.
queryNoPart of a city name in Persian or English, or a code. Empty lists all.
internationalNoLook up airports and cities worldwide for al_flights_international instead of Iranian cities.

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 and open-world, so the safety profile is free; the description still adds real value by disclosing return-field semantics — `code`, `train`/`flight` booleans, and `whole_city` rows whose code ends in ALL. It stops short of describing result volume, ordering or empty-result behavior, which is the only remaining behavioral gap.

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 action, then the sequencing rule, then return-field semantics — a sensible priority order with no filler. The parenthetical "a tiny train stop may have no buses" and the ALL-code note are dense but each carries non-obvious information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and only three optional parameters, the description supplies what an agent actually needs: how to query, which field to propagate, how to interpret the flags, and the international branch. The only minor omission is that it never mentions whether codes also feed al_stays or al_hotels, which is peripheral to calling the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by tying international=true to a concrete consumer (al_flights_international) and giving world-city examples, and by clarifying that bus codes reuse the train codes. It does not expand on `limit` or query matching rules, which the schema already handles.

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 — look up city codes and what is sold per city — with concrete examples (THR for Tehran, MHD for Mashhad). It is unmistakably the code-resolution tool, distinct from al_trains, al_buses and al_flights which consume its output.

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 first when the user names a city" gives an explicit trigger, and it names the downstream alternatives (al_trains, al_buses, al_flights) plus the international case that feeds al_flights_international. A branch condition (international=true) is spelled out rather than implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_flightsDomestic flightsA
Read-onlyIdempotent

Search domestic flights between two Iranian airports on one day: airline, flight number, times, fare, seats.

Use for "flights from Tehran to Shiraz on 2026-11-12". Prices are Toman per adult (child_price_toman and infant_price_toman for the others); one flight can appear several times with different fare classes. Pass return_date for a round trip, refund_rules for the cancellation fee table, adults/children/infants for a group. For other days call al_flights_cheapest first. For flights abroad use al_flights_international.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
sortNoOrder of the results.departure
limitNoMaximum number of results.
adultsNoNumber of adults.
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
infantsNoNumber of infants under 2 (one per adult at most).
childrenNoNumber of children (2-11); their fare is lower.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
return_dateNoReturn day for a round trip (same formats as `date`); adds a `returning` list.
refund_rulesNoAdd `refund_penalties` (cancellation fee by time before departure) to each fare.
only_availableNoHide fares with no seat left.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare this a read-only, idempotent, non-destructive open-world lookup, so the safety profile is covered. The description adds genuinely useful behavior beyond that: fares repeat per flight across fare classes, prices are quoted in Toman per adult, and return_date/refund_rules change the result shape by adding `returning` and `refund_penalties` lists. It stops short of describing pagination behavior for limit or any rate/quota constraints.

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 action and scope come first, followed by pricing/duplication caveats and then sibling routing, which is the right ordering. The parenthetical about `child_price_toman` and `infant_price_toman` is slightly compressed and reads awkwardly, but nothing is wasteful enough to cut.

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 an 11-parameter search with no output schema, the description covers the essentials: what is searched, what comes back at a field level, how optional parameters alter the response, and where to go for other cases. The only real gap is that the exact response envelope and pagination behavior 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 description coverage is 100%, so the baseline is 3; the description earns above that by explaining the *effect* of parameters on the response rather than just restating them — return_date adds a `returning` list, refund_rules adds `refund_penalties` per fare, and the passenger counts are for group pricing in Toman. It also hints that repeated rows represent distinct fare classes, which the schema does not say.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: "Search domestic flights between two Iranian airports on one day", then enumerates returned fields (airline, flight number, times, fare, seats). It immediately distinguishes itself from the sibling tools by the word "domestic" and by naming al_flights_international for foreign routes.

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?

Provides a concrete usage example ("flights from Tehran to Shiraz on 2026-11-12") and explicit routing rules to alternatives: use al_flights_cheapest for other days and al_flights_international for flights abroad. It also states which optional parameters to set for round trips, refund tables, and groups.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_flights_cheapestCheapest flight per dayA
Read-onlyIdempotent

List the lowest domestic fare for each day from a start date, to pick the cheapest day to fly.

Use before al_flights when the date is flexible. Prices are Toman per adult; a day with no flight is missing.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
daysNoHow many days to list, starting at `date`.
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.

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, open-world behavior, so the safety profile is covered. The description adds genuinely useful context beyond that: fares are in Toman per adult, pricing is one-way domestic, and days without a flight are omitted rather than returned as nulls — a data-shape detail an agent needs. No output schema exists, so the return format is only partially characterized.

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, zero filler: purpose and scope first, then the relationship to the sibling and the pricing/missing-day conventions. Every clause 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?

For a four-parameter read-only search tool with rich schema descriptions and a full annotation set, the description supplies what structured fields cannot: currency unit, one-way domestic scope, and the sparse-day convention. Minor gaps remain — whether round trips are supported and what the per-day record contains — but nothing blocks correct invocation.

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, date, and days are fully documented in the schema, including Persian/English/code formats, Jalali vs Gregorian dates, and the 1–15 range for days. The description adds only the 'per adult' currency framing and the per-day iteration semantics, which is baseline for a fully documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the lowest domestic fare for each day') with clear scope — domestic, per-day, from a start date — and the stated goal ('pick the cheapest day to fly'). This is plainly distinguishable from the sibling al_flights, which the description names.

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 says 'Use before al_flights when the date is flexible,' naming the alternative and the condition that selects it. It stops short of stating the inverse (use al_flights when the date is fixed) or that international routes belong to al_flights_international, but the routing signal is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_flights_internationalInternational flightsA
Read-onlyIdempotent

Search international flights between Iran and abroad (or any two cities Alibaba sells) on one day.

Use for "flights from Tehran to Istanbul on 2026-11-16". Returns airline, flight numbers, times, stops, baggage and the price per adult in Toman (total_toman is for the whole group); cheapest first by default. Pass return_date for a round trip: each fare then has a return leg. Cities and codes come from al_cities with international=true (THRALL = all Tehran airports). Charter fares are sold as one fare class. It can take 10-20 seconds because airlines answer one by one (at most 12 polls per call). To buy, send the user to alibaba.ir.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
sortNoOrder of the results.price
cabinNoCabin class.economy
limitNoMaximum number of results.
adultsNoNumber of adults.
originYesCity or airport as a name (تهران, Dubai) or code (THR, DXB, THRALL for all airports of Tehran).
airlineNoPart of an airline name to keep, e.g. 'Turkish', 'ماهان'.
infantsNoNumber of infants under 2.
childrenNoNumber of children (2-11).
max_stopsNoKeep only itineraries with at most this many stops (0 = direct).
destinationYesCity or airport as a name (تهران, Dubai) or code (THR, DXB, THRALL for all airports of Tehran).
return_dateNoReturn day for a round trip (same formats as `date`).

TDQS

A4.2/5.0
Behavior5/5

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

Well beyond the annotations, it discloses latency (10-20 seconds), the underlying mechanism (airlines answer one by one, at most 12 polls per call), default ordering (cheapest first), the returned fields, the fact that total_toman is the whole-group price, and that charter fares collapse to a single fare class. It also clarifies the tool is search-only and buying happens off-platform, which is important given openWorldHint.

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 one-line scope statement and an example immediately after, then packs return-trip, pricing, and latency notes into compact clauses. Density is high but slightly crowded by the parenthetical aside about cities Alibaba sells.

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 12-parameter tool with no output schema, the description covers the response shape (airline, flight numbers, times, stops, baggage, price per adult), price semantics, round-trip behavior, and latency expectations. What remains unaddressed is how results are truncated at the limit/poll cap or what an empty result looks like.

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 already 100%, so the baseline is 3; the description adds real meaning on top by explaining that return_date produces a `return` leg on each fare and that THRALL expands to all Tehran airports. It leaves behavioral params like sort, limit, and cabin entirely to the schema, which is acceptable given the coverage.

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 plus scope: "Search international flights between Iran and abroad ... on one day," and gives a concrete example query. The scope is clear enough to distinguish it from al_trains/al_buses/al_stays, but the parenthetical "(or any two cities Alibaba sells)" muddies the international qualifier, and the sibling al_flights is never named as the domestic counterpart.

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 an explicit use case ("Use for 'flights from Tehran to Istanbul on 2026-11-16'"), tells the agent to pass return_date for round trips, to source city codes from al_cities with international=true, and to hand off purchasing to alibaba.ir. It stops short of explicitly excluding al_flights and al_flights_cheapest, so the domestic/summary siblings must be inferred.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_hotelsHotelsA
Read-onlyIdempotent

Search hotels in a city for a stay: stars, rating, price for the whole stay, meal plan, perks (domestic and abroad).

Use for "a 4-star hotel in Mashhad for 2 nights from 1405-08-21". Prices are Toman for the room for all nights (price_per_night_toman is the average). The site's own page shows the same list and count. It can take up to a few seconds while hotels answer.

NameRequiredDescriptionDefault
cityYesCity name in Persian or English (مشهد, Istanbul, دبی).
sortNoOrder of the results: best rated first, or cheapest first.rating
limitNoMaximum number of results.
adultsNoAdults in the room (one room per search).
nightsNoNumber of nights, counted from the check-in date.
checkinYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
min_starsNoLowest star rating to keep, 1-5.
only_availableNoHide hotels with no room for those dates.

TDQS

A4/5.0
Behavior4/5

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

The annotations already establish a read-only, idempotent, non-destructive open-world operation. Beyond that, the description discloses total-stay pricing in Toman, the meaning of price_per_night_toman, parity with the site's list and count, and possible multi-second latency while hotels respond.

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 front-loads the purpose and follows it with a compact example, pricing semantics, source consistency, and latency. Each sentence contributes actionable information without substantial repetition or unnecessary wording.

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 an eight-parameter search with fully documented inputs, the definition supplies enough context to select and invoke the tool and interpret its core prices. Listing result attributes partly compensates for the absent output schema, though explicit sibling differentiation and any important availability or freshness limitations would make it more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the structured input documentation already does most of the work. The example usefully shows several parameters working together, but it adds little input syntax or constraint information beyond the schema; the pricing clarification primarily concerns output fields.

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 opening sentence gives a specific verb and resource—searching hotels in a city—and identifies key result attributes such as stars, rating, meal plan, and perks. Domestic and international scope is stated, but the description does not explicitly distinguish this tool from the potentially overlapping al_stays or al_stay_detail siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

The explicit 'Use for' example provides a concrete natural-language request involving a city, star preference, stay length, and Jalali date. This gives clear selection context, although there is no when-not guidance or routing to an alternative sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_stay_detailVilla or holiday home detailsA
Read-onlyIdempotent

Show one villa or holiday home in full: capacity, beds, amenities, house rules, cancellation terms, calendar, reviews.

Use after al_stays when the user wants to decide on a place. Prices are Toman per night (price_base weekday, price_weekend, price_holiday); calendar lists the next days with available or not and the night's price. Guest names are left out.

NameRequiredDescriptionDefault
idYesThe `id` of a place from al_stays.
reviewsNoHow many recent guest reviews to include (0 for none).
calendar_daysNoHow many days of availability and nightly prices to list from today.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, non-destructive, open-world semantics, and the description adds information they cannot: prices are in Toman per night with the specific fields (price_base weekday, price_weekend, price_holiday), the calendar exposes availability plus nightly price, and guest names are deliberately omitted. That redaction and unit disclosure is genuine behavioral context, though nothing is said about missing/invalid ids or result size.

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 capability and its return facets, then a short usage-routing sentence, then unit/field clarifications. Dense but nearly every clause carries information; the parenthetical field names are slightly listy but earn their place by anchoring the pricing semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description carries the return-value burden and does so by enumerating the facets and the price/calendar structure. Only edge behavior (invalid id, empty reviews, calendar_days=0) is unaddressed, which is a minor gap for a read-only detail 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 baseline is 3, but the description adds meaning beyond the schema: it explains that calendar entries carry both availability and that night's price, and that price fields are per-night in Toman, which makes the reviews and calendar_days parameters' output concrete.

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 ("Show one villa or holiday home in full") and enumerates the returned facets: capacity, beds, amenities, house rules, cancellation terms, calendar, reviews. This clearly separates it from the list-level al_stays and from al_hotels, which is a different property type.

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 sequencing: "Use after al_stays when the user wants to decide on a place" tells the agent both the prerequisite call and the intent that triggers this one. It does not state exclusions (e.g., that hotels belong to al_hotels), so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_staysVillas and holiday homesA
Read-onlyIdempotent

Search villas, suites, cottages and other holiday homes for rent in a city, with price, rating and capacity.

Use for "a villa in Masuleh for 4 people next weekend". Prices are Toman: price_per_night_toman is the average for the stay, price_total_toman the whole stay (VAT not included). The sort applies to the first 100 places the site returns (found is the full count). Call al_stay_detail with an id for the calendar, rules and amenities. The listings are Jabama's, sold through alibaba.ir.

NameRequiredDescriptionDefault
sortNoOrder of the results.recommended
typeNoKind of place: villa, suite, traditional house, cottage, apartment, hostel, ecotourism lodge, complex.
limitNoMaximum number of results.
guestsNoNumber of guests.
nightsNoNumber of nights, counted from the check-in date.
checkinYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
max_priceNoHighest price per night in Toman.
min_priceNoLowest price per night in Toman.
min_ratingNoLowest guest rating, 0-5 (for example 4).
destinationYesCity or village name (ماسوله, رامسر, کیش) or a page slug like city-masuleh.
instant_onlyNoOnly places you can book at once without the host's approval.

TDQS

A4.3/5.0
Behavior5/5

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

Beyond the annotations (readOnly, idempotent, open-world, non-destructive), the description discloses genuinely useful behavior: prices are in Toman with VAT excluded, the sort applies only to the first 100 places the site returns, and `found` is the full count rather than the returned count. It also states data provenance (Jabama listings sold through alibaba.ir), which matters for an agent assessing result trustworthiness. That is real added context the structured fields do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

The purpose is front-loaded, then the example, then the pricing and pagination caveats, then the handoff to al_stay_detail — a logical order with little filler. It is somewhat dense in field names (`price_per_night_toman`, `price_total_toman`, `found`) that concern results rather than invocation, which costs a point on tightness.

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 11-parameter search tool with no output schema, the description covers what an agent most needs: what it searches, a usage example, currency and VAT semantics for the price fields, the sort truncation at 100 with `found` as the true count, and where to go for per-listing detail. The remaining unknowns (result object shape) are delegated sensibly to al_stay_detail.

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, but the description adds meaning on top: it clarifies the currency of price filtering and explicitly limits what the `sort` parameter actually operates over (the first 100 site results). That sort-scoping detail materially changes how an agent should interpret ordering results and is not in 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 opens with a specific verb and resource set: "Search villas, suites, cottages and other holiday homes for rent in a city, with price, rating and capacity." That is far more than a restatement of the name and tells an agent exactly what corpus is being queried. It stops short of 5 because it never explicitly contrasts itself with the sibling al_hotels tool, which an agent could plausibly confuse it with.

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?

A concrete worked example ("a villa in Masuleh for 4 people next weekend") anchors the intended use case, and the description routes onward to al_stay_detail for calendar, rules and amenities. It gives no explicit when-not guidance, such as when to prefer al_hotels over this tool or what to do if no results are returned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_toursTour packagesA
Read-onlyIdempotent

Search tour packages (round trip plus hotel) from a city to a destination such as Kish, Mashhad, Istanbul or Dubai.

Use for "a 3-night Kish tour for two from Tehran next week". Each result is a hotel with the cheapest package: hotel, stars, rating, room, meal plan, how you travel, and the price per person and for the whole group in Toman. Results come in after a few seconds (at most 15 polls per call). To buy, send the user to alibaba.ir.

NameRequiredDescriptionDefault
sortNoOrder of the results.price
limitNoMaximum number of results.
adultsNoTravellers sharing one room (the price is for the whole group).
nightsNoNumber of nights, counted from the check-in date.
originNoDeparture city, tours start from Tehran, Isfahan, Mashhad and a few more.تهران
checkinYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
max_priceNoHighest price per person in Toman.
min_starsNoLowest hotel star rating to keep, 1-5.
destinationYesDestination city in Persian or English: کیش, Mashhad, استانبول, Dubai.

TDQS

A4.1/5.0
Behavior5/5

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

Beyond annotations, the description discloses return composition (hotel, stars, rating, room, meal plan, transport, per-person and group price), latency/polling behavior ('at most 15 polls per call'), and that purchase must happen on alibaba.ir. This adds substantial operational context not covered by readOnly/openWorld/idempotent hints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

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

The description front-loads the purpose and then packs useful example, result, latency, and purchase-path information into a compact block. A few phrases are dense, but there is no obvious filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, open-world search tool with no output schema, it explains what comes back, how quickly, and that the tool does not complete a purchase. The main completeness gap is the lack of explicit comparison to al_tours_cheapest, which matters given the sibling list.

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 all nine parameters are already documented in the schema. The description reinforces that prices are per person and for the whole group and describes the package result, but adds little parameter-specific meaning 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 gives a clear verb and resource — searching tour packages that bundle round trip and hotel — and scopes it to city-to-destination searches with example destinations. It does not differentiate from the close sibling al_tours_cheapest, and the phrase 'cheapest package' per hotel may blur that 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 provides a concrete usage example ('a 3-night Kish tour for two from Tehran next week'), which gives clear context for selecting the tool. It offers no explicit when-not guidance or comparison to alternatives such as al_tours_cheapest.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_tours_cheapestCheapest tour per dayA
Read-onlyIdempotent

List the lowest tour price per person for 11 departure days around a date (5 before, 5 after), to pick the cheapest day.

Use before al_tours when the date is flexible. Prices are Toman per person for a tour of nights nights; a day without tours is missing. Then call al_tours for the chosen day.

NameRequiredDescriptionDefault
nightsNoNumber of nights, counted from the check-in date.
originNoDeparture city (Tehran, Isfahan, Mashhad and a few more).تهران
checkinYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
destinationYesDestination city in Persian or English: کیش, Mashhad, استانبول, Dubai.

TDQS

A4.5/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), but the description adds substantive behavior: prices are Toman per person, they are per-tour for `nights` nights, and days with no tours are omitted rather than zero-priced. That sparse-result disclosure is exactly the kind of trait an agent needs before interpreting the response.

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 short sentences, each carrying distinct information (scope, sequencing, price semantics), with the core behavior front-loaded. The only blemish is awkward mid-sentence line breaks that slightly hurt scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema, the description must convey the return shape, and it does: a per-day lowest price keyed to the 11-day window, in Toman per person, with missing days absent. It stops short of specifying ordering or whether a full day-by-day object is returned, which is a minor remaining gap for a tool with no 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%, so all four parameters are already documented in the schema, including the Gregorian/Jalali date rule and the `nights` counting convention. The description restates the nights basis and adds the per-person price framing but adds no new parameter syntax or constraints, 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 (list the lowest tour price per person) plus the exact scope: 11 departure days, 5 before and 5 after a given date. It also names the sibling al_tours as the contrasting tool, so an agent can distinguish it without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

Gives an explicit selection rule — 'Use before al_tours when the date is flexible' — and a follow-up rule — 'Then call al_tours for the chosen day.' Both the when-to-use condition and the alternative tool are named directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_trainsTrain ticketsA
Read-onlyIdempotent

Search train tickets between two Iranian cities on one day: company, class, times, price and seats left.

Use for "trains from Tehran to Mashhad on 1405-08-20". Prices are Toman per adult. seats_left 0 means sold out. class is the wagon name (stars, berths, meals) and class_code its type: S saloon seats, EC 4-berth compartment, EL 6-berth compartment, V special. Pass return_date for the way back. Call al_trains_cheapest to compare prices over the following days. While the rail suppliers are in their maintenance window (usually after midnight) the site answers with an error; try again in a few minutes.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
sortNoOrder of the results.departure
limitNoMaximum number of results.
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
passengersNoNumber of travellers; seats_left is for this group size.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
return_dateNoReturn day for a round trip (same formats as `date`); adds a `returning` list.
ticket_typeNofamily = mixed compartments; female or male = single-gender compartments (seat counts differ).family
wagon_classNoKeep only this class code from the results, e.g. EC (compartment), EL (6-berth), S (saloon), V.
only_availableNoHide sold-out trains.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare read-only and idempotent, and the description adds substantive behavior on top: prices are in Toman per adult, seats_left 0 means sold out, return_date adds a separate `returning` list, and suppliers error out during a post-midnight maintenance window so a retry in a few minutes is expected. That error-window warning is exactly the operational context annotations cannot carry.

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 trigger example, then behavioral caveats; almost every sentence carries new information. Slightly dense with parenthetical code lists, but nothing is padding.

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 10-parameter, output-schema-less tool, the description sufficiently covers return fields, currency units, sold-out semantics, and a known failure mode. It leaves sort/limit/passengers behavior to the schema, which handles them adequately.

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 every parameter including date formats, city codes, and enum values. The description adds only marginal semantics beyond that – the meaning of a zero seats_left and the `returning` output list – plus a restatement of the class codes. Baseline 3 fits.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search train tickets between two Iranian cities on one day') and enumerates what comes back: company, class, times, price, seats left. The sibling al_trains_cheapest is named as a distinct tool, so an agent can route without opening either 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?

Gives a concrete trigger example ('trains from Tehran to Mashhad on 1405-08-20') and an explicit alternative with its condition ('Call al_trains_cheapest to compare prices over the following days'). It does not address the non-rail siblings (al_buses, al_flights) or say when a rail search is the wrong choice, leaving some routing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

al_trains_cheapestCheapest train per dayA
Read-onlyIdempotent

List the lowest train price for each day from a start date, to pick the cheapest day to travel.

Use before al_trains when the date is flexible. Prices are Toman per adult; a missing day has no train.

NameRequiredDescriptionDefault
dateYesTravel date, Gregorian 2026-11-11 or Jalali 1405-08-20 (the year tells which).
daysNoHow many days to list, starting at `date`.
originYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.
destinationYesCity name in Persian or English (تهران, Mashhad) or its code (THR, MHD); al_cities lists them.

TDQS

A4.5/5.0
Behavior4/5

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

Beyond the annotations' safe, read-only profile, the description clarifies that prices are in Toman per adult and that a missing day means no train operates. It does not discuss price freshness or availability, but the added output semantics are useful and prevent misinterpretation.

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 compact and front-loaded with the tool's purpose, followed by workflow guidance and two important result-interpretation details. Every sentence earns its place without repeating schema-level constraints.

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 simple four-parameter lookup with complete schema descriptions and clear safety annotations, this supplies the information needed to select and invoke it correctly. It also covers the conceptual result shape, units, and empty-day meaning despite the absence of an 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%, including date formats, day ranges, and accepted city identifiers. The description's reference to a start date reinforces the schema but adds little parameter guidance beyond it, so the high-coverage 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?

The description gives a specific verb, resource, and scope: listing the lowest train price for each day from a start date. It also distinguishes the tool from al_trains by positioning it as the flexible-date, cheapest-day selection step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

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

It explicitly says to use this tool before al_trains when the travel date is flexible. This provides both a clear usage condition and the appropriate sibling tool for the subsequent search.

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. 14 tool updatesv0.1.2
    • First observedal_bus_seats
    • First observedal_buses
    • First observedal_buses_cheapest
    • First observedal_cities
    • First observedal_flights
    • First observedal_flights_cheapest
    • First observedal_flights_international
    • First observedal_hotels
    • First observedal_stay_detail
    • First observedal_stays
    • First observedal_tours
    • First observedal_tours_cheapest
    • First observedal_trains
    • First observedal_trains_cheapest

TDQS

A4.3/5.0

Scored across 14 tools

Disambiguation5/5

Each tool targets a distinct resource plus action, and the descriptions explicitly cross-reference alternatives (e.g. al_flights says use al_flights_international for abroad; al_stays vs al_hotels vs al_tours are clearly differentiated by lodging type). The _cheapest siblings are unambiguously tied to their base search tool by name and stated purpose, and al_bus_seats and al_stay_detail are unique detail endpoints.

Naming Consistency5/5

All tools follow a predictable al_<resource>[_qualifier] pattern, with qualifiers used consistently (_cheapest, _international, _detail, _seats). The only slight quirk is singular 'bus' in al_bus_seats vs plural al_buses, but this reflects a single bus and remains fully readable.

Tool Count5/5

14 tools is squarely in the well-scoped range, and each earns its place: a base search per vertical plus a flexible-date cheapest variant, a couple of detail endpoints, and one code-lookup helper. Nothing feels redundant or padded.

Completeness4/5

The surface covers all major verticals (trains, buses, domestic/international flights, hotels, holiday homes, tours) with search and cheapest-day variants, and booking is intentionally out of scope (redirect to alibaba.ir). Minor gaps remain: hotels have no detail endpoint analogous to al_stay_detail, and trains lack a seat-map equivalent to al_bus_seats.

Maintenance

ActivityMaintained
ResponsivenessSyncing

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to search hotels, flights, trains, and attractions via natural language through Fliggy FlyAI, returning structured travel results inside MCP-compatible clients.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search Iranian villas, cottages, and apartments, check nightly availability, calculate exact stay totals for dates and guests, and read reviews and host statistics. It is a read-only stdio MCP server with no login, booking, payment, or SMS endpoints.
    15
    122 PyPI
    2
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI agents to search Jabama stays, group tours, events and theater seats, and to fetch the exact night-by-night price for given dates and guests along with calendars, house rules, amenities, host reputation and reviews. Runs locally as a read-only server with no login, booking or payment.
    147 PyPI
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search and compare the cheapest flights, trains, buses, private taxis and hotels across Iran, including free seats, baggage allowances, refund rules and exact prices, for a single date or across weeks. All 22 tools are read-only and return compact structured JSON, so an agent can plan multi-mode trips and hotel stays without logging in or booking.
    22
    22
    120 PyPI
    2
    MIT