Skip to main content
Glama

🏡 otaghak-mcp

Let your AI agent find a place to stay on Otaghak. 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

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


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

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

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

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

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

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

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 (about 100 m); the exact address and the host's phone come only after booking.

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

FAQ

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 failed connection once (timeouts are not retried). 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.

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

فارسی

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

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

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

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

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

نصب در 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 pytest            # offline, against recorded responses
uv run 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.

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity slug to find its most discounted stays, e.g. 'ramsar'. Default: the whole site.
limitNoRooms per list.
guestsNoNumber of guests, e.g. 4. Rooms that cannot take that many are left out.
check_inNoArrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month.
check_outNoDeparture day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive/openWorld, so safety is covered; the description adds real behavioral detail beyond that — the 14:00–23:50 Iran-time display window, undated prices for last-second rooms, and the fact that city filters out last_second entirely. It stops short of describing result shape or pagination, which is acceptable given the output schema.

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

Conciseness4/5

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

Front-loads the core purpose ('Current discounts: ...') then details each list, with zero filler sentences. The backtick-heavy, oddly line-wrapped formatting is slightly noisy but not verbose.

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

Completeness5/5

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

With an output schema present, return values need not be described; the description instead covers the two list modes, their scoping rules, the time window, and the natural next call. Nothing an agent needs to invoke this correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds interaction semantics the schema cannot express: `city` suppresses the last_second list, and supplying dates makes most_discounted prices stay-specific. That is genuine meaning beyond the per-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 resource (current discounts / deals) and explicitly splits it into two named lists, 'last_second' and 'most_discounted', each with its own scope and sort order. An agent can tell this apart from ot_search_rooms or ot_price_quote without opening the schema.

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

Usage Guidelines4/5

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

Gives concrete selection conditions: last_second is site-wide and excluded when `city` is supplied, while most_discounted is scoped to the 'discounted' collection and honors city/dates. It also routes the agent forward ('Next: ot_price_quote for the exact total'), though it does not contrast itself against the other room-search siblings.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
collectionNoCollection code to list its cities, e.g. 'beach', 'jungle', 'villa-north-iran', 'lastsecond'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare the read-only, idempotent, non-destructive profile, so the bar is low. The description adds a genuine behavioral detail beyond them: when `collection` is supplied the result set changes to also include the cities that collection covers, expressed as city slugs. It does not discuss limits or pagination, but with an output schema present that is not required.

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

Conciseness5/5

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

Three short sentences, front-loaded with the resource and the concrete examples, followed by the routing rule and the parameter behavior. No filler or repetition; every sentence carries a distinct instruction.

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

Completeness4/5

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

With an output schema present, return values need not be spelled out, and the description covers the zero-required/one-optional parameter surface plus the cross-tool handoff to ot_search_rooms. The only small gap is what the tool returns when `collection` is omitted, which is left to the schema.

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 earns a bump: it explains that `collection` is a code shared with ot_search_rooms and demonstrates the accepted values ('beach', 'jungle', 'lastsecond'), which is meaning beyond the raw slug pattern. It also clarifies the optional param's effect on the response.

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

Purpose4/5

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

Names the specific resource (popular cities and themed collection landing pages) and illustrates it with concrete examples ('discounted', 'jungle villas', 'villas with pool'). It is distinguishable from list-style siblings but never uses an explicit verb like 'list', leaving the action slightly implied by the noun phrase.

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

Usage Guidelines5/5

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

Gives an explicit trigger ('Use when the user has no destination yet') and a second, distinct trigger (to obtain collection codes for the ot_search_rooms `collection` parameter), naming the sibling that consumes the output. Nothing is left to inference about when to reach for this tool.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesCity or province name in Persian or as an English slug, e.g. 'رامسر', 'ramsar', 'مازندران', or a numeric room code, e.g. '2508916'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds output-interpretation context the annotations cannot: cities return an undated listing count and a province `listings` value is not a search count, warning the agent about a plausible misuse.

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 transformation and stays compact, with the reverse-mapping note and the 'Next:' routing fragment kept brief. It is slightly dense with backtick-quoted field references and the trailing routing clause is a touch clipped, but no sentence is wasted.

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

Completeness5/5

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

An output schema exists, so return structure needn't be described, and the description still adds what matters: what the input maps to, the interpretation caveat on counts, and where to go next. Nothing an agent needs to call this 1-parameter lookup correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100% and the single `query` parameter already documents accepted forms (Persian name, English slug, numeric room code) with examples. The description restates the same duality without adding format, length, or validation detail beyond the schema, so 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 concrete transformation: a place name becomes city/province slugs for ot_search_rooms, or a room code becomes its room. It names the exact input/output resources and clearly separates this from sibling lookups, so an agent can identify the tool without opening the schema.

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

Usage Guidelines5/5

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

Explicitly states the exclusion ('Room names are not searchable here') and redirects to the correct alternative with the parameter to use ('use ot_search_rooms with `name`'). It also routes downstream consumers ('Next: ot_search_rooms, or ot_room for a room hit'), leaving no ambiguity about when this tool applies.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoWords to look for, Persian works best, e.g. 'لغو' (cancellation) or 'کیف پول' (wallet).
topicNofaq: the help-center FAQ; terms: guest terms of use (booking, cancellation policies, refunds, wallet, stay rules); host_rules; quality_policy.faq

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: without `query` you get every FAQ question with short answers or section titles with a preview, and with `query` you get matching FAQ items or page paragraphs. It does not mention truncation limits or result caps, which is the only remaining gap.

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

Conciseness4/5

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

Purpose is front-loaded in the first clause, and the parenthetical enumerations of covered content are informative rather than padding. The second paragraph carries the usage/behavioral load efficiently, though the topic list is somewhat duplicated between the body and the schema.

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

Completeness4/5

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

With an output schema present, return values need not be explained, and annotations cover safety. All parameters are documented, both optional, and the sibling routing is stated. The definition is complete enough to invoke correctly; only edge-case behavior (result limits, empty-query fallback on non-FAQ topics) is unstated.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description goes further by explaining the query/no-query behavioral split and clarifying that `topic` selects the content set (FAQ vs. terms vs. host rules vs. quality policy). The per-parameter hints (Persian keywords, length limit) live in the schema rather than the description, so it does not fully supersede 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 ('Read Otaghak's help center') and enumerates exactly what lives inside: FAQ, guest terms with booking/cancellation/refund/wallet rules, host rules, and quality policy. It also explicitly separates itself from the sibling ot_room by noting where a room-specific cancellation policy lives, so an agent can route correctly without opening either schema.

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

Usage Guidelines5/5

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

Provides an explicit when-not/alternative: 'A room's own cancellation policy is in ot_room.' Combined with the enumerated topic scopes, the agent knows what this tool covers and where the one obvious overlapping case goes instead.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
endYesLast day (inclusive), e.g. '2026-12-31'. At most a year after start.
startYesFirst day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already declare this is a safe, idempotent read. The description adds the critical non-obvious caveat that holiday flags are only populated ~7 weeks ahead, so blank later days mean 'unknown', not 'working day'. That is exactly the kind of data-quality disclosure annotations cannot carry.

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

Conciseness4/5

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

Three short sentences, front-loaded with the core purpose and immediately followed by the freshness caveat. The parentheticals earn their place, though the line-break layout is slightly awkward.

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

Completeness5/5

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

Output schema exists, so return values need no explanation. Between the freshness limitation, the holiday/weekend definition, and the cross-reference to ot_room_calendar, an agent has everything needed to call and interpret this 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 coverage is 100% and both parameters are documented there, including the 'at most a year after start' constraint. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('List Iranian public holidays') with explicit scope (date range, Fridays included) and enrichment fields (Jalali dates, weekdays). An agent can immediately distinguish this from sibling date/availability tools like ot_room_calendar.

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

Usage Guidelines4/5

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

Gives a clear use case ('plan around long weekends') and routes the agent to ot_room_calendar for pricing implications. It stops short of stating when-not to use it or what alternative exists for non-Iranian holidays, but the context is concrete.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
host_idNoHost (user) id, e.g. 1626813.
room_idNoOr a room id to look up its host, e.g. 2512254.
rooms_limitNoHost's rooms to list.
reviews_limitNoNewest reviews across the host's rooms.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real value beyond that: it discloses data caveats such as 'undated starting prices' and 'newest reviews across all their rooms', which warn the agent about freshness/scope of the returned figures. It does not discuss auth or rate limits, but those are less critical for a read-only lookup.

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 guidance sentence, with the core purpose front-loaded and the input paths second. Every clause carries information (returned fields, entry options, use case) with no filler.

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

Completeness5/5

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

With an output schema present, return-value formatting need not be explained, and the description still names the main returned fields. Annotations cover the safety profile and all four parameters are schema-documented, so an agent has everything needed to select and call this tool 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 host_id, room_id, rooms_limit and reviews_limit are all documented in the schema itself, including the 'or a room id' alternative. The description restates the host_id/room_id either-or but adds no syntax, format, or limit semantics beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('Check a host') and enumerates exactly what the profile contains: response time, response/acceptance rates, member since, active rooms with starting prices, and newest guest reviews. The host-level aggregation is clearly distinguishable from siblings like ot_room (single room) and ot_reviews (reviews only), and the 'judge whether a host is reliable' framing pins down intent.

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 the two entry paths ('Pass host_id, or room_id to find the room's host') and a clear purpose statement ('use to judge whether a host is reliable or to see their other places'). It stops short of explicit when-not-to-use or naming a sibling to prefer instead, so it is clear context rather than full routing guidance.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
room_idYesRoom id (code), e.g. 2512254.
check_outNoDeparture day to check, Gregorian YYYY-MM-DD, e.g. '2026-10-23'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, non-destructive, which fits a lookup. Beyond that the description discloses two behavioral traits the structured fields do not: results are date-dependent and non-deterministic across departure days ("often closed for it on a given day"), and the currency unit is uncertain. No contradiction with annotations.

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

Conciseness4/5

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

Front-loaded with the outcome and keeps the routing sentence short. The parenthetical "(Toman, a unit not confirmed on the site)" is slightly clunky but carries real information, so it earns its place; overall there is little waste.

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

Completeness4/5

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

With an output schema present, return values needn't be spelled out, and annotations carry the safety profile. The description covers purpose, trigger, key caveats, and the sibling relationship, leaving only minor gaps such as what happens when check_out is omitted (default null).

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 room_id and check_out are already documented; the description still adds meaning by explaining that check_out is not just a date but the switch that determines bookability on that departure day (rooms are often closed for a given day). It also flags that the price unit (Toman) is unconfirmed, which the schema does not say.

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

Purpose5/5

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

States a specific verb+resource (check a room's late checkout) and enumerates exactly what the answer contains: availability, hours, price, and bookability on a given departure day. It explicitly distinguishes itself from the sibling ot_price_quote, which only aggregates the cost, so an agent can route without opening either schema.

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

Usage Guidelines4/5

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

"Use when the user wants to leave later than the check-out time" gives a clear triggering condition, and it names ot_price_quote as the complementary tool for totaling cost. There is no explicit when-not guidance, but the use case is narrow and well bounded.

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 above the base guests (after discount), optional late checkout, and the total. nightly is the calendar breakdown; discounted nights there are rounded to 1,000 each, so they can add up to a little more than nights_total.

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. Coupons and wallet credit need login and are not included. Use before the user books on otaghak.com.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsYesNumber of guests, e.g. 4.
room_idYesRoom id (code), e.g. 2512254.
check_inYesArrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'.
check_outYesDeparture day, e.g. '2026-10-23'. At most 20 nights.
late_checkout_hoursNoLate checkout hours to add (offered rooms only, usually 4), e.g. 4.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond them: availability validation with available=false plus reason, stay-length and guest-capacity checks, the rule that an unbookable late checkout still returns a quote with late_checkout.available=false, and the caveat that discounted nights are rounded to 1,000 so nightly can exceed nights_total. This is genuinely useful operational detail.

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

Conciseness4/5

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

Front-loaded with the core purpose in the first clause, then the breakdown, then the validation/exclusion rules. It is dense and slightly long, but nearly every sentence carries a distinct constraint (rounding, availability, late checkout, login exclusions).

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

Completeness5/5

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

An output schema exists so return values need not be explained, yet the description usefully clarifies the non-obvious rounding relationship between nightly and nights_total, plus failure semantics for availability and late checkout. Combined with full schema coverage and clear annotations, an agent has everything needed to call and interpret it.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds real semantic meaning: 'guests' is interpreted as base occupancy with extra-guest charges applied above it, and late_checkout_hours is framed as optional and only valid for offered rooms. That clarifies how inputs map to pricing behavior rather than merely restating field docs.

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 (amount to pay in Toman for a room/dates/guests) and enumerates the returned components (nights_total, extra-guest charge, late checkout, total). This clearly separates it from siblings like ot_room (details) and ot_room_calendar (availability display).

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 explicit context: 'Use before the user books on otaghak.com,' and notes that coupons and wallet credit need login and are excluded. It does not name alternatives (e.g., ot_late_checkout or ot_room) or say when not to use it, so it falls short of full routing guidance.

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoZero-based page number.
limitNoReviews per page.
room_idYesRoom id (code), e.g. 2512254.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety is covered. The description adds genuine behavioral context: 'rating is null and reviews empty when the room has no ratings yet (new rooms)' and that reviews are sorted 'newest first (with host replies).' It stops short of pagination/volume caveats, but the edge-case disclosure is valuable.

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 tightly packed sentences: the return contract first, then the empty-state caveat and cross-tool routing. No filler and the most decision-relevant information is front-loaded.

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

Completeness5/5

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

With an output schema present and rich annotations, the description only needs to add what structured fields cannot: the empty-room edge case, sort order, and sibling routing. All are present, and the required room_id plus pagination are schema-documented.

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% – room_id, page (zero-based), and limit are all documented in the schema. The description adds nothing about the parameters, 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 precise verb+resource (get a room's rating) and enumerates the exact payload: 0-5 rating, star histogram, six category scores, recommend percentage, written reviews newest first with host replies. This is far more specific than the title and lets an agent distinguish it from sibling tools.

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

Usage Guidelines5/5

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

Explicitly says to use it 'after ot_room or ot_search_rooms to judge quality' and routes the host-level variant to 'ot_host has reviews across all of a host's rooms.' Both the when-to-use condition and the alternative tool are named.

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

ParametersJSON Schema
NameRequiredDescriptionDefault
room_idYesRoom id (code), e.g. 2512254.
check_inNoArrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month.
check_outNoDeparture day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in.
max_photosNoPhoto URLs to return.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds a genuinely non-obvious behavioral trait: with check_in/check_out the returned price is the average night even when the dates are booked, so price does not imply availability, and it points to ot_price_quote/ot_room_calendar to verify. That is real behavioral context beyond the annotations.

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

Conciseness4/5

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

Front-loads the purpose, then price semantics, then next steps in three tight sentences. Dense but every clause earns its place; the enumerated field list is slightly long but aids selection.

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

Completeness5/5

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

Output schema exists, so return values need not be explained; combined with 100% schema coverage, the annotations, and the explicit routing, an agent has everything needed to call this correctly and interpret the result.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, and the description goes beyond it by explaining what check_in/check_out actually change (average nightly price vs undated starting price) rather than merely restating the date formats already in 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 one room') and enumerates precisely what the room record contains (capacity, beds, amenities, house rules, cancellation policy, host, photos, price). It clearly distinguishes itself from the sibling search tools by being the single-room detail 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?

Explicitly routes the agent: 'Use after ot_search_rooms or ot_find_place', and names five next-step tools with their distinct roles (ot_price_quote for exact total, ot_room_calendar for free nights, ot_reviews, ot_host, ot_similar_rooms). Both when-to-use and alternatives 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, minimum and maximum nights when arriving that day, weekend, public holiday, late checkout.

A night is priced on its arrival day. Calendars open only to the end of next Jalali month. Use to find free dates, the cheapest nights or allowed stay lengths. Next: ot_price_quote for a stay.

ParametersJSON Schema
NameRequiredDescriptionDefault
endNoLast 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.
startNoFirst day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Default: today.
room_idYesRoom id (code), e.g. 2512254.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, so the safety profile is covered. The description adds genuinely non-obvious behavior: the pricing rule ('a night is priced on its arrival day') and the calendar horizon limit ('open only to the end of next Jalali month'), which an agent cannot infer from 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 tight paragraphs: the first front-loads the returned fields, the second carries the pricing rule, horizon limit, and usage/handoff. Every sentence earns its place with no filler.

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

Completeness5/5

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

An output schema exists, so return structure need not be re-explained. Combined with annotations and 100% schema coverage, the description supplies the remaining operational context (pricing rule, horizon, usage, next step) an agent needs to call this correctly.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds a semantic constraint relevant to the start/end parameters — the calendar only opens to the end of next Jalali month — which goes beyond the field-level docs and explains truncation behavior.

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

Purpose5/5

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

States a specific verb+resource ('Get a room's calendar day by day') and enumerates the exact per-day fields returned (discounted/undiscounted nightly price, availability, instant booking, min/max nights, weekend, holiday, late checkout). It also distinguishes itself from siblings by routing to ot_price_quote for stay pricing.

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 clear usage contexts ('find free dates, the cheapest nights or allowed stay lengths') and names the natural next tool (ot_price_quote for a stay). It does not explicitly state when NOT to use it versus ot_room or ot_search_rooms, so it falls short of 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_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity slug, e.g. 'ramsar'. Also returns its districts (landmarks).
provinceNoProvince slug, e.g. 'mazandaran'.
collectionNoCollection code, e.g. 'beach'.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/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 return-content context (Toman price range, filter codes, district/landmark ids), but since an output schema exists this is partly redundant and it says nothing about auth or rate limits.

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

Conciseness4/5

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

The purpose sentence is front-loaded and the long parenthetical enumerating filter examples is the only mildly indulgent part. Overall it is tight and skimmable.

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

Completeness4/5

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

With an output schema present, return values need not be re-explained, and the description still supplies the essential workflow link to ot_search_rooms plus scope semantics. It is complete enough to invoke correctly, missing only edge-case or auth guidance.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description goes beyond the schema by explaining what each scope yields (a city returns its districts and landmarks; the codes feed ot_search_rooms' filters/room_types ids), which clarifies the otherwise opaque slug parameters.

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

Purpose5/5

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

States a specific verb (List) and resource (search filters) and scopes it precisely to city/province/collection/site. It also names the consuming sibling (ot_search_rooms), so an agent can place it in the workflow 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?

The final sentence gives an explicit trigger: 'Use when the user asks for an amenity, a rule, a room type or a place near a landmark.' It does not state when NOT to use it or name a competing alternative, but the trigger conditions are concrete.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity slugs from ot_find_place, e.g. ['ramsar'] or ['ramsar', 'chalus'] (any of them).
nameNoWords of the room name, e.g. 'نرگس'.
pageNoZero-based page number.
sortNoOrder. cheapest/most_expensive use the nightly price after discount; with dates, cheapest then re-sorts each page by stay_total (extra-guest charges included).recommended
limitNoRooms per page.
primeNoOnly 'prime' (premium) rooms.
guestsNoNumber of guests, e.g. 4. Rooms that cannot take that many are left out.
filtersNoAmenity, 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.
instantNoOnly instant booking (no host approval).
bedroomsNoMinimum bedrooms, e.g. 2.
check_inNoArrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month.
city_tagNoCity theme page slug with `city`, e.g. 'beach' or 'cottage' (from ot_travel_guide related pages).
provinceNoProvince slug, e.g. 'mazandaran'.
check_outNoDeparture day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in.
max_priceNoHighest nightly price in Toman (after discount), e.g. 8000000.
min_priceNoLowest nightly price in Toman (after discount), e.g. 3000000.
collectionNoCollection (landing) code from ot_destinations, e.g. 'beach', 'jungle', 'villapool', 'discounted', 'lastsecond'.
min_ratingNoMinimum rating: 3, 4 or 5.
rent_typesNoRent type: whole_place (دربست), semi_private, shared.
room_typesNoRoom type ids from ot_search_filters, e.g. [138] villa, [154] cottage, [137] apartment.
district_idNoDistrict id (near a landmark) from ot_search_filters, used with `city`, e.g. 230.
include_nearbyNoAlso include rooms around the city.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare the read-only, idempotent, open-world profile, so the description is free to add the non-obvious behavior: prices are undated starting prices without dates, and with dates they are estimates that 'can be a few Toman off' while including extra-guest charges. That estimate caveat is genuinely valuable context an agent cannot get from 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 tight paragraphs: scope first, then date/pricing semantics, then the tool chain. For a 22-parameter tool this is efficiently front-loaded with no filler sentences.

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

Completeness4/5

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

An output schema exists, so return values need not be explained, yet the description still clarifies the two price fields' meaning. Given the tool's complexity, the definition covers scope, pricing duality, dependencies and follow-ons adequately; only explicit when-not guidance 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 every parameter is already documented in structured form; baseline 3 applies. The description adds cross-parameter semantics (check_in/check_out together drive availability and pricing) but no per-parameter detail beyond what the schema already carries.

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

Purpose5/5

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

Opens with a specific verb and resource ('Search Otaghak stays') and enumerates the property types and the three scoping axes (city, province, collection). It is clearly distinguishable from siblings like ot_room (single stay details) or 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 Guidelines4/5

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

Explicitly routes to prerequisites ('Get slugs from ot_find_place, filter codes from ot_search_filters') and names the follow-on tools (ot_room, ot_price_quote, ot_room_calendar) with their conditions. It lacks any 'when not to use this' guidance relative to siblings like ot_deals or ot_similar_rooms, so not a full 5.

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.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
guestsNoNumber of guests, e.g. 4. Rooms that cannot take that many are left out.
room_idYesRoom id (code), e.g. 2512254.
check_inNoArrival day, Gregorian YYYY-MM-DD, e.g. '2026-10-20'. Not in the past; calendars open only to the end of next Jalali month.
check_outNoDeparture day, Gregorian YYYY-MM-DD, e.g. '2026-10-23' (3 nights). At most 20 nights after check_in.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already cover read-only/idempotent/safe, so the bar is lower. The description adds behavior the annotations cannot express: prices are undated starting prices without dates and re-priced for the stay with dates, and unavailable rooms are surfaced in a not_available list. That is genuine operational context 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.

Conciseness5/5

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

Front-loaded with the core purpose, then the pricing/availability nuance, then the next-step tools. Every sentence adds information; there is no restatement of the title or padding.

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

Completeness5/5

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

With an output schema present, return shape need not be explained, and the description instead covers the non-obvious parts: pricing mode depends on dates, booked/too-small rooms land in not_available, and the follow-on tools. Nothing an agent needs to invoke it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description goes further by explaining how check_in/check_out change price semantics and how guests filters out undersized rooms, adding interaction meaning that the per-parameter schema text does not fully 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 first sentence states a specific verb (get), resource (alternatives to a room), scope (same city and type), and cardinality (4-5), and the phrase 'as the room page shows them' anchors it to a known surface. An agent can separate it from ot_search_rooms and ot_room 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?

It gives explicit trigger conditions ('Use when the user's room is full or too expensive') and names follow-on tools (ot_room, ot_price_quote). It does not contrast itself against sibling discovery tools like ot_search_rooms, so the 'when-not' side is thin, but the routing guidance is real.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoWhat `place` is.city
placeYesCity, province or collection slug, e.g. 'ramsar', 'mazandaran', 'beach'.
max_charsNoMax characters of the guide text.
blog_queryNoBlog search words, e.g. 'رستوران رامسر'. Default: the place's Persian name.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral value by disclosing the four content blocks returned and the cross-tool handoff pattern (related_pages slugs feed ot_search_rooms city_tag); only auth/rate-limit details are absent.

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 returned content, followed by a short when-to-use sentence and one routing note. No filler sentences, though the parenthetical enumeration of examples is slightly dense.

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

Completeness4/5

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

With an output schema present, the description need not define return values, yet it helpfully summarizes them. It covers purpose, trigger, and one downstream integration, leaving only edge-case behavior (pagination, empty results, locale of blog_query) unaddressed.

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

Parameters3/5

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

Schema description coverage is 100%, so kind, place, max_chars and blog_query are already documented in the schema, including examples and defaults. The description adds little parameter-level detail beyond implying that related_pages slugs (themes) are usable identifiers, which is indirect. 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?

The description states a specific verb and resource ('Get the site's travel guide for a destination') and then enumerates the concrete payload: guide text, FAQ, related search pages with listing counts, and blog articles. It is clearly distinguishable from siblings like ot_search_rooms or ot_destinations.

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

Usage Guidelines4/5

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

It gives an explicit trigger condition ('Use when the user asks what a place is like or what to do there') and even routes a downstream step to ot_search_rooms via city_tag. It stops short of naming when a sibling (e.g. ot_destinations) would be the better pick, so it is strong context without explicit exclusions.

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.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 purposes, and descriptions explicitly cross-reference each other (e.g. ot_room for rough price, ot_price_quote for exact total, ot_room_calendar for per-night breakdown). However several tools overlap around pricing (ot_search_rooms, ot_room, ot_price_quote, ot_room_calendar, ot_deals) and around discovery (ot_search_rooms, ot_search_filters, ot_destinations), so an agent could still hesitate on which price/discovery tool to pick.

Naming Consistency4/5

All names use a consistent ot_ prefix and snake_case, which makes the set easy to scan; the underlying resource is always clear. The only deviation is a mix of verb-led (ot_find_place, ot_search_rooms, ot_search_filters) and noun-phrase (ot_room, ot_host, ot_deals) conventions, but this stays readable.

Tool Count4/5

15 tools sit at the top of the ideal range but each covers a genuinely distinct facet of a booking domain (search, place resolution, filters, room detail, reviews, calendar, quote, host, deals, holidays, help, guide, late checkout, similar rooms). It is slightly heavy but nothing feels redundant.

Completeness5/5

The surface covers the full research/planning lifecycle: destination discovery, place resolution, filtered search, room detail, availability calendar, exact pricing, reviews, host vetting, alternatives, deals, holidays and late checkout. Booking/auth is intentionally left to otaghak.com, so no critical agent workflow dead-ends.

Maintenance

ActivityNo data
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
    52 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
    MIT