Skip to main content
Glama

divar-mcp: Divar MCP server for AI agents

Unofficial, read-only MCP server that lets your AI agent search Divar (دیوار) ads in any Iranian city: homes, cars, phones and more. It finds the cheapest and best-value ads, compares ads, checks whether a price is fair and browses the map. Prices are in Toman.

An MCP server for Divar, Iran's largest classifieds site. Search by city, neighbourhood, category, text and any of the category's filters, read a full ad, compare several, see the seller's other ads, get market statistics, appraise a price against similar ads and poll for new ads, all from Claude, Cursor or Copilot. No account, no API key, nothing is posted or changed.

Quick start · Tools · FAQ · فارسی


For AI agents

  • What: Unofficial MCP server for Divar (دیوار, divar.ir), Iran's classifieds site. Persian queries work best; prices in Toman.

  • Install: claude mcp add divar -- uvx divar-mcp (stdio, needs uv and Python 3.10+).

  • Auth: none. Optional DIVAR_MCP_PROXY sets an HTTP proxy for every request.

  • Access: read-only on Divar. It cannot log in, post, chat, bookmark or reveal a seller's phone number. Only dv_watch and dv_price_trend write, to a local file of your own searches.

  • Also: resources divar://cities, divar://categories, divar://category-filters/{slug}; prompts compare_ads, best_under_budget, appraise_listing, watch_market.

  • Tools: 31, all prefixed dv_. Start with dv_search, dv_post, dv_cheapest, dv_best_for_budget, dv_market.

  • Typical sequence: dv_cities / dv_categories -> dv_filters -> dv_search -> dv_post -> dv_similar / dv_appraise / dv_compare.

  • Use when: the user wants to find, price-check or monitor Divar ads (flats to buy or rent, used cars, phones, furniture, jobs...), or asks what something costs in a city.

  • Do not use when: the user wants to post an ad, message a seller or get a phone number (login-only on Divar).

  • Output: compact JSON ad cards. price for a sale; deposit + rent for a rental; no price means negotiable. Pass token between tools and next_cursor back as cursor.

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

Related MCP server: divar-mcp

Quick start

You need uv.

claude mcp add divar -- uvx divar-mcp

Any other MCP client: command uvx, args ["divar-mcp"] (or pip install divar-mcp and run divar-mcp).

What it can do

  • Search ads in one or several cities by category, text, neighbourhood, price (and deposit for rentals), brand and model, photo, freshness and every other filter of the category; merge several pages with duplicates removed; continue with a cursor

  • Full ad: price in Toman, specs, features, description, all images, map position, seller type, shared-housing flag, placeholder-price detection

  • Smart tools: cheapest ads (junk prices skipped), best value and most-for-the-budget, side-by-side comparison showing only the differences, similar ads, fair-price appraisal with percentile and confidence, market statistics by district and by day

  • Monitoring: poll dv_new_since with the last timestamp to see only new ads; export results as CSV or JSON lines

  • Map: ads around a GPS point or landmark with distances; neighbourhoods, neighbours, address of a point

  • Sellers and dealers: how many ads a seller has, the business card and its ads

Tools

All tools are read-only and start with dv_. An ad card has token, title, price (sale) or deposit + rent (rent 0 with full_deposit means رهن کامل), info (mileage, condition...), district, seller (agency label), age_h (hours since the last bump), photos, image (thumbnail URL, only from dv_search with thumbnails), chat, tag (paid promotion), url, and suspect_price when the price looks like a placeholder. Absent flags mean false. Default page size is 10 to 20 ads.

Find places and categories

Tool

What it does

dv_cities

City ids for a name (1,177 cities); no query lists the biggest cities

dv_districts

Neighbourhoods of a city with ids, centre and main streets

dv_neighbours

Neighbourhoods adjacent to a district (Divar's list plus the nearest ones by distance)

dv_locate

City, neighbourhood and street address of a GPS point

dv_place_search

Map autocomplete: landmark or street to coordinates

dv_place_mapping

Convert old Divar place ids to current ones

dv_categories

The 236-node category tree; search by name, list children

dv_filters

Every filter of a category: key, type, label, unit, options

dv_filter_options

Brand and model keys (161 car brands), districts and other option lists, with typed search

dv_suggest

The search box's suggestions and category guesses for some text

dv_parse_query

A plain Persian request ("آپارتمان اجاره ونک زیر ۸ میلیارد") to dv_search arguments: city, neighbourhoods, price bounds, area (80 متری), category

dv_boundary

Neighbourhood borders of a city (GeoJSON): the city box, or one neighbourhood's polygon

Search and price

Tool

What it does

dv_search

Search ads with city, category, text, districts, price, brand, photo, freshness and any category filter; multi-page merge, client-side age and keyword filters, cursor paging

dv_count

How many ads match a search (capped at 10,000)

dv_cheapest

The cheapest ads of a search; placeholder prices and far-below-median outliers skipped

dv_best_for_budget

Within a budget: best value with an explainable deal_score (and reasons) against the median of the ads that fit (price per m2 for property for sale), and the most you can get; bait / co-op / loan titles are skipped

dv_find_deals

Ads priced well below the median of a search, no budget needed; junk prices and bait titles removed

dv_market

Price statistics (min, quartiles, median, max) plus breakdown by district and by day

dv_appraise

Is an ad's price (or a price you give) high or low versus similar ads: percentile, verdict ("insufficient comparables" when the call is extreme but thin), confidence

dv_new_since

Ads published after a timestamp: poll with the returned latest to watch a search

dv_export

The ads of a search as CSV or JSON lines

dv_nearby

Map ads around a point (category required), nearest first, with coordinates, distance and total price

dv_watch

Saved searches: create, then check to get only the ads newer than the last check (local file)

dv_price_trend

One median asking price per day for a search, kept locally, with change since the previous day

dv_status

Is Divar reachable, latency, caches, saved watches and the tool list

One ad and its seller

Tool

What it does

dv_post

Full ad: price, specs, features, description, images, map position, seller type, flags

dv_posts

Up to 10 ads in one call, compact

dv_compare

2 to 6 ads side by side: prices and only the specs that differ

dv_similar

Ads like this one (same brand and area, widening step by step)

dv_seller

A seller's personal and business ad counts, business card (or "personal seller") and other ads

dv_dealer

A business's public page: name, member since, first 11 ads

Good to know

  • Prices are Toman. Divar's prices are Toman already; nothing is converted. A missing price means negotiable (توافقی), never 0. Rentals have deposit (ودیعه) and rent (اجاره); rent 0 with full_deposit is رهن کامل.

  • Asking prices. Everything is what sellers typed, not what deals close at. Some sellers type junk (1,111,111 or a deposit as a car price): suspect_price flags placeholders, and rankings and statistics skip them and prices under a tenth of the median.

  • Province scope. city: "استان مشهد" (or province:مشهد) searches the whole province of that city; districts and boundaries need a city.

  • Order. Divar's API only returns newest first; the first 1-3 rows can be paid promotions with older dates. dv_search sort and the price tools sort the ads fetched in the call, not the whole market. Paging is a time cursor (next_cursor -> cursor).

  • Filters. dv_filters lists the keys of a category; filters a category lacks are reported in ignored, not silently dropped. Web URL slugs (car) work next to API slugs (light).

  • Map positions of most ads are fuzzed by about 500 m (approximate_location).

  • No phone numbers. Divar shows them only to logged-in users; this server never logs in. Use url to open the ad.

  • Detail prices come from the ad's price rows; Divar's raw number elsewhere in the ad is float-rounded for large values.

  • Persian queries work best; Arabic letter variants (ي/ك) are folded, and an empty Persian query is retried once folded.

FAQ

Is there a Divar API or MCP server for AI agents? Yes: this unofficial MCP server wraps the public JSON API the Divar website itself uses, so Claude, Cursor or Copilot can search ads, read details and compare prices. Divar's official Kenar API is for partners (OAuth and an API key) and is not used here.

Is it official, safe and free? It is unofficial, open source (MIT) and free. It is read-only, needs no account or API key, and runs on your machine with no hosted server in between.

Can it message a seller, post an ad or get a phone number? No. Those need a Divar login and are deliberately left out.

Can it alert me when a matching ad appears? It does not push. dv_new_since returns only ads newer than a timestamp, and dv_watch remembers that timestamp for a saved search (in ~/.divar-mcp/state.json, or DIVAR_MCP_STATE), so a scheduler (cron, a Claude Code loop) can call dv_watch with action: "check".

Configuration

The server calls api.divar.ir directly and ignores system proxy variables. To use a proxy set DIVAR_MCP_PROXY=http://host:port. Saved watches and price history go to ~/.divar-mcp/state.json; set DIVAR_MCP_STATE to use another file.

Development

export HTTPS_PROXY=http://127.0.0.1:10898 HTTP_PROXY=http://127.0.0.1:10898   # uv downloads only
uv sync
uv run ruff check . && uv run ruff format --check .
uv run pytest -q            # offline, recorded fixtures
uv run pytest -m live -q    # real API, one test per tool

The API map this server is built on lives next to it in ../divar/.

فارسی: سرور MCP دیوار

divar-mcp یک سرور MCP غیررسمی برای دیوار است که به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در آگهی‌های هر شهر ایران جستجو کند، آگهی را کامل ببیند، چند آگهی را مقایسه کند، ارزان‌ترین و مناسب‌ترین آگهی را برای یک بودجه پیدا کند، منصفانه بودن قیمت را بسنجد و آگهی‌های اطراف یک نقطه روی نقشه را ببیند.

  • فقط خواندنی است و حساب کاربری یا کلید API نمی‌خواهد؛ شماره تلفن فروشنده را نشان نمی‌دهد.

  • همه قیمت‌ها به تومان است؛ قیمت نداشتن یعنی توافقی.

بپرسید: «ارزان‌ترین آپارتمان ۲ خوابه اجاره‌ای در ونک با ودیعه زیر ۱ میلیارد کدام است؟»

Disclaimer

Unofficial; not affiliated with Divar. Read-only access to the data of public pages. Keep request rates low (Divar showed no rate limit, but be polite).

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

License

MIT

Available Tools

31 tools
dv_appraiseIs this price fairA
Read-onlyIdempotent

Is an ad's price (or a price you have in mind) high or low compared with similar ads? Percentile, verdict, confidence.

With a token: compares its price (or monthly rent) with similar ads found from its own breadcrumb (brand + district, widening step by step). Without: give price plus category/query/filters. Returns percentile (share of comparable ads that are cheaper), verdict ('insufficient comparables', with no lean either way, when confidence is low and the call would be "well below/above market"), vs_median_pct, the fair band p25-p75 and confidence (high: 40+ comparable ads at the first level, medium: 15+, else low). Comparisons ignore year, mileage, area and condition: refine with filters/query, or dv_compare against specific ads. Asking prices only.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
pagesNoPages scanned per comparison level.
priceNoWithout a token: the price in Toman to check against the search below (monthly rent for rent categories).
queryNoFree text in title or description, e.g. 'پراید 111'.
tokenNoAn ad to appraise: its price is ranked against similar ads. Omit to appraise a price you give.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only cover safety (readOnly/idempotent/openWorld); the description adds the real behavioral substance: confidence thresholds (high 40+, medium 15+), the 'insufficient comparables' verdict when confidence is low, the widening breadcrumb strategy, and that comparisons ignore year/mileage/area/condition and reflect asking prices only.

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 question and the mode split, and nearly every clause earns its place. It is dense with nested parentheticals and confidence cutoffs, which slightly taxes readability but introduces 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 no output schema, the description carries return-value duty and does so fully (percentile, verdict, vs_median_pct, p25-p75 band, confidence) plus caveats. Both zero-required-parameter modes are explained, so 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.

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 cross-parameter meaning the schema lacks: token vs price are alternate modes, price means monthly rent for rent categories, and breadcrumb widening derives from the ad. It stops short of documenting every parameter individually, which the schema already does.

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, answerable question ('Is an ad's price ... high or low compared with similar ads?') and names the exact outputs (percentile, verdict, confidence). It distinguishes itself from sibling dv_compare by scoping to market-fairness appraisal rather than ad-to-ad comparison.

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 splits the two invocation modes: with `token` it appraises that ad via its own breadcrumb, without it you must supply `price` plus category/query/filters. It also routes the agent to `filters`/`query` for refinement and to dv_compare for specific-ad comparisons.

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

dv_best_for_budgetBest ads for a budgetA
Read-onlyIdempotent

Within a budget: the best-value ads (furthest below their peers' median) and the most you can get (closest to the budget).

Scans the newest pages pages capped at budget. Each best_value ad has a deal_score (0-100) with reasons (distance below budget_median, photos, freshness; penalties for prices over 70% under the median and for notice, parking or co-op titles). Ads under 20% of the uncapped market_median and bait titles (وامدار, قدرالسهم, اقساط, پیش‌فروش...; kept if the word is in query / keywords) are dropped into skipped_implausible. Property for sale ranks by price per m2; the top 6 ad pages are opened for publish time, floor, parking and elevator (the caveat says the rest are unchecked). An unrealistic budget returns an empty best_value with a note. Use a narrow query or brand: a mixed category's median means nothing. Next: dv_appraise, dv_post.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
limitNoAds per list.
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
budgetYesMaximum price in Toman (rent categories: monthly rent), e.g. 1500000000.
recentNoPublished within '3h', '12h', '1d', '3d' or '7d'.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_age_hoursNoOnly ads bumped within this many hours.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already establish the safe read-only profile (readOnlyHint, idempotentHint, destructiveHint=false), and the description still adds substantial behavior: it scans the newest N pages capped at budget, computes a deal_score with named reasons and penalties, drops implausible/bait ads into skipped_implausible, opens the top 6 ad pages for extra fields with an explicit caveat about the rest, and reports an empty list with a note on unrealistic budgets. This is unusually rich disclosure of algorithm and side data 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?

The purpose is front-loaded in the first line before any implementation detail, and no sentence is purely decorative. It is dense to the point of being run-on, with heavy parenthetical stacking (median, photos, freshness; penalties...), which slightly impedes scanning but does not bury the lead.

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 15 parameters, nested filters, and no output schema, the description carries the burden of explaining returns and it does so: best_value, deal_score, reasons, skipped_implausible, caveat, and note are all named. Combined with the usage and failure-mode guidance, an agent has everything needed to call this correctly.

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

Parameters4/5

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

Schema description coverage is already 100%, so the baseline is 3, but the description genuinely extends semantics: it clarifies that budget interacts with market_median/budget_median and that query/keywords determine whether bait words are kept rather than filtered, and that a mixed category makes the median meaningless. That adds meaning not encoded in the schema.

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

Purpose4/5

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

The description states a precise verb (scan/return) and resource (ads within a budget) and even names the two ranked sub-lists it produces: 'best-value ads' and 'the most you can get'. This is far more specific than a tautology and an agent can tell it is a budget-constrained deal ranker. It stops short of distinguishing itself from close siblings like dv_cheapest or dv_find_deals, which is the only reason it is not 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?

It gives real invocation guidance: 'Use a narrow query or brand: a mixed category's median means nothing', and routes onward with 'Next: dv_appraise, dv_post'. It also explains the failure mode ('An unrealistic budget returns an empty best_value with a note'). No explicit when-not or direct sibling exclusion is offered, so a 4 rather than 5.

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

dv_boundaryCity boundaryA
Read-onlyIdempotent

Neighbourhood borders of a city from Divar's GeoJSON: the city's bounding box, or one neighbourhood's polygon.

Without district: the city bounding box [min_lon, min_lat, max_lon, max_lat] and the neighbourhoods with id, centre and box. With district: a GeoJSON Feature of that neighbourhood (coordinates [lon, lat], thinned to max_points per ring, so the shape is approximate). Use to draw an area or test a point against it; for a point's own neighbourhood use dv_locate. Next: dv_nearby with the centre.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
limitNoMax neighbourhoods listed in the overview.
districtNoA neighbourhood name or id (e.g. 'ونک', '315') to get its polygon. Omit for the city's bounding box and its neighbourhoods.
max_pointsNoMax vertices per polygon ring (the full outline is thinned).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so safety is covered. The description adds real behavioral context beyond them: geometry is thinned to `max_points` per ring so the shape is approximate, and the returned payload differs sharply between the two modes. It stops short of mentioning error behavior for an unknown district or coordinate order caveats beyond [lon, lat].

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, with the resource and the two output modes front-loaded before the usage and next-step guidance. Slightly dense in the first clause, but no filler or repetition of schema content.

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

Completeness4/5

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

With no output schema, the description carries the return-shape burden and does so adequately by naming the bounding box tuple, the per-neighbourhood id/centre/box fields, and the GeoJSON Feature shape. Missing only failure modes (unknown city/district) and any note on coordinate reference system beyond the [lon, lat] ordering.

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 genuine semantic weight: `district` is framed as a mode switch, not just a filter, and `max_points` is explained as a lossy approximation of the outline rather than a raw cap. `limit` is not clarified further in the description, which keeps this from a 5.

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 (neighbourhood borders of a city) and source (Divar's GeoJSON), then splits the two operating modes explicitly: no `district` returns the city bounding box plus a neighbourhood list, with `district` returns one neighbourhood's GeoJSON Feature. An agent can distinguish this from dv_districts, dv_neighbours, and dv_locate without reading any schema.

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

Usage Guidelines5/5

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

Gives a concrete use condition ('draw an area or test a point against it'), an explicit exclusion with the alternative ('for a point's own neighbourhood use dv_locate'), and a forward pointer ('Next: dv_nearby with the centre'). Routing between siblings is fully specified.

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

dv_categoriesBrowse categoriesA
Read-onlyIdempotent

The Divar category tree (236 nodes, up to 4 levels): slug, Persian name, path and whether it is a leaf.

Use to find the category slug for dv_search and the other tools (leaf slugs such as light = cars and vans, apartment-sell, apartment-rent, mobile-phones). Filters exist per category: dv_filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax categories to return.
queryNoPart of a category name or slug, Persian or Latin: 'موبایل', 'apartment'.
parentNoList the direct children of this category slug, e.g. 'vehicles' or 'real-estate'. Omit for the 10 top-level categories.

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 the safety profile is covered. The description adds context beyond that — the tree's size (236 nodes) and depth (up to 4 levels) — which helps the agent anticipate the result set, though pagination/limit behavior is left to the schema.

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

Conciseness4/5

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

Front-loaded with what the tool returns, then the usage pointer. Two compact sentences with little waste; the parenthetical slug examples add value but are the only slightly list-heavy part.

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?

No output schema exists, so the description usefully lists the returned fields itself. For a read-only browse tool whose annotations already carry the safety profile, this is essentially complete, with only minor gaps around result ordering or pagination.

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 limit, query and parent are already fully documented in the schema. The description contributes nothing extra about parameter syntax or formats, making the baseline 3 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 resource — the Divar category tree — and enumerates what each node carries (slug, Persian name, path, leaf flag). It distinguishes itself from siblings by naming dv_search as the consumer of the slugs and dv_filters as the per-category filter tool, so an agent can tell it apart without opening another schema.

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

Usage Guidelines4/5

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

Explicitly states the use case: 'Use to find the `category` slug for dv_search and the other tools,' and routes filters to dv_filters. It gives clear context and a named alternative, though it stops short of a full when-not clause (e.g., what to do when the category is already known).

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

dv_cheapestFind cheapest adsA
Read-onlyIdempotent

The cheapest ads of a search, cheapest first. Skips negotiable ads, placeholder or absurd prices and far-below-median outliers.

Divar cannot sort by price, so this scans the newest pages pages (about 25 ads each) and ranks them: raise pages for a wider scan or narrow with filters. Rent categories rank by monthly rent (deposit shown too). Ads under 10% of the median (include_outliers shows them) are usually not the thing searched for: a 100,000 Toman 'car' is a transfer slip or a deposit. The answer says how many ads were scanned and skipped. Next: dv_post, dv_compare.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
limitNoMax ads in the answer.
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
recentNoPublished within '3h', '12h', '1d', '3d' or '7d'.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_age_hoursNoOnly ads bumped within this many hours.
include_outliersNoAlso list ads priced under 10% of the scanned median (usually deposits, parts or bait).
min_realistic_priceNoDrop ads priced below this many Toman (seller junk prices like 1,000 are already flagged and skipped).

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the readOnly/idempotent annotations, it discloses real behavior: negotiable, placeholder and absurd prices are skipped, sub-10%-of-median ads are dropped unless `include_outliers` is set, rent categories rank on monthly rent, and the response reports how many ads were scanned and skipped. That is exactly the kind of context annotations cannot convey.

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

Conciseness4/5

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

Front-loaded with the result shape and ranking rule, then caveats and next steps. It is dense rather than bloated, though the outlier behavior is stated twice (in prose and again against `include_outliers`), which is minor redundancy.

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 17-parameter, no-output-schema tool this is close to complete: it explains the scan model, exclusions, ranking, and what the answer reports. It omits only edge behavior such as what a fully unfiltered scan returns, which the agent can infer from the parameter docs.

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 meaning to specific params: `pages` (~25 ads per page, affects scan width), `include_outliers` (sub-10%-median ads), and the rent-category interpretation of min/max price. It adds value over the schema without documenting every one of the 17 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?

The description names a specific verb and resource ('the cheapest ads of a search, cheapest first') plus the exact scope of the scan, which cleanly separates it from siblings like dv_search, dv_best_for_budget and dv_find_deals. An agent can tell what this tool returns without opening the schema.

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

Usage Guidelines4/5

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

It gives concrete operating guidance: raise `pages` for a wider scan or narrow with `filters`, and it names follow-on tools (dv_post, dv_compare). It does not explicitly say when to prefer a sibling such as dv_best_for_budget over this one, so it stops short of full when/when-not coverage.

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

dv_citiesFind citiesA
Read-onlyIdempotent

City ids for a name (1,177 cities; Tehran is 1, Mashhad 3). Returns id, name, URL slug, province id and centre.

Use first when you need a city for another tool (they also accept the name directly). Persian letter variants (ي/ی, ك/ک) are matched. Next: dv_districts for the neighbourhoods of a city, dv_search to look for ads.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax cities to return.
queryNoCity name or slug, Persian or Latin, e.g. 'مشهد', 'kar'. Omit for the 7 biggest cities.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds genuinely useful behavior beyond that: dataset size (1,177 cities), Persian letter-variant normalization (ي/ی, ك/ک), and the default behaviour when query is omitted. It does not discuss pagination or result ordering, which keeps it short of a 5.

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

Conciseness5/5

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

Two compact paragraphs, each sentence load-bearing: the first states purpose and returns, the second states fallback behaviour and routing. No filler, and the most important fact 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 no output schema, the description compensates by naming the returned fields, and for a 2-parameter optional-query lookup it covers selection, defaults, and follow-up tools. Nothing an agent needs to call it correctly is missing.

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

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 explains limit and query fully, including the 'omit for the 7 biggest cities' default. The description only adds illustrative ID values (Tehran 1, Mashhad 3), which is a marginal gain. Baseline 3 applies.

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

Purpose5/5

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

The description gives a specific verb+resource ('City ids for a name') and immediately enumerates what is returned (id, name, URL slug, province id, centre). It is unambiguous against siblings like dv_districts or dv_search, which are named as follow-ups rather than competitors.

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: 'Use first when you need a `city` for another tool', plus a note that other tools also accept the name directly, and a 'Next:' chain pointing to dv_districts and dv_search. Both when-to-use and what-to-use-next are stated.

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

dv_compareCompare adsA
Read-onlyIdempotent

Side by side: the price of each ad and only the specs that differ (the identical ones are listed once).

Gives cheapest, per other ad cheapest_saves_pct (how much less the cheapest costs than that ad; per metre when every priced ad has an area, see compared_by), the differing spec rows with each ad's value, shared specs, and features one ad has and another lacks. Works across ads of the same kind (two cars, two flats); specs are the Persian rows of each ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokensYes2 to 6 ad tokens to compare.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld). The description adds meaningful behavior beyond that: it discloses the computed outputs (cheapest, cheapest_saves_pct, compared_by), the per-metre normalization rule when all priced ads have an area, and the fact that identical specs are collapsed. That is substantive disclosure of what the tool computes and returns.

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

Conciseness4/5

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

It is dense but front-loaded: the core comparison semantics come first, then the computed fields. Every clause conveys distinct information about output shape; the parentheticals are slightly heavy but not 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?

There is no output schema, so the description carries the burden of describing results, and it does so thoroughly (cheapest, savings percentage, differing rows, shared specs, unique features, compared_by). The only gap is the absence of routing guidance to sibling tools, which is a usage rather than completeness concern.

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

Parameters3/5

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

Schema coverage is 100% and the single 'tokens' parameter is fully described there (2–6 ad tokens). The description adds nothing about token format or provenance, but with complete schema documentation the baseline of 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 opens with a specific verb and resource ('Side by side: the price of each ad') and immediately scopes the output ('only the specs that differ'). It is clearly distinguishable from siblings like dv_cheapest, dv_appraise, and dv_similar, which perform different single-ad or ranking operations.

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 states a real constraint — 'Works across ads of the same kind (two cars, two flats)' — which tells the agent when the tool is applicable. However, it never names an alternative (e.g. dv_cheapest, dv_appraise, dv_similar) or explains when to prefer comparison over those tools, so the when-to-use guidance is only implied.

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

dv_countCount matching adsA
Read-onlyIdempotent

How many active ads match a search, in one cheap call (capped: 10,000 means '10,000 or more').

Use to size a market, to test whether a filter combination is too narrow, or to compare cities and districts before fetching ads. Same arguments as dv_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
queryNoFree text in title or description, e.g. 'پراید 111'.
recentNoPublished within '3h', '12h', '1d', '3d' or '7d'.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_depositNoRent categories: deposit (ودیعه) in Toman.
min_depositNoRent categories: deposit (ودیعه) in Toman.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive and open-world, so safety is covered. The description adds genuinely new behavior: the 10,000 cap and its '10,000 or more' semantics, and that the call is cheap. It does not explain cost/latency beyond 'cheap' or the exact return shape.

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

Conciseness5/5

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

Two tight sentences; the most surprising and decision-relevant fact (the cap semantics) is front-loaded in parentheses. 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?

With no output schema, the description still conveys the essential return semantics (a count, saturated at 10,000) and the nested filters object is documented in the schema. An agent can call this correctly; only finer return details (e.g. whether `ignored` keys are echoed) are left implicit.

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% across 12 params, so the schema already documents each field exhaustively. The description only points to dv_search for argument parity, adding no syntax or format detail beyond the schema. 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 (count) and resource (active ads matching a search), plus the key scope qualifier that the result is capped at 10,000. The closing note 'Same arguments as dv_search' immediately separates it from that sibling without opening either schema.

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

Usage Guidelines5/5

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

Gives three explicit use cases (size a market, test whether a filter combination is too narrow, compare cities/districts) and explicitly positions it as a pre-step 'before fetching ads' — i.e. route to dv_search for actual listings. When-to-use and the alternative are both named.

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

dv_dealerDealer pageA
Read-onlyIdempotent

A business account's public page: name, active ad count, member since and its first 11 ads.

Divar's web API gives only the first batch of a dealer's ads (no paging); search with the dealer's name or use the ad filters for more. Ads are compact rows (token, title, price, district, age, photos, tag); the ad link is url_prefix + token and age_h is hours since the last bump.

ParametersJSON Schema
NameRequiredDescriptionDefault
brand_tokenYesDealer id from dv_seller, e.g. 'ZbeypyTr'.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/openWorld, and the description goes well beyond them: it discloses the 11-ad cap, the absence of paging, the exact shape of each ad row (token, title, price, district, age, photos, tag), and how to build the ad link from url_prefix + token. That is meaningful behavioral context an agent cannot get from structured fields.

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

Conciseness5/5

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

Purpose and returned fields are front-loaded in one sentence, followed by a second paragraph covering the paging limitation, row format, and link construction. Every clause carries usable information with no 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 no output schema, the description carries the return-value burden and does so fully: it lists the page fields, the ad-row fields, the link convention, and the meaning of age_h. An agent can call this correctly and interpret the response without further help.

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 parameter is fully documented in the schema ('Dealer id from dv_seller, e.g. ZbeypyTr'), including pattern and length. The description adds no additional semantics about brand_token, so the baseline 3 applies.

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

Purpose4/5

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

The description names a specific resource ('a business account's public page') and enumerates exactly what it returns (name, active ad count, member since, first 11 ads), so an agent knows precisely what this fetches. It stops short of an explicit contrast with the closest sibling, dv_seller (individual seller vs. business account), so sibling differentiation is left to inference from the param description.

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

Usage Guidelines4/5

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

It clearly states the tool's limit ('only the first batch... no paging') and routes the agent elsewhere for more ('search with the dealer's name or use the ad filters'), naming the viable alternatives. The routing is by description rather than tool name, but the condition that selects the alternative is explicit.

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

dv_districtsCity neighbourhoodsA
Read-onlyIdempotent

Neighbourhoods (محله) of one city with ids, centre point and the main streets inside (Tehran has about 450).

Use to get the district ids for a districts filter, or to pick coordinates for dv_nearby. dv_search and the other search tools take district names directly. Next: dv_neighbours for adjacent areas.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
limitNoMax neighbourhoods to return.
queryNoPart of a neighbourhood name, e.g. 'ونک'.

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, non-destructive semantics, so the safety profile is covered. The description usefully adds the scale of the result set (Tehran ~450) and the shape of each record (ids, centre point, streets), which helps the agent anticipate output volume. It does not discuss truncation or the default limit behavior beyond what the schema states.

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 with the core purpose front-loaded and zero filler. The routing sentences are compact, though the trailing 'Next: dv_neighbours' is only marginally valuable.

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 naming the returned fields (ids, centre point, streets). Annotations cover the safety profile. Pagination/ordering behavior is not described, a minor gap for a potentially 450-item result.

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

Parameters3/5

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

Schema coverage is 100%, so all three parameters (city, limit, query) are already fully documented with defaults, constraints and examples. The description adds no additional parameter syntax or meaning, 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 resource (neighbourhoods/districts of one city) and what each record contains (ids, centre point, main streets), with a volume hint. It explicitly distinguishes itself from search siblings, noting they take district names directly while this tool supplies the underlying ids.

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 when-to-use cases ('to get the district ids for a districts filter', 'to pick coordinates for dv_nearby'), an exclusionary note that dv_search and other search tools don't need it, and a next-step route to dv_neighbours. Nothing is left to inference.

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

dv_exportExport adsA
Read-onlyIdempotent

The ads of a search as CSV or JSON lines text, ready to save to a spreadsheet or analyse.

Same arguments as dv_search. Columns: token, title, price, deposit, rent (Toman), district, posted (UTC), photos, seller, info, url. Missing prices are empty. The text is in data; write it to a file yourself.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
limitNoMax rows.
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
formatNo'csv' (header + rows) or 'jsonl' (one JSON ad per line).csv
recentNoPublished within '3h', '12h', '1d', '3d' or '7d'.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_depositNoRent categories: deposit (ودیعه) in Toman.
min_depositNoRent categories: deposit (ودیعه) in Toman.
max_age_hoursNoOnly ads bumped within this many hours.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already establish readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely useful behavior: the payload arrives as text in `data` and the caller must write the file itself, missing prices are emitted as empty fields, and the exact column set. That is real disclosure beyond structured data, though it says nothing about size limits or truncation.

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

Conciseness5/5

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

Purpose is front-loaded in the first clause, followed by the essential operational note about `data` and the file-writing responsibility. The column enumeration is compact and earns its place because there is no output schema to describe the shape.

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 18 optional parameters, nested `filters`, and no output schema, the description carries the return-shape burden and does so by enumerating columns and flagging empty prices. It does not touch on output size, pagination interplay between `limit` and `pages`, or the `ignored` key mentioned in the schema, leaving minor gaps.

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

Parameters3/5

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

Schema description coverage is 100% across all 18 parameters, so the schema fully documents city, limit, pages, format, filters, etc. The description adds no parameter-level meaning beyond pointing at dv_search's argument set, which is the expected baseline when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb+resource (ads of a search exported as CSV or JSON lines) and names the output medium, which clearly separates it from dv_search's inline results. It even lists the emitted columns. It stops short of explicitly contrasting itself with dv_search beyond noting the shared arguments, so it is not a full 5.

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?

"Same arguments as dv_search" plus "ready to save to a spreadsheet or analyse" implies when to reach for this tool over the search sibling, but there is no explicit when/when-not statement or named alternative. The reader must infer that dv_export is the file-producing counterpart of dv_search.

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

dv_filter_optionsFilter optionsA
Read-onlyIdempotent

Allowed values of a filter: brand and model keys (161 car brands), districts, or any option list.

With query it uses Divar's own typed search (best way to turn 'پراید' into the key 'Pride 111'). Without it: all brands (key, title, model count), or the models of one brand. Pass the keys to dv_search as brand_model / filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
brandNobrand_model only: a brand key (e.g. 'Peugeot') to list its models.
limitNoMax options to return.
queryNoText to look up inside the filter, e.g. 'سمند' or 'ونک'. Without it the whole list (or one brand) is returned.
filterNoFilter key from dv_filters, usually 'brand_model' (cars, phones, ...) or 'districts'.brand_model
categoryYesCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the bar is lower. The description still adds real context beyond them: the lookup is backed by Divar's own typed search, and the result set varies by whether `query`/`brand` is supplied.

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 what the tool returns, then the with/without `query` branching in two compact sentences. Slightly dense with parentheticals but 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?

No output schema exists, and the description partially covers returns ('key, title, model count'), plus how to feed keys into dv_search. It does not describe pagination/limit behavior or error cases when a brand/category is unknown, but is otherwise sufficient for a read-only lookup tool.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description genuinely clarifies parameter interplay the schema states only per-field: `query` triggers typed search, omitting it returns the full list, and `brand` restricts to one brand's models. That coupling of query/brand/filter is the key semantic an agent needs.

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: it returns allowed values for a filter (brand/model keys, districts, option lists), and gives concrete scale ('161 car brands'). It is clearly separable from dv_filters (which yields filter keys) and from dv_search (which consumes the keys).

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 explains the two modes: with `query` it uses Divar's typed search to map Persian text to a key, without it returns all brands or one brand's models, and it tells the agent to pass results into dv_search as brand_model/filters. It stops short of naming dv_filters as the sibling that supplies the `filter` key.

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

dv_filtersCategory filtersA
Read-onlyIdempotent

Every filter a category supports: key, type, Persian label, unit and the allowed options.

Use before dv_search when you need more than price and district. Pass the keys in filters: number_range -> {'size': {'min': 80, 'max': 120}}, repeated_string -> {'rooms': ['دو']}, str -> {'gearbox': 'automatic'}, boolean -> {'parking': true}. lazy filters (districts, brand_model) have long option lists: use dv_filter_options or the districts / brand_model arguments of dv_search. Rent categories filter credit (deposit) and rent, sale categories price; both in Toman.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
categoryYesCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.

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), and the description adds genuinely useful behavior: which filter types exist, that 'lazy' filters have long option lists needing a different tool, and that rent vs. sale categories filter different fields (credit/rent vs. price), all in Toman. It stops short of stating pagination or response-shape details, but it goes meaningfully 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?

The purpose and the usage cue are front-loaded in the first two sentences, and the rest is dense but load-bearing type examples. It is a single run-on block with no visual grouping, which slightly hurts scanability, but there is no filler.

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

Completeness4/5

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

With no output schema, the description correctly explains what is returned and adds domain rules (rent vs. sale filter fields, Toman units) plus pointers to dv_filter_options for long lists. It is complete enough to call the tool correctly, though it leaves the relationship between the schema's city/category params and the referenced `filters` payload implicit.

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

Parameters4/5

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

Schema coverage is 100% for the two declared parameters (city, category), so the baseline would be 3. The description earns an extra point by supplying value-encoding semantics for the filter payload (number_range -> {min,max}, repeated_string -> list, str -> scalar, boolean -> true) that the schema does not document at all.

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 specifies the resource precisely: it enumerates every filter a category supports along with the returned fields (key, type, Persian label, unit, options). It also names the sibling dv_filter_options and the alternative path via dv_search, so an agent can distinguish it from the rest of the dv_* family without inspecting schemas.

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

Usage Guidelines5/5

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

It states the trigger condition explicitly ('Use before dv_search when you need more than price and district') and routes the agent to alternatives for the lazy/long-list filters. The when-to-use and the escape hatch are both spelled out rather than left to inference.

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

dv_find_dealsFind dealsA
Read-onlyIdempotent

Ads priced well below the median of the same search, without a budget: scored deals, with bait and junk prices removed.

Scans the newest pages pages and keeps ads min_discount_pct to 70% below the median (price per m2 for property for sale). Left out: suspect and placeholder prices, ads under 20% of the median (deposits, parts, bait), bait or co-op titles (وامدار, قدرالسهم, اقساط, پیش‌فروش...; unless you ask for the word) and notice / parking titles. Use a narrow query or filters: the median of a mixed category means nothing. Asking prices only. Next: dv_post, dv_appraise, dv_compare.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
limitNoMax deals.
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
recentNoPublished within '3h', '12h', '1d', '3d' or '7d'.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_age_hoursNoOnly ads bumped within this many hours.
min_discount_pctNoOnly ads at least this many percent below the median.

TDQS

A4.2/5.0
Behavior5/5

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

Beyond the read-only/idempotent annotations, it discloses the filtering logic in detail: median basis is price per m2 for sale, ads under 20% of median, suspect/placeholder prices, bait/co-op titles, notice/parking titles are dropped, and "Asking prices only". This is genuinely useful behavioral context an agent cannot infer from the schema.

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

Conciseness4/5

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

Front-loaded with the core definition, then the exclusion rules, then guidance — no filler sentences. It is dense and telegraphic (Persian keyword lists, backtick references), but every clause carries operational 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 16-parameter discovery tool with nested `filters` and no output schema, it covers the essentials: median semantics, exclusion rules, and narrow-query guidance. It does not explain the shape of the returned "scored deals" (no output schema exists) or the apparent gap between `min_discount_pct` max of 60 and the stated 70% floor.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining what `min_discount_pct` is measured against (median, up to 70% below) and by advising that `query`/`filters` must be narrow for the median to be meaningful.

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?

Specific verb and resource: it finds ads priced below the median, explicitly "without a budget", which implicitly separates it from dv_best_for_budget and dv_cheapest. The scope (scored deals, bait/junk removed) is clear. It does not explicitly contrast itself with dv_search or dv_cheapest, so sibling differentiation is partial.

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

Usage Guidelines4/5

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

Gives a concrete usage rule: "Use a narrow query or filters: the median of a mixed category means nothing", plus a workflow pointer ("Next: dv_post, dv_appraise, dv_compare"). It states the condition that makes results meaningful but does not say when to pick this over the other deal-hunting siblings.

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

dv_locateLocate a GPS pointA
Read-onlyIdempotent

The city, neighbourhood and street address of a GPS point.

Gives the city id and district id to use as filters. The street address is only known inside covered areas. Next: dv_nearby for ads around the point.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude inside Iran, e.g. 35.7.
lonYesLongitude inside Iran, e.g. 51.4.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely useful context beyond that: street address resolution is limited to covered areas, and the returned ids are intended as filters for other tools.

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 lines, front-loaded with the result and then the usage hint. It is tight and waste-free, though the opening sentence is a fragment whose missing verb slightly reduces immediate clarity.

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 what comes back (city, neighbourhood, street address, city id, district id) and its coverage limit. For a two-parameter read-only tool this is close to complete; only the handling of points outside covered areas or outside Iran is left unspecified.

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 both lat/lon carry bounds plus worked examples, so the schema fully carries parameter meaning. The description adds no syntax, format or edge-case detail about the coordinates beyond what the schema states, so the baseline 3 applies.

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

Purpose4/5

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

The description names the exact resource produced (city, neighbourhood, street address) for a GPS input, which is a specific and recognizable reverse-geocoding operation. It is a noun phrase rather than a verb+resource statement, so the action ('locate') must be inferred from the name, but the output is unambiguous.

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

Usage Guidelines4/5

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

It states what the result is for ('Gives the city id and district id to use as filters') and explicitly chains to the next tool ('Next: dv_nearby for ads around the point'). No exclusions or when-not conditions are given, so it falls short of a 5.

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

dv_marketMarket price statisticsA
Read-onlyIdempotent

Asking-price statistics of a search: min, p10, p25, median, p75, p90, max, mean; split by district and by day.

Scans the newest pages pages (about 25 ads each) and drops negotiable and suspect prices (excluded) and, from the statistics, prices under a tenth of the median. Sale searches give price; rentals give rent and deposit (Toman). by_district lists the busiest neighbourhoods with ad count and median; per_day shows how many ads were posted per UTC date and their median, a rough trend. These are what sellers ask, not what deals close at, and a sample of the newest ads, not the whole market: use a narrow query or filters (one model, one area) for a meaningful median. Next: dv_cheapest, dv_best_for_budget, dv_appraise.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
recentNoPublished within '3h', '12h', '1d', '3d' or '7d'.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_depositNoRent categories: deposit (ودیعه) in Toman.
min_depositNoRent categories: deposit (ودیعه) in Toman.
max_age_hoursNoOnly ads bumped within this many hours.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations declare only the safety profile (readOnly, openWorld, idempotent, non-destructive); the description adds substantial behavioral detail beyond that: it scans only the newest `pages` pages, drops negotiable/suspect prices into `excluded`, trims prices below a tenth of the median, returns `price` for sales vs `rent`/`deposit` for rentals, and explicitly warns these are asking prices from a newest-ads sample, not closed deals.

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 return statistics and the key sampling caveat, then details `by_district`/`per_day` and next steps. Slightly repetitive (the district/day split is announced up front and re-explained later), but every sentence carries information for a 16-parameter tool with no output schema.

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

Completeness5/5

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

With no output schema, the description fully covers the return surface (min/percentiles/median/mean, `by_district` with ad count and median, `per_day` counts and medians, `excluded`) plus the sample-vs-market caveat, which is exactly what an agent needs to interpret the numbers.

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 the schema already documents all 16 parameters, including the '~25 ads per page' meaning of `pages`. The description reinforces the sale-vs-rental price interpretation (relevant to min_price/max_price) but adds little 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+resource: computing asking-price statistics (min, p10–p90, median, mean) for a search, split by district and by day. An agent can tell this apart from dv_count (a count), dv_price_trend (a trend over time) and dv_cheapest (a listing) 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?

Gives concrete context for meaningful use ('use a narrow query or filters (one model, one area) for a meaningful median') and routes the agent onward with 'Next: dv_cheapest, dv_best_for_budget, dv_appraise.' It lacks an explicit when-not-to-use statement, but the sampling caveat effectively delimits when this tool is appropriate.

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

dv_nearbyAds near a pointA
Read-onlyIdempotent

Ads on the map around a GPS point, nearest first, with coordinates, distance, price chips and a thumbnail.

Up to 200 ads per area are available (total_in_area is the true count). Pin positions are fuzzed by about 500 m for most categories (approximate_location), so distances are approximate. A category is required (Divar's map returns nothing without one). Map prices are rounded in the site's display (1.5 billion = 1,500,000,000); sale pins give the total price and, for homes, price_per_m2. Next: dv_post for details.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude, e.g. 35.7. Get one from dv_place_search or dv_districts.
lonYesLongitude, e.g. 51.4.
limitNoMax ads in the answer.
queryNoFree text in title or description, e.g. 'پراید 111'.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryYesRequired: the map shows nothing without a category. Slug or Persian name, e.g. 'apartment-sell', 'apartment-rent', 'light'. List them with dv_categories.
radius_mNoSearch radius in metres.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_depositNoRent categories: deposit (ودیعه) in Toman.
min_depositNoRent categories: deposit (ودیعه) in Toman.

TDQS

A4.5/5.0
Behavior5/5

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

Adds substantial behavior beyond the annotations: a 200-ad cap per area with total_in_area as the true count, ~500 m pin fuzzing (approximate_location) making distances approximate, and rounded map prices. These are exactly the caveats an agent needs and are consistent with readOnly/idempotent hints.

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

Conciseness5/5

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

Front-loads the purpose and return shape, then the constraints/caveats, then the next step. Dense but every sentence (fuzzing, cap, category requirement, price rounding) earns its place; 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 no output schema, the description carries the return contract (coordinates, distance, price chips, thumbnail, total_in_area) and the key limitations (cap, fuzz, approximate distances). A mutation-free 12-param tool is fully covered for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so parameters are already well documented (lat/lon sourced from dv_place_search/dv_districts, filters keys from dv_filters, price units). The description reinforces the required-category rule and price rounding but adds little parameter syntax beyond the schema — baseline 3.

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

Purpose5/5

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

States a specific verb+resource+scope: ads on the map around a GPS point, returned nearest-first, with the exact payload fields (coordinates, distance, price chips, thumbnail). The map/geographic framing and the 'Next: dv_post for details' routing make it distinguishable from the many search siblings.

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

Usage Guidelines4/5

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

Gives clear context for use (geographic point search) and a hard precondition ('a category is required'), plus a next-step pointer to dv_post. It stops short of explicitly naming an alternative like dv_search for non-map queries, so it is contextual rather than fully routing.

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

dv_neighboursAdjacent neighbourhoodsA
Read-onlyIdempotent

Neighbourhoods adjacent to a district, to widen a neighbourhood search to the surrounding area.

districts is Divar's own adjacency list, which is short for some areas (Vanak lists one). nearest adds the closest districts of city by centroid distance (within 3 km, up to 6) so a widened search is not too narrow. Pass the ids (or names) as districts to dv_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
district_idYesDistrict id from dv_districts, e.g. 655.

TDQS

A3.7/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: `districts` is Divar's short adjacency list (Vanak lists one) and `nearest` supplements it with centroid-distance districts within 3 km, up to 6, which explains why results vary by area.

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

Conciseness4/5

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

The purpose is front-loaded in the first sentence, followed by the mechanics of `districts` and `nearest`, and it ends with the actionable handoff to dv_search. It is well ordered, though the parenthetical detail (within 3 km, up to 6, Vanak lists one) is somewhat granular for a definition.

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

Completeness4/5

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

For a read-only lookup with no output schema, the description does enough: it names the two result sets (districts, nearest) the agent will get back and what to do with them. It is not exhaustive about the exact return shape, but the essential call-and-consume loop is covered.

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 parameters are already documented in the schema (district_id from dv_districts, city name/id with comma-separated examples). The description does not meaningfully extend parameter semantics beyond noting the outputs should be fed back as `districts` to dv_search, so the baseline 3 is appropriate.

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

Purpose4/5

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

The description states a specific resource (adjacent neighbourhoods around a district) and the intent (widening a neighbourhood search to the surrounding area). It does not explicitly differentiate itself from the sibling dv_nearby, which is the most likely confusable tool, so it falls just 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 Guidelines3/5

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

It implies usage by describing the widening scenario and by saying to pass the ids as `districts` to dv_search, which gives the agent a downstream workflow. However, it never states when NOT to use it or how it differs from dv_nearby/dv_districts, leaving the selection decision partly to inference.

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

dv_new_sinceNew ads since a timeA
Read-onlyIdempotent

Ads published after a moment, newest first: poll this to watch a search (a new flat, a cheap car) without repeats.

Call it, remember latest, and pass it as since next time: only ads newer than that come back. Promoted old ads are excluded by date. more is true when the page limit was reached and even more new ads exist. Nothing is stored or pushed: the caller (or a scheduler) decides when to poll.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
hoursNoUsed when `since` is omitted: ads from the last N hours.
limitNoMax ads in the answer.
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
sinceNoUTC timestamp like 2026-10-16T01:50:00Z (the `latest` of the previous call). Omit to use `hours`.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
has_photoNoOnly ads with photos.
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].
max_depositNoRent categories: deposit (ودیعه) in Toman.
min_depositNoRent categories: deposit (ودیعه) in Toman.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, open-world. The description adds genuinely non-obvious behavior: promoted old ads are excluded by date, `more` signals that the page limit was hit, and nothing is stored or pushed (stateless cursor polling). The only gap is how far back the cursor can reach or what happens if `since` is stale.

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?

Four compact sentences, front-loaded with what the tool returns and then the polling contract. Nothing is redundant against the schema despite the tool having 17 parameters.

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

Completeness4/5

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

With no output schema, the description usefully surfaces return-side signals (`latest`, `more`) and the exclusion of promoted ads. It leaves a few operational questions open for a 17-param, nested-object tool, such as cursor expiry, but it is adequate for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 17 parameters, including the `since`/`hours` relationship and the `latest` convention. The description reinforces the `since`-from-previous-`latest` loop but adds no format or validation 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.

Purpose4/5

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

The description names a specific verb and resource ('Ads published after a moment, newest first') and states the tool's distinctive behavior as a polling cursor over a saved search. It distinguishes itself from a one-shot search by describing repetition-free polling, though it never names its nearest sibling (dv_search or dv_watch) 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?

It gives a concrete operating loop: call it, remember `latest`, pass it as `since` next time, and let a caller or scheduler decide when to poll. That is clear when-to-use guidance, but there is no explicit when-not-to-use or routing statement against dv_search/dv_watch.

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

dv_parse_queryQuestion to searchA
Read-onlyIdempotent

Turn a plain Persian request into dv_search arguments: city, neighbourhoods, price bounds, category and leftover words.

A rule-based helper, not a language model: it finds a city and its neighbourhoods by name, amounts with میلیارد / میلیون / هزار (with زیر, کمتر از, تا, بالای, حداقل or از ... تا ...), a category from Divar's own guess for the leftover words, and moves rental words (اجاره, رهن) to the matching rent category. search can be passed to dv_search as it is; check notes for what was assumed. An area like '80 متری' becomes a size filter of ±10%. Rooms, year or mileage are not extracted: use dv_filters.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYesA search as a person would write it, e.g. 'آپارتمان اجاره ونک زیر ۸ میلیارد' or 'پراید کرج تا ۲۰۰ میلیون'.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare it read-only, idempotent and non-destructive, so the safety profile is covered. The description adds substantive behavior beyond that: it is rule-based rather than an LLM, it discloses its extraction limits, and it points the agent at `notes` to see what was assumed.

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?

Opens with the core transformation, then lists extraction rules and caveats; every clause maps to a real parsing behavior an agent needs. It is dense but each sentence earns its place, with only mild redundancy in the price-modifier enumeration.

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

Completeness5/5

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

With no output schema, the description usefully names the return keys (`search`, `notes`) and tells the agent how to consume them. Combined with the disclosed limitations and the pointer to dv_filters, an agent has everything needed to call and use the result 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% and the single `text` parameter is already exemplified in the schema, so baseline is a 3. The description earns above baseline by explaining what the text is parsed into (amount modifiers زیر/تا/بالای, rental words moving to a rent category, '80 متری' becoming a ±10% size filter).

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

Purpose5/5

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

States a specific transformation ('turn a plain Persian request into dv_search arguments') and enumerates exactly which fields it extracts (city, neighbourhoods, price bounds, category, leftover words). It is clearly distinguishable from siblings dv_search (the consumer) and dv_filters (the fallback for rooms/year/mileage).

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

Usage Guidelines4/5

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

Explicitly routes the agent: use dv_filters for rooms/year/mileage, and the produced `search` can be passed directly to dv_search. What is missing is an explicit when-not (e.g., skip this tool if you already have structured arguments), though that is strongly implied.

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

dv_place_mappingMap old place idsA
Read-onlyIdempotent

Convert old Divar place ids to the current ones (Divar merged and renumbered places).

Use when an id from an old link or saved data returns nothing. mapping has the renumbered ids only; unchanged are current city ids; unverified ids are not in the renumber table and are not cities (districts cannot be checked here: see dv_districts).

ParametersJSON Schema
NameRequiredDescriptionDefault
idsYesOld district/city ids saved from earlier Divar data.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare the safety profile (readOnly, idempotent, non-destructive), so the bar is lower; the description adds genuine value by naming the response buckets (mapping, unchanged, unverified) and clarifying what each means. It does not state what happens for ids absent from all three buckets, which is a minor gap.

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

Conciseness5/5

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

Front-loads the purpose in one sentence, then the trigger condition, then the return-taxonomy detail. Every clause carries information and nothing is repeated.

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

Completeness5/5

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

With no output schema, the description correctly compensates by enumerating the three result categories and flagging the district limitation. Combined with the 100%-covered input schema, 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 coverage is 100% and the single `ids` parameter is fully described in the schema ('Old district/city ids saved from earlier Divar data'). The description echoes this framing without adding format, ordering, or batching semantics, 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 (convert) and resource (old Divar place ids → current ones), with the reason (Divar merged and renumbered places). An agent can immediately distinguish this id-remapping utility from lookup siblings like dv_districts or dv_place_search.

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 condition — 'when an id from an old link or saved data returns nothing' — and routes the district-checking case to the named alternative dv_districts. Both when-to-use and when-not-to-use are covered.

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

dv_postAd detailsA
Read-onlyIdempotent

Everything public about one ad: price in Toman, specs, features, description, images, map position, seller type.

Prices: price (sale) or deposit + rent (rental; rent 0 + full_deposit = رهن کامل); negotiable true when the seller gave none; suspect_price marks placeholder prices. specs are the Persian spec rows of the ad (mileage, year, area, rooms...). lat/lon are fuzzed by about 500 m for most categories. shared_housing flags همخانه ads. No phone number: Divar shows it only to logged-in users, use url to contact the seller. Next: dv_similar, dv_appraise (is the price fair), dv_seller, dv_compare.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokenYesAd token: the last part of divar.ir/v/<slug>/<token> or `token` of a search result, e.g. 'gaRPIP2m'.
full_textNoDo not cut the description (default cuts at 1500 characters).
max_imagesNoHow many full-size image URLs to return.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations only cover the read-only/idempotent safety profile, and the description adds real behavioral facts beyond that: lat/lon are fuzzed ~500 m, no phone number is exposed because Divar hides it from anonymous users, `suspect_price` marks placeholder prices, and `rent 0 + full_deposit` means رهن کامل. These are non-obvious data-shape and visibility constraints an agent could not infer from structured fields.

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

Conciseness4/5

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

Front-loaded with a one-line scope statement, then grouped into price semantics, location/feature semantics, the contact limitation, and next-tool routing. It is dense with backticked field names but every clause carries information; a slightly tighter price sentence would earn 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?

With no output schema, the description carries the full burden of explaining the return payload, and it does: price/deposit/rent, specs, images, fuzzed coordinates, and the missing phone field. Nothing an agent needs to interpret or act on the response is absent.

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

Parameters3/5

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

Schema description coverage is 100%, so `token`, `full_text`, and `max_images` are already fully documented in the schema (including the 1500-char truncation default). The description's backticked terms (`price`, `deposit`, `rent`, `negotiable`) describe return fields, not input parameters, so it adds little beyond the baseline for this dimension.

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 and scope: 'Everything public about one ad', immediately establishing this as the single-ad detail fetch. The phrase 'one ad' implicitly contrasts with the list/search siblings (dv_posts, dv_search) without the agent needing to open another schema.

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

Usage Guidelines4/5

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

Ends with explicit routing: 'Next: dv_similar, dv_appraise (is the price fair), dv_seller, dv_compare', and notes to use `url` for seller contact since no phone is returned. It gives clear follow-on context but no explicit when-not-to-use condition (e.g. 'use dv_posts for batches').

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

dv_postsSeveral adsA
Read-onlyIdempotent

Details of up to 10 ads in one call (compact: specs and one image, description cut at 300 characters).

Use to read a shortlist from dv_search. An ad that was removed shows an error instead of failing the call.

ParametersJSON Schema
NameRequiredDescriptionDefault
tokensYesAd tokens, e.g. ['gaRPIP2m', 'gaRPYuZk'] (at most 10).

TDQS

A4.2/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), but the description adds non-obvious behavior: compact payload (specs plus one image, description truncated at 300 chars) and partial-failure semantics where a removed ad yields an `error` field instead of failing the whole call. That is meaningful context beyond the annotations, though ordering/pagination behavior is unstated.

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

Conciseness5/5

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

Two short sentences, zero filler, with the payload shape front-loaded and the routing hint second. Every clause earns its place.

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

Completeness4/5

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

With no output schema, the description usefully sketches the return shape (compact specs, one image, truncated description, `error` for removed ads), which is enough to call and interpret it. Minor gaps remain, such as whether results are returned in token order.

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?

With a single parameter at 100% schema description coverage (type, example, maxItems), the schema carries the semantics. The description only restates the batch cap of 10, adding no format or token-provenance 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 ('Details of up to 10 ads in one call') plus the batch scope, which cleanly distinguishes it from the singular sibling dv_post. An agent knows exactly what this returns 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?

'Use to read a shortlist from dv_search' names the upstream tool and the workflow condition that selects this one, which is strong routing guidance. It does not state explicit exclusions (e.g., when to prefer dv_post or dv_compare instead), 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.

dv_price_trendPrice trendA

The median asking price of a search over the days you have checked it: records one point per day in a local file.

Divar keeps no price history, so the trend starts with your first call and grows each day you call it again (a scheduler helps). Each call scans the newest pages pages, stores median / quartiles / count for today (a second call the same UTC day replaces it) and returns the last 90 points with change_pct since the previous day. Use a narrow query: a mixed category's median is noise. For a one-off distribution use dv_market.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
pagesNoResult pages to merge, about 25 ads each.
queryNoFree text in title or description, e.g. 'پراید 111'.
recordNoStore today's median so later calls can show the trend.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only say readOnlyHint=false, idempotentHint=false, destructiveHint=false, openWorldHint=true. The description explains the write side effect that makes this non-readOnly (one point per day persisted to a local file), the replacement behavior on a second same-day call, and the fact that history only starts from the first call and can never be back-filled. That is meaningful context beyond the annotations, though it says nothing about failure modes or file location.

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

Conciseness4/5

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

Front-loaded with what the tool produces, then the mechanics, then the caveat and the alternative. Four dense sentences, each carrying information; slightly long but no filler and no repetition of the name.

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 8 optional params, nested filters and no output schema, the description compensates by describing the return shape (last 90 points plus change_pct) and the persistence model. It lacks detail on the `filters` object (delegated to dv_filters) and on what happens when zero results are recorded, leaving minor gaps.

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, but the description ties parameters to behavior: `pages` defines the scan scope, `record` controls whether today's median is persisted, and `query`/category narrowness determines whether the median is meaningful. It stops short of documenting city/districts/brand_model 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 precise verb+resource: it records the median asking price of a search, one point per day, in a local file, and returns a 90-point series with change_pct. It explicitly names the sibling it is not (dv_market for one-off distributions), so an agent can separate the two without opening a schema.

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

Usage Guidelines5/5

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

Gives concrete when-to-use guidance (call daily, a scheduler helps), an explicit exclusion/alternative ('For a one-off distribution use dv_market'), and a query-quality constraint ('Use a narrow query: a mixed category's median is noise'). It also states the repeat-call semantics (same UTC day replaces today's point).

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

dv_sellerSeller and their adsA
Read-onlyIdempotent

The seller behind an ad: how many personal and business ads they have, the business card (name, brand_token) and their ads.

Use to judge a seller (one flat or fifty cars?) and to list their other ads. For a dealer's whole page call dv_dealer with the brand_token (dv_post does not give one). A personal seller has no business card (seller_kind). No phone number or identity is exposed.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax of the seller's other ads to return.
tokenYesAd token: the last part of divar.ir/v/<slug>/<token> or `token` of a search result, e.g. 'gaRPIP2m'.

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, open-world, so the safety profile is covered. The description adds genuine context beyond them: the privacy posture ('No phone number or identity is exposed') and the data-shape caveat that a personal seller has no business card (`seller_kind`).

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 resource and its outputs, then usage, then caveats. The parentheticals ('one flat or fifty cars?') carry real semantic signal rather than filler, though the sentence count is slightly higher than strictly needed.

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 carry return-value meaning, and it does: ad counts, business card fields, and the ad list, plus the seller_kind caveat. Nothing an agent needs to call this correctly is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so both input params (token, limit) are fully documented in the schema. The description mentions brand_token and seller_kind, but those are output fields rather than inputs, so it adds little input-parameter meaning beyond the schema. Baseline 3.

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 ('the seller behind an ad') and enumerates the concrete outputs: personal/business ad counts, the business card (name, brand_token), and their ads. It also differentiates itself from siblings by naming dv_dealer and dv_post, so an agent can place it precisely.

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 use case ('judge a seller... and list their other ads') and routes to the alternative: 'For a dealer's whole page call dv_dealer with the brand_token (`dv_post` does not give one)'. The when-to-use and the fallback are both spelled out.

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

dv_similarSimilar adsA
Read-onlyIdempotent

Ads similar to one ad: same brand/model (or category) and neighbourhood, widening step by step until enough are found.

Divar has no similar-ads endpoint; this searches the ad's own breadcrumb (brand+district, brand, category+district, category). basis names the levels used, narrowest first. Sorted newest first. For property, ads priced over 5x or under a fifth of this ad, or whose title area is under 0.4x or over 2.5x of its area (a 950B bulk listing next to a 180 m flat), are left out and counted in excluded_outliers. Next: dv_compare, dv_appraise.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax similar ads.
pagesNoPages scanned per breadcrumb level.
tokenYesAd token: the last part of divar.ir/v/<slug>/<token> or `token` of a search result, e.g. 'gaRPIP2m'.

TDQS

A4.6/5.0
Behavior5/5

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

Annotations already establish safe/idempotent read semantics, and the description goes well beyond them: the four-level breadcrumb widening order, narrowest-first sorting, newest-first ordering, and concrete outlier exclusion thresholds for property (5x price, 0.4x/2.5x area) with the resulting `excluded_outliers` count. This is exactly the behavioral context an agent cannot infer from structured fields.

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

Conciseness4/5

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

Purpose and scope are front-loaded in the first sentence, and each subsequent sentence adds a distinct fact (search strategy, sort order, exclusion rules, next tools). It runs long and includes an illustrative parenthetical, but no sentence is pure 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?

There is no output schema, so the description carries the return-value burden and does so: it names `basis` and `excluded_outliers` and states the sort order. Combined with the disclosed filtering rules, an agent has everything needed to call and interpret this tool.

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

Parameters4/5

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

Schema coverage is already 100%, so baseline is 3, but the description adds interpretive meaning the schema lacks: 'widening step by step' clarifies what `pages` (pages scanned per breadcrumb level) actually traverses, and the breadcrumb level list explains what the returned `basis` refers to.

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 ('Ads similar to one ad') plus the matching logic (same brand/model or category + neighbourhood) and the widening fallback. An agent can distinguish it from siblings like dv_nearby or dv_search 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?

Explains the algorithmic context ('Divar has no similar-ads endpoint; this searches the ad's own breadcrumb') and names the follow-on tools (dv_compare, dv_appraise). It does not, however, explicitly state when to prefer this over other discovery siblings such as dv_nearby or dv_find_deals.

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

dv_statusServer statusA
Read-onlyIdempotent

Is Divar reachable and how fast: version, a live latency check, caches and local watch state.

Call first when other tools fail (it tells a blocked network from a bad argument). The check is one small request to Divar. The server instructions describe the usual tool order (cities and categories, then dv_search, then dv_post).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

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 genuinely new context: the check is 'one small request to Divar' (cost/latency footprint) and it discriminates network failure from argument error. It does not discuss caching/TTL of the reported values, so it stops short of 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?

Three short sentences, front-loaded with what it returns and then the diagnostic condition. The closing pointer to the server instructions is mildly tangential but earns its place as ordering guidance.

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 parameters, no output schema to explain, and rich annotations, the description covers what an agent needs: what is reported, when to call it, and its request cost. Only the shape/reliability of the reported values (e.g. cache freshness) is left implicit.

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

Parameters4/5

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

The tool takes no parameters, so there is nothing for the description to clarify beyond the schema; baseline for a zero-param tool is 4.

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

Purpose5/5

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

States a specific verb-and-resource ('Is Divar reachable and how fast') plus the exact facets exposed (version, live latency, caches, local watch state). This clearly separates it from the search/listing siblings, which never report transport health.

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 — 'Call first when other tools fail' — and states the diagnostic payoff (distinguishing a blocked network from a bad argument). It also routes the agent to the server instructions for the normal tool order, so when-not-to-use is implied by that ordering.

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

dv_suggestSearch suggestionsA
Read-onlyIdempotent

What Divar's search box would suggest for some text, and which categories the text belongs to.

Use to find the right category and a good query when the user only gave a product name. Each suggestion has the category slug and a probability; categories are guesses for the bare word. Next: dv_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
queryYesText as typed in the Divar search box, e.g. 'پراید', 'پژو'.

TDQS

A4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower. The description usefully adds return-shape semantics absent from any output schema: each suggestion carries a category slug and a probability, and `categories` are guesses for the bare word. This is real added value 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?

Two short paragraphs with no waste; the purpose comes first and the usage hint plus next step follow. The opening sentence is slightly roundabout but still front-loaded and economical.

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 lookup with no output schema, everything an agent needs is present: what is returned (slug + probability), when to reach for it, and where to go next. The `city` parameter is fully covered by the schema, so no gap remains.

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 `query` and `city` are already fully documented in the schema. The description adds no syntax or format detail beyond what is there, so the baseline of 3 applies.

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

Purpose4/5

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

The description names a specific function ('what Divar's search box would suggest for some text') plus a second output type (category guesses), so the agent knows exactly what comes back. It partially differentiates from siblings by naming dv_search as the follow-up step, though it never explicitly contrasts with the near-neighbour dv_parse_query or dv_categories.

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

Usage Guidelines4/5

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

It states a clear trigger condition: use this when the user only supplied a product name and you need the right category and a good query. It also points to the next tool in the workflow ('Next: dv_search'), but gives no when-not guidance or distinction from dv_parse_query.

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

dv_watchSaved watchesA

Save a search and later get only the ads that appeared since the last check; stored in a local file, nothing is pushed.

create takes the search arguments of dv_search (validated once, then stored with the current time as the mark). check runs dv_new_since for the watch and moves the mark to the newest ad it returned, so the next check shows only newer ads; it does not run by itself: call it from a schedule or when asked. The file is ~/.divar-mcp/state.json (override with DIVAR_MCP_STATE); it holds only your searches. Next: dv_post for a new ad.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity name or id; several comma-separated, e.g. 'تهران', 'mashhad', 'تهران,کرج'.تهران
nameNocreate: a label for you, e.g. 'cheap Pride in Karaj'.
limitNocheck: max new ads per watch.
queryNoFree text in title or description, e.g. 'پراید 111'.
actionYes'create' saves a search, 'check' returns the ads newer than the last check and moves the mark, 'list' shows the saved searches, 'delete' removes one.
excludeNoDrop ads whose title has any of these words.
filtersNoOther category filters (keys from dv_filters): {'size': {'min': 80, 'max': 120}, 'rooms': ['دو'], 'parking': true}. Unknown keys are returned in `ignored`.
categoryNoCategory slug or Persian name, e.g. 'light' (cars), 'apartment-sell', 'apartment-rent', 'mobile-phones'.
keywordsNoWords that must all be in the title.
watch_idNocheck / delete: the id from 'create' or 'list'. check without it checks every watch.
districtsNoNeighbourhood names or ids in the one city, e.g. ['ونک'].
max_priceNoToman; monthly rent in rent categories.
min_priceNoToman; monthly rent in rent categories.
brand_modelNoVehicles, phones: brand/model, e.g. ['پژو 206'].

TDQS

A4.7/5.0
Behavior5/5

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

Despite annotations already covering safety (readOnlyHint=false, openWorldHint=true), the description adds substantial non-obvious behavior: state is a local file at ~/.divar-mcp/state.json, overridable via DIVAR_MCP_STATE, holds only the caller's searches, nothing is pushed, and check mutates the mark so the next call shows only newer ads. That is exactly the kind of hidden-state 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?

Front-loaded with purpose, then action semantics, then state location, then next-step routing — a sensible ordering with no filler. Slightly dense and the mid-paragraph line breaks are arbitrary, but every sentence carries needed 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 14-parameter, nested-object, mutation-and-read hybrid with no output schema, the description covers the create/check lifecycle, persistence model and follow-up tool. list and delete are left to the schema, which is acceptable given 100% coverage.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3. The description adds genuine meaning by tying `create` params to dv_search's argument set and clarifying the mark semantics of `check` (watch_id omitted = check all). It stops short of explaining several action-specific params, which the schema already covers.

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 (save a search, then get only ads that appeared since the last check) and immediately distinguishes itself from siblings by naming dv_search, dv_new_since and dv_post. An agent knows this is a persistent watchlist, not a one-shot search, 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 routes usage: `create` reuses dv_search arguments, `check` runs dv_new_since and advances the mark, and check 'does not run by itself: call it from a schedule or when asked'. It also names the follow-up tool (dv_post for a new ad), so the when-and-what-next is fully specified.

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. 31 tool updatesv0.1.0
    • First observeddv_appraise
    • First observeddv_best_for_budget
    • First observeddv_boundary
    • First observeddv_categories
    • First observeddv_cheapest
    • First observeddv_cities
    • First observeddv_compare
    • First observeddv_count
    • First observeddv_dealer
    • First observeddv_districts
    • First observeddv_export
    • First observeddv_filter_options
    • First observeddv_filters
    • First observeddv_find_deals
    • First observeddv_locate
    • First observeddv_market
    • First observeddv_nearby
    • First observeddv_neighbours
    • First observeddv_new_since
    • First observeddv_parse_query
    • First observeddv_place_mapping
    • First observeddv_place_search
    • First observeddv_post
    • First observeddv_posts
    • First observeddv_price_trend
    • First observeddv_search
    • First observeddv_seller
    • First observeddv_similar
    • First observeddv_status
    • First observeddv_suggest
    • First observeddv_watch

TDQS

A4/5.0

Scored across 31 tools

Disambiguation4/5

Most tools have clearly distinct outputs, and the descriptions helpfully clarify boundaries (e.g. search vs count vs export vs cheapest vs market). However, several search-derived analysis tools (dv_cheapest, dv_best_for_budget, dv_find_deals, dv_market, dv_price_trend, dv_appraise) and the watch/new-since pair overlap enough that an agent could still hesitate.

Naming Consistency5/5

Every tool uses the same dv_ prefix and lowercase snake_case, with readable noun/verb phrases such as dv_search, dv_post, dv_filters, and dv_price_trend. No mixed conventions or casing issues appear.

Tool Count2/5

31 tools is above the 25+ threshold and feels heavy for a single MCP surface, even for a rich marketplace domain. Several tools could be consolidated or made optional subcommands, and some tools (dv_status, dv_place_mapping) are thin relative to the total.

Completeness4/5

The read/search/analysis lifecycle is well covered: categories, filters, city/district lookup, search, export, details, seller, dealer, price stats, compare, watch, and trend. Gaps are mostly write/account operations such as creating or editing ads, messaging/contact, or deleting saved watches, which may be outside the read-only scope.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables searching and comparing product prices, sellers, and price history from Torob, Iran's price-comparison engine, including shop trust signals and physical store availability.
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search Digikala's catalogue, compare every seller's offers and prices, review ~30 days of price history, read customer reviews and Q&A, and surface current deals, all through read-only tools.
    23
    576 PyPI
    31
    MIT