digikala-mcp
A read-only MCP server that lets AI agents shop around Digikala and Digikala Fresh: search products, compare sellers, judge prices, and inspect reviews, deals, and extras.
Search & discover products by keyword in Persian or English, with price, brand, feature, color, seller, fast-delivery and in-stock filters; get autocomplete suggestions, categories, filter options, and title-match flags.
Find the best price: cheapest real matches (accessories filtered out), best-rated picks under a budget, and every seller's offer for a product, cheapest first.
Browse categories, brands, sellers (with reputation stats), best sellers, and today's Incredible Offers or Fresh supermarket deals.
Judge whether to buy: ~30-day price history per color/variant, 30-day lows, and a shortlist refresh of up to 10 products with price, stock, rating and distance from the low.
Check quality: customer reviews with stars, pros/cons and verified-buyer flags; buyer questions with answers.
Compare and explore: similar products/cheaper alternatives, 2-4 product spec comparison, installment plans.
Extras: Digikala Fresh grocery search, Digikala Plus plans, live 18k gold and coin prices, and address/coordinate lookup with city/province ids.
Read-only by design: no login, cart, checkout, payment or posting; no API key required, runs locally over stdio, prices in Toman.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@digikala-mcpcheapest Samsung Galaxy A07 on Digikala, and is now a good time to buy?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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.
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-mcporclaude 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 withdk_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>ofdkp-<id>) pass between tools.Network: talks to
api.digikala.comdirectly from your machine. On "refused the request (HTTP 403)" for every call, setDIGIKALA_MCP_PROXY.Machine-readable:
server.jsonand 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-mcpSettings → 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-mcpOr 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?"
ارزان‌ترین شیر کم‌چرب در سوپرمارکت دیجی‌کالا چند است؟
ارزان‌ترین گوشی سامسونگ A07 کدام است و الان وقت خرید است؟
امروز چه شگفت‌انگیزی برای هدفون هست؟
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 |
| Search by words with sort, price, brand, feature, color and seller filters; flags loose title matches |
| Cheapest in-stock real matches for a query, accessories dropped, one list |
| Best-rated real matches under a budget, rating weighted by number of ratings |
| Autocomplete: better keywords, category codes and brand ids |
| Filter options of a category or search: features (OS, storage, ...), colors, brands, sellers, price range |
| Find category codes and main-category ids |
| Browse a category with sort and the same filters, optionally one brand |
| Browse a brand's products |
| A seller's rating, on-time shipping, cancellations, returns and products |
| Incredible Offers or supermarket deals, biggest discount first |
| Current best sellers, overall or per main category |
| Search or browse Digikala Fresh, the supermarket |
Tool | What it does |
| Price, stock, specs and every seller's offer (color, warranty, shipping), cheapest first |
| Re-price up to 10 products at once: price, cheapest offer, stock, rating, distance from the 30-day low |
| About 30 days of daily prices per color, with low and high |
| Customer reviews with stars, pros/cons and verified-buyer flag |
| Customer questions with their top answers |
| Similar products, e.g. cheaper alternatives |
| 2-4 products side by side: the specs that differ, plus the shared ones |
| Digipay credit-line offers for a product (credit amount, monthly repayment, months) |
Tool | What it does |
| Digikala Plus membership plans (free shipments) and benefits |
| Live 18k gold price per gram (daily and ~3-month change) and gold coin prices |
| 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 supermarketdigikala-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);
nullmeans 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=cheapeston a text search shows accessories first; that's how Digikala ranks it. Usedk_find_cheapestfor "cheapest X".Search always returns something, even for nonsense words (Digikala's search is semantic).
dk_searchmarks each resultmatch: all / some / none(with the missing words), anddk_find_cheapestanddk_best_for_budgetkeep only titles that contain every query word.Filters by feature:
dk_filters(category_code="mobile-phone")lists ids like operating system → Android, thendk_category_products(attributes={2226: [19239]})filters on them.The 30-day low ignores one-day dips.
dk_shortlistcompares 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'slowest_price_30d) can be a single day of one color.dk_price_historygives both per color.Photos: cards carry
image,dk_productanimageslist (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_productshows its price, which can differ from the main-store price in search results.Shipping cost is only calculated at checkout (login).
dk_productshows how each offer ships, anddk_plus_plansthe 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-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
فارسی
سرور MCP دیجی‌کالا برای دستیار هوش مصنوعی
digikala-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای دیجی‌کالا، بزرگ‌ترین فروشگاه اینترنتی ایران، است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در دیجی‌کالا جستجو کند، قیمت همه فروشندگان یک کالا را مقایسه کند، تاریخچه قیمت، نظرات و پرسش‌وپاسخ‌ها را بخواند و پیشنهادهای شگفت‌انگیز را پیدا کند.
چه کارهایی می‌کند
جستجو به فارسی یا انگلیسی، با فیلتر قیمت، برند، ویژگی (سیستم عامل، حافظه و ...)، رنگ، نوع فروشنده و ارسال سریع؛ کنار هر نتیجه می‌گوید عنوانش واقعاً با جستجو جور است یا نه.
ارزان‌ترین کالای واقعی را پیدا می‌کند (لوازم جانبی مثل قاب و کابل را کنار می‌گذارد) و پیشنهاد همه فروشندگان یک کالا را از ارزان به گران نشان می‌دهد.
بهترین انتخاب با بودجه شما: کالاها را بر اساس امتیازی رتبه‌بندی می‌کند که تعداد امتیازدهنده‌ها را هم در نظر می‌گیرد، تا یک کالای ۵ ستاره با ۳ رأی از کالای ۴٫۶ ستاره با ۹۰۰ رأی جلو نزند.
تاریخچه قیمت حدود ۳۰ روز گذشته و کمترین قیمت ماه، برای اینکه بدانید الان وقت خرید است یا نه.
بررسی دوباره فهرست منتخب: قیمت، موجودی و فاصله تا کمترین قیمت ماه تا ۱۰ کالا با یک درخواست.
کیفیت: نظرات خریداران با نقاط قوت و ضعف، پرسش‌وپاسخ‌ها، و کارنامه فروشنده (ارسال به‌موقع، لغو، مرجوعی).
تخفیف‌ها: شگفت‌انگیزها، پرفروش‌ها و تخفیف‌های سوپرمارکت (دیجی‌کالا فرش).
بیشتر: مقایسه مشخصات فنی، طرح‌های دیجی‌کالا پلاس، قیمت لحظه‌ای طلا و سکه.
نکته‌ها
فقط خواندنی است: وارد حساب نمی‌شود، سبد خرید نمی‌سازد و سفارش ثبت نمی‌کند.
همه قیمت‌ها به تومان است و امتیازها مثل سایت از ۵.
روی سیستم خود شما اجرا می‌شود، کلید API لازم ندارد و به هیچ سرور واسطی داده نمی‌فرستد.
پاسخ‌ها تا ۲ دقیقه نگه داشته می‌شوند؛ قیمت ممکن است همین‌قدر از سایت عقب باشد.
کلیدواژه‌ها: دیجی‌کالا، digikala، سرور MCP دیجی‌کالا، مقایسه قیمت، ارزان‌ترین قیمت، تاریخچه قیمت، شگفت‌انگیز دیجی‌کالا، دیجی‌کالا فرش، فروشگاه اینترنتی، خرید آنلاین.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add digikala -- uvx digikala-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
نمونه پرسش‌ها
«ارزان‌ترین گوشی سامسونگ A07 کدام است و الان قیمتش خوب است؟»
«بهترین هدفون بی‌سیم تا ۳ میلیون تومان چیست؟»
«گوشی اندرویدی با ۲۵۶ گیگ حافظه که خود دیجی‌کالا می‌فروشد، از ارزان به گران.»
«این سه لپ‌تاپ را مقایسه کن و بگو کدام ارزش خرید دارد.»
«امروز چه شگفت‌انگیزی برای هدفون هست؟»
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.
Related servers
Technolife MCP server for electronics prices, with installment prices
MasterKala MCP server for gadgets and phone accessories
Torob MCP server for price comparison across Iranian shops
Okala MCP server for online grocery shopping
Banimode MCP server for fashion and clothing
iran-mcp: catalog of all Iranian-service MCP servers
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
If this saves you clicks, a star helps others find it.
Available Tools
23 toolsdk_best_for_budgetBest picks for a budgetARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max picks to return. | |
| pages | No | Result pages to scan, 20 products each. | |
| query | No | What to buy, e.g. 'هدفون بی سیم' or 'گوشی سامسونگ'. | |
| max_price | Yes | Budget in Toman, e.g. 20000000 for 20 million Toman. | |
| min_price | No | Skip anything cheaper, in Toman. Default for a query: a floor that drops accessories. | |
| min_ratings | No | Skip products with fewer ratings than this. | |
| category_code | No | Or a category code instead of a query, e.g. 'mobile-phone' (from dk_suggest). |
TDQS
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.
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.
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.
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.
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.
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 sellersARead-onlyIdempotent
List current best sellers, overall or in one main category; also returns the main categories' ids for category_id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max products to return. | |
| category_id | No | Main category id from dk_categories (no arguments) or this tool's `categories`, e.g. 1 for mobile. Leaf ids are rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds one 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.
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.
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.
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.
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.
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 brandARead-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=...).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the results. | relevance |
| max_price | No | Highest price in Toman, e.g. 50000000. | |
| min_price | No | Lowest price in Toman, e.g. 10000000 for 10 million Toman. | |
| brand_code | Yes | Brand 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_only | No | Only products that can be bought now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds 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.
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.
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.
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.
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.
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 categoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max categories to return. | |
| query | No | Words in the category name or code, e.g. 'هدفون' or 'laptop'. | |
| parent_id | No | List the sub-categories of this category id. |
TDQS
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.
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.
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.
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.
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.
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 categoryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the results. | relevance |
| colors | No | Color ids from dk_filters, e.g. [1]. | |
| brand_ids | No | Brand ids from dk_product's brand_id or dk_brand_products' brand.id, e.g. [18] Samsung, [1662] Xiaomi. | |
| max_price | No | Highest price in Toman, e.g. 50000000. | |
| min_price | No | Lowest price in Toman, e.g. 10000000 for 10 million Toman. | |
| attributes | No | Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]}. Values OR, attributes AND. | |
| brand_code | No | Only this brand: its English slug, e.g. 'xiaomi' or 'lenovo' (dk_product's brand_code). | |
| seller_type | No | Only offers from Digikala itself, official brand sellers, trusted sellers or rural (roosta) sellers. | |
| category_code | Yes | Category code from dk_categories, dk_suggest or dk_product, e.g. 'mobile-phone'. | |
| fast_delivery | No | Only items with fast (Jet) delivery. | |
| in_stock_only | No | Only products that can be bought now. | |
| ready_to_ship | No | Only items already in Digikala's warehouse (ship sooner). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, non-destructive open-world 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.
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.
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.
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.
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.
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 productsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_ids | Yes | 2-4 product ids of the same kind, e.g. [20109389, 20110013]. |
TDQS
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.
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.
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.
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.
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.
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 dealsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the deals. | biggest_discount |
| query | No | Optional words to narrow the deals, e.g. 'هدفون' or 'شیر'. | |
| store | No | 'digikala' for Incredible Offers, 'supermarket' for Digikala Fresh grocery deals. | digikala |
| max_price | No | Highest price in Toman, e.g. 50000000. | |
| min_price | No | Lowest price in Toman, e.g. 10000000 for 10 million Toman. |
TDQS
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.
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.
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.
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.
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.
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 optionsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Search words instead of a category, e.g. 'هدفون بی سیم'. | |
| brand_code | No | With category_code: only this brand, e.g. 'samsung'. | |
| attribute_id | No | Return only this attribute with all its values, e.g. 2251 (phone storage). | |
| category_code | No | Category code from dk_suggest or dk_categories, e.g. 'mobile-phone'. |
TDQS
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.
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.
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.
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.
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.
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 productARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max products to return. | |
| pages | No | Relevance pages to scan, 20 products each. | |
| query | Yes | Product name or words, Persian or English, e.g. 'گوشی سامسونگ' or 'airpods pro'. | |
| max_price | No | Highest price in Toman, e.g. 50000000. | |
| min_price | No | Skip anything cheaper than this, in Toman. Default: a quarter of the median price of the top matches (ignoring max_price), which drops accessories. |
TDQS
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.
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.
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.
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.
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.
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_fresh_searchSearch groceriesARead-onlyIdempotent
Search or browse Digikala Fresh (supermarket). category_code beats query and also returns sub-categories.
For grocery discounts use dk_deals(store='supermarket').
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the results. | relevance |
| query | No | Grocery product, Persian works best, e.g. 'شیر کم چرب' or 'برنج'. | |
| max_price | No | Highest price in Toman, e.g. 50000000. | |
| min_price | No | Lowest price in Toman, e.g. 10000000 for 10 million Toman. | |
| category_code | No | Fresh category code instead of a query: groceries, dairy, snacks, protein-foods, breakfast, beverages, warm-drinks, fruits-and-vegetables, personal-hygiene, baby-and-mother, home-hygiene, dried-fruit-nuts, ready-made-canned-food, condiments, frozen-food, salts-and-pickles, or a sub-category code this tool returned. | |
| in_stock_only | No | Only products that can be bought now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description only needs to add beyond that. It does disclose precedence behavior when both query and category_code are supplied, and that category_code also returns sub-categories, which is a genuine return-shape clue absent from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with purpose and the precedence rule, followed by a compact routing pointer. No wasted words, though the stray line breaks make it slightly less tight than an ideal single block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Seven optional parameters are all documented at 100% coverage, annotations carry the safety profile, and no output schema exists so return detail is not required. The description covers the one ambiguous interaction (query vs category_code) and hints at sub-categories, leaving little an agent would need missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all seven parameters richly (units, limits, enums, example values). The description's only added meaning is the precedence of category_code over query, which is useful but minimal against a fully documented schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Search or browse") and resource ("Digikala Fresh (supermarket)"), so an agent knows it targets the grocery vertical. It names dk_deals as the alternative for discounts, but never explicitly contrasts with dk_search, which is the obvious sibling an agent might 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing guidance: discounts go to dk_deals(store='supermarket'), and it states a precedence rule ("category_code beats query"). It lacks a when-not-to-use-this-vs-dk_search note, so the guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
dk_gold_pricesGold and coin pricesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 plansARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Digikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389. |
TDQS
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.
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.
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.
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.
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.
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 locationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude, to describe a point instead (Iran: ~25 to ~40). | |
| city | No | Persian city name; without it most addresses find nothing, e.g. 'تهران' or 'مشهد'. | |
| long | No | Longitude, with lat. | |
| address | No | Address or landmark in Persian, e.g. 'میدان ونک'. Latin text matches poorly. |
TDQS
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.
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.
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.
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.
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.
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 plansARead-onlyIdempotent
List Digikala Plus plans (free shipments per month: jet = same-day Tehran/Karaj, fresh = supermarket) with price in Toman and benefits.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. 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.
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.
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.
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.
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.
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 historyARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Digikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389. |
TDQS
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.
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.
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.
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.
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.
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 offersARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| max_offers | No | Max seller offers to return, cheapest first. | |
| product_id | Yes | Digikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389. | |
| include_specs | No | Include the specification table. |
TDQS
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.
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.
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.
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.
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.
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 answersARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the questions. | most_answered |
| full_text | No | Skip text cuts and pros/cons caps; return everything whole. | |
| product_id | Yes | Digikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389. |
TDQS
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.
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.
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.
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.
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.
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 reviewsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the reviews. | most_helpful |
| limit | No | Max reviews from the page (20 per page). | |
| full_text | No | Skip text cuts and pros/cons caps; return everything whole. | |
| product_id | Yes | Digikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389. |
TDQS
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.
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.
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.
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.
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.
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_searchSearch productsARead-onlyIdempotent
Search products by name: price (Toman), discount, seller, rating, 20 per page.
Search also returns loosely related items: each product has match ('all', 'some' with
missing_words, or 'none'); prefer 'all'. Filter ids come from dk_filters(query=...).
sort=cheapest puts accessories first: use dk_find_cheapest for the cheapest real match.
Next: dk_product for every seller's offer.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the results. | relevance |
| query | Yes | Product name or words, Persian or English, e.g. 'گوشی سامسونگ' or 'airpods pro'. | |
| colors | No | Color ids from dk_filters, e.g. [1]. | |
| brand_ids | No | Brand ids from dk_product's brand_id or dk_brand_products' brand.id, e.g. [18] Samsung, [1662] Xiaomi. | |
| max_price | No | Highest price in Toman, e.g. 50000000. | |
| min_price | No | Lowest price in Toman, e.g. 10000000 for 10 million Toman. | |
| attributes | No | Feature filters from dk_filters: {attribute id: [value ids]}, e.g. {2226: [19239]}. Values OR, attributes AND. | |
| seller_type | No | Only offers from Digikala itself, official brand sellers, trusted sellers or rural (roosta) sellers. | |
| fast_delivery | No | Only items with fast (Jet) delivery. | |
| in_stock_only | No | Only products that can be bought now. | |
| ready_to_ship | No | Only items already in Digikala's warehouse (ship sooner). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare safe read-only, idempotent, open-world behavior, so the bar is lower. The description goes well beyond by disclosing 20 results per page, the 'match' field semantics ('all', 'some' with missing_words, 'none'), and the important sort=cheapest caveat.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core search action and keeps the rest dense with match, filter, sort, and next-step information. It is appropriately sized with no filler, though some fragments are compressed enough to require careful parsing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex 12-parameter search tool with no output schema, the description covers key behavioral details: pagination, result match quality, and the next tool to call. It does not describe all return fields or pagination limits beyond page size, but schema and annotations cover the remaining structured concerns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 12 parameters are already documented, making 3 the baseline. The description adds only marginal parameter context, mainly that filter ids come from dk_filters(query=...) and restating price/seller/rating fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Search products by name', with scope details (price, discount, seller, rating, 20 per page). It also distinguishes itself from siblings by naming dk_find_cheapest for cheapest real matches and dk_product for seller offers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear usage context: filter ids come from dk_filters(query=...), sort=cheapest has a caveat directing to dk_find_cheapest, and 'Next: dk_product' tells the follow-up call. It lacks explicit when-not-to-use guidance against other search-like siblings such as dk_fresh_search or dk_category_products.
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 productsARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the results. | best_selling |
| seller_code | Yes | Seller code from dk_product offers or a product card, e.g. 'CGDG9'. | |
| in_stock_only | No | Only products that can be bought now. |
TDQS
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.
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.
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.
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.
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.
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 shortlistARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_ids | Yes | 1-10 product ids, e.g. [20109389, 20110013]. |
TDQS
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.
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.
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.
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.
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.
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 productsARead-onlyIdempotent
List products similar to one (same kind, other models and brands).
sort='cheapest' gives cheaper alternatives; then dk_compare.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 products per page). | |
| sort | No | Order of the results. | relevance |
| product_id | Yes | Digikala product id, the number in 'dkp-<id>' (from dk_search etc.), e.g. 20109389. | |
| in_stock_only | No | Only products that can be bought now. |
TDQS
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.
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.
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.
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.
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.
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 suggestionsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Partial text, e.g. 'samsung' or 'هدفون'. |
TDQS
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.
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.
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.
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.
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.
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.
23 tool updates
v0.4.0- Changed
dk_best_for_budget9 fields changed- removed
Input schema / properties / category_code / titleRemoved value: -"Category Code" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / min_ratings / titleRemoved value: -"Min Ratings" - removed
Input schema / properties / pages / titleRemoved value: -"Pages" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"dk_best_for_budgetArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_best_for_budgetDictOutput", - "type": "object" -}New value: +null
- Changed
dk_best_sellers5 fields changed- removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +10 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"dk_best_sellersArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_best_sellersDictOutput", - "type": "object" -}New value: +null
- Changed
dk_brand_products8 fields changed- removed
Input schema / properties / brand_code / titleRemoved value: -"Brand Code" - removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_brand_productsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_brand_productsDictOutput", - "type": "object" -}New value: +null
- Changed
dk_categories7 fields changed- changed
Input schema / properties / limit / defaultPrevious value: -40New value: +25 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / parent_id / titleRemoved value: -"Parent Id" - changed
Input schema / properties / query / anyOfPrevious value: -[ - { - "minLength": 2, - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"dk_categoriesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_categoriesDictOutput", - "type": "object" -}New value: +null
- Changed
dk_category_products17 fields changed- changed
Input schema / properties / attributes / anyOfPrevious 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" + } +] - changed
Input schema / properties / attributes / descriptionPrevious 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." - removed
Input schema / properties / attributes / titleRemoved value: -"Attributes" - removed
Input schema / properties / brand_code / titleRemoved value: -"Brand Code" - removed
Input schema / properties / brand_ids / titleRemoved value: -"Brand Ids" - removed
Input schema / properties / category_code / titleRemoved value: -"Category Code" - removed
Input schema / properties / colors / titleRemoved value: -"Colors" - removed
Input schema / properties / fast_delivery / titleRemoved value: -"Fast Delivery" - removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / ready_to_ship / titleRemoved value: -"Ready To Ship" - removed
Input schema / properties / seller_type / titleRemoved value: -"Seller Type" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_category_productsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_category_productsDictOutput", - "type": "object" -}New value: +null
- Changed
dk_compare3 fields changed- removed
Input schema / properties / product_ids / titleRemoved value: -"Product Ids" - removed
Input schema / titleRemoved value: -"dk_compareArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_compareDictOutput", - "type": "object" -}New value: +null
- Changed
dk_deals9 fields changed- removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / query / anyOfPrevious value: -[ - { - "minLength": 2, - "type": "string" - }, - { - "type": "null" - } -]New value: +[ + { + "maxLength": 100, + "minLength": 2, + "type": "string" + }, + { + "type": "null" + } +] - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / store / titleRemoved value: -"Store" - removed
Input schema / titleRemoved value: -"dk_dealsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_dealsDictOutput", - "type": "object" -}New value: +null
- Changed
dk_filters6 fields changed- removed
Input schema / properties / attribute_id / titleRemoved value: -"Attribute Id" - removed
Input schema / properties / brand_code / titleRemoved value: -"Brand Code" - removed
Input schema / properties / category_code / titleRemoved value: -"Category Code" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"dk_filtersArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_filtersDictOutput", - "type": "object" -}New value: +null
- Changed
dk_find_cheapest8 fields changed- changed
Input schema / properties / limit / defaultPrevious value: -20New value: +10 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / pages / titleRemoved value: -"Pages" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"dk_find_cheapestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_find_cheapestDictOutput", - "type": "object" -}New value: +null
- Changed
dk_fresh_search9 fields changed- removed
Input schema / properties / category_code / titleRemoved value: -"Category Code" - removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_fresh_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_fresh_searchDictOutput", - "type": "object" -}New value: +null
- Changed
dk_gold_prices2 fields changed- removed
Input schema / titleRemoved value: -"dk_gold_pricesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_gold_pricesDictOutput", - "type": "object" -}New value: +null
- Changed
dk_installments3 fields changed- removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / titleRemoved value: -"dk_installmentsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_installmentsDictOutput", - "type": "object" -}New value: +null
- Changed
dk_location6 fields changed- removed
Input schema / properties / address / titleRemoved value: -"Address" - removed
Input schema / properties / city / titleRemoved value: -"City" - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - removed
Input schema / properties / long / titleRemoved value: -"Long" - removed
Input schema / titleRemoved value: -"dk_locationArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_locationDictOutput", - "type": "object" -}New value: +null
- Changed
dk_plus_plans2 fields changed- removed
Input schema / titleRemoved value: -"dk_plus_plansArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_plus_plansDictOutput", - "type": "object" -}New value: +null
- Changed
dk_price_history3 fields changed- removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / titleRemoved value: -"dk_price_historyArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_price_historyDictOutput", - "type": "object" -}New value: +null
- Changed
dk_product5 fields changed- removed
Input schema / properties / include_specs / titleRemoved value: -"Include Specs" - removed
Input schema / properties / max_offers / titleRemoved value: -"Max Offers" - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / titleRemoved value: -"dk_productArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_productDictOutput", - "type": "object" -}New value: +null
- Changed
dk_questions6 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Skip text cuts and pros/cons caps; return everything whole.", + "type": "boolean" +} - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_questionsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_questionsDictOutput", - "type": "object" -}New value: +null
- Changed
dk_reviews7 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Skip text cuts and pros/cons caps; return everything whole.", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "default": 10, + "description": "Max reviews from the page (20 per page).", + "maximum": 20, + "minimum": 1, + "type": "integer" +} - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_reviewsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_reviewsDictOutput", - "type": "object" -}New value: +null
- Changed
dk_search16 fields changed- changed
Input schema / properties / attributes / anyOfPrevious 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" + } +] - changed
Input schema / properties / attributes / descriptionPrevious 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." - removed
Input schema / properties / attributes / titleRemoved value: -"Attributes" - removed
Input schema / properties / brand_ids / titleRemoved value: -"Brand Ids" - removed
Input schema / properties / colors / titleRemoved value: -"Colors" - removed
Input schema / properties / fast_delivery / titleRemoved value: -"Fast Delivery" - removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / ready_to_ship / titleRemoved value: -"Ready To Ship" - removed
Input schema / properties / seller_type / titleRemoved value: -"Seller Type" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_searchDictOutput", - "type": "object" -}New value: +null
- Changed
dk_seller6 fields changed- removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / seller_code / titleRemoved value: -"Seller Code" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_sellerArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_sellerDictOutput", - "type": "object" -}New value: +null
- Changed
dk_shortlist3 fields changed- removed
Input schema / properties / product_ids / titleRemoved value: -"Product Ids" - removed
Input schema / titleRemoved value: -"dk_shortlistArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_shortlistDictOutput", - "type": "object" -}New value: +null
- Changed
dk_similar6 fields changed- removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"dk_similarArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_similarDictOutput", - "type": "object" -}New value: +null
- Changed
dk_suggest3 fields changed- removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"dk_suggestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "dk_suggestDictOutput", - "type": "object" -}New value: +null
5 tool updates
v0.2.1- Added
dk_best_for_budget - Changed
dk_category_products5 fields changed- added
Input schema / properties / attributesAdded 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" +} - added
Input schema / properties / colorsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "integer" + }, + "maxItems": 10, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Color ids from dk_filters, e.g. [1].", + "title": "Colors" +} - added
Input schema / properties / fast_deliveryAdded value: +{ + "default": false, + "description": "Only items with fast (Jet) delivery.", + "title": "Fast Delivery", + "type": "boolean" +} - added
Input schema / properties / ready_to_shipAdded value: +{ + "default": false, + "description": "Only items already in Digikala's warehouse (ship sooner).", + "title": "Ready To Ship", + "type": "boolean" +} - added
Input schema / properties / seller_typeAdded 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" +}
- Added
dk_filters - Changed
dk_search5 fields changed- added
Input schema / properties / attributesAdded 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" +} - added
Input schema / properties / colorsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "integer" + }, + "maxItems": 10, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Color ids from dk_filters, e.g. [1].", + "title": "Colors" +} - added
Input schema / properties / fast_deliveryAdded value: +{ + "default": false, + "description": "Only items with fast (Jet) delivery.", + "title": "Fast Delivery", + "type": "boolean" +} - added
Input schema / properties / ready_to_shipAdded value: +{ + "default": false, + "description": "Only items already in Digikala's warehouse (ship sooner).", + "title": "Ready To Ship", + "type": "boolean" +} - added
Input schema / properties / seller_typeAdded 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" +}
- Added
dk_shortlist
20 tool updates
v0.1.0- First observed
dk_best_sellers - First observed
dk_brand_products - First observed
dk_categories - First observed
dk_category_products - First observed
dk_compare - First observed
dk_deals - First observed
dk_find_cheapest - First observed
dk_fresh_search - First observed
dk_gold_prices - First observed
dk_installments - First observed
dk_location - First observed
dk_plus_plans - First observed
dk_price_history - First observed
dk_product - First observed
dk_questions - First observed
dk_reviews - First observed
dk_search - First observed
dk_seller - First observed
dk_similar - First observed
dk_suggest
TDQS
Scored across 23 tools
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.
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.
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.
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
Related MCP Connectors
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
The E-commerce Marketplace For Every AI Agent. A Governed Catalog Of 600M+ US Products, Plus Four Agent Ready Capabilities Search, Price Comparison, Product-Vs-Product, And Detailed Q&A.
Agent-native product catalog: 300M+ products, 150,000+ stores, deliver_to ranking.
AI marketplace: search, buy, sell across Amazon, eBay, AliExpress. 13 tools.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables 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.55-
- AlicenseNot gradedqualityBmaintenanceEnables LLMs to search products, fetch detailed specifications, and browse categories from SnappShop in real-time.MIT
- AlicenseAqualityAmaintenanceEnables 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.14428 PyPI2MIT
- AlicenseAqualityAmaintenanceEnables 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.261MIT