Skip to main content
Glama
sepehr071

digikala-mcp

by sepehr071

digikala-mcp: Digikala MCP server for AI agents

Let your AI agent shop around on Digikala (دیجی‌کالا). An unofficial, read-only MCP server for Iran's largest online store: search products, compare every seller's offer, check a product's price history, read reviews and Q&A, and catch today's Incredible Offers, all from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

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


For AI agents

  • What: unofficial MCP server (model context protocol) for Digikala (digikala.com, Iran) and its Fresh supermarket. Queries in Persian or English, prices in Toman.

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

  • Auth: none, no API key or account. Optional DIGIKALA_MCP_PROXY (HTTP proxy, or a comma-separated list, e.g. with an Iranian exit if Digikala blocks yours).

  • Access: read-only. No login, cart, checkout or payment, so no confirmation is needed before calling any tool.

  • Tools: 23, all prefixed dk_. Start with dk_find_cheapest, dk_search, dk_best_for_budget, dk_deals. Typical sequence: dk_find_cheapest -> dk_product -> dk_price_history.

  • Use when: finding, comparing or judging prices of products and sellers on Digikala, including the Fresh supermarket.

  • Do not use when: the user wants to buy, or needs shipping cost (only calculated at checkout) or anything behind a login.

  • Output: compact JSON. Prices in Toman, ratings 0-5 (null = not rated). Numeric product ids (the <id> of dkp-<id>) pass between tools.

  • Network: talks to api.digikala.com directly from your machine. On "refused the request (HTTP 403)" for every call, set DIGIKALA_MCP_PROXY.

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

Related MCP server: SnappShop MCP Server

Why

Digikala lists the same phone many times: different colors, memory sizes, bundles and a dozen sellers per listing, with prices that move every day. Sorting by "cheapest" puts phone cases first. Finding the real cheapest offer, and whether today's price is a good one means a lot of clicking. An agent with digikala-mcp does it in three calls:

You: Cheapest Samsung Galaxy A07 on Digikala, and is now a good time to buy?

Agent: calls dk_find_cheapest(query="samsung a07") → dk_product(product_id=20109389) → dk_price_history(product_id=20109389)

Price

Model

Seller

42,503,600

Galaxy A07 64 GB / 4 GB

Digikala (same-day delivery in Tehran)

44,518,000

Galaxy A07 64 GB / 4 GB + 25 W charger

Sepahan Hamrah Yaghout

46,811,800

Galaxy A07 128 GB / 4 GB

Digikala

The 64 GB model is cheapest at 42,503,600, sold by Digikala itself; the next seller asks 42,918,000. But it's not a great moment: the black one sold for 34,499,000 yesterday and 33,200,000 at its lowest this month. Today's best offer is about 23% above yesterday's, so waiting may pay off.

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

What it can do

  • Search the whole catalogue in Persian or English, with price, brand, feature (OS, storage, ...), color, seller and fast-delivery filters; every result says whether its title really matches

  • Find the real cheapest match, with accessories filtered out, and every seller's offer for a product

  • Best picks for a budget, ranked by a rating weighted by how many buyers rated it, with the reasoning shown

  • Re-check a shortlist of up to 10 products in one call: price, cheapest offer, stock, distance from the 30-day low

  • Judge a price with about 30 days of daily price history and the 30-day low

  • Browse categories, brands, sellers and best sellers, sorted by price, sales, views, newest or buyers' pick

  • Check quality with reviews, pros/cons, buyer Q&A and seller reputation

  • Catch deals: Incredible Offers and supermarket (Digikala Fresh) discounts

  • Extras: spec comparison, installment plans, Digikala Plus shipping plans, live gold and coin prices

  • Read-only by design: no login, no cart, no orders, no payment

Quick start

You need uv. No API key or account.

claude mcp add digikala -- uvx digikala-mcp

Settings → Developer → Edit Config, then add:

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

Or in ~/.codex/config.toml:

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

Add to ~/.gemini/settings.json:

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

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

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

Then just ask:

  • "Cheapest AirPods-style earbuds under 3 million Toman with at least 4 stars?"

  • "Compare the Galaxy A07 64 GB and 128 GB. Is the bigger one worth the difference?"

  • "Is this seller reliable? CGDG9"

  • "What are today's Incredible Offers on headphones, biggest discount first?"

  • "Which Android phones with 256 GB sold by Digikala itself are under 20 million Toman?"

  • ارزان&zwnj;ترین شیر کم&zwnj;چرب در سوپرمارکت دیجی&zwnj;کالا چند است؟

  • ارزان&zwnj;ترین گوشی سامسونگ A07 کدام است و الان وقت خرید است؟

  • امروز چه شگفت&zwnj;انگیزی برای هدفون هست؟

Tools

Product ids are the number in a digikala.com/product/dkp-<id>/ link. Every list returns compact product cards: id, title, brand, price, discount, stock, seller, rating, a photo URL (image) and the product link.

Tool

What it does

dk_search

Search by words with sort, price, brand, feature, color and seller filters; flags loose title matches

dk_find_cheapest

Cheapest in-stock real matches for a query, accessories dropped, one list

dk_best_for_budget

Best-rated real matches under a budget, rating weighted by number of ratings

dk_suggest

Autocomplete: better keywords, category codes and brand ids

dk_filters

Filter options of a category or search: features (OS, storage, ...), colors, brands, sellers, price range

dk_categories

Find category codes and main-category ids

dk_category_products

Browse a category with sort and the same filters, optionally one brand

dk_brand_products

Browse a brand's products

dk_seller

A seller's rating, on-time shipping, cancellations, returns and products

dk_deals

Incredible Offers or supermarket deals, biggest discount first

dk_best_sellers

Current best sellers, overall or per main category

dk_fresh_search

Search or browse Digikala Fresh, the supermarket

Tool

What it does

dk_product

Price, stock, specs and every seller's offer (color, warranty, shipping), cheapest first

dk_shortlist

Re-price up to 10 products at once: price, cheapest offer, stock, rating, distance from the 30-day low

dk_price_history

About 30 days of daily prices per color, with low and high

dk_reviews

Customer reviews with stars, pros/cons and verified-buyer flag

dk_questions

Customer questions with their top answers

dk_similar

Similar products, e.g. cheaper alternatives

dk_compare

2-4 products side by side: the specs that differ, plus the shared ones

dk_installments

Digipay credit-line offers for a product (credit amount, monthly repayment, months)

Tool

What it does

dk_plus_plans

Digikala Plus membership plans (free shipments) and benefits

dk_gold_prices

Live 18k gold price per gram (daily and ~3-month change) and gold coin prices

dk_location

Address → coordinates, or coordinates → address with Digikala city/province ids

All 23 tools are annotated readOnlyHint: true and return compact structured JSON, so they don't flood the agent's context.

How it works

  AI agent  (Claude, Cursor, Copilot, ...)
      │
      │  MCP over stdio
      ▼
  digikala-mcp  (runs on your machine)
      │
      │  HTTPS
      └──────▶  api.digikala.com   products, sellers, deals, Fresh supermarket

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

Good to know

  • Prices are in Toman. The Digikala API answers in Rial; every tool divides by 10 so numbers match the website. Gold and coin prices are already Toman.

  • Ratings are 0–5, like the site (the API's 0–100 divided by 20); null means not rated yet. Review stars are 1–5.

  • Persian and English queries both work (گوشی سامسونگ, airpods pro). Category and brand codes are English slugs (mobile-phone, samsung).

  • sort=cheapest on a text search shows accessories first; that's how Digikala ranks it. Use dk_find_cheapest for "cheapest X".

  • Search always returns something, even for nonsense words (Digikala's search is semantic). dk_search marks each result match: all / some / none (with the missing words), and dk_find_cheapest and dk_best_for_budget keep only titles that contain every query word.

  • Filters by feature: dk_filters(category_code="mobile-phone") lists ids like operating system → Android, then dk_category_products(attributes={2226: [19239]}) filters on them.

  • The 30-day low ignores one-day dips. dk_shortlist compares today's price with the lowest price that held on two days in a row (low_30d), because Digikala's own 30-day low (lowest_one_day_30d, dk_product's lowest_price_30d) can be a single day of one color. dk_price_history gives both per color.

  • Photos: cards carry image, dk_product an images list (max 4), both absolute https URLs taken from the API as-is. They end in ?x-oss-process=image/resize,m_lfit,h_300,w_300/quality,q_80, so they are 300 px JPEGs; drop that suffix for the original size.

  • Prices move several times an hour on popular listings with many sellers; re-check right before buying.

  • Answers are cached for 2 minutes, so an agent repeating a call doesn't hit Digikala again; prices can lag the site by that much. A timeout, 5xx or 429 is retried up to twice with backoff.

  • Groceries come from the supermarket store: dk_product shows its price, which can differ from the main-store price in search results.

  • Shipping cost is only calculated at checkout (login). dk_product shows how each offer ships, and dk_plus_plans the free-shipping plans.

FAQ

Yes: digikala-mcp is an unofficial MCP server with 23 read-only tools for search, seller offers, price history, reviews and deals. It calls the same public endpoints the digikala.com web app uses; no API key is needed.

Add the server with claude mcp add digikala -- uvx digikala-mcp (or the matching config in Quick start for Claude Desktop, Cursor and VS Code), then ask in plain language, in Persian or English.

It is unofficial and not affiliated with Digikala. It is read-only (no login, cart or payment), runs on your machine, and is free under the MIT license.

Usually not: in testing the API answered from a foreign (Turkish) exit. If every tool fails with "refused the request (HTTP 403)", set DIGIKALA_MCP_PROXY to an HTTP proxy with an Iranian exit. (A 403 from just one call usually means an unknown category or brand code.) Normal system proxy variables are ignored on purpose. If Digikala serves a bot-check page, install the optional browser fallback (uvx --with patchright==1.63.0 digikala-mcp or pip install digikala-mcp[browser]), then run patchright install chromium.

No, and that's deliberate. It has no login and never calls the cart, checkout, payment, or review/question posting endpoints; it only reads public data. The agent finds the best option; you tap buy on the site.

Digikala lists products that are out of stock, coming soon or discontinued. They have no current offer, so there's no price. Searches use in_stock_only: true by default.

Yes. dk_fresh_search searches and browses Digikala Fresh, dk_deals takes store='supermarket', and dk_product falls back to the Fresh product API for supermarket ids.

Toman, like the website. The API answers in Rial and every tool divides by 10; gold and coin prices are already Toman.

Since 2026-10-05 Digikala's Digipay credit endpoint answers an empty list for every product (the product page shows no credit box either), so the tool returns a note instead of offers.

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

npx @modelcontextprotocol/inspector uvx digikala-mcp

Configuration

Variable

Default

Meaning

DIGIKALA_MCP_PROXY

unset

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

فارسی

سرور MCP دیجی&zwnj;کالا برای دستیار هوش مصنوعی

digikala-mcp یک سرور MCP غیررسمی و فقط&zwnj;خواندنی برای دیجی&zwnj;کالا، بزرگ&zwnj;ترین فروشگاه اینترنتی ایران، است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می&zwnj;دهد در دیجی&zwnj;کالا جستجو کند، قیمت همه فروشندگان یک کالا را مقایسه کند، تاریخچه قیمت، نظرات و پرسش&zwnj;وپاسخ&zwnj;ها را بخواند و پیشنهادهای شگفت&zwnj;انگیز را پیدا کند.

چه کارهایی می&zwnj;کند

  • جستجو به فارسی یا انگلیسی، با فیلتر قیمت، برند، ویژگی (سیستم عامل، حافظه و ...)، رنگ، نوع فروشنده و ارسال سریع؛ کنار هر نتیجه می&zwnj;گوید عنوانش واقعاً با جستجو جور است یا نه.

  • ارزان&zwnj;ترین کالای واقعی را پیدا می&zwnj;کند (لوازم جانبی مثل قاب و کابل را کنار می&zwnj;گذارد) و پیشنهاد همه فروشندگان یک کالا را از ارزان به گران نشان می&zwnj;دهد.

  • بهترین انتخاب با بودجه شما: کالاها را بر اساس امتیازی رتبه&zwnj;بندی می&zwnj;کند که تعداد امتیازدهنده&zwnj;ها را هم در نظر می&zwnj;گیرد، تا یک کالای ۵ ستاره با ۳ رأی از کالای ۴٫۶ ستاره با ۹۰۰ رأی جلو نزند.

  • تاریخچه قیمت حدود ۳۰ روز گذشته و کمترین قیمت ماه، برای اینکه بدانید الان وقت خرید است یا نه.

  • بررسی دوباره فهرست منتخب: قیمت، موجودی و فاصله تا کمترین قیمت ماه تا ۱۰ کالا با یک درخواست.

  • کیفیت: نظرات خریداران با نقاط قوت و ضعف، پرسش&zwnj;وپاسخ&zwnj;ها، و کارنامه فروشنده (ارسال به&zwnj;موقع، لغو، مرجوعی).

  • تخفیف&zwnj;ها: شگفت&zwnj;انگیزها، پرفروش&zwnj;ها و تخفیف&zwnj;های سوپرمارکت (دیجی&zwnj;کالا فرش).

  • بیشتر: مقایسه مشخصات فنی، طرح&zwnj;های دیجی&zwnj;کالا پلاس، قیمت لحظه&zwnj;ای طلا و سکه.

نکته&zwnj;ها

  • فقط خواندنی است: وارد حساب نمی&zwnj;شود، سبد خرید نمی&zwnj;سازد و سفارش ثبت نمی&zwnj;کند.

  • همه قیمت&zwnj;ها به تومان است و امتیازها مثل سایت از ۵.

  • روی سیستم خود شما اجرا می&zwnj;شود، کلید API لازم ندارد و به هیچ سرور واسطی داده نمی&zwnj;فرستد.

  • پاسخ&zwnj;ها تا ۲ دقیقه نگه داشته می&zwnj;شوند؛ قیمت ممکن است همین&zwnj;قدر از سایت عقب باشد.

کلیدواژه&zwnj;ها: دیجی&zwnj;کالا، digikala، سرور MCP دیجی&zwnj;کالا، مقایسه قیمت، ارزان&zwnj;ترین قیمت، تاریخچه قیمت، شگفت&zwnj;انگیز دیجی&zwnj;کالا، دیجی&zwnj;کالا فرش، فروشگاه اینترنتی، خرید آنلاین.

نصب (اول uv را نصب کنید). در Claude Code:

claude mcp add digikala -- uvx digikala-mcp

در Claude Desktop، Cursor و بقیه برنامه&zwnj;ها همان تنظیم بخش Quick start را بگذارید.

نمونه پرسش&zwnj;ها

  • «ارزان&zwnj;ترین گوشی سامسونگ A07 کدام است و الان قیمتش خوب است؟»

  • «بهترین هدفون بی&zwnj;سیم تا ۳ میلیون تومان چیست؟»

  • «گوشی اندرویدی با ۲۵۶ گیگ حافظه که خود دیجی&zwnj;کالا می&zwnj;فروشد، از ارزان به گران.»

  • «این سه لپ&zwnj;تاپ را مقایسه کن و بگو کدام ارزش خرید دارد.»

  • «امروز چه شگفت&zwnj;انگیزی برای هدفون هست؟»

Development

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

The live tests can also run on GitHub (Actions → Live → Run workflow). They are not scheduled: from GitHub's US runners Digikala times out on a few calls each run, while the same tests pass from an Iranian connection.

Tools live in src/digikala_mcp/catalog.py, product.py and services.py; each is a typed async function with a docstring that tells the agent when to use it. Issues and PRs are welcome, especially new tools and fixes for API changes.

Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions tests, publishes to PyPI and the MCP Registry, and creates the GitHub Release.

Disclaimer

Unofficial and not affiliated with or endorsed by Digikala. It uses the public endpoints of the digikala.com web app, which can change without notice. Please keep request rates reasonable.

Author

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

License

MIT

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

Available Tools

23 tools
dk_best_for_budgetBest picks for a budgetA
Read-onlyIdempotent

Rank the best-rated in-stock products within a budget (Toman) by a rating weighted by its count.

A 5.0 from 3 buyers does not beat a 4.6 from 900; ties go to the cheaper one. A query keeps only titles with every word and drops accessories. Use for "best X under Y"; then dk_product, dk_reviews.

NameRequiredDescriptionDefault
limitNoMax picks to return.
pagesNoResult pages to scan, 20 products each.
queryNoWhat to buy, e.g. 'هدفون بی سیم' or 'گوشی سامسونگ'.
max_priceYesBudget in Toman, e.g. 20000000 for 20 million Toman.
min_priceNoSkip anything cheaper, in Toman. Default for a query: a floor that drops accessories.
min_ratingsNoSkip products with fewer ratings than this.
category_codeNoOr a category code instead of a query, e.g. 'mobile-phone' (from dk_suggest).

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive, openWorld), so the bar is lower; the description still adds real behavior: the weighted-rating rule, the tie-breaker, and that queries require every word in the title and drop accessories. It stops short of noting result size or pagination limits of the scan.

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

Conciseness4/5

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

Three tight sentences, front-loaded with the purpose, then the ranking rule, then the usage cue. Dense but every sentence carries information; only slight terseness ('Use for "best X under Y"') costs it a point.

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

Completeness4/5

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

For a 7-parameter, no-output-schema, open-world tool, the description covers what the tool does to the data (filter, drop accessories, weight ratings) and what to do next. It omits any hint of the returned shape, which is the only notable gap.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, but the description adds semantics the schema does not: query matching requires every word in the title and drops accessories, and min_price defaults to a floor that filters accessories when a query is given. That meaningfully clarifies two of the seven parameters.

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

Purpose5/5

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

States a specific verb (rank) plus resource (best-rated in-stock products) and the exact ordering key (rating weighted by count, ties to cheaper). This clearly separates it from siblings such as dk_search, dk_best_sellers, and dk_find_cheapest.

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

Usage Guidelines4/5

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

Gives an explicit trigger phrase ('best X under Y') and chains the follow-up tools (dk_product, dk_reviews). It does not, however, state when to prefer this over similar siblings like dk_best_sellers or dk_find_cheapest, so exclusions are missing.

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

dk_best_sellersBest sellersA
Read-onlyIdempotent

List current best sellers, overall or in one main category; also returns the main categories' ids for category_id.

NameRequiredDescriptionDefault
limitNoMax products to return.
category_idNoMain category id from dk_categories (no arguments) or this tool's `categories`, e.g. 1 for mobile. Leaf ids are rejected.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds one genuine behavioral trait beyond the annotations: the response also carries the main category ids usable as category_id. It says nothing about ordering, result size limits, or failure behavior.

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

Conciseness4/5

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

A single compact sentence with the core purpose front-loaded before the secondary return-value detail. The trailing clause about returning category ids is slightly compressed and grammatically awkward, but nothing is wasted.

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

Completeness4/5

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

For a two-parameter, read-only list tool with no output schema, the description covers what it returns at a high level and how to source the optional category_id. Missing only result ordering and the effect of limit defaults, which are minor.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it clarifies that category_id accepts only main categories and that the tool itself returns those ids, making the input self-servicing. limit's semantics are left entirely to the schema.

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

Purpose4/5

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

States a specific verb and resource (list best sellers) and adds scope (overall or within one main category), which separates it from dk_category_products and dk_search. It does not explicitly name a sibling it is not, so it stops short of a 5.

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

Usage Guidelines3/5

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

The description implies usage via the category_id sourcing note (dk_categories or this tool's own `categories` output), which is useful chaining guidance. However, it never says when to prefer this over dk_category_products, dk_deals, or dk_search, and gives no exclusions.

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

dk_brand_productsBrowse a brandA
Read-onlyIdempotent

List a brand's products with sort and price filters (Toman), plus the brand id for brand_ids.

For one brand inside one category use dk_category_products(brand_code=...).

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the results.relevance
max_priceNoHighest price in Toman, e.g. 50000000.
min_priceNoLowest price in Toman, e.g. 10000000 for 10 million Toman.
brand_codeYesBrand code: usually the lowercase English brand name (as in digikala.com/brand/<code>/, or dk_product's brand_code), e.g. 'samsung' or 'xiaomi'.
in_stock_onlyNoOnly products that can be bought now.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds the Toman currency and a hint about a returned brand id, but says nothing about pagination limits beyond the schema, result size, or failure modes. Modest added value over the annotations.

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

Conciseness4/5

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

Two short sentences with the core capability front-loaded and the disambiguation second. The parenthetical '(Toman)' and the 'brand id for brand_ids' fragment are slightly cryptic but cost little space.

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

Completeness3/5

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

There is no output schema, so the description carries some burden for return shape; it only gestures at 'the brand id' without describing the product list structure or the 20-per-page behavior (which lives in the schema). Given full param coverage and full annotations, it is adequate but leaves the response format underspecified.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter (page, sort enum, min/max price, brand_code pattern, in_stock_only) is already documented in the schema. The description only restates currency units and filter categories. Baseline 3 is appropriate when the schema does the heavy lifting.

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

Purpose4/5

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

States a specific verb+resource ('List a brand's products') and names the filter dimensions (sort, price). It also differentiates from the sibling dk_category_products. The trailing clause 'plus the brand id for brand_ids' is ambiguous about what is actually returned, which keeps it short of a 5.

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

Usage Guidelines4/5

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

Explicitly routes the agent to the alternative: 'For one brand inside one category use dk_category_products(brand_code=...).' That gives a clear when-to-use-this-instead condition. It doesn't cover other siblings (dk_search, dk_best_sellers) or when a brand-level browse is the wrong entry point.

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

dk_categoriesFind categoriesA
Read-onlyIdempotent

Find category codes for dk_category_products and main-category ids for dk_best_sellers.

query matches the Persian name or English code (Persian finds more: 'لپ تاپ' finds the laptop leaf, 'laptop' does not); parent_id lists children; neither lists the main categories. A category with subcategories mixes in accessories: browse its product leaf.

NameRequiredDescriptionDefault
limitNoMax categories to return.
queryNoWords in the category name or code, e.g. 'هدفون' or 'laptop'.
parent_idNoList the sub-categories of this category id.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds genuinely useful behavior beyond them: Persian queries match more terms than English codes, and parent_id/query never surface main categories. The accessory-mixing caveat for categories with subcategories is real operational context.

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

Conciseness4/5

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

Purpose is front-loaded in a short first sentence and the rest is dense with semicolon-separated rules rather than filler. Slightly compressed but every clause carries information; minor awkwardness in the wrapped formatting.

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

Completeness4/5

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

No output schema exists, yet the description still explains what is returned (category codes for dk_category_products, main-category ids for dk_best_sellers) and the matching rules. The one remaining gap is that it names the 'main categories' limitation without offering a path to retrieve them.

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

Parameters4/5

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

Schema coverage is 100% (baseline 3), but the description adds meaning the schema lacks: a Persian-vs-English matching asymmetry with a concrete example, and the fact that parent_id lists children whereas query/parent_id together still omit main categories.

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

Purpose5/5

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

States a specific verb and resource ('Find category codes ... main-category ids') and immediately connects the output to the two siblings that consume it (dk_category_products, dk_best_sellers), so an agent can distinguish this lookup tool from the product-listing tools without opening a schema.

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

Usage Guidelines4/5

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

Gives concrete per-parameter routing: query matches name/code, parent_id lists children, and 'neither lists the main categories' flags a limitation. It also implicitly routes the agent to browse the product leaf for accessories, but no explicit sibling alternative is named as a fallback for the main-category gap it calls out.

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

dk_category_productsBrowse a categoryA
Read-onlyIdempotent

List one category's products with sort and filters (price in Toman), strict order.

E.g. "cheapest laptops" (category 'notebook-netbook-ultrabook'), "best-selling Xiaomi phones" (brand_code='xiaomi'). Feature ids come from dk_filters(category_code=...). No text query here.

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the results.relevance
colorsNoColor ids from dk_filters, e.g. [1].
brand_idsNoBrand ids from dk_product's brand_id or dk_brand_products' brand.id, e.g. [18] Samsung, [1662] Xiaomi.
max_priceNoHighest price in Toman, e.g. 50000000.
min_priceNoLowest price in Toman, e.g. 10000000 for 10 million Toman.
attributesNoFeature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]}. Values OR, attributes AND.
brand_codeNoOnly this brand: its English slug, e.g. 'xiaomi' or 'lenovo' (dk_product's brand_code).
seller_typeNoOnly offers from Digikala itself, official brand sellers, trusted sellers or rural (roosta) sellers.
category_codeYesCategory code from dk_categories, dk_suggest or dk_product, e.g. 'mobile-phone'.
fast_deliveryNoOnly items with fast (Jet) delivery.
in_stock_onlyNoOnly products that can be bought now.
ready_to_shipNoOnly items already in Digikala's warehouse (ship sooner).

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare this a read-only, idempotent, non-destructive open-world read, so the safety profile is covered. The description adds the currency unit (Toman) and ID-provenance requirements, but says nothing about rate limits, auth, or result shape, and 'strict order' is vague filler rather than a disclosed behavior.

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

Conciseness4/5

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

Two compact sentences with examples doing real work and the core purpose front-loaded. Minor waste in the unexplained phrase 'strict order', which costs a point.

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

Completeness3/5

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

For a 13-parameter tool with one required field and no output schema, the description covers purpose, ID sources, and search exclusion, and the schema itself is richly documented. It still leaves the return shape (result fields, total counts) unaddressed, which matters more here because no output schema exists.

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

Parameters3/5

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

Schema description coverage is 100% and every parameter already carries an example, so the baseline is 3. The description mostly duplicates that (brand_code='xiaomi', category slug, Toman pricing) and only adds cross-tool provenance for feature/attribute ids.

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

Purpose5/5

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

States a specific verb (List), resource (one category's products), and scope (sort + filters, single category, no text query). It explicitly carves itself out from the text-search sibling with 'No text query here' and the worked examples ('cheapest laptops', 'best-selling Xiaomi phones') make the intent unmistakable.

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

Usage Guidelines4/5

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

Gives concrete when-to-use examples and dependency routing ('Feature ids come from dk_filters(category_code=...)'), plus an implicit exclusion of text-query tools. It stops short of naming dk_search or dk_brand_products as the alternative for those cases, so the routing is suggested rather than explicit.

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

dk_compareCompare productsA
Read-onlyIdempotent

Compare 2-4 products side by side: price and rating, then the spec rows where they differ.

values in a specs row follow the order of products (null = no such spec); identical rows fold into same_specs. Best within one category. Unknown ids are listed in missing_ids.

NameRequiredDescriptionDefault
product_idsYes2-4 product ids of the same kind, e.g. [20109389, 20110013].

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), and the description adds substantive behavior beyond them: how missing/unknown ids surface (missing_ids), how identical spec rows collapse (same_specs), positional alignment of values to products with null meaning absent, and which side wins ties ('best within one category'). That is useful non-obvious context for an annotated read tool.

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

Conciseness4/5

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

Three short, front-loaded lines with no filler; the core action comes first and the field-name semantics follow. Slightly telegraphic phrasing ('Best within one category') costs a little clarity but nothing is wasted.

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

Completeness4/5

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

With no output schema, the description must carry the return contract, and it largely does: comparison shape, differing-row filtering, same_specs, missing_ids. It omits error behavior for invalid counts or mismatched product kinds, but a 1-parameter read-only tool is otherwise sufficiently covered.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter is fully documented there, so baseline is 3. The description goes beyond the schema by explaining how the result relates back to the input ordering (`values` follows `products`, null = no such spec), which is semantics an agent needs to read the response correctly.

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

Purpose5/5

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

States a specific verb and resource ('Compare 2-4 products side by side') plus the scope and the exact outputs it produces (price/rating, differing spec rows). No sibling tool does product-vs-product comparison, so the agent can distinguish it from dk_product, dk_search, or dk_shortlist at a glance.

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

Usage Guidelines2/5

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

The description never states when to choose this over alternatives such as dk_product (single lookup) or dk_shortlist, nor any preconditions (all ids must be the same kind is only in the schema). Usage is inferable from the verb, but no explicit routing guidance is given.

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

dk_dealsCurrent dealsA
Read-onlyIdempotent

List today's Incredible Offers (flash deals), biggest discount first, in-stock only.

Each product has discount_pct, price_before_discount and deal_ends (Tehran time). store='supermarket' lists Fresh deals.

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the deals.biggest_discount
queryNoOptional words to narrow the deals, e.g. 'هدفون' or 'شیر'.
storeNo'digikala' for Incredible Offers, 'supermarket' for Digikala Fresh grocery deals.digikala
max_priceNoHighest price in Toman, e.g. 50000000.
min_priceNoLowest price in Toman, e.g. 10000000 for 10 million Toman.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare this a safe, idempotent, read-only call. Beyond that, the description discloses genuinely new behavior: results are constrained to in-stock items, sorted by biggest discount by default, and each product returns discount_pct, price_before_discount and deal_ends in Tehran time. That timezone note matters for a time-sensitive field and is not derivable from structured data.

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

Conciseness4/5

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

Two short paragraphs, front-loaded with what the tool returns and how it is scoped. Both sentences carry non-redundant information given there is no output schema. Minor slack in restating the store mapping that the schema also covers.

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

Completeness4/5

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

With no output schema, the description usefully explains the returned fields and their timezone, plus the in-stock filter and default sort. Pagination is left to the schema and there is no mention of rate limits, but for a read-only listing tool the agent has enough to call it correctly.

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

Parameters3/5

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

Schema description coverage is 100%, so every parameter is already documented in the schema, which sets the baseline at 3. The description reinforces the store semantics and default ordering but adds no format or constraint detail beyond what the schema states. The one extra value-add, the Tehran timezone, concerns output rather than a parameter.

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

Purpose4/5

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

The description gives a specific verb and resource ('List today's Incredible Offers'), clarifying it is a curated deals feed rather than a general search. The in-stock-only and default-sort modifiers pin down the scope further. It does not name sibling tools (e.g. dk_search, dk_find_cheapest) to differentiate, so it stops short of a 5.

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

Usage Guidelines3/5

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

It implies when to use it (browsing live flash deals) and clarifies that store='supermarket' switches to Fresh grocery deals, which is decision-relevant routing. However, it never states exclusions or explicitly contrasts with alternatives such as dk_search or dk_find_cheapest, leaving the agent to infer which deals tool to pick.

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

dk_filtersFilter optionsA
Read-onlyIdempotent

List the filters of a category or a search: attributes, colors, sellers, price range (Toman), brands.

Attributes give {value title: id}; one with over 15 values only has value_count: call again with attribute_id. Colors are {title: id}; brands {code: id} (category only); categories {code: title} (query only). Pass the ids to dk_category_products or dk_search (attributes={attribute id: [value ids]}, colors, seller_type, brand_ids).

NameRequiredDescriptionDefault
queryNoSearch words instead of a category, e.g. 'هدفون بی سیم'.
brand_codeNoWith category_code: only this brand, e.g. 'samsung'.
attribute_idNoReturn only this attribute with all its values, e.g. 2251 (phone storage).
category_codeNoCategory code from dk_suggest or dk_categories, e.g. 'mobile-phone'.

TDQS

A4/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description only needs to add operational detail — and it does. It discloses the response shapes ({value title: id}, {title: id}, {code: id}, {code: title}) and the non-obvious truncation behavior for large attribute sets that forces a second call. Since there is no output schema, this disclosure is doing real work.

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

Conciseness4/5

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

The purpose statement is front-loaded in the first sentence, and the remaining lines are dense but each carries a distinct fact (return shapes, recursion rule, downstream consumption). The telegraphic brace/semicolon shorthand is efficient but costs some readability, keeping it from a 5.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so by describing each filter's shape. It covers both operating modes, the two-call workaround for large attribute sets, and how the ids feed into sibling tools. Minor gaps remain (e.g. seller_type semantics, price-range format beyond Toman), so not a 5.

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

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3, but the description adds mode-dependent meaning the schema does not state cleanly: brands use {code: id} in category mode, categories use {code: title} in query mode. That clarifies which parameters are applicable in which operating mode, going beyond the per-field schema text.

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

Purpose4/5

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

States a specific verb and resource — 'List the filters of a category or a search' — and enumerates the filter kinds returned (attributes, colors, sellers, price range, brands). It also names the consumer tools (dk_category_products, dk_search), which separates it from siblings like dk_categories or dk_suggest. It stops short of explicitly contrasting itself with those discovery siblings.

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

Usage Guidelines4/5

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

Gives concrete when-to-use direction: pass the returned ids to dk_category_products or dk_search, and it names the exact parameter names to use. It also handles the edge case explicitly — an attribute with over 15 values returns only value_count, so call again with attribute_id. No explicit when-not-to-use or exclusions, so not a 5.

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

dk_find_cheapestFind cheapest productA
Read-onlyIdempotent

Find the cheapest in-stock products that really match a query, sorted by price (Toman).

Scans the top relevant results, keeps titles with every query word (else any word, with a note) and drops accessories. Use for "cheapest X"; then dk_product on the winner, as another seller may sell it for less.

NameRequiredDescriptionDefault
limitNoMax products to return.
pagesNoRelevance pages to scan, 20 products each.
queryYesProduct name or words, Persian or English, e.g. 'گوشی سامسونگ' or 'airpods pro'.
max_priceNoHighest price in Toman, e.g. 50000000.
min_priceNoSkip anything cheaper than this, in Toman. Default: a quarter of the median price of the top matches (ignoring max_price), which drops accessories.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly/openWorld/idempotent/non-destructive, so safety is covered. The description adds real behavioral detail beyond that: it scans the top relevant results, keeps titles containing every query word (falling back to any word with a `note`), and drops accessories. That matching-relaxation behavior is exactly the kind of thing an agent cannot infer from annotations or schema.

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

Conciseness4/5

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

Three compact sentences, front-loaded with purpose then matching logic then routing; nothing is filler. The mid-sentence line break before the backticked `note` makes the structure slightly choppier than ideal, keeping it just under a 5.

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

Completeness4/5

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

For a 5-parameter, no-output-schema lookup tool, the description covers purpose, filtering behavior, ordering, unit (Toman), and the next step. Return shape is only hinted at via the mention of a `note`, which is a minor gap but not a blocker for correct invocation.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents limit, pages, query, min_price, and max_price including the accessory-dropping default. The description's 'drops accessories' reiterates the schema's min_price note rather than adding new parameter meaning, so the baseline 3 applies.

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

Purpose4/5

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

The description states a specific verb and resource with scope: 'Find the cheapest in-stock products that really match a query, sorted by price.' It also signals the intended phrasing ('Use for "cheapest X"'), which separates it from generic siblings like dk_search. It stops short of distinguishing itself from the closest sibling, dk_best_for_budget, so it is clear but not fully sibling-differentiated.

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

Usage Guidelines4/5

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

It gives a concrete when-to-use trigger ('cheapest X') and a follow-up step ('then dk_product on the winner, as another seller may sell it for less'). There is no explicit when-not or named alternative for budget-style queries, so it is clear context without exclusions.

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

dk_gold_pricesGold and coin pricesA
Read-onlyIdempotent

Get the live 18k gold price per gram and gold coin prices, in Toman.

gold18_day_change_pct is vs the previous daily point; period change, low and high cover the ~3-month chart. Coins' change_pct is as Digikala shows it. Coins with price null are not for sale.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, open-world, non-destructive behavior. The description adds genuinely useful field semantics beyond that: what gold18_day_change_pct compares against, that period change/low/high span a ~3-month chart, and that a null coin price means 'not for sale.' This is real context the annotations do not carry.

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

Conciseness4/5

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

Front-loaded purpose sentence followed by a compact field-glossary paragraph; every sentence earns its place. The second block is slightly terse ('period change, low and high') but not wasteful.

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

Completeness4/5

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

With no parameters and no output schema, the description must convey what comes back, and it partially does by defining several return fields. It does not enumerate the full response shape (e.g., the coin list structure), leaving a small gap for a tool whose return values carry the whole contract.

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

Parameters4/5

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

With zero parameters, the baseline is 4. The description instead spends its text on return-field semantics, which is the right allocation for a no-argument tool.

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

Purpose5/5

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

The first sentence states a specific verb and resource: 'Get the live 18k gold price per gram and gold coin prices, in Toman.' No sibling tool in the list covers market/commodity pricing, so it is trivially distinguished from the product-search siblings.

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

Usage Guidelines4/5

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

The description gives clear context (live gold/coin prices) but no explicit when-to-use/when-not guidance. Because it takes no parameters and no sibling overlaps this resource, the usage is unambiguous without routing instructions.

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

dk_installmentsInstallment plansA
Read-onlyIdempotent

Get the Digipay credit-line offers for a product, in Toman.

A plan is a fixed credit line (credit_amount) repaid in months installments of monthly_repayment; it is not sized to the product price, so never present it as "this product for X a month". Needs Digipay approval. An unknown id gives no plans; check it with dk_product.

NameRequiredDescriptionDefault
product_idYesDigikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is covered; the description adds genuinely non-obvious behavioral facts on top: an approval requirement, empty-result behavior on unknown ids, and the warning that plans are not sized to the product price so they must not be framed as a per-month product offer.

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

Conciseness4/5

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

Three tight sentences with the purpose front-loaded, then the domain caveat, then the prerequisite and error behavior. Nothing is padded, though the mid-sentence backtick identifiers make it slightly denser than needed.

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

Completeness4/5

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

For a one-parameter read-only lookup with no output schema, the description supplies the missing return-shape vocabulary, the approval prerequisite, and the invalid-id behavior. The only gap is that it never contrasts with the sibling dk_plus_plans, leaving the agent to guess which plan tool fits which product type.

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

Parameters3/5

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

Schema description coverage is 100% and the single product_id parameter is already well documented in the schema (format, example, range), so the schema carries the load. The description adds only the currency unit (Toman) and output-field vocabulary (credit_amount, months, monthly_repayment), which are return-value semantics rather than parameter semantics.

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

Purpose4/5

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

States a specific verb (Get) and resource (Digipay credit-line offers for a product) and even names the price unit (Toman). It defines what an installment plan is, but never explicitly distinguishes itself from the nearby sibling dk_plus_plans, which an agent could plausibly confuse it with.

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

Usage Guidelines4/5

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

Gives a real prerequisite ("Needs Digipay approval"), tells the agent what happens with a bad input ("An unknown id gives no plans"), and routes to a validator ("check it with dk_product"). It stops short of an explicit when-to-use-vs-alternative statement (e.g. vs dk_plus_plans), so it is clear context but not full exclusion guidance.

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

dk_locationFind locationA
Read-onlyIdempotent

Turn an address into coordinates, or coordinates into an address with Digikala's city_id and state_id.

Pass address + city, or lat + long. Prices are the same everywhere; location only affects delivery.

NameRequiredDescriptionDefault
latNoLatitude, to describe a point instead (Iran: ~25 to ~40).
cityNoPersian city name; without it most addresses find nothing, e.g. 'تهران' or 'مشهد'.
longNoLongitude, with lat.
addressNoAddress or landmark in Persian, e.g. 'میدان ونک'. Latin text matches poorly.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld/non-destructive, so the safety bar is covered. The description adds genuinely useful behavioral context beyond them: the two mutually exclusive input modes and the domain fact that pricing is location-independent while delivery is not.

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

Conciseness5/5

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

Two sentences, zero filler, with the primary purpose front-loaded and the input modes immediately after. Every clause earns its place.

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

Completeness4/5

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

For a 4-optional-param, no-output-schema lookup tool this is close to complete: it names the inputs, the two modes, and the returned identifiers. The one gap is that with zero required parameters and all defaults null, the failure behavior when neither mode is supplied is not stated.

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

Parameters4/5

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

Schema coverage is 100%, so per-parameter docs already carry the load and the baseline is 3. The description goes one step further by specifying the cross-parameter pairing constraint (address+city as a unit, lat+long as a unit), which the schema does not express.

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

Purpose5/5

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

States a specific bidirectional verb+resource: address→coordinates or coordinates→address, returning Digikala city_id/state_id. That is unambiguous and clearly distinct from every sibling, all of which are catalog/product/price tools.

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

Usage Guidelines4/5

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

'Pass address + city, or lat + long' tells the agent exactly which invocation mode to pick, and the note that location only affects delivery (not price) tells it when the result matters. It stops short of stating what happens if both or neither mode is supplied, so it is clear context rather than full when/when-not guidance.

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

dk_plus_plansDigikala Plus plansA
Read-onlyIdempotent

List Digikala Plus plans (free shipments per month: jet = same-day Tehran/Karaj, fresh = supermarket) with price in Toman and benefits.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuine domain context the annotations cannot: the plan tiers (jet vs fresh) and that results carry Toman pricing and benefits. It does not describe ordering or count, which is a minor omission for a small static list.

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

Conciseness5/5

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

A single front-loaded sentence with the core action first and the differentiating details in a compact parenthetical. Every clause (tier names, geography, currency, benefits) carries information an agent would otherwise lack; nothing is padding.

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

Completeness5/5

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

For a zero-parameter, non-destructive list tool with no output schema, the description already tells the agent what comes back (plan tiers, Toman prices, benefits). Nothing needed to invoke or interpret the call is missing.

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

Parameters4/5

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

The tool takes zero parameters, so the baseline of 4 applies. The description neither invents nor misrepresents parameters, and correctly implies the call returns the full plan set with no filtering input.

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

Purpose5/5

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

States a specific verb (List) and resource (Digikala Plus plans), then immediately qualifies what those plans contain (jet same-day Tehran/Karaj shipping, fresh supermarket, price in Toman, benefits). No sibling tool in the list covers subscription plans, so the agent can route here unambiguously.

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

Usage Guidelines3/5

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

Usage is only implied — an agent infers this is for questions about Plus subscription tiers, but there is no explicit 'use when' clause, no prerequisites, and no named alternative (e.g. when to prefer dk_fresh_search or dk_deals instead). Adequate but leaves selection to inference.

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

dk_price_historyPrice historyA
Read-onlyIdempotent

Get ~30 days of daily buy-box prices (Toman) per color/variant, with lowest and highest.

For "is this a good price?": lowest_2_days is the lowest price held two days in a row (lowest can be a one-day dip). Days are Jalali. An unknown id gives no variants; check it with dk_product.

NameRequiredDescriptionDefault
product_idYesDigikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description adds real context beyond them: the ~30-day window, daily granularity, Toman currency, per-variant grouping, and the Jalali calendar basis. It also discloses the empty-result edge case for unknown ids, though it does not describe other return fields or data-freshness guarantees.

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

Conciseness5/5

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

Front-loads the core capability in the first sentence, then layers the interpretation hint and the error-handling note. Three short blocks, no filler, every sentence earns its place.

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

Completeness4/5

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

With no output schema, the description must carry return-value meaning, and it does name lowest, highest, and lowest_2_days with their semantics. For a single-parameter read-only tool this is nearly complete; only minor details (exact window variance, additional fields) are left implicit.

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

Parameters4/5

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

Schema coverage is 100% for the single product_id parameter, so the baseline would be 3, but the description adds behavioral meaning: an unknown id yields no variants and should be validated via dk_product. That extra guidance is genuinely useful parameter-level context.

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

Purpose5/5

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

States a specific verb (Get), resource (daily buy-box prices), and scope (~30 days, per color/variant, in Toman) plus the two summary fields returned. It also routes the agent to dk_product for id validation, so it is distinguishable from sibling tools.

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

Usage Guidelines4/5

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

Explicitly frames the use case ('For "is this a good price?"') and explains why lowest_2_days is the right field versus lowest for that judgment. It also names dk_product as the fallback for an unknown id. It does not, however, compare itself to pricing siblings like dk_find_cheapest or dk_deals.

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

dk_productProduct details and offersA
Read-onlyIdempotent

Get one product's price, stock, rating, specs and every seller's offer (cheapest first).

An offer is one color/size from one seller: price (Toman), stock_left (only when low), warranty, seller rating 0-5, ships_by ('digikala', 'jet' = same-day Tehran/Karaj, 'seller'), free_shipping. lowest_price_30d can be a one-day dip of one color; dk_price_history's lowest_2_days is steadier. Groceries have store='supermarket' and a price that can differ from dk_search's.

NameRequiredDescriptionDefault
max_offersNoMax seller offers to return, cheapest first.
product_idYesDigikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389.
include_specsNoInclude the specification table.

TDQS

A4.4/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial behavioral detail: the offer model (one color/size per seller), that stock_left appears 'only when low', ships_by semantics ('jet' = same-day Tehran/Karaj), and the lowest_price_30d volatility caveat. This is well beyond what the structured fields convey.

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

Conciseness4/5

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

The core purpose is front-loaded in sentence one, followed by a compressed field glossary. Dense but essentially waste-free; the caveats about lowest_price_30d and groceries each carry information an agent would otherwise misread.

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

Completeness5/5

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

With no output schema, the description carries the burden of describing returns and does so: the top-level fields and the full per-offer field set with their meanings and conditional presence. Nothing an agent needs to interpret results is missing.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents product_id, max_offers and include_specs; the baseline is 3. The description reinforces the cheapest-first ordering and the offer concept but adds no syntax or format detail beyond the schema.

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

Purpose5/5

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

Opens with a specific verb+resource ('Get one product's...') and enumerates exactly what comes back: price, stock, rating, specs, and every seller's offer. It is clearly distinguishable from siblings like dk_search (listing) and dk_price_history (history series).

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

Usage Guidelines4/5

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

Routes the agent to alternatives with reasons: dk_price_history's lowest_2_days is 'steadier' than a possibly spurious lowest_price_30d dip, and warns that grocery prices may differ from dk_search's. It lacks an explicit 'use this when you have a product_id' trigger or a when-not-to-use statement, so it stops short of a 5.

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

dk_questionsProduct questions and answersA
Read-onlyIdempotent

Read customers' questions (20 per page) with up to 2 answers each (answered_by: buyer, seller, ...).

Texts are cut to 300 characters (full_text=true: whole). Use for practical doubts (compatibility, size, registration).

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the questions.most_answered
full_textNoSkip text cuts and pros/cons caps; return everything whole.
product_idYesDigikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare the safe-read profile (readOnly, idempotent, non-destructive), and the description adds real behavior beyond that: 20 items per page and texts truncated to 300 characters unless full_text=true. It does not mention rate limits or total counts, but this is solid added context.

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

Conciseness4/5

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

Two compact sentences with the core read/count facts front-loaded and the use case trailing. No filler, though the truncation detail is packed into a parenthetical that is slightly dense.

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

Completeness4/5

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

For a read-only, single-object listing tool with a fully documented schema and annotations covering safety, this is nearly complete. The absence of an output schema is not an issue since the description conveys the return shape (questions, answers, truncation).

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

Parameters3/5

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

Schema description coverage is 100%, so baseline is 3. The description restates full_text's effect and page size, which the schema already documents, so it adds little beyond the structured fields.

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

Purpose4/5

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

States a specific verb and resource: 'Read customers' questions' with the answer cardinality made concrete ('up to 2 answers each'). It is clearly a Q&A reader, distinguishable in spirit from dk_reviews, though it never names that nearest sibling explicitly.

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

Usage Guidelines4/5

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

'Use for practical doubts (compatibility, size, registration)' gives concrete when-to-use context. It does not state when NOT to use it or point to alternatives like dk_reviews, so it stops short of full routing guidance.

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

dk_reviewsProduct reviewsA
Read-onlyIdempotent

Read customer reviews: stars 1-5 (null = none), text, pros/cons, verified buyer flag.

The overall rating (0-5) is in dk_product. Texts are cut to 300 characters, pros/cons to 5 of 80; full_text=true returns them whole. An unknown id gives no reviews; check it with dk_product.

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the reviews.most_helpful
limitNoMax reviews from the page (20 per page).
full_textNoSkip text cuts and pros/cons caps; return everything whole.
product_idYesDigikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389.

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, but the description adds real behavioral detail: truncation limits (300 chars, pros/cons 5 of 80), the full_text override, and that an unknown id returns no reviews rather than an error. That is meaningful context beyond the annotations.

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

Conciseness4/5

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

Front-loaded with the return payload, then constraints, then the id caveat. Three tight sentences with no filler, though the numeric limits make it slightly dense.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does so well (fields, truncation, full_text behavior). Only minor gaps remain, such as pagination semantics, which the schema already covers.

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

Parameters4/5

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

Schema coverage is 100% so the baseline is 3, but the description adds value the schema lacks: the concrete cut numbers and the semantic note that stars can be null (no rating). It does not add syntax for page/sort/limit beyond the schema.

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

Purpose5/5

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

States a specific verb and resource ('Read customer reviews') and enumerates the returned fields (stars, text, pros/cons, verified buyer flag). It also distinguishes itself from the sibling dk_product by explicitly routing the overall rating there.

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

Usage Guidelines4/5

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

Clear context: it directs the agent to dk_product for the overall rating and to verify ids, and explains when to set full_text=true. It stops short of explicitly naming when not to use it, but the routing guidance is solid.

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

dk_sellerSeller profile and productsA
Read-onlyIdempotent

Get a seller's reputation (rating 0-5, on-time shipping, cancellations, returns) and products.

Use before recommending an unknown seller. Percentages are the share of good orders (100 = never late).

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the results.best_selling
seller_codeYesSeller code from dk_product offers or a product card, e.g. 'CGDG9'.
in_stock_onlyNoOnly products that can be bought now.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so the safety profile is covered. The description adds genuinely useful metric semantics ('Percentages are the share of good orders, 100 = never late') that annotations cannot express, but says nothing about pagination behavior or how many products come back.

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

Conciseness5/5

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

Three tight sentences with zero filler. The purpose and the usage trigger are both front-loaded, and the clarifying note on percentage semantics is placed last where it does not obstruct scanning.

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

Completeness4/5

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

With no output schema, the description does name what is returned (rating, on-time shipping, cancellations, returns, products) and how to interpret the numbers, which is adequate for a read-only lookup. It leaves the 20-products-per-page result shape to the schema, but nothing critical for invoking the tool is missing.

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

Parameters3/5

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

Schema description coverage is 100%, and every parameter (page, sort, seller_code, in_stock_only) is documented with type, default, enum or pattern in the schema itself. The description only glosses the reputation fields, adding no parameter-level detail beyond the schema, so the baseline 3 applies.

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

Purpose4/5

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

States a specific verb and resource: fetching a seller's reputation metrics plus their products. It is distinguishable from siblings like dk_best_sellers (listing) and dk_brand_products (brand-scoped), though it never explicitly names those distinctions.

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

Usage Guidelines4/5

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

'Use before recommending an unknown seller' gives a clear trigger condition for when to reach for this tool. It stops short of stating when not to use it or pointing at an alternative for known/trusted sellers.

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

dk_shortlistRe-check a shortlistA
Read-onlyIdempotent

Re-price up to 10 products in one call: price, cheapest offer, stock, rating and 30-day low (Toman).

Use to refresh a watched list or check stock. cheapest_offer can be below price (the featured offer). low_30d is the lowest price held two days in a row, vs_30d_low_pct today's price above it (0 = at the low); lowest_one_day_30d is Digikala's figure, possibly a one-day dip. For specs use dk_compare; for the daily curve dk_price_history.

NameRequiredDescriptionDefault
product_idsYes1-10 product ids, e.g. [20109389, 20110013].

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered; the description goes further and explains non-obvious value semantics: cheapest_offer can sit below price (featured offer), low_30d requires two consecutive days at the low, vs_30d_low_pct is 0 at the low, and lowest_one_day_30d is Digikala's figure that may be a one-day dip. With no output schema, this disambiguation is genuinely load-bearing.

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

Conciseness5/5

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

The capability and its field set are front-loaded in the first sentence, followed by usage, then field semantics. Every remaining sentence defines a term or points at an alternative; nothing is padding.

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

Completeness5/5

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

With no output schema and only one input parameter, the description carries the return-value burden and does exactly that by defining the five fields and their units. An agent knows what it will get back and when to prefer a sibling.

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

Parameters3/5

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

Schema coverage is 100% and the single parameter's description already documents the 1-10 id constraint. The description's 'up to 10 products' merely restates maxItems, adding no new syntax or format meaning, so the baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource ('re-price up to 10 products in one call') and enumerates the returned fields (price, cheapest offer, stock, rating, 30-day low) with currency. It explicitly names the siblings it is not (dk_compare for specs, dk_price_history for the daily curve), so an agent can differentiate without opening another schema.

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

Usage Guidelines5/5

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

'Use to refresh a watched list or check stock' gives the triggering scenario, and the closing sentence routes to two concrete alternatives with their selection criteria ('For specs use dk_compare; for the daily curve dk_price_history'). When-to-use and when-not-to-use are both covered.

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

dk_similarSimilar productsA
Read-onlyIdempotent

List products similar to one (same kind, other models and brands).

sort='cheapest' gives cheaper alternatives; then dk_compare.

NameRequiredDescriptionDefault
pageNoPage number, from 1 (20 products per page).
sortNoOrder of the results.relevance
product_idYesDigikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389.
in_stock_onlyNoOnly products that can be bought now.

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already establish this as a safe, idempotent, read-only, open-world lookup, so the safety profile is covered. The description adds useful behavioral context — the notion of similarity and that one sort mode yields cheaper alternatives — but says nothing about return shape, result size, or pagination behavior beyond what the schema states.

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

Conciseness4/5

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

Two short sentences, front-loaded with the purpose before the parameter hint and next-step pointer. The trailing fragment "then dk_compare." is terse almost to the point of ambiguity, but no sentence is wasted.

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

Completeness4/5

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

For a read-only listing tool whose 4 parameters are fully documented in the schema, the description covers purpose, similarity scope, a key sort semantic, and the natural follow-up call. The main remaining gap is that, with no output schema, it never characterizes what a result entry contains.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning the schema lacks: the schema only says 'Order of the results' for sort, while the description explains that sort='cheapest' resolves to cheaper alternatives relative to the source product. This only covers one of eight enum values, so it is above baseline but not exhaustive.

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

Purpose4/5

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

The description gives a specific verb+resource ("List products similar to one") and immediately defines what 'similar' means — same kind, other models and brands — which disambiguates it from generic listing siblings like dk_search or dk_category_products. It stops short of explicitly naming a sibling it should not be used in place of.

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

Usage Guidelines4/5

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

It gives concrete usage direction: use sort='cheapest' to surface cheaper alternatives, and it names the follow-up tool (dk_compare) as a chained next step. There is no 'when not to use this' guidance or comparison against the other discovery tools, so it is clear context rather than full routing.

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

dk_suggestSearch suggestionsA
Read-onlyIdempotent

Autocomplete a vague or misspelled query into keywords, categories and brands.

Next: dk_search with a keyword, or dk_category_products with a category code.

NameRequiredDescriptionDefault
queryYesPartial text, e.g. 'samsung' or 'هدفون'.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds value beyond that by disclosing the return shape (keywords, categories, brands) in a tool with no output schema, though it says nothing about result limits or ranking.

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

Conciseness5/5

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

Two compact lines: the capability first, the follow-on routing second. No filler, and everything is front-loaded.

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

Completeness5/5

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

For a one-parameter, read-only lookup with no output schema, the description covers the input expectation, the returned entity types and the next step, which is everything an agent needs to call it and chain it correctly.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter already has an example, so the baseline is 3. The description adds semantic meaning by indicating the query is expected to be partial/vague or misspelled, which frames how to populate it.

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

Purpose5/5

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

States a specific verb and resource ('Autocomplete a vague or misspelled query') plus the nature of the output (keywords, categories, brands). It also names the sibling tools it feeds into, so an agent can place it precisely in the workflow.

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

Usage Guidelines4/5

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

The condition for use is explicit ('vague or misspelled query'), and the two downstream alternatives (dk_search, dk_category_products) are named with the input each expects. It stops short of stating when NOT to call this (e.g. skip it if you already have a clean keyword), so it is clear context rather than full routing logic.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 23 tool updatesv0.4.0
    • Changeddk_best_for_budget9 fields changed
      • removedInput schema / properties / category_code / title
        Removed value: -"Category Code"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / min_ratings / title
        Removed value: -"Min Ratings"
      • removedInput schema / properties / pages / title
        Removed value: -"Pages"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"dk_best_for_budgetArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_best_for_budgetDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_best_sellers5 fields changed
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +10
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"dk_best_sellersArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_best_sellersDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_brand_products8 fields changed
      • removedInput schema / properties / brand_code / title
        Removed value: -"Brand Code"
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_brand_productsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_brand_productsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_categories7 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -40New value: +25
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / parent_id / title
        Removed value: -"Parent Id"
      • changedInput schema / properties / query / anyOf
        Previous value: -[
        -  {
        -    "minLength": 2,
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 100,
        +    "minLength": 2,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"dk_categoriesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_categoriesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_category_products17 fields changed
      • changedInput schema / properties / attributes / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": {
        -      "items": {
        -        "type": "integer"
        -      },
        -      "type": "array"
        -    },
        -    "maxProperties": 10,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "maxItems": 20,
        +      "type": "array"
        +    },
        +    "maxProperties": 10,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / attributes / description
        Previous value: -"Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]} for Android phones. Values of one attribute are OR'ed, attributes are AND'ed."New value: +"Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]}. Values OR, attributes AND."
      • removedInput schema / properties / attributes / title
        Removed value: -"Attributes"
      • removedInput schema / properties / brand_code / title
        Removed value: -"Brand Code"
      • removedInput schema / properties / brand_ids / title
        Removed value: -"Brand Ids"
      • removedInput schema / properties / category_code / title
        Removed value: -"Category Code"
      • removedInput schema / properties / colors / title
        Removed value: -"Colors"
      • removedInput schema / properties / fast_delivery / title
        Removed value: -"Fast Delivery"
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / ready_to_ship / title
        Removed value: -"Ready To Ship"
      • removedInput schema / properties / seller_type / title
        Removed value: -"Seller Type"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_category_productsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_category_productsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_compare3 fields changed
      • removedInput schema / properties / product_ids / title
        Removed value: -"Product Ids"
      • removedInput schema / title
        Removed value: -"dk_compareArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_compareDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_deals9 fields changed
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / query / anyOf
        Previous value: -[
        -  {
        -    "minLength": 2,
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "maxLength": 100,
        +    "minLength": 2,
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / properties / store / title
        Removed value: -"Store"
      • removedInput schema / title
        Removed value: -"dk_dealsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_dealsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_filters6 fields changed
      • removedInput schema / properties / attribute_id / title
        Removed value: -"Attribute Id"
      • removedInput schema / properties / brand_code / title
        Removed value: -"Brand Code"
      • removedInput schema / properties / category_code / title
        Removed value: -"Category Code"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"dk_filtersArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_filtersDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_find_cheapest8 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +10
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / pages / title
        Removed value: -"Pages"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"dk_find_cheapestArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_find_cheapestDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_fresh_search9 fields changed
      • removedInput schema / properties / category_code / title
        Removed value: -"Category Code"
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_fresh_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_fresh_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_gold_prices2 fields changed
      • removedInput schema / title
        Removed value: -"dk_gold_pricesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_gold_pricesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_installments3 fields changed
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / title
        Removed value: -"dk_installmentsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_installmentsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_location6 fields changed
      • removedInput schema / properties / address / title
        Removed value: -"Address"
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • removedInput schema / title
        Removed value: -"dk_locationArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_locationDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_plus_plans2 fields changed
      • removedInput schema / title
        Removed value: -"dk_plus_plansArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_plus_plansDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_price_history3 fields changed
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / title
        Removed value: -"dk_price_historyArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_price_historyDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_product5 fields changed
      • removedInput schema / properties / include_specs / title
        Removed value: -"Include Specs"
      • removedInput schema / properties / max_offers / title
        Removed value: -"Max Offers"
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / title
        Removed value: -"dk_productArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_productDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_questions6 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Skip text cuts and pros/cons caps; return everything whole.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_questionsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_questionsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_reviews7 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Skip text cuts and pros/cons caps; return everything whole.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 10,
        +  "description": "Max reviews from the page (20 per page).",
        +  "maximum": 20,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_reviewsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_reviewsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_search16 fields changed
      • changedInput schema / properties / attributes / anyOf
        Previous value: -[
        -  {
        -    "additionalProperties": {
        -      "items": {
        -        "type": "integer"
        -      },
        -      "type": "array"
        -    },
        -    "maxProperties": 10,
        -    "type": "object"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "additionalProperties": {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "maxItems": 20,
        +      "type": "array"
        +    },
        +    "maxProperties": 10,
        +    "type": "object"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / attributes / description
        Previous value: -"Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]} for Android phones. Values of one attribute are OR'ed, attributes are AND'ed."New value: +"Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]}. Values OR, attributes AND."
      • removedInput schema / properties / attributes / title
        Removed value: -"Attributes"
      • removedInput schema / properties / brand_ids / title
        Removed value: -"Brand Ids"
      • removedInput schema / properties / colors / title
        Removed value: -"Colors"
      • removedInput schema / properties / fast_delivery / title
        Removed value: -"Fast Delivery"
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / ready_to_ship / title
        Removed value: -"Ready To Ship"
      • removedInput schema / properties / seller_type / title
        Removed value: -"Seller Type"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_seller6 fields changed
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / seller_code / title
        Removed value: -"Seller Code"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_sellerArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_sellerDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_shortlist3 fields changed
      • removedInput schema / properties / product_ids / title
        Removed value: -"Product Ids"
      • removedInput schema / title
        Removed value: -"dk_shortlistArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_shortlistDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_similar6 fields changed
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"dk_similarArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_similarDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changeddk_suggest3 fields changed
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"dk_suggestArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "dk_suggestDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 5 tool updatesv0.2.1
    • Addeddk_best_for_budget
    • Changeddk_category_products5 fields changed
      • addedInput schema / properties / attributes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "maxProperties": 10,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]} for Android phones. Values of one attribute are OR'ed, attributes are AND'ed.",
        +  "title": "Attributes"
        +}
      • addedInput schema / properties / colors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "maxItems": 10,
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Color ids from dk_filters, e.g. [1].",
        +  "title": "Colors"
        +}
      • addedInput schema / properties / fast_delivery
        Added value: +{
        +  "default": false,
        +  "description": "Only items with fast (Jet) delivery.",
        +  "title": "Fast Delivery",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ready_to_ship
        Added value: +{
        +  "default": false,
        +  "description": "Only items already in Digikala's warehouse (ship sooner).",
        +  "title": "Ready To Ship",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / seller_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "digikala",
        +        "official",
        +        "trusted",
        +        "roosta"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only offers from Digikala itself, official brand sellers, trusted sellers or rural (roosta) sellers.",
        +  "title": "Seller Type"
        +}
    • Addeddk_filters
    • Changeddk_search5 fields changed
      • addedInput schema / properties / attributes
        Added value: +{
        +  "anyOf": [
        +    {
        +      "additionalProperties": {
        +        "items": {
        +          "type": "integer"
        +        },
        +        "type": "array"
        +      },
        +      "maxProperties": 10,
        +      "type": "object"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]} for Android phones. Values of one attribute are OR'ed, attributes are AND'ed.",
        +  "title": "Attributes"
        +}
      • addedInput schema / properties / colors
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "type": "integer"
        +      },
        +      "maxItems": 10,
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Color ids from dk_filters, e.g. [1].",
        +  "title": "Colors"
        +}
      • addedInput schema / properties / fast_delivery
        Added value: +{
        +  "default": false,
        +  "description": "Only items with fast (Jet) delivery.",
        +  "title": "Fast Delivery",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / ready_to_ship
        Added value: +{
        +  "default": false,
        +  "description": "Only items already in Digikala's warehouse (ship sooner).",
        +  "title": "Ready To Ship",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / seller_type
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "digikala",
        +        "official",
        +        "trusted",
        +        "roosta"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only offers from Digikala itself, official brand sellers, trusted sellers or rural (roosta) sellers.",
        +  "title": "Seller Type"
        +}
    • Addeddk_shortlist
  3. 20 tool updatesv0.1.0
    • First observeddk_best_sellers
    • First observeddk_brand_products
    • First observeddk_categories
    • First observeddk_category_products
    • First observeddk_compare
    • First observeddk_deals
    • First observeddk_find_cheapest
    • First observeddk_fresh_search
    • First observeddk_gold_prices
    • First observeddk_installments
    • First observeddk_location
    • First observeddk_plus_plans
    • First observeddk_price_history
    • First observeddk_product
    • First observeddk_questions
    • First observeddk_reviews
    • First observeddk_search
    • First observeddk_seller
    • First observeddk_similar
    • First observeddk_suggest

TDQS

A4/5.0

Scored across 23 tools

Disambiguation4/5

There are several product-listing tools (dk_search, dk_category_products, dk_brand_products, dk_fresh_search) and two specialized rankers (dk_find_cheapest, dk_best_for_budget), which could be confused. However, descriptions explicitly delineate boundaries (text query vs category vs brand vs supermarket) and give 'Next:' routing hints, so an agent can reliably pick.

Naming Consistency5/5

Every tool uses the same dk_ prefix with a consistent snake_case noun/verb pattern (dk_search, dk_product, dk_price_history, dk_best_sellers). No style mixing at all.

Tool Count4/5

23 tools is at the heavy end, but the domain is genuinely broad (search, categories, brands, sellers, reviews, Q&A, deals, fresh, plus, installments, gold, location) and each tool maps to a distinct capability. Only minor redundancy from the multiple listing entry points.

Completeness4/5

Coverage of the browsing/shopping-research lifecycle is strong: discovery, filters, comparison, reviews, Q&A, price history, seller reputation, deals and financing. Gaps like cart/checkout and returns are outside a data-lookup server's scope, so no critical dead ends for its purpose.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Enables intelligent product discovery on Digikala (Iran's largest e-commerce platform) with bilingual search, query optimization, price filtering in Toomans, product details, recommendations, and AI-powered semantic search for clothing and accessories.
    5
    5
    -
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to search a catalog of roughly 960,000 fashion products across about 10,000 Iranian online and Instagram shops, comparing prices and discounts, checking per-color and per-size stock, browsing categories and curated listings, and finding similar items at other shops. It also lets agents assess shop trust signals such as ratings and buyer surveys, surface flash sales and discount codes, and read blog style guides, all read-only with no login or ordering.
    14
    428 PyPI
    2
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to compare prices across Iranian online and in-person shops, inspect each seller's offer with warranty and installment details, review roughly a year of price history, score deals, and find the cheapest shop for a whole basket. It is read-only, requires no account or API key, and runs locally for Claude, Cursor or Copilot.
    26
    1
    MIT