Skip to main content
Glama

🏡 otaghak-mcp: Otaghak MCP server for AI agents

Unofficial, read-only MCP server for Otaghak (اتاقک): let your AI agent find a place to stay in Iran. Search villas, cottages and apartments across Iran, check which nights are free, get the exact price for your dates and guests, and read reviews and host stats, all from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development · Related servers · Disclaimer · License


For AI agents

  • What: unofficial, read-only MCP server for Otaghak (اتاقک), an Iranian marketplace for villas, cottages and apartments. Queries work best in Persian, English slugs work too; prices are in Toman.

  • Install: claude mcp add otaghak -- uvx otaghak-mcp (stdio transport; needs Python 3.10+ and uv).

  • Auth: none, no API key. Optional OTAGHAK_MCP_PROXY (HTTP proxy, or a comma-separated list) if Otaghak blocks your network.

  • Access: read-only. No login, booking, payment or SMS codes, so no confirmation is needed before calling tools.

  • Tools: 15, all prefixed ot_*. Start with ot_find_place, then ot_search_rooms → ot_room or ot_room_calendar → ot_price_quote. For bargains use ot_deals.

  • Use when: finding a stay in Iran and getting the exact total for dates and guests, with reviews and host stats.

  • Do not use when: you need to book or pay (the user does that on otaghak.com), or want prices past the open calendar (end of the next Jalali month, at most 20 nights).

  • Output: compact JSON. Prices in Toman, dates Gregorian YYYY-MM-DD (check_out is the departure day), ratings 0-5. Pass the numeric room id between tools.

  • Machine-readable: server.json; catalog of all Iranian MCP servers: iran-mcp (TOOLS.md, servers.json, llms.txt).

Related MCP server: com.stayingapi/hotel-vacation-rental-mcp

Why

On Otaghak the price on a listing card is rarely what you pay: every night has its own price, weekends cost more, discounts change per night, extra guests cost extra per night, and calendars only open about a month ahead. Getting the real total for my dates and my group means clicking through calendars one room at a time. An agent with otaghak-mcp does the clicking:

You: We are 4 people, Ramsar, 20 to 23 October. How much is the "سوییسی لیلی" cottage in total?

Agent: calls ot_search_rooms(city=["ramsar"], name="لیلی") → ot_price_quote(room_id=2508916, check_in="2026-10-20", check_out="2026-10-23", guests=4)

Night

Price

Before discount

Tue 20 Oct

4,000,000

5,000,000

Wed 21 Oct

4,000,000

5,000,000

Thu 22 Oct

4,250,000

5,000,000

1 extra guest (3 nights)

980,000

1,200,000

Total to pay

13,230,000

The cottage includes 3 guests and takes at most 4, so the 4th person costs 400,000 a night (discounted too, at a slightly different rate than the nights). All three nights are free and bookable instantly. Want me to compare it with ot_similar_rooms?

Real tool output from 2026-10-04; prices change all the time. Prices are in Toman.

What it can do

  • 🔎 Search stays in a city, province or themed collection (beach, jungle, villa with pool, ...) for your dates and group, sorted by price, rating or discount

  • 🧮 Exact price for dates and guests: every night after discount, extra-guest charges, optional late checkout

  • 📅 Calendars: which nights are free, nightly prices, minimum and maximum stay, weekends and holidays

  • 🏠 Room details: rooms and beds, amenities, house rules, check-in times, cancellation policy, nearby shops, photos

  • ⭐ Quality: rating, six category scores, percent who recommend it, reviews with host replies, host response time and acceptance rate

  • 🏷️ Deals: last-second discounts and the most discounted stays

  • 🧭 Guides: destination guides, FAQ, blog articles and the site's rules (cancellation, refunds)

  • 🔒 Read-only by design: no login, no booking, no payment, no SMS codes

Quick start

You need uv.

claude mcp add otaghak -- uvx otaghak-mcp

Settings → Developer → Edit Config, then add:

{
  "mcpServers": {
    "otaghak": { "command": "uvx", "args": ["otaghak-mcp"] }
  }
}

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": {
    "otaghak": { "type": "stdio", "command": "uvx", "args": ["otaghak-mcp"] }
  }
}
codex mcp add otaghak -- uvx otaghak-mcp

Or in ~/.codex/config.toml:

[mcp_servers.otaghak]
command = "uvx"
args = ["otaghak-mcp"]

Add to ~/.gemini/settings.json:

{
  "mcpServers": {
    "otaghak": { "command": "uvx", "args": ["otaghak-mcp"] }
  }
}

Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.

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

Then just ask:

  • "Cheapest villa with a pool near Ramsar for 6 people next weekend?"

  • "Is room 2512254 free from 20 to 23 October, and what's the total for 5 guests?"

  • "Pet-friendly cottages in Gilan with a rating of 4 or more."

  • "Show the reviews and the host's response rate for room 2512254, then suggest similar rooms for the same dates."

  • "Which Iranian holidays fall in the next month, and is late checkout offered by this room?"

  • یک کلبه جنگلی در ماسال برای ۴ نفر، آخر هفته بعد، با رزرو آنی پیدا کن.

  • قیمت نهایی ویلای شماره ۲۵۱۲۲۵۴ برای ۵ نفر از ۲۰ تا ۲۳ اکتبر چقدر می‌شود؟

  • تخفیف‌دارترین اقامتگاه‌های شمال را نشان بده.

How it works

  AI agent  (Claude, Cursor, Copilot, ...)
      │
      │  MCP over stdio
      ▼
  otaghak-mcp  (runs on your machine)
      │
      │  HTTPS (REST + OData)
      └──────▶  core.otaghak.com, www.otaghak.com/blog

otaghak-mcp runs locally and calls the same public endpoints the otaghak.com website uses. There's no hosted server in between, no API key, and nothing about you is sent anywhere else.

Tools

Rooms are identified by numeric ids like 2512254 (the number in otaghak.com/room/2512254/), places by slugs like ramsar (city), mazandaran (province) or beach (collection).

Tool

What it does

ot_find_place

Place name → city / province slug; a room code → that room

ot_search_rooms

Stays in a city, province or collection for dates and guests, with filters and sorting

ot_search_filters

Filter codes (pool, parking, pets, beach or jungle area, ...), room types, price range, landmarks

ot_destinations

Popular cities and collections, and the cities of a collection

ot_deals

Last-second deals and the most discounted stays

Tool

What it does

ot_room

Details, amenities, rules, check-in/out times, cancellation policy, host, location, photos

ot_reviews

Rating, star histogram, category scores, percent who recommend, reviews with host replies

ot_similar_rooms

4-5 alternatives, re-priced and checked for your dates and guests; while the site's list is empty, a same-city, same-type search up to 1.5x the room's price (note says so)

ot_host

Host response time, response and acceptance rates, other rooms, newest reviews

Tool

What it does

ot_room_calendar

Day by day: free or booked, price, min/max nights, weekend, holiday, late checkout

ot_price_quote

Exact amount to pay for dates and guests, extra guests and late checkout included

ot_holidays

Iranian public holidays in a date range, with Jalali dates

ot_late_checkout

Whether a room offers late checkout, hours, price, and if it's open on your departure day

Tool

What it does

ot_help

Help-center FAQ, guest terms (booking, cancellation policies, refunds, wallet), host rules

ot_travel_guide

Destination guide, its FAQ, related search pages and blog articles

All 15 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, as on the site (1 Toman = 10 Rial). price_per_night is after discount. Without dates, prices are the room's undated starting price, not a quote.

  • The amount to pay is ot_price_quote → total: the nights after discount (the room page's payable amount), plus extra guests above the room's included guests (discounted like the nights), plus optional late checkout. Coupons and wallet credit need a login and are not included. Search results carry a stay_total estimate that can be a few Toman off; with dates, sort="cheapest" orders each page by it.

  • Dates are Gregorian YYYY-MM-DD and check_out is the departure day. No past dates, at most 20 nights, and hosts' calendars open only to the end of the next Jalali month; the tools say so clearly instead of returning an empty list. A Jalali date gets an error with its Gregorian twin.

  • Guests: each room includes base_guests in its price and takes up to max_guests. ot_price_quote checks the limit itself (the site's own search doesn't when you ask for a specific room).

  • Ratings are 0–5; null means not rated yet. Holiday flags are only published about 7 weeks ahead.

  • Location is approximate; the exact address and the host's phone come only after booking.

  • Persian queries match best (رامسر, کلبه), English slugs work too.

FAQ

otaghak-mcp is an unofficial MCP server for Otaghak: it exposes the public endpoints of otaghak.com as 15 read-only tools, so an agent can search stays and get exact prices. (Otaghak's own booking web service is for partners under contract; this is not it.)

Install it with uvx otaghak-mcp (see Quick start), then ask in Persian or English, for example "cheapest villa with a pool near Ramsar for 6 people next weekend, with the exact total".

It is unofficial and MIT licensed, so free to use. It is read-only: no login, no API key, no booking or payment, and it runs on your machine.

No, and that's deliberate. It has no login and never calls booking, payment, OTP/SMS, wallet, favorites or review endpoints. The agent finds the room and the exact price; you book on otaghak.com.

Hosts' calendars on Otaghak are open only to the end of the next Jalali month, and stays are limited to 20 nights. Outside that window the site has no prices, so the tools tell you the last bookable day instead.

No. It was tested from an Iranian home connection and through a Turkish exit, and both worked. Cloud servers outside Iran were not tested; if Otaghak blocks one, set OTAGHAK_MCP_PROXY.

The server retries a timeout, failed connection, 5xx or 429 up to twice with a short backoff. If it keeps failing, check your connection or set OTAGHAK_MCP_PROXY. Normal system proxy variables are ignored on purpose, because direct calls are the fastest. If Otaghak shows a bot-check page, install the optional browser fallback: pip install "otaghak-mcp[browser]" (or uvx --from "otaghak-mcp[browser]" otaghak-mcp), then run patchright install chromium.

Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.

npx @modelcontextprotocol/inspector uvx otaghak-mcp

Configuration

Variable

Default

Meaning

OTAGHAK_MCP_PROXY

unset

HTTP proxy for every request, e.g. http://user:pass@host:port. A comma-separated list is used one at a time: the next proxy takes over when one is blocked (403/429) or cannot connect

فارسی: سرور MCP اتاقک

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

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

  • مبلغ نهایی را با قیمت تک‌تک شب‌ها، هزینه نفر اضافه و تأخیر در تخلیه حساب می‌کند.

  • همه قیمت‌ها به تومان است و تاریخ‌ها میلادی (YYYY-MM-DD) هستند.

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

  • برای پیدا کردن آن در گوگل یا رجیستری MCP، «سرور MCP اتاقک» یا «otaghak mcp» را جستجو کنید.

  • کلیدواژه‌های مرتبط: اتاقک، رزرو ویلا، رزرو کلبه، اجاره ویلا شمال، اجاره کلبه جنگلی، اقامتگاه بوم‌گردی، اجاره روزانه ویلا، قیمت اقامتگاه، سرور MCP فارسی، هوش مصنوعی و رزرو اقامتگاه.

  • ابزارها (۱۵ ابزار با پیشوند ot_): جستجوی اقامتگاه، فیلترها، مقصدها، تخفیف‌ها، جزئیات اتاق، نظرات، میزبان، اتاق‌های مشابه، تقویم، قیمت دقیق، تعطیلات، تأخیر در تخلیه، راهنمای کمک و راهنمای سفر.

نصب در Claude Code:

claude mcp add otaghak -- uvx otaghak-mcp

بعد بپرسید: «ارزان‌ترین ویلای استخردار رامسر برای ۶ نفر از ۲۰ تا ۲۳ اکتبر چند تمام می‌شود؟»

Development

git clone https://github.com/sepehr071/otaghak-mcp && cd otaghak-mcp
uv sync
uv run python -m pytest            # offline, against recorded responses
uv run python -m pytest -m live    # real API
uv run ruff check .

Tools live in src/otaghak_mcp/search.py, room.py, pricing.py and info.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.

If this saves you clicks, a star helps others find it.

Disclaimer

Unofficial and not affiliated with or endorsed by Otaghak. It uses the public endpoints of the otaghak.com website, which can change without notice. Otaghak offers an official booking web service to partners under contract; this is not it. Please keep request rates reasonable.

Author

Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.

License

MIT

Available Tools

15 tools
ot_dealsDeals and discountsA
Read-onlyIdempotent

Current discounts: the home page's last-second deals and the most discounted stays (biggest percent first).

last_second rooms are site-wide tonight-style deals shown 14:00-23:50 Iran time with undated prices; they are left out when city is given. most_discounted lists rooms of the 'discounted' collection (in city if given) that have a discount, sorted by percent; with dates the prices are for that stay. Next: ot_price_quote for the exact total.

NameRequiredDescriptionDefault
cityNoCity slug, e.g. 'ramsar'. Default: whole site.
limitNoRooms per list.
guestsNoGuests, e.g. 4; smaller rooms are left out.
check_inNoArrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar).
check_outNoDeparture day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights).

TDQS

A4.1/5.0
Behavior4/5

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

The annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the description earns credit by adding the operational details those hints can't: the 14:00–23:50 Iran-time window, that last_second prices are undated, and that city-supplied calls silently drop that list. It stops short of describing result shape or any rate/refresh behavior.

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 tight sentences, front-loaded with what the tool returns, then the per-list caveats, then the sibling handoff. Dense but every clause carries information; only mild redundancy in the opening 'Current discounts:' framing.

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

Completeness4/5

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

With no output schema, the description must carry the return-value burden and largely does: two named lists, their membership rules, ordering, and the date-dependence of prices. Minor gaps remain, e.g. that `limit` applies per list and whether results can be empty for a city with no discounted inventory.

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 goes beyond it by explaining what `city` actually does to the result set (excludes last_second) and how dates change pricing (prices are for that stay vs undated), which the schema alone does not convey.

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

Purpose5/5

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

The description names a concrete resource and its two constituent lists ('last_second' deals and 'most_discounted' stays), plus the sort order (biggest percent first). An agent can tell exactly what comes back without opening any schema, and it distinguishes itself from ot_search_rooms/ot_search_filters by being a discounts view.

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 real conditional guidance — last_second is omitted when `city` is supplied, and dated queries change the price semantics — and routes the agent forward to ot_price_quote for totals. What's missing is when NOT to use this tool versus ot_search_rooms or ot_search_filters for a general availability search; usage is implied rather than contrasted.

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

ot_destinationsPopular destinations and collectionsA
Read-onlyIdempotent

Popular cities and collections (themed landing pages: discounted, jungle villas, villas with pool, ...).

Use when the user has no destination yet, or to find collection codes for ot_search_rooms collection. With collection, also lists the cities that collection covers (city slugs).

NameRequiredDescriptionDefault
collectionNoCollection code to list its cities, e.g. 'beach'.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the safety profile is covered. The description adds a genuine behavioral nuance beyond the schema: when `collection` is supplied, the response also lists the cities that collection covers (as city slugs), which changes what the caller should expect back.

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 plus a clause; the core purpose is front-loaded and every sentence carries actionable information (examples, trigger condition, sibling linkage). 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?

There is no output schema, so the description carries the burden of hinting at returns; it does this by noting the city-slug listing behavior. For a zero-required-param read tool this is nearly complete, though it could say more about the shape of the default (no-argument) response.

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

Parameters4/5

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

Schema coverage is 100% and the schema already documents `collection` with an example ('beach'), so baseline is 3. The description goes further by explaining the semantic effect of passing the parameter (it switches the tool to listing covered cities and yields slugs), adding meaning beyond the schema text.

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

Purpose4/5

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

States a specific resource ('popular cities and collections') and clarifies what collections are with concrete examples ('themed landing pages: discounted, jungle villas, villas with pool'). It does not explicitly differentiate itself from sibling discovery tools like ot_deals, ot_travel_guide, or ot_find_place, so it stops short of a 5.

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 clear triggering condition ('use when the user has no destination yet') and names the downstream consumer ('to find collection codes for ot_search_rooms `collection`'). It lacks an explicit when-not clause (e.g., what to use once a destination is known), which keeps it from a 5.

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

ot_find_placeFind place or room codeA
Read-onlyIdempotent

Turn a place name into the city / province slugs that ot_search_rooms needs, or a room code into its room.

Cities come with their listing count (undated). A province listings number is not a search count. Room names are not searchable here: use ot_search_rooms with name. Next: ot_search_rooms, or ot_room for a room hit.

NameRequiredDescriptionDefault
queryYesCity/province name (Persian or slug), e.g. 'رامسر', or a room code, e.g. '2508916'.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description adds real behavioral context beyond them: cities carry an undated listing count, a province listings number is not a search count, and room names are not queryable here.

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 and no wasted sentences; the caveats each carry distinct meaning. It is telegraphic and slightly dense, but nothing is redundant.

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

Completeness4/5

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

With no output schema, the description does describe what comes back (city with listing count, province listings, room from a code) and flags the two input modes. Complete enough for a single-param resolver, though return structure could be spelled out a touch more.

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

Parameters4/5

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

Schema coverage is 100% and the single query param is fully documented with format and examples, so the baseline is 3. The description adds the dual-mode meaning (place name vs room code) and what each resolves to, going slightly beyond the schema.

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

Purpose5/5

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

States a specific verb and resource: resolving a place name into city/province slugs, or a room code into its room. It distinguishes itself from siblings by naming ot_search_rooms and ot_room as the tools that 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?

Explicit routing is present: 'Room names are not searchable here: use ot_search_rooms with name' gives a clear when-not, and 'Next: ot_search_rooms, or ot_room for a room hit' names the alternatives and the condition selecting each.

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

ot_helpHelp: rules and FAQA
Read-onlyIdempotent

Read Otaghak's help center: the FAQ, or the guest terms (booking and cancellation rules, the five cancellation policies, refunds, wallet, check-in rules), host rules or quality policy.

Without query you get every FAQ question (short answers) or the section titles of a page with a preview; with query the matching FAQ items or page paragraphs. A room's own cancellation policy is in ot_room.

NameRequiredDescriptionDefault
queryNoPersian words to look for, e.g. 'لغو', 'کیف پول'.
topicNofaq, terms (booking, cancellation policies, refunds, wallet, stay rules), host_rules, quality_policy.faq

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, and open-world, so the safety profile is covered. The description adds the genuinely useful behavioral detail that no-query returns all questions/section titles with previews while query returns matching items or paragraphs — a real difference in return shape the annotations do not convey.

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, zero filler. The domain list is front-loaded, the query behavior is explained next, and the sibling redirect closes with no wasted words.

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 two-parameter read-only content tool with no output schema and full schema coverage, the description is complete: it covers scope, both parameter modes, the enum topics, and the one ambiguous case (room-level policy) by naming the correct alternative.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes further: it explains the query parameter's effect on result granularity (whole list vs. matching paragraphs) and names the topic domains in prose, reinforcing the enum. It adds semantic value beyond the schema's terse field descriptions.

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 (Read) and resource (Otaghak's help center), and enumerates the content domains (FAQ, guest terms, host rules, quality policy). It also explicitly distinguishes itself from ot_room for room-specific cancellation policies, which no other sibling covers.

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?

Explains the query/no-query branching clearly, telling the agent when to search versus when to list whole sections, and routes room-specific policy lookups to ot_room. It does not, however, say when to choose this over ot_travel_guide or ot_reviews, which are plausible adjacent content siblings.

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

ot_holidaysHolidays and weekdaysA
Read-onlyIdempotent

List Iranian public holidays (Fridays included) in a date range, with Jalali dates and weekdays.

Holiday flags are filled only about 7 weeks ahead: later days show no holidays, which means unknown, not working days. Use to plan around long weekends; weekend nights (Wed, Thu) and holidays usually cost more (see ot_room_calendar).

NameRequiredDescriptionDefault
endYesLast day (inclusive), e.g. '2026-12-31'; max a year after start.
startYesFirst day YYYY-MM-DD, e.g. '2026-10-20'.

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), and the description adds genuinely non-obvious behavior: holiday flags are only populated ~7 weeks ahead, and blank days mean 'unknown, not working days'. It also discloses the return content (Jalali dates, weekdays) with no output schema present.

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

Conciseness5/5

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

Three tight sentences, front-loaded with what the tool returns, then the critical data-freshness caveat, then the usage/pricing hook. 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?

For a two-parameter read-only lookup with no output schema, the description supplies everything needed: what comes back, the reliability limit on the holiday flags, and where to go for the pricing consequence. Nothing an agent needs to call it correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both date parameters, their formats, and the one-year maximum span are already documented in the schema. The description adds no format or constraint detail beyond that, 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 Iranian public holidays') with scope ('in a date range') and output content ('with Jalali dates and weekdays'). It distinguishes itself from the sibling ot_room_calendar by cross-referencing it for pricing context rather than duplicating it.

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 to plan around long weekends' and points to ot_room_calendar for the price implication of weekend nights and holidays. No explicit when-not-to-use or exclusion of other date tools, 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.

ot_hostHost profileA
Read-onlyIdempotent

Check a host: response time, response and acceptance rates, member since, active rooms (undated starting prices) and the newest guest reviews across all their rooms.

Pass host_id, or room_id to find the room's host. Use to judge whether a host is reliable or to see their other places.

NameRequiredDescriptionDefault
host_idNoHost id, e.g. 1626813.
room_idNoOr a room id, to find its host.
full_textNoReturn long texts in full instead of clipped.
rooms_limitNoHost's rooms to list.
reviews_limitNoNewest reviews across the host's rooms.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover read-only, idempotent, open-world and non-destructive semantics, so the burden is lighter. The description nonetheless adds real behavioral context beyond them: prices are 'undated starting prices,' reviews are the 'newest across all their rooms,' and long text is clipped unless requested. Auth/rate-limit behavior is not discussed, keeping it out of 5 territory.

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 sentences: the return payload is front-loaded, then the invocation modes and intended use. No filler, no repetition of the title.

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 characterize the return, and it does so explicitly by listing the profile fields. Combined with the input-mode guidance and the clipping caveat, an agent has everything needed to call it correctly.

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 five parameters. The description clarifies the host_id/room_id input-mode choice, but adds nothing for full_text, rooms_limit or reviews_limit. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb ('Check') and resource ('a host') and enumerates exactly what the profile contains: response time, response/acceptance rates, member since, active rooms, newest reviews. An agent can distinguish this from ot_room or ot_reviews 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 Guidelines4/5

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

Explicitly tells the agent how to invoke it ('Pass host_id, or room_id to find the room's host') and names the intent ('judge whether a host is reliable or to see their other places'). It does not, however, explicitly name a sibling alternative such as ot_reviews for pure review retrieval, so it falls just 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.

ot_late_checkoutLate checkoutA
Read-onlyIdempotent

Check whether a room offers late checkout, for how many hours and at what price (Toman, a unit not confirmed on the site), and with check_out whether it can be booked on that departure day (offered rooms are often closed for it on a given day).

Use when the user wants to leave later than the check-out time. ot_price_quote adds it to a total with late_checkout_hours.

NameRequiredDescriptionDefault
room_idYesRoom id (code), e.g. 2512254.
check_outNoDeparture day to check, e.g. '2026-10-23'.

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 bar is lower; the description still adds real behavioral context: the price unit is Toman and explicitly flagged as unverified, and it warns that offered rooms are often closed for late checkout on a given day. That quirk is genuinely useful and not derivable from structured fields.

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

Conciseness4/5

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

Front-loaded with the core purpose, then usage. The second sentence is a bit clause-heavy ('with check_out whether it can be booked on that departure day') but every element carries information and nothing is redundant 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 no output schema, the description does the work of describing the return surface (offered or not, hours, price, bookability), which is what an agent needs. Minor gaps remain, such as how an 'unavailable' result is signaled, but it is nearly complete for a 2-parameter read 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 description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining what check_out actually does behaviorally (determines whether late checkout can be booked on that departure day) rather than merely restating 'departure day to check'.

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 (check whether a room offers late checkout) and enumerates the exact facets returned: availability, number of hours, price, and bookability on a given departure day. This is clearly distinguished from siblings like ot_price_quote, which it explicitly frames as a complementary tool.

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 triggering condition ('Use when the user wants to leave later than the check-out time') and names the related tool plus the parameter that connects them ('ot_price_quote adds it to a total with late_checkout_hours'). An agent knows both when to call this and how it chains.

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

ot_price_quoteExact stay priceA
Read-onlyIdempotent

Get the amount to pay (Toman) for a room, dates and guests: nights_total (the room page's payable amount for the base guests), the extra-guest charge, optional late checkout, and the total. nightly is the calendar breakdown (each discounted night is rounded to 1,000, so it can add up to a little more than nights_total; price_before_discount is absent when there is no discount).

Also checks that every night is free, the stay length is allowed and the room takes that many guests (available=false with a reason otherwise). Late checkout that cannot be booked keeps the quote, with late_checkout.available=false. Use before the user books on otaghak.com.

NameRequiredDescriptionDefault
guestsYesGuests, e.g. 4.
room_idYesRoom id (code), e.g. 2512254.
check_inYesArrival day YYYY-MM-DD, e.g. '2026-10-20'.
check_outYesDeparture day, e.g. '2026-10-23' (max 20 nights).
late_checkout_hoursNoLate checkout hours to add (offered rooms), e.g. 4.

TDQS

A4.6/5.0
Behavior5/5

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

With annotations already covering readOnly/idempotent/non-destructive, the description adds substantial behavior: nightly rounding to 1,000, price_before_discount omitted when no discount, available=false plus reason on failed checks, and a partial-success path where unbookable late checkout keeps the quote with late_checkout.available=false.

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 payoff (what amount is returned and its parts) then covers edge cases; every sentence carries information. It is dense with parentheticals and slightly long, keeping it just shy 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?

No output schema exists, so the description must explain return values, and it does so thoroughly (field names, rounding behavior, absent fields, failure shapes). For a 5-parameter quote tool this is complete enough to invoke correctly.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: nights_total is for the base guests, and late_checkout_hours is treated as optional and may silently return available=false. It does not add format or boundary detail beyond the schema.

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

Purpose5/5

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

States a specific verb+resource: 'Get the amount to pay (Toman) for a room, dates and guests', and enumerates the returned components (nights_total, extra-guest charge, late checkout, total). Its combined pricing-plus-availability scope functionally distinguishes it from siblings like ot_room_calendar and ot_search_rooms.

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 clear usage trigger: 'Use before the user books on otaghak.com', establishing it as a pre-booking validation/quote step. It does not, however, name alternatives (e.g. why not ot_room or ot_search_rooms) or state when-not to use it.

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

ot_reviewsRoom reviews and ratingA
Read-onlyIdempotent

Get a room's rating (0-5), star histogram, six category scores, percent of guests who recommend it, and written reviews, newest first (with host replies).

rating is null and reviews empty when the room has no ratings yet (new rooms). Use after ot_room or ot_search_rooms to judge quality; ot_host has reviews across all of a host's rooms.

NameRequiredDescriptionDefault
pageNoZero-based page.
limitNoReviews per page.
room_idYesRoom id (code), e.g. 2512254.
full_textNoReturn long texts in full instead of clipped.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral context: ordering (newest first), inclusion of host replies, and the edge case where rating is null and reviews are empty for new rooms — a detail not in annotations or schema.

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

Conciseness5/5

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

Two sentences, front-loaded with the returned payload and followed by the caveat and routing guidance. 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?

There is no output schema, so the description must convey the return shape — and it does, listing rating, histogram, category scores, recommendation percent, and reviews. Combined with the edge-case note, 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.

Parameters3/5

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

Schema description coverage is 100%, so page, limit, room_id, and full_text are all documented in the schema itself (including clipping behavior tied to full_text). The description adds no parameter-level syntax or format detail, 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 and resource — retrieves a room's rating, star histogram, category scores, recommendation percent, and written reviews — and implicitly distinguishes itself from ot_host, which covers reviews across all of a host's rooms.

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 explicit timing ('Use after ot_room or ot_search_rooms to judge quality') and names the alternative sibling (ot_host) with the condition that selects it. An agent can route correctly without opening either schema.

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

ot_roomRoom detailsA
Read-onlyIdempotent

Get one room: description, capacity, rooms and beds, amenities, house rules, check-in/out times, cancellation policy, host, nearby places, approximate location, photos and nightly price.

With check_in/check_out the price is the average night for those dates, even when they are booked (ot_price_quote or ot_room_calendar tells whether they are free); without, an undated starting price. instant_on_some_nights is the room-level flag: instant booking can differ per night, so for given dates read instant in ot_price_quote or ot_room_calendar. Use after ot_search_rooms or ot_find_place. Next: ot_price_quote (exact total), ot_room_calendar (free nights), ot_reviews, ot_host (host response and acceptance rates), ot_similar_rooms.

NameRequiredDescriptionDefault
room_idYesRoom id (code), e.g. 2512254.
check_inNoArrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar).
check_outNoDeparture day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights).
full_textNoReturn long texts in full instead of clipped.
max_photosNoPhoto URLs to return.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered. The description adds non-obvious behavior the schema does not: the nightly price is an average for the given dates even when those dates are booked, and instant_on_some_nights is only a room-level flag whose per-night truth lives in ot_price_quote/ot_room_calendar. That is real disclosure beyond structured fields.

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

Conciseness4/5

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

Field list is front-loaded and each sentence carries information, but the middle paragraph is long and parenthetically dense, requiring a careful read. Slightly more compact phrasing would preserve all the value.

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

Completeness4/5

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

With no output schema, the description does the work of describing return contents by enumerating the returned fields, which is strong. It leaves minor gaps such as how clipping interacts with full_text and how approximate location is expressed, but an agent can call this 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 the baseline is 3, but the description goes further by explaining what check_in/check_out actually change (date-specific average price vs. undated starting price) and that they do not indicate availability. That is meaning beyond the schema's format hints.

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 ('Get one room') plus the resource and enumerates the exact payload it returns (description, capacity, beds, amenities, house rules, price, etc.). That is far more than a restatement of the title and lets an agent know precisely what a single-room fetch yields.

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 states prerequisites ('Use after ot_search_rooms or ot_find_place') and names the correct follow-on tools for each intent (ot_price_quote for exact total, ot_room_calendar for free nights, ot_reviews, ot_host, ot_similar_rooms). Both when-to-use and what-to-use-next are covered.

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

ot_room_calendarRoom calendarA
Read-onlyIdempotent

Get a room's calendar day by day: nightly price after and before discount (Toman), free or booked, instant booking, min and max nights when arriving that day, weekend, public holiday, late checkout.

A night is priced on its arrival day. Absent keys: price_before_discount = no discount, instant / weekend / holiday / late_checkout = no. Use to find free dates, cheap nights or allowed stay lengths. Next: ot_price_quote for a stay.

NameRequiredDescriptionDefault
endNoLast day (inclusive), e.g. '2026-11-20'. Default: start + 30 days.
startNoFirst day YYYY-MM-DD, e.g. '2026-10-20'. Default: today.
room_idYesRoom id (code), e.g. 2512254.

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/openWorld, so the safety profile is covered. The description adds real behavioral semantics beyond them: pricing is anchored to the arrival day, and absent keys have defined defaults (no discount, instant/weekend/holiday/late_checkout = no), which is exactly the kind of context an agent needs to interpret 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?

Front-loads the core purpose and then compresses the return fields into a dense list; each clause (absent-key defaults, next step) carries information. The telegraphic style is slightly terse but not padded, so 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 no output schema, the description does the work of describing the return payload field by field and explains how missing keys should be read, which is essential for a calendar-dump tool. Coverage is strong, though the encoding of 'free or booked' and the min/max nights fields could be spelled out a bit more.

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 start/end/room_id defaults are already documented in the schema, establishing a baseline of 3. The description's 'A night is priced on its arrival day' helps interpret the day-keyed response, but adds no syntax or format detail for the individual parameters themselves.

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

Purpose5/5

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

States a specific verb+resource+granularity ('Get a room's calendar day by day') and enumerates exactly what each day contains (price before/after discount, free/booked, instant booking, min/max nights, weekend, holiday, late checkout). This is clearly distinguishable from siblings like ot_room or ot_price_quote, which are routed to 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?

Gives concrete use cases ('find free dates, cheap nights or allowed stay lengths') and names the natural follow-up tool ('Next: ot_price_quote for a stay'), which routes the agent well. It does not state when NOT to use this tool or contrast it with ot_room, so it stops short of explicit exclusion guidance.

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

ot_search_filtersSearch filter codesA
Read-onlyIdempotent

List the search filters of a city, province or collection (or the whole site) with the codes ot_search_rooms takes.

Returns the nightly price range (Toman), room types (ids for room_types), filter codes for filters (pool, jacuzzi, parking, heating, pets, parties, beach / jungle area, ...), and for a city its districts and landmarks (district_id). Use when the user asks for an amenity, a rule, a room type or a place near a landmark.

NameRequiredDescriptionDefault
cityNoCity slug, e.g. 'ramsar'; also returns its districts.
provinceNoProvince slug, e.g. 'mazandaran'.
collectionNoCollection code, e.g. 'beach'.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds real behavioral value by enumerating what is returned (price range in Toman, room type ids, filter codes, districts/landmarks), which is important since no output schema exists. It does not mention auth or rate limits, 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.

Conciseness4/5

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

Two sentences that are front-loaded with the core action and scope, then the return contents and usage trigger. Slightly dense, but every clause carries information an agent needs; 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?

With no output schema, the description correctly compensates by describing the return payload. Combined with annotations that cover the read-only/idempotent profile and a fully documented schema, the definition is complete enough to call correctly, though it omits response shape/pagination detail.

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 each of the three optional params is already documented with slug examples and the extra data it returns. The description mostly restates that scope without adding syntax or format detail beyond the schema, 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?

The description gives a specific verb ('List') and resource ('search filters'), states the scope (city, province, collection, or whole site), and explicitly frames the tool as the code-lookup companion to ot_search_rooms. An agent can distinguish it from ot_search_rooms and ot_destinations without opening any schema.

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

Usage Guidelines4/5

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

'Use when the user asks for an amenity, a rule, a room type or a place near a landmark' gives concrete triggering contexts, and naming ot_search_rooms as the consumer of these codes implies the workflow. There is no explicit when-not-to-use statement or exclusion, but the intended usage is unambiguous.

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

ot_search_roomsSearch staysA
Read-onlyIdempotent

Search Otaghak stays (villas, cottages, apartments, eco-lodges) in a city, province or collection.

With check_in/check_out every room is available on those dates and carries the stay price: price_per_night (average after discount) and stay_total for guests (incl. extra-guest charges; estimate, can be a few Toman off). Without dates prices are undated starting prices. Get slugs from ot_find_place, filter codes from ot_search_filters. Next: ot_room for details, ot_price_quote for the exact total, ot_room_calendar for other dates.

NameRequiredDescriptionDefault
cityNoCity slugs from ot_find_place, e.g. ['ramsar'] (any of them).
nameNoRoom name words, e.g. 'نرگس'.
pageNoZero-based page.
sortNoOrder; with dates, cheapest re-sorts each page by stay_total.recommended
limitNoRooms per page.
primeNoOnly 'prime' rooms.
guestsNoGuests, e.g. 4; smaller rooms are left out.
filtersNoCodes from ot_search_filters exactly as returned, e.g. ['ruleValues=10101|10103|10102'] (pets). All must match.
instantNoOnly instant booking.
bedroomsNoMinimum bedrooms, e.g. 2.
check_inNoArrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar).
city_tagNoCity theme slug with `city`, e.g. 'cottage' (ot_travel_guide).
provinceNoProvince slug, e.g. 'mazandaran'.
check_outNoDeparture day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights).
max_priceNoMax nightly Toman after discount, e.g. 8000000.
min_priceNoMin nightly Toman after discount, e.g. 3000000.
collectionNoCollection code from ot_destinations, e.g. 'beach', 'villapool'.
min_ratingNoMinimum rating.
rent_typesNoRent type.
room_typesNoRoom type ids from ot_search_filters, e.g. [138] villa.
district_idNoLandmark district id from ot_search_filters, with `city`, e.g. 230.
include_nearbyNoAlso rooms around the city.

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive, so safety is covered. The description adds real behavioral context beyond that: with dates every room is available and priced (price_per_night as average after discount, stay_total including extra-guest charges), and it honestly caveats that the total is an estimate that 'can be a few Toman off'. It does not describe pagination behavior, hence 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.

Conciseness5/5

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

Two short paragraphs, front-loaded with what the tool does, then the pricing semantics, then the cross-tool routing. No filler sentences; every clause carries either scope, behavior, or navigation 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?

For a 22-parameter, zero-required search tool with no output schema, the description covers the essential ambiguities: date-dependent pricing, guest-based filtering, and which sibling to call for detail or exact totals. It stops short of describing the returned result shape (list vs. envelopes, pagination signals), which a first-time caller would still have to infer.

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 goes beyond the schema by explaining where parameter values come from (city slugs via ot_find_place, filters/room_types/district_id via ot_search_filters, collection via ot_destinations) and by explaining how dates change the meaning of returned prices for the guests parameter.

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 first sentence names a specific verb and resource ('Search Otaghak stays') and enumerates the scope (villas, cottages, apartments, eco-lodges) across city, province or collection. It is immediately distinguishable from sibling tools like ot_room (details) and ot_find_place (slug lookup).

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 prerequisites are given ('Get slugs from ot_find_place, filter codes from ot_search_filters') and explicit follow-ups are routed ('Next: ot_room for details, ot_price_quote for the exact total, ot_room_calendar for other dates'). It also states the condition that changes behavior: providing check_in/check_out vs. omitting them.

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

ot_similar_roomsSimilar roomsA
Read-onlyIdempotent

Get 4-5 alternatives to a room (same city and type), as the room page shows them (or, while that list is empty upstream, a search of the room's city and type up to 1.5x its price; note says so).

Without dates prices are undated starting prices (not tonight's). With check_in/check_out the rooms are re-priced for that stay; rooms that are booked or too small for guests are listed in not_available. Use when the user's room is full or too expensive. Next: ot_room, ot_price_quote.

NameRequiredDescriptionDefault
guestsNoGuests, e.g. 4; smaller rooms are left out.
room_idYesRoom id (code), e.g. 2512254.
check_inNoArrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar).
check_outNoDeparture day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights).

TDQS

A4.5/5.0
Behavior5/5

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

Adds behavior well beyond the annotations: the upstream-empty fallback (search up to 1.5x price, flagged in `note`), the pricing semantics (undated starting prices without dates, re-priced with dates), and the not_available handling for booked/too-small rooms. Annotations only cover the safety profile, so this is genuinely additive.

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 and scoped follow-ups (pricing, availability, usage) in a tight four-sentence block. The first sentence's nested parenthetical is slightly dense but not wasteful.

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-format burden and does name key fields (not_available, `note`). The structure of the primary alternatives list itself is left implicit, a minor gap for a no-output-schema 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 baseline is 3, but the description adds real semantics: `guests` determines which rooms land in not_available rather than merely filtering, and check_in/check_out change pricing versus the undated starting prices. It doesn't clarify date-range limits beyond what the schema already says.

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: 'Get 4-5 alternatives to a room (same city and type)', plus the fallback scope while the upstream list is empty. An agent can distinguish this anchored-to-a-room lookup from the broader ot_search_rooms from the text alone.

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 clear trigger ('Use when the user's room is full or too expensive') and names follow-on tools ('Next: ot_room, ot_price_quote'). It stops short of an explicit when-not or a contrast against ot_search_rooms, so it falls just below the top band.

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

ot_travel_guideDestination travel guideA
Read-onlyIdempotent

Get the site's travel guide for a destination: guide text, the destination's FAQ (best season, sights, prices), related search pages (city themes such as beach, cottage, apartment with listing counts) and matching blog articles (restaurants, sights, souvenirs).

Use when the user asks what a place is like or what to do there. City theme slugs from related_pages go to ot_search_rooms city_tag.

NameRequiredDescriptionDefault
kindNoWhat `place` is.city
placeYesCity, province or collection slug, e.g. 'ramsar', 'beach'.
full_textNoReturn long texts in full instead of clipped.
max_charsNoMax characters of the guide text.
blog_queryNoBlog search words, e.g. 'رستوران رامسر'. Default: place name.

TDQS

A3.9/5.0
Behavior3/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 useful composition context (what data areas the guide aggregates) but doesn't disclose clipping behavior or defaults, which full_text and max_chars imply but don't explain.

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 verb and the enumeration of return content, then a clear when-to-use block. The parenthetical examples (beach, cottage, apartment) and blog subtopics add length but are informative rather than 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?

A read-only aggregation tool with a fully documented schema; the description covers purpose, trigger, contents, and one cross-tool chaining case. Return format details are appropriately left to the schema/annotations, though the clipping behavior when full_text is false could be spelled out.

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 what place/kind mean and the max_chars clipping behavior via full_text. The description adds the cross-tool hint that related_pages slugs map to ot_search_rooms `city_tag`, but no additional parameter syntax or format detail beyond the schema.

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

Purpose5/5

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

States a specific verb (get) and resource (travel guide for a destination) and enumerates the return contents (guide text, FAQ, related search pages, blog articles). This distinguishes it from siblings like ot_destinations or ot_find_place, which locate destinations rather than describe them.

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 gives the trigger condition ('when the user asks what a place is like or what to do there') and a concrete chaining instruction routing theme slugs to ot_search_rooms `city_tag`. No exclusion guidance for other guide-like siblings, but the when-to-use is clear.

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. 15 tool updatesv0.2.0
    • Changedot_deals13 fields changed
      • changedInput schema / properties / check_in / description
        Previous value: -"Arrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month."New value: +"Arrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar)."
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in."New value: +"Departure day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights)."
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • changedInput schema / properties / city / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / city / description
        Previous value: -"City slug to find its most discounted stays, e.g. 'ramsar'. Default: the whole site."New value: +"City slug, e.g. 'ramsar'. Default: whole site."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • changedInput schema / properties / guests / description
        Previous value: -"Number of guests, e.g. 4. Rooms that cannot take that many are left out."New value: +"Guests, e.g. 4; smaller rooms are left out."
      • removedInput schema / properties / guests / title
        Removed value: -"Guests"
      • changedInput schema / properties / limit / default
        Previous value: -10New value: +8
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"ot_dealsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_dealsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_destinations5 fields changed
      • changedInput schema / properties / collection / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / collection / description
        Previous value: -"Collection code to list its cities, e.g. 'beach', 'jungle', 'villa-north-iran', 'lastsecond'."New value: +"Collection code to list its cities, e.g. 'beach'."
      • removedInput schema / properties / collection / title
        Removed value: -"Collection"
      • removedInput schema / title
        Removed value: -"ot_destinationsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_destinationsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_find_place4 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"City or province name in Persian or as an English slug, e.g. 'رامسر', 'ramsar', 'مازندران', or a numeric room code, e.g. '2508916'."New value: +"City/province name (Persian or slug), e.g. 'رامسر', or a room code, e.g. '2508916'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"ot_find_placeArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_find_placeDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_help6 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Words to look for, Persian works best, e.g. 'لغو' (cancellation) or 'کیف پول' (wallet)."New value: +"Persian words to look for, e.g. 'لغو', 'کیف پول'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / topic / description
        Previous value: -"faq: the help-center FAQ; terms: guest terms of use (booking, cancellation policies, refunds, wallet, stay rules); host_rules; quality_policy."New value: +"faq, terms (booking, cancellation policies, refunds, wallet, stay rules), host_rules, quality_policy."
      • removedInput schema / properties / topic / title
        Removed value: -"Topic"
      • removedInput schema / title
        Removed value: -"ot_helpArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_helpDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_holidays6 fields changed
      • changedInput schema / properties / end / description
        Previous value: -"Last day (inclusive), e.g. '2026-12-31'. At most a year after start."New value: +"Last day (inclusive), e.g. '2026-12-31'; max a year after start."
      • removedInput schema / properties / end / title
        Removed value: -"End"
      • changedInput schema / properties / start / description
        Previous value: -"First day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'."New value: +"First day YYYY-MM-DD, e.g. '2026-10-20'."
      • removedInput schema / properties / start / title
        Removed value: -"Start"
      • removedInput schema / title
        Removed value: -"ot_holidaysArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_holidaysDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_host11 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts in full instead of clipped.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / host_id / description
        Previous value: -"Host (user) id, e.g. 1626813."New value: +"Host id, e.g. 1626813."
      • removedInput schema / properties / host_id / title
        Removed value: -"Host Id"
      • changedInput schema / properties / reviews_limit / default
        Previous value: -5New value: +3
      • removedInput schema / properties / reviews_limit / title
        Removed value: -"Reviews Limit"
      • changedInput schema / properties / room_id / description
        Previous value: -"Or a room id to look up its host, e.g. 2512254."New value: +"Or a room id, to find its host."
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • changedInput schema / properties / rooms_limit / default
        Previous value: -10New value: +6
      • removedInput schema / properties / rooms_limit / title
        Removed value: -"Rooms Limit"
      • removedInput schema / title
        Removed value: -"ot_hostArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_hostDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_late_checkout5 fields changed
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure day to check, Gregorian YYYY-MM-DD, e.g. '2026-10-23'."New value: +"Departure day to check, e.g. '2026-10-23'."
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • removedInput schema / title
        Removed value: -"ot_late_checkoutArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_late_checkoutDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_price_quote11 fields changed
      • changedInput schema / properties / check_in / description
        Previous value: -"Arrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'."New value: +"Arrival day YYYY-MM-DD, e.g. '2026-10-20'."
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure day, e.g. '2026-10-23'. At most 20 nights."New value: +"Departure day, e.g. '2026-10-23' (max 20 nights)."
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • changedInput schema / properties / guests / description
        Previous value: -"Number of guests, e.g. 4."New value: +"Guests, e.g. 4."
      • removedInput schema / properties / guests / title
        Removed value: -"Guests"
      • changedInput schema / properties / late_checkout_hours / description
        Previous value: -"Late checkout hours to add (offered rooms only, usually 4), e.g. 4."New value: +"Late checkout hours to add (offered rooms), e.g. 4."
      • removedInput schema / properties / late_checkout_hours / title
        Removed value: -"Late Checkout Hours"
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • removedInput schema / title
        Removed value: -"ot_price_quoteArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_price_quoteDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_reviews8 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts in full instead of clipped.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / limit / default
        Previous value: -10New value: +5
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / page / description
        Previous value: -"Zero-based page number."New value: +"Zero-based page."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • removedInput schema / title
        Removed value: -"ot_reviewsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_reviewsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_room9 fields changed
      • changedInput schema / properties / check_in / description
        Previous value: -"Arrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month."New value: +"Arrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar)."
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in."New value: +"Departure day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights)."
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts in full instead of clipped.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / max_photos / title
        Removed value: -"Max Photos"
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • removedInput schema / title
        Removed value: -"ot_roomArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_roomDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_room_calendar7 fields changed
      • changedInput schema / properties / end / description
        Previous value: -"Last day (inclusive), e.g. '2026-11-20'. Default: 30 days after start. Days past the open calendar (end of next Jalali month) are not returned."New value: +"Last day (inclusive), e.g. '2026-11-20'. Default: start + 30 days."
      • removedInput schema / properties / end / title
        Removed value: -"End"
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • changedInput schema / properties / start / description
        Previous value: -"First day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Default: today."New value: +"First day YYYY-MM-DD, e.g. '2026-10-20'. Default: today."
      • removedInput schema / properties / start / title
        Removed value: -"Start"
      • removedInput schema / title
        Removed value: -"ot_room_calendarArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_room_calendarDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_search_filters9 fields changed
      • changedInput schema / properties / city / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / city / description
        Previous value: -"City slug, e.g. 'ramsar'. Also returns its districts (landmarks)."New value: +"City slug, e.g. 'ramsar'; also returns its districts."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • changedInput schema / properties / collection / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / collection / title
        Removed value: -"Collection"
      • changedInput schema / properties / province / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / province / title
        Removed value: -"Province"
      • removedInput schema / title
        Removed value: -"ot_search_filtersArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_search_filtersDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_search_rooms48 fields changed
      • removedInput schema / properties / bedrooms / title
        Removed value: -"Bedrooms"
      • changedInput schema / properties / check_in / description
        Previous value: -"Arrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month."New value: +"Arrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar)."
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in."New value: +"Departure day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights)."
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • changedInput schema / properties / city / anyOf
        Previous value: -[
        -  {
        -    "items": {
        -      "description": "Slug (letters, digits, -).",
        -      "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -      "type": "string"
        -    },
        -    "maxItems": 5,
        -    "type": "array"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "items": {
        +      "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +      "type": "string"
        +    },
        +    "maxItems": 5,
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / city / description
        Previous value: -"City slugs from ot_find_place, e.g. ['ramsar'] or ['ramsar', 'chalus'] (any of them)."New value: +"City slugs from ot_find_place, e.g. ['ramsar'] (any of them)."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • changedInput schema / properties / city_tag / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / city_tag / description
        Previous value: -"City theme page slug with `city`, e.g. 'beach' or 'cottage' (from ot_travel_guide related pages)."New value: +"City theme slug with `city`, e.g. 'cottage' (ot_travel_guide)."
      • removedInput schema / properties / city_tag / title
        Removed value: -"City Tag"
      • changedInput schema / properties / collection / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / collection / description
        Previous value: -"Collection (landing) code from ot_destinations, e.g. 'beach', 'jungle', 'villapool', 'discounted', 'lastsecond'."New value: +"Collection code from ot_destinations, e.g. 'beach', 'villapool'."
      • removedInput schema / properties / collection / title
        Removed value: -"Collection"
      • changedInput schema / properties / district_id / description
        Previous value: -"District id (near a landmark) from ot_search_filters, used with `city`, e.g. 230."New value: +"Landmark district id from ot_search_filters, with `city`, e.g. 230."
      • removedInput schema / properties / district_id / title
        Removed value: -"District Id"
      • changedInput schema / properties / filters / description
        Previous value: -"Amenity, rule, region and feature codes from ot_search_filters, exactly as returned, e.g. ['attributeValues=130202|130201|130101|130102|130103|AGG1'] (pool) or ['ruleValues=10101|10103|10102'] (pets). All must match."New value: +"Codes from ot_search_filters exactly as returned, e.g. ['ruleValues=10101|10103|10102'] (pets). All must match."
      • removedInput schema / properties / filters / title
        Removed value: -"Filters"
      • changedInput schema / properties / guests / description
        Previous value: -"Number of guests, e.g. 4. Rooms that cannot take that many are left out."New value: +"Guests, e.g. 4; smaller rooms are left out."
      • removedInput schema / properties / guests / title
        Removed value: -"Guests"
      • changedInput schema / properties / include_nearby / description
        Previous value: -"Also include rooms around the city."New value: +"Also rooms around the city."
      • removedInput schema / properties / include_nearby / title
        Removed value: -"Include Nearby"
      • changedInput schema / properties / instant / description
        Previous value: -"Only instant booking (no host approval)."New value: +"Only instant booking."
      • removedInput schema / properties / instant / title
        Removed value: -"Instant"
      • changedInput schema / properties / limit / default
        Previous value: -15New value: +10
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / max_price / description
        Previous value: -"Highest nightly price in Toman (after discount), e.g. 8000000."New value: +"Max nightly Toman after discount, e.g. 8000000."
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • changedInput schema / properties / min_price / description
        Previous value: -"Lowest nightly price in Toman (after discount), e.g. 3000000."New value: +"Min nightly Toman after discount, e.g. 3000000."
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • changedInput schema / properties / min_rating / description
        Previous value: -"Minimum rating: 3, 4 or 5."New value: +"Minimum rating."
      • removedInput schema / properties / min_rating / title
        Removed value: -"Min Rating"
      • changedInput schema / properties / name / description
        Previous value: -"Words of the room name, e.g. 'نرگس'."New value: +"Room name words, e.g. 'نرگس'."
      • removedInput schema / properties / name / title
        Removed value: -"Name"
      • changedInput schema / properties / page / description
        Previous value: -"Zero-based page number."New value: +"Zero-based page."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / prime / description
        Previous value: -"Only 'prime' (premium) rooms."New value: +"Only 'prime' rooms."
      • removedInput schema / properties / prime / title
        Removed value: -"Prime"
      • changedInput schema / properties / province / anyOf
        Previous value: -[
        -  {
        -    "description": "Slug (letters, digits, -).",
        -    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "pattern": "^[A-Za-z][A-Za-z0-9-]{1,60}$",
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / province / title
        Removed value: -"Province"
      • changedInput schema / properties / rent_types / description
        Previous value: -"Rent type: whole_place (دربست), semi_private, shared."New value: +"Rent type."
      • removedInput schema / properties / rent_types / title
        Removed value: -"Rent Types"
      • changedInput schema / properties / room_types / description
        Previous value: -"Room type ids from ot_search_filters, e.g. [138] villa, [154] cottage, [137] apartment."New value: +"Room type ids from ot_search_filters, e.g. [138] villa."
      • removedInput schema / properties / room_types / title
        Removed value: -"Room Types"
      • changedInput schema / properties / sort / description
        Previous value: -"Order. cheapest/most_expensive use the nightly price after discount; with dates, cheapest then re-sorts each page by stay_total (extra-guest charges included)."New value: +"Order; with dates, cheapest re-sorts each page by stay_total."
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"ot_search_roomsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_search_roomsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_similar_rooms9 fields changed
      • changedInput schema / properties / check_in / description
        Previous value: -"Arrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month."New value: +"Arrival day YYYY-MM-DD, e.g. '2026-10-20' (not past, in the open calendar)."
      • removedInput schema / properties / check_in / title
        Removed value: -"Check In"
      • changedInput schema / properties / check_out / description
        Previous value: -"Departure day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in."New value: +"Departure day YYYY-MM-DD, e.g. '2026-10-23' (max 20 nights)."
      • removedInput schema / properties / check_out / title
        Removed value: -"Check Out"
      • changedInput schema / properties / guests / description
        Previous value: -"Number of guests, e.g. 4. Rooms that cannot take that many are left out."New value: +"Guests, e.g. 4; smaller rooms are left out."
      • removedInput schema / properties / guests / title
        Removed value: -"Guests"
      • removedInput schema / properties / room_id / title
        Removed value: -"Room Id"
      • removedInput schema / title
        Removed value: -"ot_similar_roomsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_similar_roomsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedot_travel_guide10 fields changed
      • changedInput schema / properties / blog_query / description
        Previous value: -"Blog search words, e.g. 'رستوران رامسر'. Default: the place's Persian name."New value: +"Blog search words, e.g. 'رستوران رامسر'. Default: place name."
      • removedInput schema / properties / blog_query / title
        Removed value: -"Blog Query"
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return long texts in full instead of clipped.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / kind / title
        Removed value: -"Kind"
      • changedInput schema / properties / max_chars / default
        Previous value: -3000New value: +2000
      • removedInput schema / properties / max_chars / title
        Removed value: -"Max Chars"
      • changedInput schema / properties / place / description
        Previous value: -"City, province or collection slug, e.g. 'ramsar', 'mazandaran', 'beach'."New value: +"City, province or collection slug, e.g. 'ramsar', 'beach'."
      • removedInput schema / properties / place / title
        Removed value: -"Place"
      • removedInput schema / title
        Removed value: -"ot_travel_guideArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "ot_travel_guideDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 15 tool updatesv0.1.0
    • First observedot_deals
    • First observedot_destinations
    • First observedot_find_place
    • First observedot_help
    • First observedot_holidays
    • First observedot_host
    • First observedot_late_checkout
    • First observedot_price_quote
    • First observedot_reviews
    • First observedot_room
    • First observedot_room_calendar
    • First observedot_search_filters
    • First observedot_search_rooms
    • First observedot_similar_rooms
    • First observedot_travel_guide

TDQS

A4.3/5.0

Scored across 15 tools

Disambiguation4/5

Most tools have clearly distinct resource+action targets (ot_room vs ot_search_rooms vs ot_price_quote vs ot_room_calendar vs ot_reviews). Some overlap exists in the discovery cluster—ot_destinations, ot_find_place, ot_search_filters and ot_deals can all surface cities/collections—but the detailed descriptions and 'Next:' chaining hints resolve most doubt.

Naming Consistency5/5

Every tool shares the same ot_ prefix and snake_case noun-phrase convention (ot_room, ot_room_calendar, ot_price_quote, ot_search_rooms). The pattern is fully predictable with no mixing of styles or verb forms.

Tool Count5/5

15 tools sit at the top of the ideal 3-15 range and each maps to a distinct facet of accommodation search (discovery, detail, pricing, calendar, host, reviews, guides, help). No redundant tools pad the set.

Completeness4/5

The surface covers search, discovery, room detail, calendar, exact pricing, host/reviews, deals, holidays and help very thoroughly for an information/planning server. There is no booking or reservation-management operation, though the descriptions make clear that booking is intentionally out of scope on otaghak.com.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    B
    maintenance
    A read-only hospitality-focused MCP server that enables users to retrieve reservation details, listing briefs, and guest conversation contexts from Hostaway. It simplifies hospitality workflows by providing specialized tools for searching threads and viewing reservation data through natural language interfaces.
    6
    23 npm
    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
    16 npm
    1
    MIT