torob-mcp
An unofficial, read-only MCP server that lets AI agents search Torob (Iran's price-comparison site) and compare shop prices for products in Iran, with prices in Toman.
Search products (
tb_search) by query (Persian/Finglish), category, brand, price range, new/used, in-person, installment and attribute filters, with CSV export; also autocomplete (tb_suggest), filters/brands/categories (tb_filters,tb_brands,tb_category), trends (tb_trends), special offers (tb_offers) and city ids (tb_cities).Get product details (
tb_product): name, price window, category path, brand, key or full specs, cheapest offer.See every shop's offer (
tb_sellers): price, shop score, warranty, installments, delivery, reliability flags, stats and filters; also in-person stores with address/hours/shelf price (tb_stores), availability counts (tb_presence) and variants (tb_variants).Check price history: ~1-year weekly price chart with a great/fair/high verdict (
tb_price_chart) and notable drops/rises (tb_price_history).Make buying decisions: cheapest trustworthy offer for a product named in words (
tb_cheapest), compare 2–5 products (tb_compare), best picks under a budget (tb_best_value), 0–100 deal score (tb_deal_check), and cheapest single shop or split cart for a shopping list (tb_basket).Explore alternatives and utilities: similar products (
tb_similar), clean product links (tb_product_url), batch product records (tb_products_batch).Inspect shops: trust profiles with score, e-Namad, tenure, delivery/payment terms (
tb_shop), find shops by name/domain (tb_find_shops) and browse a shop's catalogue (tb_shop_products).Read-only and no auth: no login, API key, purchases or alerts; compact JSON output, all tools annotated
readOnlyHint: true.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@torob-mcpwhat's the cheapest price for an iPhone 15?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
torob-mcp: Torob MCP server for AI agents
Let your AI agent compare prices across Iranian shops on Torob (ترب). An unofficial, read-only MCP server for Torob, Iran's price-comparison engine: search a product, see every shop's offer, check the price history, judge a deal and find the cheapest shop for a whole shopping list, all from Claude, Cursor or Copilot.
For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development · Related
Status: new. The live test suite passes against torob.com (checked 2026-10-18). Some endpoints are still mapped from the web app's code only, and several offline test fixtures are hand-made rather than recorded.
For AI agents
What: unofficial MCP server (model context protocol) for Torob (ترب), an Iranian price-comparison site. Persian and Finglish queries work; prices in Toman.
Install:
uvx torob-mcporclaude mcp add torob -- uvx torob-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
TOROB_MCP_PROXY(HTTP proxy, or a comma-separated list; Torob blocks many foreign and cloud IPs).Access: read-only. It cannot log in, buy, bookmark or set price alerts, so no confirmation is needed before calling any tool.
Tools: 26, all prefixed
tb_. Start withtb_search,tb_sellers,tb_cheapest,tb_deal_check,tb_basket. Typical sequence:tb_search->tb_sellers(every shop) ->tb_price_chart/tb_deal_check;tb_cheapestfor "where is X cheapest";tb_compareto choose between models.Units: prices in Toman (Torob's API is already Toman; nothing is converted).
priceisnull, never 0, when there is no usable price.Use when: the user wants the best Iranian shop price for a product, a price history, installment or warranty offers, or a pick within a budget.
Do not use when: the user wants to buy, or needs their own Torob account data (watchlist, alerts).
Output: compact JSON. The product
id(a UUID) passes between tools; links arehttps://torob.com/p/<id>/(not repeated on every card;tb_product_urland csv output still give them).Network: talks to
api.torob.comdirectly from your machine. After a bot-protection block (HTTP 490) it stops calling for 30 minutes and reports the minutes left; setTOROB_MCP_PROXYfor another exit.Machine-readable:
server.jsonand the iran-mcp catalog (TOOLS.md,servers.json,llms.txt).
Related MCP server: digikala-mcp
Why
Torob lists one product with the offers of many shops, but judging them takes clicks: which offers are reliable,
who gives a warranty or installments, whether today's price is high compared to the last year, and which single
shop can sell your whole list. An agent with torob-mcp answers that in a few calls, and skips offers Torob itself flags as unreliable.
What it can do
Search with category, brand (by name), price range, new / used, in-person, installment and attribute filters; weak matches are flagged (
low_confidence,unmatched_terms, suggested queries)Every shop's offer for a product with score, warranty, installments, delivery and Torob's order-volume notes; offers flagged as unreliable are hidden and kept out of the statistics
In-person stores with address, hours, open now and the age of the shelf price
Price chart (about a year, weekly) with a great / fair / high verdict, price moves, and a 0-100 deal score
Decision tools: cheapest trustworthy offer for a name, compare 2-5 products (only the differing specs), best picks under a budget, cheapest shop for a whole basket (single shop vs split cart)
Shop profiles (score, e-Namad seal, time on Torob, delivery terms), shop search, shop catalogue
CSV export of search results and seller lists
Read-only by design: no login, no alerts, no purchases
Example prompts:
"Cheapest trustworthy shop for an iPhone 13 Pro 256 GB, and is now a good time to buy?"
"Compare the Galaxy A55 and the Redmi Note 13 Pro. Which one is worth the price difference?"
"Which shops sell this laptop with installments and a warranty?"
"Best 55-inch TVs under 30 million Toman."
"Cheapest single shop for: a kettle, a toaster and an electric grill. Is splitting the cart cheaper?"
ارزان‌ترین فروشنده معتبر آیفون ۱۳ پرو ۲۵۶ کجاست و الان وقت خرید هست؟
نمودار قیمت این گوشی در یک سال گذشته را نشان بده.
ارزان‌ترین فروشگاهی که همه این سه کالا را دارد کدام است؟
Quick start
You need uv. No API key or account.
claude mcp add torob -- uvx torob-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"torob": { "command": "uvx", "args": ["torob-mcp"] }
}
}Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json.
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"torob": { "type": "stdio", "command": "uvx", "args": ["torob-mcp"] }
}
}codex mcp add torob -- uvx torob-mcpOr in ~/.codex/config.toml:
[mcp_servers.torob]
command = "uvx"
args = ["torob-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"torob": { "command": "uvx", "args": ["torob-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It's a standard stdio MCP server: run uvx torob-mcp, or pip install torob-mcp and run torob-mcp.
Tools
All tools are read-only and start with tb_. A product is identified by its id (a UUID); every tool also accepts
a /p/<id>/... path or a full torob.com product URL.
Tool | What it does |
| Search with sort, category, brand name or id, price range, new / used, in-person, installment, city and validated attribute filters; csv output |
| Torob's autocomplete (fixes Finglish and colloquial wording); works even while other calls are blocked |
| Category children, brands, price span, sort options and attribute slugs / values for a query or category |
| A category page: parents, sub-categories and top products |
| All brands of a category with ids |
| What people search right now, with a sample product each |
| The special-offers feed: themed rows of discounted products |
| City ids (most visited, or search by name) for the |
Tool | What it does |
| Name, price window, category path, brand, key specs (full table on request), cheapest offer |
| Every online shop offer with score, warranty, installments, delivery, buyer notes; min / median / max and spread; city, installment, warranty and score filters; csv output |
| In-person stores: address, hours, open now, shelf price and age, optional map coordinates |
| Counts of online shops, in-person stores, installment shops and Torob-warranty shops |
| Sibling variants (storage + RAM, colour, region) with their own prices |
| Weekly minimum and average price for about a year with a buy-now verdict |
| Notable price drops and rises, lowest and highest point, last change |
| Products Torob shows as alternatives |
| Clean torob.com link from an id, path or URL (no request) |
| Short records for up to 10 products |
Tool | What it does |
| Cheapest trustworthy offer for a product named in words (checks every shop of the top matches; installment and city options) |
| Compare 2-5 products: only the differing specs, price window, cheapest flagged |
| Ranked picks under a budget in Toman (by budget reach, popularity or price) |
| Deal score 0-100 from the price history and today's offers, for today's price or a price you were offered |
| Cheapest single shop that sells every item of a list, and the split-cart total |
Tool | What it does |
| Shop trust profile: score, votes, e-Namad seal, time on Torob, city, website, delivery and payment terms |
| Find shops by name or domain, optionally by city |
| Products a shop sells, with the price range of the page |
All 26 tools are annotated readOnlyHint: true and return compact JSON, so they don't flood the agent's context.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
torob-mcp (runs on your machine)
│
│ HTTPS, Chrome-like client
└──────▶ api.torob.com products, sellers, stores, price charts, shopstorob-mcp runs locally and calls the same public JSON endpoints the torob.com web app uses. There is no hosted
server in between and no API key. Requests go one at a time with a pause between them, and replies are cached.
Good to know
Prices are Toman. Torob's API already returns Toman (checked against the display text in every test); nothing is converted.
priceisnullwhen there is no usable price, never 0.A card's price is the cheapest across shops and can be an out-of-stock or unreliable offer. For a real buying price use
tb_sellersortb_cheapest, which skip offers flaggedunreliable.Torob's bot protection. Torob's firewall answers HTTP 490 (a captcha page) when one IP sends a burst of requests, and then keeps blocking that IP for an hour or more. This server presents itself as Chrome (TLS and HTTP/2 fingerprint, headers), makes one call at a time with a pause between calls (2 s plus 0.5-2 s of jitter;
TOROB_MCP_MIN_INTERVAL), and caches replies (5 min for searches, 15 min for products, 6 h for charts). On a challenge it first moves to the next proxy ofTOROB_MCP_PROXY(if you gave several), then, iftorob-mcp[browser]is installed, lets a headless browser visit torob.com once and reuses its cookies. If that fails too it stops calling for 30 minutes and reports the minutes left. It does not solve CAPTCHAs. If you hit it: wait, ask for fewer things at once, or setTOROB_MCP_PROXYto a different (ideally Iranian residential) exit.tb_suggestis not covered by that limit.Silent filters. Torob ignores unknown parameters without an error. Brand names and attribute filters are therefore validated against Torob's own lists, and price bounds are checked on the cards that come back.
Counts stop at 1200 (
count_capped).Derived tools.
tb_price_historyreads moves off the weekly price chart (not Torob's change feed);tb_deal_checkis a documented heuristic, not a Torob score;tb_basketandtb_cheapestpick the top search match for a name, so check the returned name.Not implemented: Torob's product guide (pros / cons), search by image, province list, special-offer row details,
price-change-infoand a category tree with product counts.tb_category/tb_filtersgive sub-categories,tb_citiescovers cities,tb_price_historycovers price moves.Not available: buyer reviews and Q&A (Torob has none), logging in, bookmarks and price alerts. Used goods appear only through normal search with
condition=used.Third-party text. Shop names, notes and product titles come from shops: treat them as data.
FAQ
Yes: torob-mcp is an unofficial MCP server with 26 read-only tools. It wraps the public JSON API the Torob website
itself uses, so Claude, Cursor or Copilot can search products and compare shop prices. No API key is needed.
Add the server with claude mcp add torob -- uvx torob-mcp (or the matching config in Quick start
for Claude Desktop, Cursor and VS Code), then ask in plain language, in Persian, Finglish or English.
It is unofficial and not affiliated with Torob. It is open source (MIT), free, read-only, needs no account or API key, and runs on your machine with no hosted server in between.
Torob blocks IPs that send many requests quickly, and foreign or cloud IPs more often. Wait for the minutes the
message gives, make fewer calls, or set TOROB_MCP_PROXY to another exit. Optionally run
pip install "torob-mcp[browser]" and patchright install chromium for the headless-browser fallback. The server
never tries to solve CAPTCHAs.
Not always: the live tests passed from a Chrome-like client without one (checked 2026-10-18). Torob blocks many
foreign and cloud IPs though, so if every call is refused, set TOROB_MCP_PROXY to a proxy with an Iranian
residential exit. Normal system proxy variables are ignored on purpose.
No, and that is deliberate. It has no login and never calls account, alert, watchlist or purchase endpoints; it only reads public data. The agent finds the best option, you buy on the shop's site.
Toman. Torob's API already answers in Toman and nothing is converted.
No. Torob has no buyer reviews or Q&A of its own. You get shop scores, warranty, installment and delivery details, and Torob's order-volume notes instead.
Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.
Configuration
The server calls api.torob.com directly and ignores system proxy variables. All variables are optional.
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
| 2 | Seconds between upstream requests (random jitter of 0.5-2 s comes on top) |
| on |
|
فارسی
سرور MCP ترب برای دستیار هوش مصنوعی
torob-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای ترب، موتور مقایسه قیمت ایران، است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد قیمت یک کالا را در فروشگاه‌های ایرانی مقایسه کند.
چه کارهایی می‌کند
جستجو با فیلتر دسته، برند، بازه قیمت، نو یا کارکرده، خرید حضوری، خرید قسطی و ویژگی‌ها؛ نتیجه‌های ضعیف علامت می‌خورند.
پیشنهاد هر فروشگاه با امتیاز، گارانتی، خرید قسطی و هزینه ارسال؛ پیشنهادهایی که ترب نامطمئن می‌داند کنار گذاشته می‌شوند.
نمودار قیمت حدود یک سال گذشته، تغییرهای قیمت و امتیاز معامله از ۰ تا ۱۰۰ تا بدانید الان وقت خرید هست یا نه.
ارزان‌ترین فروشنده معتبر برای یک کالا، مقایسه ۲ تا ۵ کالا و بهترین انتخاب‌ها در بودجه شما.
سبد خرید: ارزان‌ترین فروشگاه که همه کالاهای فهرست را دارد، یا مجموع قیمت با تقسیم سبد.
فروشگاه‌ها: امتیاز، نماد اعتماد الکترونیکی، مدت حضور در ترب و شرایط ارسال و پرداخت؛ همچنین فروشگاه‌های حضوری با نشانی و ساعت کار.
نکته‌ها
فقط خواندنی است: وارد حساب نمی‌شود، خرید یا هشدار قیمت ثبت نمی‌کند و کلید API لازم ندارد.
همه قیمت‌ها به تومان است و قیمت نامعلوم
nullاست، نه صفر.اگر ترب با کد ۴۹۰ جلوی درخواست‌ها را بگیرد، سرور ۳۰ دقیقه درخواست نمی‌فرستد و دور زدن آن را تلاش نمی‌کند. می‌توانید با
TOROB_MCP_PROXYخروجی دیگری بدهید.
کلیدواژه‌ها: ترب، torob، سرور MCP ترب، مقایسه قیمت، ارزان‌ترین قیمت، ارزان‌ترین فروشنده، تاریخچه قیمت، نمودار قیمت، خرید قسطی، گارانتی، سبد خرید، فروشگاه اینترنتی.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add torob -- uvx torob-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
نمونه پرسش‌ها
«ارزان‌ترین فروشنده معتبر آیفون ۱۳ پرو ۲۵۶ کجاست و الان وقت خرید هست؟»
«این دو گوشی را مقایسه کن و بگو کدام ارزش خرید دارد.»
«بهترین تلویزیون ۵۵ اینچ تا ۳۰ میلیون تومان کدام است؟»
«کدام فروشگاه‌ها این لپ‌تاپ را با گارانتی و خرید قسطی دارند؟»
Development
git clone https://github.com/sepehr071/torob-mcp && cd torob-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q # offline, recorded fixtures
uv run python -m pytest -m live -q # real API; skips (does not fail) when Torob answers 490Tools live in src/torob_mcp/ (search.py, product.py, decide.py, shops.py); each is a typed async function
with a docstring that tells the agent when to use it. A unit test keeps the tool tables in this README equal to the
server's tool list. Issues and PRs are welcome.
Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions tests,
publishes to PyPI and the MCP Registry, and creates the GitHub Release.
Related servers
Digikala MCP server for Digikala prices, to cross-check a Torob result
Technolife MCP server for electronics prices
MasterKala MCP server for gadgets and phone accessories
Okala MCP server for online grocery shopping
iran-mcp: catalog of all Iranian-service MCP servers
Listed on mcpfarsi.ir, the Persian MCP marketplace
Disclaimer
Unofficial and not affiliated with or endorsed by Torob. It is read-only and uses the public endpoints of the torob.com web app, which can change without notice. Please keep request rates low.
Author
Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.
License
If this saves you clicks, a star helps others find it.
Available Tools
26 toolstb_basketShopping basketARead-onlyIdempotent
Cheapest shop for a whole shopping list: best single shop that sells everything, and the split-cart total.
Names resolve to the top search match (check items[].name; pass ids to be exact).
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City id or name: only offers serving that city. | |
| items | Yes | Product names ('آیفون 13 128') or ids / URLs. | |
| condition | No | used = کارکرده / stock. | new |
| min_score | No | ||
| installment_only | No | Installment shops only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open world), so the description's real contribution is the fuzzy name-resolution behavior: names map to the top search match and ids should be passed for exactness. That is a genuine behavioral caveat an agent would otherwise miss, though it says nothing about what happens when no single shop stocks everything.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the core behavior and the caveat placed second. The parenthetical reference to items[].name is compact, though it points at a response field with no output schema to anchor it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 sketch the return shape ('best single shop' plus 'split-cart total'), which is the minimum needed. It omits the fallback behavior when no single shop covers the list and leaves the min_score threshold unexplained for a tool with five parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so the baseline applies. The description meaningfully clarifies the `items` parameter (names resolve loosely; verify against the returned items[].name), but the undocumented `min_score` parameter — a scoring threshold with no schema description — is not addressed at all.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific computation over a specific resource: cheapest single shop covering a whole list plus the split-cart total. That is clearly distinct from single-product siblings like tb_cheapest and tb_compare, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'whole shopping list' implies the multi-item use case, distinguishing it in spirit from single-item price tools, but there is no explicit when-to-use/when-not or named alternative such as tb_cheapest or tb_shop. The agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_best_valueBest value under budgetARead-onlyIdempotent
Ranked product picks that fit a budget (Toman), for "best phone under 30 million".
No quality score: check specs with tb_compare. In-stock products only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | No | What to buy, e.g. 'لپ تاپ'. Optional with category. | |
| budget | Yes | Max price, Toman. | |
| rank_by | No | budget_reach: priciest models that fit first. | budget_reach |
| category | No | ||
| condition | No | used = کارکرده / stock. | new |
| min_shops | No | Skip products with fewer shops. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the description's job is to add constraints — and it does: results are ranked, priced in Toman, restricted to in-stock products, and explicitly carry no quality score. That last point is a genuinely useful disclosure about what the tool will NOT return. It does not describe the shape of the ranked output, which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose before the example and the tb_compare hand-off. Every clause carries information; the phrase 'No quality score: check specs with tb_compare' is slightly compressed but still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters and no output schema, the agent is left inferring what a 'ranked pick' record contains (price, shop count, model info) and how ranking changes with rank_by. The in-stock and no-score caveats are helpful, but for a tool of this complexity the description stops short of fully arming the caller.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 71%, so the schema carries most parameter meaning, and the description adds only the Toman currency for budget — which the schema already states ('Max price, Toman.'). The ranking behavior of rank_by, the limit cap of 30, the query/category interplay, and the min_shops shop-count filter are not illuminated beyond their schema text. Baseline 3 for a well-covered schema is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a specific verb+resource ('Ranked product picks that fit a budget') and anchors it with a concrete intent example ('best phone under 30 million'), so the agent knows this is a budget-constrained discovery tool. It also pre-empts confusion with a rating tool by stating 'No quality score'. It does not, however, distinguish itself from close siblings like tb_cheapest or tb_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied through the example intent and the hand-off 'check specs with tb_compare', which tells the agent where to go for quality comparisons. But there is no explicit when-to-use/when-not versus tb_cheapest, tb_search, or tb_suggest, which are the most likely competing choices for the same request.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_brandsBrandsARead-onlyIdempotent
All brands of a category with their ids (for tb_search brand=).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | Name contains this text. | |
| category | Yes | Category id, e.g. 94 (mobile phones); see tb_filters. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is fully covered. The description adds only the scoping fact (results are per-category) and the id-passthrough purpose; it says nothing about the limit/pagination behavior implied by the default of 60 and max of 100.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence that front-loads the resource and its scope, with the integration hint second. Nothing is redundant, though the terseness edges toward under-specification rather than crispness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with rich annotations, no output schema, and mostly documented parameters, the description covers what the tool returns (brands plus ids) and why. The only material gap is the undocumented limit parameter and the resulting pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 67%: category and search are documented in the schema, while limit has no description anywhere. The tool description adds no parameter-level detail beyond implying that category drives the result set, so it neither compensates for the undocumented limit nor adds meaning over the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (brands), scopes it to a category, and states the return payload (brand ids). That distinguishes it from siblings like tb_filters or tb_search — this is a lookup that feeds one of them — though it never explicitly contrasts itself with tb_filters, which also returns taxonomy data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(for tb_search brand=)' gives a concrete chaining hint: call this to obtain the id value that tb_search expects for brand. There is no explicit when-not guidance and no mention of tb_filters as the place to discover category ids, so the agent must infer the workflow entry point from the schema rather than the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_categoryBrowse categoryARead-onlyIdempotent
A category page: its parents, sub-categories and top products.
Use to walk the category tree. For text search in a category use tb_search(category=).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| sort | No | most_sellers = most shops. | popular |
| brand | No | Brand id or name. | |
| limit | No | ||
| category | Yes | Category id, e.g. 94 (mobile phones); see tb_filters. | |
| max_price | No | Toman. |
TDQS
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 safety profile is covered. The description adds return-content context (ancestors plus sub-categories plus top products), which is valuable given there is no output schema, but it says nothing about pagination over the 10-default limit or what happens at tree edges.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the caller gets, followed by the routing rule. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 carry the burden of describing results and does so briefly (parents, sub-categories, top products). Given six parameters that include filtering and pagination, an agent still has to infer how results are paged and ordered, keeping this short of full coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
At 67% schema coverage, the description adds essentially no meaning for page, limit, sort, brand, or max_price — all are left to the schema. The only parameter-adjacent info is the parenthetical showing that tb_search also accepts a category argument, which is a cross-tool hint rather than semantics for this tool's inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"A category page: its parents, sub-categories and top products" states the resource and enumerates what comes back, and "Use to walk the category tree" gives the agent an unambiguous job for the tool. It is clearly separable from tb_search, though it stops short of a verb-first statement of the operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes text queries elsewhere: "For text search in a category use tb_search(category=)" names the sibling and the condition that selects it. No guidance is given on when to prefer other category-adjacent siblings (tb_filters, tb_brands), but the main disambiguation is handled.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_cheapestCheapest offerARead-onlyIdempotent
Cheapest trustworthy offer for a product named in words: searches, then looks at every shop's offer.
Gives the best usable offer per top match and the overall cheapest; check the matched name.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City id or name: only offers serving that city. | |
| query | Yes | Product, e.g. 'ps5 slim'. | |
| condition | No | used = کارکرده / stock. | new |
| min_score | No | Minimum shop score. | |
| candidates | No | Top search matches to check (one request each). | |
| installment_only | No | Installment (قسطی) shops only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world, and non-destructive, so the safety profile is covered. The description adds real value beyond that: it discloses the multi-step search-then-check-every-shop behavior and warns that the matched product name may not be exact, which is important for trusting results. It stops short of stating cost/latency implications of checking multiple candidates.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the purpose, with no filler. The return-shape sentence is slightly compressed ('per top match and the overall `cheapest`'), but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, no-output-schema tool, the description covers purpose, internal search behavior, return shape, and the fuzzy-match caveat. The main remaining gap is that it doesn't quantify that each candidate match costs an extra request, though the schema's candidates description mentions 'one request each'.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented, and the baseline is 3. The description reinforces the query semantics ('named in words') and implies the candidates concept via 'top match', but adds nothing about city, condition, min_score, or installment_only beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb+resource ('Cheapest trustworthy offer for a product named in words') and explains the internal two-step behavior (search, then inspect every shop's offer). It is clear what the tool returns ('best usable offer per top match and the overall cheapest'), though it doesn't explicitly contrast itself with near-neighbors like tb_offers, tb_best_value, or tb_compare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: you supply a product 'named in words' and get the cheapest trustworthy offer. There is no explicit when-to-use vs. when-not, and no sibling is named as an alternative for cases like browsing all offers (tb_offers) or comparing specific products (tb_compare). The 'check the matched name' note is a useful caveat but not routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_citiesCitiesBRead-onlyIdempotent
City ids for city arguments (392 Tehran, 468 Mashhad, 240 Isfahan).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| search | No | Persian name or part, e.g. 'مشهد'; omit for most visited. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered without the description. The description's only added value is workflow context (these ids feed `city` arguments) plus three sample mappings; it says nothing about how results are ordered, paged, or capped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with the purpose front-loaded and no filler. The parenthetical example IDs are genuinely useful for grounding the identifier format, though they are an arbitrary three-city sample that could mislead about coverage.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and half the parameters undocumented, the description should explain that the tool returns a list of cities with their ids and how `search`/`limit` shape that list. Instead it only asserts the id mapping, leaving the agent to infer the return shape and filtering behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: `search` is documented in the schema, but `limit` (default 10, max 50) has no description anywhere. The description mentions neither parameter and does not compensate for the gap by explaining filtering by Persian name or result limiting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the concrete resource (city ids) and the reason it exists (to be fed into `city` arguments of other tools), which distinguishes it from siblings like tb_stores or tb_products. It lacks an explicit verb describing the operation (list vs. search), so an agent knows what it yields but not exactly what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'for `city` arguments' implies when to call it: whenever a `city` parameter is needed elsewhere. There is no explicit when-not guidance, no mention of alternatives (e.g. omitting the argument to get defaults), and no statement that omitting `search` returns the most visited cities.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_compareCompare productsARead-onlyIdempotent
Side-by-side comparison of 2-5 products: only the specs that differ, the price window, and which is cheapest.
differences maps a spec to its values in products order (null = not listed).
| Name | Required | Description | Default |
|---|---|---|---|
| products | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world, so the description is not required to explain safety. It adds genuinely new behavioral context: the result is filtered to only differing specs, includes a price window, and the `differences` map carries null for unlisted values. That last detail is important, because null would otherwise be ambiguous between 'not listed' and 'unknown'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first front-loads the operation and the output summary, the second handles the one non-obvious return-value convention. Nothing is repeated from the schema or title, and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with no output schema, the definition covers input cardinality, input format (via schema), and the shape of the response, including null semantics. The remaining gap is failure behavior: it doesn't say what happens when an id is invalid, a product has no offers, or fewer than 2 valid products resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Reported coverage is 0% (the schema's own description text is minimal), and the schema already encodes minItems 2 / maxItems 5; the description reinforces the 2-5 range in prose. More importantly, it explains that values in `differences` follow the `products` argument order, so the order in which the caller supplies ids is semantically meaningful. That is meaning beyond the schema, though it doesn't say whether duplicate ids are rejected or normalized.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation ('side-by-side comparison of 2-5 products') and enumerates what it returns: differing specs, price window, cheapest pick. That is far more specific than the title 'Compare products'. It does not, however, distinguish itself from close siblings such as tb_cheapest, tb_best_value, or tb_products_batch, which an agent could plausibly pick for the same intent.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the 2-5 product cardinality and the comparison framing, so an agent can infer 'use when the user wants several products contrasted'. There is no explicit when-to-use statement, no exclusion of tb_cheapest/tb_best_value (whose purposes overlap with 'which is cheapest'), and no note on what happens for a single product or unknown ids.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_deal_checkDeal checkARead-onlyIdempotent
Is this a good price? Score 0-100 from the product's price history and today's competing offers.
100 minus the price's percentile among past weekly minimums, minus up to 20 when above today's cheapest usable
offer. reasons explains it.
| Name | Required | Description | Default |
|---|---|---|---|
| price | No | Offered price, Toman; default today's cheapest usable offer. | |
| product | Yes | Product id (UUID) or torob.com product URL. |
TDQS
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 goes further by disclosing the actual scoring model (100 minus price percentile among past weekly minimums, minus up to 20 when above today's cheapest usable offer) and noting a `reasons` field, which is real behavioral insight not captured in annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly 40 words, front-loaded with the question and the output form, with zero filler. The formula sentence is somewhat dense in notation ('minus the price's percentile...') and slightly harder to parse than a plain-language restatement would be, but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter, annotation-covered, no-output-schema tool, the definition covers what the tool returns and how it is computed. The only minor gap is not stating what `reasons` contains or what the score means in practical terms (e.g., thresholds for 'good'), though the return-format burden is light here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, including the 'default today's cheapest usable offer' behavior and the Toman unit, so the schema carries most parameter meaning. The description reinforces the comparison basis (past weekly minimums vs today's competing offers) but adds 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.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with the user-facing question the tool answers and states a concrete output: a 0-100 score derived from the product's price history plus today's competing offers. That framing (a judgment/score) is clearly distinct from sibling tools like tb_price_history, tb_cheapest, tb_compare, and tb_best_value, so an agent can route 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: it is for judging whether a specific offered price is fair. There is no explicit when-to-use/when-not-to-use guidance and no sibling is named as an alternative (e.g., 'for raw series, use tb_price_history'), which leaves the agent to infer the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_filtersSearch filtersARead-onlyIdempotent
Which filters exist for a query/category: sub-categories, brands, price span, sort options, attributes.
Use before tb_search for category / brand ids or the attribute slugs and values of filters.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search text, e.g. 'لپ تاپ'. | |
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety and determinism are covered. The description adds useful output-shape context (it returns attribute slugs/values usable as filter inputs) but says nothing about empty results, latency, or whether filters are query-dependent versus category-dependent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the return payload followed by the usage rule; nothing is padding. The first sentence is a fragment without a verb, which is slightly clipped but still readable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With two optional params, no output schema, and rich annotations, the definition covers the essentials: what the call yields and how to use the result in a follow-up search. The remaining gap is the undocumented `category` parameter and the interaction between the two optional inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: `query` has a description and example in Farsi, while `category` is an undescribed integer. The phrase "category / brand ids" hints that `category` consumes an id rather than a name, which is real added meaning, but it never states where that id comes from (tb_category) or how query and category interact when both are supplied.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the specific resource and enumerates the payload: sub-categories, brands, price span, sort options, and attributes returned for a query/category. It implicitly distinguishes itself from tb_search by being the metadata-discovery step, though it never explicitly says it does not return products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use before tb_search for category / brand ids or the attribute slugs and values" gives a clear sequencing rule and names the downstream sibling, which is stronger than most definitions. It stops short of covering edge cases such as calling with neither query nor category, or when to prefer tb_category/tb_brands for ids instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_find_shopsFind shopsARead-onlyIdempotent
Find shops in Torob's directory by name or domain; returns ids for tb_shop and tb_shop_products.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City or province, Persian. | |
| kind | No | offline = in-person. | all |
| page | No | ||
| limit | No | ||
| query | Yes | Shop name or domain, e.g. 'bavanmobile.ir'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and non-destructive behavior, so safety is covered. The description adds the useful fact that the lookup key can be either a name or a domain and that results are ids meant for follow-up tools, but says nothing about pagination, result caps, or empty-result behavior for a directory search.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the action, data source, lookup keys, and return value front-loaded; there is no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description partially compensates by saying it returns ids for tb_shop and tb_shop_products, which is genuinely useful. But for a 5-parameter paginated search it omits pagination behavior and total-count semantics, so key operational details an agent needs are missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 60%: query, city, and kind are documented in the schema, while page and limit have no descriptions. The description's 'by name or domain' restates the query parameter but adds no new semantic detail, and it does not compensate for the undocumented pagination parameters. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Find shops in Torob's directory') and the lookup key ('by name or domain'), plus names the downstream consumers (tb_shop, tb_shop_products). It does not disambiguate from close siblings like tb_stores or tb_sellers, so it falls short of a 5, but the purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'returns ids for tb_shop and tb_shop_products' implicitly tells the agent this is a discovery/lookup step that should precede those calls. However, there is no explicit statement of when to use this instead of tb_stores, tb_sellers, or tb_search, and no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_offersSpecial offersCRead-onlyIdempotent
Torob's special-offers feed ("پیشنهاد ویژه"): themed rows with discounted or promoted products.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| size | No | Rows per page; each row is ~900 KB upstream. | |
| limit | No | Products per row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered without the description's help. The description adds no behavioral context beyond annotations: no mention of pagination depth limits, the heavy payload cost, or what a 'row' contains. The 900 KB-per-row cost note lives only in the parameter schema, not here.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single tight sentence with zero filler and the resource name is front-loaded. However, its brevity comes at the cost of information: the one sentence could have carried a usage cue or payload warning at little length cost.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With three optional paging parameters, no output schema and no required inputs, the description is complete enough to identify the target but not enough to call it confidently, since the nested rows-of-products return shape goes unexplained. An agent would need to guess how results are structured and what a single page yields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage sits at 67%: size and limit carry upstream descriptions, but page is undocumented. The description adds nothing about any parameter — not the page/size/limit interplay, not what a 'row' versus a 'product' means operationally — so it fails to compensate for the uncovered parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource (Torob's special-offers feed, "پیشنهاد ویژه") and states its contents: themed rows with discounted or promoted products. The retrieval verb is only implied by 'feed', and no sibling (tb_suggest, tb_deal_check, tb_cheapest) is named to distinguish it, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this instead of the many overlapping siblings such as tb_suggest, tb_deal_check or tb_cheapest, and no prerequisites or exclusions are stated. The agent must infer usage purely from the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_presenceShop presenceCRead-onlyIdempotent
How widely a product is sold: online shops, in-person stores, installment and warranty shops, price window.
| Name | Required | Description | Default |
|---|---|---|---|
| product | Yes | Product id (UUID) or torob.com product URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so safety is covered. The description adds the useful signal that results span online shops, physical stores, installment/warranty sellers, and a price window – behavioral context beyond the annotations. It does not describe result shape or whether the answer is a count, list, or summary.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single short fragment with no wasted words, but the terseness comes at the cost of precision: no verb, and 'price window' is left unexplained. Short is not the same as well-structured here.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With one required parameter, no output schema, and full annotation coverage, the definition is nearly complete for invocation. However, it never explains what 'how widely' means operationally (counts? shop list? range?) or what a 'price window' is, leaving the return semantics ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'product' parameter is fully documented (UUID or torob.com URL), so the schema carries the burden. The description adds nothing about how the product input affects the presence result, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource as how widely a product is sold across shop types, but it is a noun phrase without a verb, and terms like 'price window' and 'presence' are not defined. An agent can guess it returns availability/distribution info but cannot state precisely what the tool returns versus tb_offers or tb_stores.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance and no exclusions are given, despite many plausible siblings (tb_offers, tb_stores, tb_find_shops, tb_sellers, tb_cheapest) that could be confused with it. The agent must infer that 'presence' means distribution breadth rather than price comparison.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_price_chartPrice chartARead-onlyIdempotent
Price chart of a product (about a year, weekly): minimum and average price in Toman, with a buy-now verdict.
summary.verdict (great / fair / high) follows percentile: share of weeks cheaper than now.
| Name | Required | Description | Default |
|---|---|---|---|
| points | No | Latest weekly points (26 = about 6 months). | |
| product | Yes | Product id (UUID) or torob.com product URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover safety (readOnly, idempotent, non-destructive, open-world), so the description's added value is in disclosing data shape: weekly series over roughly a year, prices in Toman, and a verdict field derived from a percentile statistic. It explains the verdict's enum semantics and derivation, which is genuinely useful beyond the annotations. Minor tension: it says 'about a year, weekly' while the schema default of 26 points yields about 6 months.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core purpose front-loaded and the verdict/percentile explanation following. Every clause carries information; only the year-vs-default-points mismatch slightly muddies an otherwise clean statement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it only partially does: it names summary.verdict and the percentile concept plus min/average prices, but not the shape of the chart series itself. For a read-only two-parameter tool this is adequate but leaves the primary output structure underspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (product, points) are already fully documented in the schema, making 3 the baseline. The description adds only indirect meaning, tying the weekly cadence to the series length, but does not clarify how 'points' interacts with the stated one-year window.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (a product's price chart), its granularity (weekly, about a year), the metrics returned (minimum and average price in Toman) and an added output (a buy-now verdict). That is enough to tell it apart conceptually from siblings like tb_price_history or tb_trends, though it never names an alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'buy-now verdict' phrasing implies the decision-support use case, so an agent can infer when this tool is relevant. However, there is no explicit when-to-use or when-not-to-use statement and no routing against the closely overlapping siblings tb_price_history and tb_deal_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_price_historyPrice history eventsARead-onlyIdempotent
Notable price moves of a product, newest first, with the lowest and highest point.
Weekly moves of the chart's minimum price; a negative change_pct is a drop.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| product | Yes | Product id (UUID) or torob.com product URL. | |
| min_change_pct | No | Ignore smaller moves (percent). |
TDQS
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 safety profile is covered. The description still adds real context beyond them: newest-first ordering, inclusion of the lowest and highest point, weekly granularity, and the sign convention that a negative change_pct is a drop. What it doesn't add is any sense of cost, latency, or what happens when no move clears the threshold.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core behavior front-loaded and no filler. The second sentence is dense and slightly cryptic ('the chart's minimum price' presumes familiarity with the price-chart tool), but nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry return-value information, and it partially does: ordering, the presence of low/high points, and the change_pct sign convention. It omits the per-event shape beyond change_pct (timestamps, price values) and never clarifies how min_change_pct defaulting interacts with the 'notable' definition, leaving a moderate gap for a 3-parameter analytical tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 67%, with product and min_change_pct documented inline but limit undocumented. The description gives meaning to the threshold indirectly ('notable', 'ignore smaller moves' via the schema default of 3) and clarifies the sign of change_pct. It does not explain that limit caps the number of returned events, so one parameter remains semantically thin in both places.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete resource and behavior: notable price moves for a product, ordered newest first, bounded by lowest and highest points. The second sentence defines 'notable' as weekly moves of the chart's minimum price, which sharpens the otherwise ambiguous word. It stops short of naming a sibling (e.g. tb_price_chart) as the alternative, so the boundary with the raw-series tool is only implied.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Use is implied rather than stated: an agent can infer this is for summarizing significant movements versus fetching a full series, especially from the 'chart's minimum price' reference. There is no explicit when-to-use/when-not-to-use clause and no named alternative such as tb_price_chart or tb_deal_check, leaving the choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_productProduct detailsARead-onlyIdempotent
Full record of one product: name, price range (Toman), category, brand, key specs, cheapest offer.
price_min/price_max include unreliable offers; cheapest_offer is the cheapest usable one on the page.
| Name | Required | Description | Default |
|---|---|---|---|
| product | Yes | Product id (UUID) or torob.com product URL. | |
| full_specs | No | Add the full spec table by section (long). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, open-world, and non-destructive behavior. The description adds useful domain-specific semantics beyond the annotations: price_min/price_max include unreliable offers, while cheapest_offer is the cheapest usable offer on the page.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then adds one focused clarification about price reliability. Both sentences are useful and there is no redundant or filler text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read-only tool with full schema coverage and annotations, the description gives a clear inventory of returned fields and explains an important price caveat. It is nearly complete, though it could briefly clarify how this differs from related tools like tb_offers or tb_variants.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains that 'product' accepts a UUID or torob.com URL and that 'full_specs' adds the full spec table. The description does not add further meaning about the input parameters, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: a full record for one product, listing name, price range in Toman, category, brand, key specs, and cheapest offer. It distinguishes itself implicitly from search/batch siblings by focusing on a single product, but it does not explicitly name alternatives such as tb_offers or tb_variants.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by 'Full record of one product,' suggesting this is for retrieving details about a known single product rather than searching or listing many. However, there is no explicit when-to-use guidance, no exclusions, and no named alternatives among the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_products_batchProduct cardsARead-onlyIdempotent
Short records (name, price window, shop counts, category, brand) for up to 10 products at once.
One request per product; failures go to errors.
| Name | Required | Description | Default |
|---|---|---|---|
| products | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnlyHint, idempotentHint, destructiveHint=false, openWorldHint), so the description's job is to add operational detail — and it does: 'one request per product' discloses the fan-out cost, and 'failures go to errors' discloses partial-failure semantics rather than all-or-nothing behavior. It stops short of noting rate-limit or throttling implications of that per-product fan-out.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the payoff (what records you get and how many), followed by the operational caveat. No filler; the line break before the failure-handling note is slightly odd but the content earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 spends its budget enumerating return fields (name, price window, shop counts, category, brand) and documents error routing, which is the main behavioral unknown for a batch call. Remaining gaps — identifier format, partial-success ordering, whether missing products count as errors — are moderate rather than disqualifying.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is reported at 0%, so the description needs to carry the parameter meaning, and it largely does not — it never says whether the array accepts UUIDs, URLs, or both, nor what happens to malformed entries. Its only parameter-relevant content ('up to 10 products') merely restates the schema's maxItems constraint.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states the resource (short product records) and the scope (up to 10 products at once), and enumerates the returned fields, so an agent can tell what it gets back. The verb is implicit rather than stated, and it never names the single-item sibling tb_product, so the batch-vs-single distinction must be inferred from 'at once'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the 'up to 10 products at once' framing suggests this is the multi-product path versus a single-product lookup, but there is no explicit when-to-use or when-not-to-use statement and no alternative tool is named despite tb_product, tb_search and tb_offers being available siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_product_urlProduct URLARead-onlyIdempotent
Clean torob.com URL for a product id, path or link (no request is sent).
| Name | Required | Description | Default |
|---|---|---|---|
| product | Yes | Product id (UUID) or torob.com product URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false. The one thing the description adds beyond them is "no request is sent", which usefully tells the agent this never touches the network despite openWorldHint=true, but it says nothing about the shape of the result or how malformed input is handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler; the operation and its key caveat arrive together.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter utility with no output schema, the description covers the essentials. It still leaves an agent guessing what the returned "clean" value looks like (full URL vs path vs id) and what happens on invalid input.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies. The description's mention of "path" slightly extends the schema, which only documents a UUID or full URL, and the plural "path or link" hints at additional accepted forms — a modest but real addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource ("Clean torob.com URL for a product id, path or link") and distinguishes itself from data-fetching siblings via "no request is sent". It falls short of a 5 because "clean" is left to inference — normalize, strip tracking parameters, or canonicalize?
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical implies this is a pure formatting utility rather than a lookup, which nudges the agent toward it before calling tb_product. However, no sibling is named and no explicit when-to-use or when-not-to-use condition is stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_searchSearch productsARead-onlyIdempotent
Search Torob for products; each card has the cheapest shop price (Toman) and the shop count.
Weak matches set low_confidence and unmatched_terms; spellcheck / suggested_queries help rephrase.
price_span is the span of the unfiltered result.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City id or name; effect unverified, use tb_sellers(city=) for local offers. | |
| page | No | 0-based. | |
| sort | No | most_sellers = most shops. | popular |
| brand | No | Brand id or name ('Apple', 'اپل'); needs query or category. | |
| limit | No | ||
| query | No | Persian or Finglish text, e.g. 'گوشی آیفون 13'. Optional with category. | |
| output | No | json | |
| filters | No | Attribute filters {slug: value} from tb_filters, e.g. {'storage': '256 gb'}. | |
| category | No | Category id, e.g. 94. | |
| condition | No | used = کارکرده / stock. | any |
| in_person | No | Only products with an in-person shop. | |
| max_price | No | Toman. | |
| min_price | No | Toman. | |
| installment | No | Only installment (Torob Pay) products. | |
| available_only | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so credit goes to what is added: the shape of each result card, the existence and meaning of `low_confidence`/`unmatched_terms` on weak matches, and that `price_span` reflects the unfiltered result rather than the filtered one. That last point is genuine non-obvious behavior an agent would otherwise misinterpret; auth/rate-limit behavior is still unstated.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, no filler: result shape first, then the failure/rephrase path, then the one subtle output field that could mislead. Front-loaded and every sentence carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 takes on the return-value burden, describing card contents and diagnostic flags. For a 15-parameter search tool it is reasonably complete, though it never mentions pagination limits, that query is optional alongside category, or when a sibling like tb_suggest should replace a rephrase attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 80%, so the baseline is 3 and the schema already documents most parameters including the city caveat and filter slug source. The description adds only one clarifying semantic — `price_span` measures pre-filter results, which matters for min_price/max_price interpretation — but says nothing about query-vs-category combinations beyond what the schema already conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Search Torob for products') and immediately characterizes the result card (cheapest shop price in Toman, shop count), so the agent knows what comes back. It does not differentiate from siblings like tb_cheapest, tb_compare, or tb_suggest, which all retrieve product pricing data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied — this is the general entry-point search — and the note about weak matches plus `spellcheck`/`suggested_queries` gives implicit guidance to rephrase rather than retry blindly. However, there is no explicit when-to-use/when-not statement, and the routing hint to tb_sellers for city filtering lives only in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_sellersSellersARead-onlyIdempotent
Every online shop offer for a product, cheapest first, with trust, warranty, installment and delivery info.
Use to pick where to buy. score/votes: shop rating 0-5; unreliable: bait or stale price; buyer_notes:
Torob's order-volume and complaint notes; updated: price age. stats cover usable offers only.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City id or name: only offers serving that city. | |
| limit | No | ||
| output | No | json | |
| product | Yes | Product id (UUID) or torob.com product URL. | |
| min_score | No | Minimum shop score. | |
| warranty_only | No | Torob warranty (گارانتی ترب) offers only. | |
| installment_only | No | Installment (قسطی) shops only. | |
| include_unreliable | No | Keep offers flagged unreliable (bait or stale). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower, and the description still adds real value by decoding the response semantics: score/votes scale, what 'unreliable' means (bait or stale price), what buyer_notes contains, and that stats cover usable offers only. It omits pagination/truncation behavior and the meaning of 'cheapest first' when unreliable offers are included.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and sort order are front-loaded in the first sentence, followed by a compact field glossary that earns its place. The backticked field list is dense and reads like documentation shorthand, but no sentence is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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 necessary work of explaining the returned offer fields, which is the main completeness risk here. Remaining gaps (limit/output defaults, behavior when filters exclude everything, relationship to the toolbar siblings) are minor for a read-only listing tool whose annotations already cover safety.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 75%, so the schema already documents city, product, min_score, warranty_only, installment_only, and include_unreliable; limit and output carry no description in either place. The description adds indirect meaning by explaining the score scale and the unreliable flag that min_score and include_unreliable operate on, but it never addresses city scoping, the limit cap of 50, or the json/csv choice.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource and scope: every online shop offer for a given product, ordered cheapest first, plus what each offer carries (trust, warranty, installment, delivery). It stops short of naming any sibling (tb_offers, tb_cheapest, tb_compare, tb_stores) by contrast, so an agent must infer the boundary itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to pick where to buy' implies the selection scenario but names no alternative and no when-not condition among the many overlapping siblings (tb_cheapest, tb_best_value, tb_compare, tb_offers). The routing decision 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.
tb_shopShop profileARead-onlyIdempotent
A shop's trust profile: score and votes, e-Namad seal, time on Torob, city, website, delivery and payment terms.
Use to vet a seller from tb_sellers. Contact details are left out.
| Name | Required | Description | Default |
|---|---|---|---|
| shop_id | Yes | Torob shop id (`shop_id` from tb_sellers). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent, read-only lookup, so the description doesn't need to restate safety. It does add a genuine disclosure not present in structured fields: 'Contact details are left out,' telling the agent to expect a redacted view of the profile. It doesn't mention rate limits or whether the record can be missing, which keeps it below the top score.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with no filler. The content of the profile comes first and the usage instruction second, which is the right front-loading for a lookup tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a single required parameter, no output schema, and full annotation coverage, the description is complete enough to call correctly. Since no output schema exists, the field enumeration stands in for a return-value description, though it doesn't indicate structure or absence behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the shop_id property already documents its range and origin, so the schema carries the parameter burden. The description reinforces the tb_sellers linkage but adds no syntax or format details beyond that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names the resource precisely and enumerates the profile contents (score and votes, e-Namad seal, time on Torob, city, website, delivery and payment terms), which tells an agent exactly what it gets back. It is a noun phrase rather than a verb, but the retrieval intent is unambiguous and clearly distinct from the list-oriented siblings like tb_sellers and tb_stores.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'Use to vet a seller from tb_sellers' supplies both the use case (seller vetting) and the workflow dependency (obtain shop_id from tb_sellers first). It stops short of excluding alternatives such as tb_stores or tb_find_shops, so the routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_shop_productsShop catalogueBRead-onlyIdempotent
Products one shop sells on Torob, with the price range of the page.
Card prices are the cheapest across all shops; tb_sellers gives this shop's own offer.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| sort | No | popular | |
| limit | No | ||
| query | No | Only products matching this text. | |
| shop_id | Yes | Torob shop id (`shop_id` from tb_sellers). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world and non-destructive, so the safety profile needs no restating. The description adds genuinely non-obvious semantics: prices shown are the cheapest across all shops, not this shop's asking price, which prevents a serious misinterpretation of results. It stops short of disclosing pagination limits or result ordering behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with what the tool returns, with the pricing caveat in second position where it is most likely to be read. No filler, though the tb_sellers clause is compressed enough to be slightly ambiguous.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a five-parameter, read-only listing tool with no output schema, the definition covers purpose and the key price-semantics caveat but omits pagination behavior, sort semantics, and any indication of result shape. An agent can call it correctly but may mis-set paging or sorting without guessing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 40%: query and shop_id are documented, but page, sort, and limit carry no descriptive text. The description does not compensate — nothing is said about the meaning of page, the four sort modes, or the limit cap, despite 'price range of the page' hinting at pagination without explaining it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('Products one shop sells on Torob') plus an attributed payload ('with the price range of the page'), so the verb and object are unambiguous. It also gestures at the boundary with tb_sellers, though the differentiation is phrased obliquely rather than as a direct 'use X instead'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implicit usage is clear: call it with a shop_id to browse that shop's catalogue. The only routing hint is the remark that tb_sellers carries this shop's own offer, which nudges the agent away from using this tool for seller-level pricing, but there is no guidance on pagination strategy, sort choice, or when another sibling (tb_search, tb_stores, tb_shop) is a better fit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_similarSimilar productsBRead-onlyIdempotent
Products Torob shows as similar (alternatives in the same class), with cheapest price and shop count.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| product | Yes | Product id (UUID) or torob.com product URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds real value beyond that by disclosing the shape of the result (cheapest price plus shop count per alternative), but says nothing about how many results come back, what the default limit implies, or what happens for a product with no similar items.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource and returned fields come first. It is efficient and readable, though the parenthetical gloss could have been spent on usage routing instead.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read-only lookup with annotations and no output schema, the description covers purpose and result fields adequately. It is incomplete on the one thing an agent must decide unaided: when to reach for this over tb_variants, tb_compare, or tb_cheapest, and how the limit affects results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: the 'product' parameter is documented in-schema as a UUID or torob.com URL, but 'limit' carries no description beyond type and 1-50 bounds. The description mentions neither parameter, so it does not compensate for the undocumented limit or clarify whether the shop count/price apply per alternative.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely: products that Torob classifies as similar, explicitly glossed as 'alternatives in the same class', and the returned fields (cheapest price, shop count). It is clear what the tool retrieves, though it never contrasts itself with nearby siblings such as tb_product, tb_variants, or tb_compare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance and no named alternative. An agent must infer from the word 'similar' that this is the right call versus tb_variants (different variants of one product) or tb_compare (side-by-side comparison), with no help from the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_storesIn-person storesARead-onlyIdempotent
In-person shops that stock a product: address, opening hours, open now, shelf price and its age.
Use for "can I buy it today near me". Online offers: tb_sellers.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City id or name: only offers serving that city. | |
| limit | No | ||
| product | Yes | Product id (UUID) or torob.com product URL. | |
| with_location | No | Add lat/lon. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive open-world query, so the safety profile is covered. The description adds value the annotations cannot: it discloses what each result carries, including freshness cues like opening hours and "open now" plus the age of the shelf price, which tells the agent the data is time-sensitive. It does not mention result volume or how the limit behaves, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences: the first front-loads what the tool returns, the second handles intent and redirection to the sibling. Nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With four parameters, no output schema, and a physically-located-data scope, the description carries the right load by enumerating return fields and framing the use case. Missing pieces are minor: nothing about result ordering or how the limit interacts with the open-now framing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 75%, with city, product, and with_location documented inline, so the baseline is 3. The description adds no parameter-level detail — no syntax for the product identifier or city, no note on what with_location costs in response size. The undocumented limit parameter is bounded by schema min/max/default, so little is lost.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource and its scope precisely — physical shops stocking a given product — and enumerates the returned attributes (address, opening hours, open-now status, shelf price and price age). It explicitly contrasts with tb_sellers for online offers, so an agent can separate the two. It stops short of distinguishing itself from other shop-related siblings such as tb_find_shops, tb_shop, or tb_shop_products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use for 'can I buy it today near me'" gives a concrete, recognisable intent that maps cleanly to the tool, and the trailing "Online offers: tb_sellers" routes the agent away when the intent is online-only. There are no explicit exclusions against the other shop/location siblings, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_suggestSuggestionsARead-onlyIdempotent
Torob's autocomplete: up to 8 search phrases for typed text (fixes Finglish and colloquial wording).
Use before tb_search. Works even while other calls are blocked.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Typed text, e.g. 'ayfon' or 'لپ'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world). The description adds real behavioral context beyond that: a hard cap of 8 results and that it normalizes Finglish/colloquial input into canonical phrases, plus the availability note about blocked calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core capability front-loaded and the workflow hint second. Nothing is redundant or buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read-only autocomplete tool with full schema coverage and rich annotations, the description supplies enough to call it correctly, including the result cap. Only the exact return shape (bare strings vs. structured suggestions) is left implicit, which is minor here.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with an example provided, so the baseline is 3. The parenthetical about fixing Finglish and colloquial wording adds meaning about what the 'text' parameter tolerates, which the schema's plain example does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('autocomplete: up to 8 search phrases for typed text') and adds scope details (max 8 results, Finglish/colloquial normalization). This clearly separates it from tb_search, which consumes the phrases rather than producing them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before tb_search' gives explicit sequencing guidance relative to the most likely alternative. It also notes it remains available while other calls are blocked. No explicit when-not-to-use condition is given, but the intended workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_trendsSearch trendsBRead-onlyIdempotent
What people search on Torob right now, each with its category and one sample product.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
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 the return structure (category, sample product per trend), which is genuinely useful since no output schema exists, but says nothing about how many items come back or how the limit behaves.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with no filler, and the defining scope ('right now') is stated early. It is slightly under-specified rather than bloated, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple, low-complexity read tool with no output schema, the description covers the return shape adequately and annotations cover safety. It is still missing any note on result volume defaults or ordering ('trending' order), which an agent might reasonably need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is one parameter with 0% schema description coverage, but its type, default of 10 and 1-30 bounds are fully expressed in the schema, so its meaning is unambiguous without prose. The description adds nothing about the limit, which is the only real gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the resource precisely ('what people search on Torob right now') and discloses the payload shape (category plus one sample product), which sets it apart from siblings like tb_search and tb_suggest. It lacks an explicit verb such as 'list' or 'get', so it falls short of the 5 bar.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Right now' weakly implies a recency-based, non-query use case, but there is no explicit when-to-use statement and no mention of alternatives such as tb_suggest or tb_search despite many closely related siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
tb_variantsVariantsBRead-onlyIdempotent
Sibling variants of a product (storage + RAM, colour, region ...) each with its own cheapest price.
| Name | Required | Description | Default |
|---|---|---|---|
| product | Yes | Product id (UUID) or torob.com product URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds one genuinely useful behavioral fact — that pricing is per-variant and cheapest-per-variant — but says nothing about how many variants come back, ordering, or whether all configurations or only priced ones are returned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence that front-loads the core idea (sibling variants) and then the pricing detail. Nothing is redundant; the only weakness is that the fragmentary phrasing takes a moment longer to parse than a verb-led sentence would.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only lookup with full schema coverage and rich annotations, the description covers what the tool returns well enough to call it correctly. Without an output schema, a brief note on result shape or variant count would have closed the last gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single product parameter, and the schema already explains that it accepts a UUID or a torob.com URL plus its length bounds. The description adds no further meaning about the identifier, which is acceptable but adds nothing beyond the structured field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description identifies the resource (sibling variants of a given product) and the key payload (each variant's cheapest price), which is enough to tell it apart from tb_product or tb_price_history. It is a noun phrase rather than a verb-led statement, and it never distinguishes itself from the close neighbour tb_similar, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this instead of tb_product, tb_similar, tb_cheapest, or tb_compare. The agent must infer from the name alone that this is the right tool when it wants variant-level pricing rather than a single product's data.
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.
26 tool updates
v0.2.0- Changed
tb_basket4 fields changed- changed
Input schema / properties / city / descriptionPrevious value: -"City id or name (e.g. 'مشهد' or 468): only offers that deliver to / sit in that city."New value: +"City id or name: only offers serving that city." - changed
Input schema / properties / condition / descriptionPrevious value: -"new (default), used (کارکرده / stock) or any."New value: +"used = کارکرده / stock." - changed
Input schema / properties / installment_only / descriptionPrevious value: -"Only shops offering installments."New value: +"Installment shops only." - changed
Input schema / properties / items / descriptionPrevious value: -"2 to 8 things to buy: product names ('آیفون 13 128') or product ids / URLs."New value: +"Product names ('آیفون 13 128') or ids / URLs."
- Changed
tb_best_value6 fields changed- changed
Input schema / properties / budget / descriptionPrevious value: -"Maximum price in Toman, e.g. 30000000."New value: +"Max price, Toman." - removed
Input schema / properties / category / descriptionRemoved value: -"Category id (e.g. 94)." - changed
Input schema / properties / condition / descriptionPrevious value: -"new (default), used (کارکرده / stock) or any."New value: +"used = کارکرده / stock." - changed
Input schema / properties / min_shops / descriptionPrevious value: -"Skip products sold by fewer shops (default 3: filters odd listings)."New value: +"Skip products with fewer shops." - changed
Input schema / properties / query / descriptionPrevious value: -"What to buy, e.g. 'لپ تاپ'. Optional when category is given."New value: +"What to buy, e.g. 'لپ تاپ'. Optional with category." - changed
Input schema / properties / rank_by / descriptionPrevious value: -"budget_reach (default): the most expensive models that still fit the budget first (usually the most capable); popular: Torob's popularity order; cheapest."New value: +"budget_reach: priciest models that fit first."
- Changed
tb_brands2 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Torob category id, e.g. 94 (mobile phones). Find ids with tb_filters or tb_category."New value: +"Category id, e.g. 94 (mobile phones); see tb_filters." - changed
Input schema / properties / search / descriptionPrevious value: -"Keep brands whose name contains this text."New value: +"Name contains this text."
- Changed
tb_category5 fields changed- changed
Input schema / properties / brand / descriptionPrevious value: -"Brand id or name inside this category."New value: +"Brand id or name." - changed
Input schema / properties / category / descriptionPrevious value: -"Torob category id, e.g. 94 (mobile phones). Find ids with tb_filters or tb_category."New value: +"Category id, e.g. 94 (mobile phones); see tb_filters." - removed
Input schema / properties / limit / descriptionRemoved value: -"Products to return (default 10, max 50)." - changed
Input schema / properties / max_price / descriptionPrevious value: -"Highest price in Toman."New value: +"Toman." - changed
Input schema / properties / sort / descriptionPrevious value: -"Order: popular (Torob default), cheapest, priciest, newest, most_sellers (most shops)."New value: +"most_sellers = most shops."
- Changed
tb_cheapest6 fields changed- changed
Input schema / properties / candidates / descriptionPrevious value: -"How many top search matches to check (default 3; one request each)."New value: +"Top search matches to check (one request each)." - changed
Input schema / properties / city / descriptionPrevious value: -"City id or name (e.g. 'مشهد' or 468): only offers that deliver to / sit in that city."New value: +"City id or name: only offers serving that city." - changed
Input schema / properties / condition / descriptionPrevious value: -"new (default), used (کارکرده / stock) or any."New value: +"used = کارکرده / stock." - changed
Input schema / properties / installment_only / descriptionPrevious value: -"Only shops offering installments (قسطی)."New value: +"Installment (قسطی) shops only." - changed
Input schema / properties / min_score / descriptionPrevious value: -"Only shops with at least this Torob score (default 0)."New value: +"Minimum shop score." - changed
Input schema / properties / query / descriptionPrevious value: -"Product to price, e.g. 'آیفون 13 پرو 256' or 'ps5 slim'."New value: +"Product, e.g. 'ps5 slim'."
- Changed
tb_cities1 field changed- changed
Input schema / properties / search / descriptionPrevious value: -"City name or part of it (Persian), e.g. 'مشهد'. Omit for the most visited cities."New value: +"Persian name or part, e.g. 'مشهد'; omit for most visited."
- Changed
tb_compare2 fields changed- removed
Input schema / properties / products / descriptionRemoved value: -"2 to 5 product ids, paths or URLs." - changed
Input schema / properties / products / items / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_deal_check2 fields changed- changed
Input schema / properties / price / descriptionPrevious value: -"A price in Toman you were offered; default: today's cheapest usable offer."New value: +"Offered price, Toman; default today's cheapest usable offer." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_filters2 fields changed- removed
Input schema / properties / category / descriptionRemoved value: -"Category id (e.g. 94)." - changed
Input schema / properties / query / descriptionPrevious value: -"Search text whose filters you want, e.g. 'لپ تاپ'."New value: +"Search text, e.g. 'لپ تاپ'."
- Changed
tb_find_shops3 fields changed- changed
Input schema / properties / city / descriptionPrevious value: -"Keep only shops in this city or province (Persian name, matched after fetching)."New value: +"City or province, Persian." - changed
Input schema / properties / kind / descriptionPrevious value: -"all (default), online or offline (in-person) shops."New value: +"offline = in-person." - changed
Input schema / properties / query / descriptionPrevious value: -"Shop name or domain, e.g. 'دیجی اپال' or 'bavanmobile.ir'."New value: +"Shop name or domain, e.g. 'bavanmobile.ir'."
- Changed
tb_offers3 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Products per row to return (default 10)."New value: +"Products per row." - removed
Input schema / properties / page / descriptionRemoved value: -"0-based page." - changed
Input schema / properties / size / descriptionPrevious value: -"Rows per page (default 1). Torob replies are huge (about 900 KB for one row), so keep it small."New value: +"Rows per page; each row is ~900 KB upstream."
- Changed
tb_presence1 field changed- changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_price_chart2 fields changed- changed
Input schema / properties / points / descriptionPrevious value: -"Latest chart points to return (default 26, about 6 months; Torob has about 52 weekly points)."New value: +"Latest weekly points (26 = about 6 months)." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_price_history2 fields changed- changed
Input schema / properties / min_change_pct / descriptionPrevious value: -"Ignore moves smaller than this percent (default 3)."New value: +"Ignore smaller moves (percent)." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_product2 fields changed- changed
Input schema / properties / full_specs / descriptionPrevious value: -"Also return the complete spec table grouped by section (long)."New value: +"Add the full spec table by section (long)." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_product_url1 field changed- changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_products_batch2 fields changed- removed
Input schema / properties / products / descriptionRemoved value: -"1 to 10 product ids, paths or URLs." - changed
Input schema / properties / products / items / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_search15 fields changed- removed
Input schema / properties / available_only / descriptionRemoved value: -"Only products in stock." - changed
Input schema / properties / brand / descriptionPrevious value: -"Brand id (e.g. 14) or name (e.g. 'Apple', 'اپل'); needs query or category. Unknown names are refused with the real brand list."New value: +"Brand id or name ('Apple', 'اپل'); needs query or category." - changed
Input schema / properties / category / descriptionPrevious value: -"Limit to a category id (e.g. 94 = mobile phones)."New value: +"Category id, e.g. 94." - changed
Input schema / properties / city / descriptionPrevious value: -"City id or name; sellers near it are preferred. Effect on search is Torob-side and unverified, use tb_sellers(city=) for exact local offers."New value: +"City id or name; effect unverified, use tb_sellers(city=) for local offers." - changed
Input schema / properties / condition / descriptionPrevious value: -"new, used (کارکرده / stock) or any."New value: +"used = کارکرده / stock." - changed
Input schema / properties / filters / descriptionPrevious value: -"Extra attribute filters {slug: value} from tb_filters, e.g. {'storage': '256 gb', 'ram': '8 gb'}. Validated: unknown slugs or values are refused."New value: +"Attribute filters {slug: value} from tb_filters, e.g. {'storage': '256 gb'}." - changed
Input schema / properties / in_person / descriptionPrevious value: -"Only products with an in-person (offline) shop."New value: +"Only products with an in-person shop." - changed
Input schema / properties / installment / descriptionPrevious value: -"Only products sold in installments (Torob Pay)."New value: +"Only installment (Torob Pay) products." - removed
Input schema / properties / limit / descriptionRemoved value: -"Products to return (default 10, max 50)." - changed
Input schema / properties / max_price / descriptionPrevious value: -"Highest price in Toman, e.g. 30000000."New value: +"Toman." - changed
Input schema / properties / min_price / descriptionPrevious value: -"Lowest price in Toman."New value: +"Toman." - removed
Input schema / properties / output / descriptionRemoved value: -"json (default) or csv text of the cards for export." - changed
Input schema / properties / page / descriptionPrevious value: -"0-based page (default 0)."New value: +"0-based." - changed
Input schema / properties / query / descriptionPrevious value: -"Search text, Persian or Finglish, e.g. 'گوشی آیفون 13' or 'ayfon 13'. Optional when category is given."New value: +"Persian or Finglish text, e.g. 'گوشی آیفون 13'. Optional with category." - changed
Input schema / properties / sort / descriptionPrevious value: -"Order: popular (Torob default), cheapest, priciest, newest, most_sellers (most shops)."New value: +"most_sellers = most shops."
- Changed
tb_sellers8 fields changed- changed
Input schema / properties / city / descriptionPrevious value: -"City id or name (e.g. 'مشهد' or 468): only offers that deliver to / sit in that city."New value: +"City id or name: only offers serving that city." - changed
Input schema / properties / include_unreliable / descriptionPrevious value: -"Keep offers Torob flags as unreliable (bait or stale prices). Hidden by default."New value: +"Keep offers flagged unreliable (bait or stale)." - changed
Input schema / properties / installment_only / descriptionPrevious value: -"Only shops that sell it in installments (قسطی)."New value: +"Installment (قسطی) shops only." - removed
Input schema / properties / limit / descriptionRemoved value: -"Rows to return (default 15, max 50)." - changed
Input schema / properties / min_score / descriptionPrevious value: -"Only shops with at least this Torob score (0-5)."New value: +"Minimum shop score." - removed
Input schema / properties / output / descriptionRemoved value: -"json (default) or csv text for export." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL." - changed
Input schema / properties / warranty_only / descriptionPrevious value: -"Only offers with Torob's buyer-protection warranty (گارانتی ترب)."New value: +"Torob warranty (گارانتی ترب) offers only."
- Changed
tb_shop1 field changed- changed
Input schema / properties / shop_id / descriptionPrevious value: -"Torob shop id (`shop_id` of a seller row from tb_sellers, e.g. 299463)."New value: +"Torob shop id (`shop_id` from tb_sellers)."
- Changed
tb_shop_products2 fields changed- changed
Input schema / properties / shop_id / descriptionPrevious value: -"Torob shop id (`shop_id` of a seller row from tb_sellers, e.g. 299463)."New value: +"Torob shop id (`shop_id` from tb_sellers)." - removed
Input schema / properties / sort / descriptionRemoved value: -"Order (default popular)."
- Changed
tb_similar2 fields changed- removed
Input schema / properties / limit / descriptionRemoved value: -"Rows to return (default 15, max 50)." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
- Changed
tb_stores4 fields changed- changed
Input schema / properties / city / descriptionPrevious value: -"City id or name (e.g. 'مشهد' or 468): only offers that deliver to / sit in that city."New value: +"City id or name: only offers serving that city." - removed
Input schema / properties / limit / descriptionRemoved value: -"Rows to return (default 15, max 50)." - changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL." - changed
Input schema / properties / with_location / descriptionPrevious value: -"Add map coordinates (lat, lon) of each store."New value: +"Add lat/lon."
- Changed
tb_suggest1 field changed- changed
Input schema / properties / text / descriptionPrevious value: -"Typed text, Persian or Finglish (e.g. 'ayfon', 'لپ')."New value: +"Typed text, e.g. 'ayfon' or 'لپ'."
- Changed
tb_trends1 field changed- removed
Input schema / properties / limit / descriptionRemoved value: -"Trends to return (default 10)."
- Changed
tb_variants1 field changed- changed
Input schema / properties / product / descriptionPrevious value: -"Product id (the UUID from search cards, e.g. '57ea65ae-0798-4cd0-96a7-38d8af180345'), a '/p/<id>/...' path or a full torob.com product URL."New value: +"Product id (UUID) or torob.com product URL."
26 tool updates
v0.1.1- First observed
tb_basket - First observed
tb_best_value - First observed
tb_brands - First observed
tb_category - First observed
tb_cheapest - First observed
tb_cities - First observed
tb_compare - First observed
tb_deal_check - First observed
tb_filters - First observed
tb_find_shops - First observed
tb_offers - First observed
tb_presence - First observed
tb_price_chart - First observed
tb_price_history - First observed
tb_product - First observed
tb_product_url - First observed
tb_products_batch - First observed
tb_search - First observed
tb_sellers - First observed
tb_shop - First observed
tb_shop_products - First observed
tb_similar - First observed
tb_stores - First observed
tb_suggest - First observed
tb_trends - First observed
tb_variants
TDQS
Scored across 26 tools
Most tools cover distinct resources or actions, and descriptions often cross-reference intended use. However, several price/offer tools overlap in practice (tb_price_chart vs tb_price_history vs tb_deal_check, tb_cheapest vs tb_sellers, tb_search vs tb_cheapest), and search/navigation tools require careful reading to choose correctly.
All tools share a clear tb_ prefix and snake_case formatting, which makes names predictable and readable. The only inconsistency is that some names are resource nouns while others are actions or compound phrases, but this is minor and still coherent.
The domain is broad enough to justify many specialized tools, but 26 tools is heavy and includes several that could be consolidated (e.g. multiple price-analysis and offer-finding tools). It is not excessive relative to the full e-commerce research scope, but it sits at the upper bound of practicality.
The surface covers search, discovery, product details, sellers, in-person stores, variants, price history, deals, comparisons, basket optimization, and shop lookup, which is strong lifecycle coverage for a price-comparison domain. Minor gaps exist around product reviews or richer category browsing, but agents can work around them.
Maintenance
Related MCP Connectors
AI-powered product search, affiliate links, and price negotiation for e-commerce platforms
Product price checks and affiliate link building for AI shopping agents.
Cheapest delivered price for any product: tech, home, shoes, beauty. Read from each store's checkout
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables searching and comparing product prices, sellers, and price history from Torob, Iran's price-comparison engine, including shop trust signals and physical store availability.1MIT
- AlicenseAqualityBmaintenanceEnables 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.23348 PyPI43MIT
- AlicenseAqualityBmaintenanceEnables AI agents to search products on Iran's marketplace of independent shops with price, category, shipping and discount filters, find the cheapest in-stock offers, and read product details, shops, categories and customer reviews. It is read-only and needs no authentication, so it can be used straight from Claude, Cursor or Copilot.798 PyPIMIT
- AlicenseAqualityBmaintenanceEnables AI agents to search Iranian electronics products, read full spec tables, compare models side by side, and check shop offers and price history in Toman. It also covers category filtering, spec-based ranking, and Zoomit reviews, articles and buying guides, all read-only and without an API key.123MIT