Skip to main content
Glama
sepehr071

masterkala-mcp

by sepehr071

masterkala-mcp: MasterKala MCP server for AI agents

Let your AI agent shop for gadgets on MasterKala (مسترکالا). An unofficial, read-only MCP server for MasterKala, the Iranian gadget and mobile accessories shop: search earbuds, chargers, power banks and smart watches, compare real prices and specs, read reviews, check stock and delivery dates, and catch today's discounts, all from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

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


For AI agents

  • What: unofficial MCP server (model context protocol) for MasterKala (masterkala.com, Iran), a gadget and mobile accessories shop that sells its own stock. Queries in Persian or English; prices in Toman.

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

  • Auth: none, no API key or account. Optional MASTERKALA_MCP_PROXY (HTTP proxy URL, or a comma-separated list, for requests to masterkala.com); system proxy settings are ignored.

  • Access: read-only. It cannot log in, use the cart, place orders or post reviews, so no confirmation is needed before calling any tool.

  • Tools: 14, all prefixed mk_. Start with mk_find_cheapest, mk_search, mk_deals, mk_browse. Typical sequence: mk_find_cheapest -> mk_product -> mk_shipping.

  • Use when: the user wants the cheapest orderable item, a spec or price comparison, reviews, stock, a delivery estimate, current discounts or a MasterKala buying guide.

  • Do not use when: the user wants to buy (the agent finds the item, the user orders on masterkala.com), needs another shop, or needs delivery to a specific address: delivery is an estimate for Tehran and "other cities by post", based on a default Tehran address.

  • Output: compact JSON. Prices in Toman (final_price is what you pay), ratings 1-5 (null = no reviews). Numeric product ids pass between tools.

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

Related MCP server: local-mcp

Why

MasterKala lists thousands of accessories, and a search for "power bank" mixes real power banks with silicone covers, out-of-stock items and things sold only in its shops. Finding the cheapest one you can actually order, and what it costs delivered, means paging through results and opening product pages. An agent with masterkala-mcp does that in seconds:

You: Cheapest Xiaomi power bank I can order now, delivered in Tehran?

Agent: calls mk_find_cheapest(query="پاوربانک شیائومی") → mk_shipping(product_id=26935)

Total

Product

Price

Shipping

4,338,000

پاوربانک 10000 شیائومی گلوریمی Glorimi LightCore 22.5W

4,188,000 (5% off)

150,000, Saturday 15:00-18:00

5,291,000

پاوربانک فوق نازک مگنتی 5000 Glorimi FitCore Mag 20W

5,291,000 (4% off)

free (over 5M)

5,401,000

پاوربانک 20000 شیائومی گلوریمی Glorimi LightCore 22.5W

5,401,000 (6% off)

free (over 5M)

The 10,000 mAh LightCore is cheapest even with the 150,000 courier fee. The 20,000 mAh LightCore ships free and costs 1,063,000 more for twice the capacity. Want me to compare their specs with mk_specs?

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

What it can do

  • Search products by name in Persian or English, with price, discount and stock

  • Find the cheapest in-stock match, with cases and covers filtered out

  • Browse any category, brand or tag sorted by price, stock or date, with price range and brand/color filters

  • Read full product details: colors, stock count, specs, side-by-side comparison, reviews

  • Check delivery: next Tehran courier slot, post to other cities, shipping fee, same-day cut-off

  • Catch deals on the discount page, plus buying guides and readers' questions from the MasterKala blog

  • Find a shop: the physical MasterKala branches in Tehran with address, phone and map location

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

Example prompts:

  • "Cheapest Bluetooth earbuds between 3 and 5 million Toman, and which one has the best reviews?"

  • "Compare the specs of the Green Lion Ocean and the Awei T66."

  • "Is the blue CMF Buds Pro 2 in stock? When would it reach Tehran?"

  • "What are today's biggest discounts on smart watches?"

  • "Where are MasterKala's physical shops in Tehran?"

  • بهترین تخفیف‌های امروز مسترکالا روی پاوربانک چیه؟

  • ارزان‌ترین هندزفری بلوتوث موجود را پیدا کن و بگو کی به تهران می‌رسد.

  • مشخصات دو ساعت هوشمند را کنار هم مقایسه کن و نظر خریداران را بگو.

Quick start

You need uv. No API key or account.

claude mcp add masterkala -- uvx masterkala-mcp

Settings → Developer → Edit Config, then add:

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

Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).

Click Install in VS Code above, or add to .vscode/mcp.json:

{
  "servers": {
    "masterkala": { "type": "stdio", "command": "uvx", "args": ["masterkala-mcp"] }
  }
}
codex mcp add masterkala -- uvx masterkala-mcp

Or in ~/.codex/config.toml:

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

Add to ~/.gemini/settings.json:

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

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

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

Tools

All tools are prefixed mk_. Product ids are numbers like 24855; category ids come from mk_categories, brand slugs from mk_brands.

Tool

What it does

mk_search

Search by keyword: price, discount, stock, plus matching categories and tag pages

mk_find_cheapest

Cheapest in-stock matches for a keyword, one flat list sorted by payable price (accessories filtered out)

mk_browse

A category, brand or tag sorted by price / stock / date, with price range and filters

mk_filters

Brand, color and feature filter ids and the price range of a category, brand or tag

mk_categories

Product categories and their ids (about 100 main categories)

mk_brands

Brands and their slugs (about 135)

mk_deals

Everything on the discount page, biggest discount first, with the time left

Tool

What it does

mk_product

Price, discount, stock status and count, colors, brand, category, rating, shops that have it

mk_specs

Specification table of 1-4 products side by side

mk_reviews

Customer reviews with star breakdown and the store's replies

mk_shipping

Next delivery slot and fee for Tehran and other cities, same-day cut-off

mk_branches

MasterKala's physical shops in Tehran with address, phone and map location

Tool

What it does

mk_blog_posts

Buying guides, comparisons and how-tos, newest first

mk_blog_comments

Readers' questions on a post with the store writer's answers

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

How it works

  AI agent  (Claude, Cursor, Copilot, ...)
      │
      │  MCP over stdio
      ▼
  masterkala-mcp  (runs on your machine)
      │
      │  HTTPS
      └──────▶  masterkala.com   JSON API, listing fragments, product pages

masterkala-mcp runs locally and calls the same public endpoints the masterkala.com website uses. There's no hosted server in between, no API key, and nothing about you is sent anywhere else. Requests go out through a Chrome-impersonating HTTP client, at most 2 at a time with a short random delay, and a dropped connection is retried up to twice. The category and brand lists are cached for an hour. Review, comment and description text is treated as untrusted site content and cut to a short length.

Good to know

  • Prices are in Toman. final_price is what you pay, price is before discount, discount_pct is a whole percent. The site's structured data is in Rial; the server converts it.

  • Shipping is free from 5,000,000 Toman per order for most items (bulky goods such as large speakers never ship free; mk_shipping gives free_shipping_from: null for them); below that, Tehran courier and post were 150,000 / 155,000 Toman on 2026-10-03. There is no address API, so mk_shipping estimates for Tehran and "other cities by post".

  • Stock: in_stock means orderable online now. Other statuses: ناموجود (sold out), به زودی (coming soon), موجود در شعب حضوری (only in the physical shops).

  • Images: every product has image, an absolute https URL (328 px webp from mk_search, mk_find_cheapest and mk_browse; 240 px from mk_deals; the original jpg from mk_specs). mk_product gives a 600 px image plus an images list (up to 4). Null/empty fields are omitted from results, stock_status only appears when it is not "موجود" (in stock), and review / comment text is cut to 400 characters (blog threads keep 3 replies, more_replies counts the rest).

  • Ratings are 1–5, null when nobody has reviewed the product yet.

  • Persian queries match best (هندزفری, پاوربانک), but English brand and model names work too (xiaomi, Buds Pro).

  • Keyword listings ignore sort. For a keyword use mk_search or mk_find_cheapest; use mk_browse with a category id, brand slug or tag id when you need sorting, a price range or filters.

  • Rate limits: the site's robots.txt disallows its API paths for crawlers, so keep request rates low (about one per second). The server already limits concurrency and adds a short delay.

  • What it does not do: no login, cart, orders, payment, wishlist or review posting; no other shops; no delivery to a specific address.

  • Proxy: set MASTERKALA_MCP_PROXY if you need one (see Configuration).

FAQ

Yes: masterkala-mcp is an unofficial MCP server with 14 read-only tools for search, prices, specs, reviews, delivery and deals. It calls the same public endpoints the masterkala.com website uses; no API key is needed.

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

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

No, and that's deliberate. It has no login and never touches the cart, order, payment, wishlist or review endpoints. The agent finds the best option; you buy it on masterkala.com.

It keeps only items you can order online now, whose title contains every word of your query, and drops cases, covers and screen protectors unless you ask for them (include_accessories: true, or a query like "کاور ..."). It scans the first 500 results by default (in-stock items come first); complete: false in the reply means more in-stock items lie past that, so raise scan (up to 1500). mk_search shows everything.

Toman. final_price is what the customer pays after discount. The site's structured data uses Rial, and the server converts it.

The server retries a dropped connection twice. If it still fails, check your internet connection. System proxy variables are ignored on purpose; set MASTERKALA_MCP_PROXY if you need a proxy. If the shop shows a bot-check page, install the browser extra (pip install "masterkala-mcp[browser]", then patchright install chromium) and the server clears it once.

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

npx @modelcontextprotocol/inspector uvx masterkala-mcp

Configuration

Variable

Default

Meaning

MASTERKALA_MCP_PROXY

unset

Optional HTTP proxy URL for every request to masterkala.com, e.g. http://user:pass@host:port; system proxy settings are ignored. A comma-separated list is used one at a time: the next proxy takes over when one is blocked or cannot connect

فارسی: سرور MCP مسترکالا

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

چه کارهایی می‌کند

  • جستجوی هندزفری، پاوربانک، شارژر، کابل، ساعت هوشمند و اسپیکر با قیمت، تخفیف و وضعیت موجودی.

  • پیدا کردن ارزان‌ترین کالای موجود برای یک عبارت، بدون کاور و قاب.

  • مرور دسته‌ها، برندها و برچسب‌ها با مرتب‌سازی و فیلتر قیمت، برند و رنگ.

  • مشخصات فنی، مقایسه تا ۴ کالا کنار هم، و نظرات خریداران با پاسخ فروشگاه.

  • زمان و هزینه ارسال به تهران و شهرهای دیگر (پست)، و شعب حضوری مسترکالا در تهران.

  • تخفیف‌های روز و مقاله‌های راهنمای خرید وبلاگ.

نکته‌ها

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

  • قیمت‌ها به تومان است و کاور و قاب را از نتایج «ارزان‌ترین» جدا می‌کند.

  • هزینه و زمان ارسال برآورد است، برای تهران و «سایر شهرها با پست»؛ آدرس دقیق پشتیبانی نمی‌شود.

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

  • اگر لازم بود، متغیر MASTERKALA_MCP_PROXY را روی یک پراکسی HTTP بگذارید.

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

claude mcp add masterkala -- uvx masterkala-mcp

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

نمونه پرسش‌ها

  • «ارزان‌ترین هندزفری بلوتوث بین ۳ تا ۵ میلیون تومان کدام است و کی به تهران می‌رسد؟»

  • «بهترین تخفیف‌های امروز مسترکالا روی پاوربانک چیه؟»

  • «ارزان‌ترین پاوربانک شیائومی موجود را پیدا کن.»

  • «مشخصات دو ساعت هوشمند را مقایسه کن.»

  • «شعب مسترکالا در تهران کجاست؟»

Development

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

Tools live in src/masterkala_mcp/catalog.py, product.py and blog.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 site changes.

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

Disclaimer

Unofficial and not affiliated with or endorsed by MasterKala. It is read-only and uses the public endpoints of the masterkala.com website, which can change without notice. Please keep request rates reasonable.

Author

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

License

MIT

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

Available Tools

14 tools
mk_blog_commentsBlog post commentsA
Read-only

Read the comments of a blog post as threads, with the store writer's answers as replies.

Useful as a support FAQ: many posts hold readers' product questions answered by MasterKala.

NameRequiredDescriptionDefault
limitNoMax comment threads to return, newest first.
post_idYesBlog post id from mk_blog_posts, e.g. 330.
full_textNoReturn comment text uncut and all replies (default: 400 chars, 3 replies).

TDQS

A3.8/5.0
Behavior3/5

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

readOnlyHint=true already establishes the safe-read profile, so the description only needs to add context. It contributes the thread/reply grouping model, but the truncation behavior (400 chars, 3 replies) and the full_text escape hatch live only in the schema. Modest value added beyond annotations.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core behavior front-loaded and the use-case context second. Every clause earns its place.

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

Completeness4/5

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

No output schema exists, but the description communicates the return shape (threads with replies) and the read-only nature is covered by annotations. An agent has enough to call it correctly; only the response envelope details remain unstated.

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

Parameters3/5

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

Schema description coverage is 100%, so limit, post_id and full_text are fully documented in-schema including the truncation defaults. The description adds no parameter syntax or format detail beyond that, making the baseline 3 correct.

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

Purpose4/5

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

States a specific verb and resource – reading a blog post's comments as threads with writer replies. Clearly separable from mk_blog_posts (which supplies the post_id) and from other mk_* tools. Lacks an explicit sibling comparison, but the resource distinction is unambiguous.

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

Usage Guidelines4/5

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

"Useful as a support FAQ: many posts hold readers' product questions answered by MasterKala" gives a concrete scenario for when an agent should reach for this tool. No exclusions or named alternatives are provided, so it falls short of a 5.

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

mk_blog_postsBlog posts and buying guidesA
Read-only

List MasterKala blog posts (buying guides, comparisons, how-tos), newest first, with links.

Use when the user asks which product type to choose or how to use a gadget: point them to the matching guide. Readers' questions answered by the store: mk_blog_comments.

NameRequiredDescriptionDefault
pageNoPage number, from 0, newest first.
limitNoPosts per page.
categoryNoBlog section, e.g. 'buying_guide' (راهنمای خرید) or 'comparison_review' (مقایسه و بررسی).buying_guide

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavior the annotations do not: newest-first ordering and that results carry links, which matters because there is no output schema. It does not disclose the notable default (category defaults to 'buying_guide', so results are filtered unless overridden) or any pagination/rate-limit behavior.

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

Conciseness5/5

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

Two tight sentences: the core listing behavior and ordering are front-loaded, followed by the usage/routing sentence. No filler or repetition of the name.

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

Completeness4/5

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

For a read-only, three-parameter list tool with no output schema, the description covers purpose, ordering and result shape ('with links') adequately. The only meaningful omission is the default category filter, which changes what an agent actually receives when it omits that parameter.

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

Parameters3/5

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

Schema description coverage is 100%, so page, limit and category are already documented in the schema, establishing the baseline of 3. The description's parenthetical content types loosely mirror several enum values but adds no syntax or defaulting detail, and it omits the consequential default of category='buying_guide'.

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

Purpose5/5

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

States a specific verb and resource ('List MasterKala blog posts'), the content types covered (buying guides, comparisons, how-tos), the ordering ('newest first') and the return shape ('with links'). It also distinguishes itself from the sibling mk_blog_comments, which handles a different content type.

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

Usage Guidelines4/5

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

Gives an explicit trigger ('Use when the user asks which product type to choose or how to use a gadget') and routes reader questions to the sibling mk_blog_comments. It stops short of excluding other plausibly competing siblings such as mk_reviews or mk_search for the same intent, so the routing 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.

mk_branchesPhysical branchesA
Read-only

List MasterKala's physical shops in Tehran with address, phone and map location.

Use when the user wants to buy in person. mk_product's branches says which shops have a given product; call the shop before going, they stock only part of the catalog.

NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuinely non-obvious operational context: shops stock only part of the catalog and the user should call before visiting, which meaningfully shapes how the agent presents results.

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

Conciseness5/5

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

Two compact sentences with no filler: the what/where/returns statement comes first, then the usage trigger and cross-reference. Every clause earns its place.

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

Completeness5/5

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

With no parameters and no output schema, the description still tells the agent what comes back (address, phone, map location) and the caveat about partial stock. Nothing needed to call or interpret this tool is absent.

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

Parameters4/5

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

The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline applies. No param-level detail is missing or misleading.

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

Purpose5/5

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

States a specific verb+resource ('List MasterKala's physical shops') and scopes it to Tehran while enumerating the returned fields (address, phone, map location). It also positions itself relative to mk_product, so an agent can distinguish it from sibling lookup tools without opening a schema.

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

Usage Guidelines4/5

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

Gives an explicit trigger ('Use when the user wants to buy in person') and points at the complementary tool for a different question (mk_product's `branches` for per-product availability). It stops short of naming when NOT to use this list, but the routing guidance is concrete.

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

mk_brandsList brandsA
Read-only

List the brands MasterKala sells with their slugs (about 135).

Use to get the brand slug for mk_browse / mk_filters ('anker-fa', 'mcdodo').

NameRequiredDescriptionDefault
queryNoOptional filter on the brand name, English only, e.g. 'xiaomi' or 'anker'.

TDQS

A4/5.0
Behavior3/5

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

readOnlyHint=true already covers the safety profile, so the description only needs to add context. It adds the result size (~135) and the value format (slugs), but says nothing about pagination, ordering, or what non-matching queries return.

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

Conciseness5/5

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

Two short sentences, zero filler, with the core purpose front-loaded and the consumption guidance second. Nothing could be removed without losing signal.

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

Completeness4/5

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

For a simple read-only listing with no output schema, the description supplies enough: what it returns, roughly how many, and the identifier format that downstream tools need. Return shape and pagination are left implicit, which is a minor gap given the tool's simplicity.

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

Parameters3/5

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

The single 'query' parameter already has a full schema description (100% coverage) covering its optionality, min length and English-only constraint. The description adds no further parameter detail, so the baseline 3 applies.

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

Purpose5/5

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

Specific verb+resource: 'List the brands MasterKala sells with their slugs', and it quantifies scope ('about 135') and gives concrete slug examples ('anker-fa', 'mcdodo'). This clearly separates it from siblings like mk_categories or mk_filters.

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

Usage Guidelines4/5

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

Explicitly states a use case and names the downstream siblings that consume its output ('Use to get the brand slug for mk_browse / mk_filters'). It does not state when not to use it or compare against other discovery tools, so it stops short of the top score.

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

mk_browseBrowse a category or brandA
Read-only

List the products of a category, brand or tag with sorting, price range and filters.

Use for "cheapest Bluetooth earbuds", "Xiaomi power banks between 1 and 2 million Toman". Pass exactly one of category_id / brand / tag_id (ids: mk_categories, mk_brands, mk_search; filter ids: mk_filters). No keyword or rating sort here: see mk_search / mk_reviews.

NameRequiredDescriptionDefault
pageNoPage number, from 0.
sortNoOrder of the listing. In-stock items always come first.cheapest
brandNoBrand slug from mk_brands, e.g. 'mcdodo' or 'anker-fa'.
limitNoProducts per page.
tag_idNoTag id from a /tag/<id>/ link in mk_search pages, e.g. 22246.
max_priceNoMaximum payable price (final_price) in Toman, e.g. 5000000.
min_priceNoMinimum payable price (final_price) in Toman, e.g. 3000000.
filter_idsNoFilter ids from mk_filters: 'm30' brand, 'o78' color, '117' attribute. Example: ['m30', 'o52'].
category_idNoCategory id from mk_categories or mk_search, e.g. 606 (Bluetooth earbuds).

TDQS

A4.6/5.0
Behavior4/5

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

readOnlyHint=true already establishes this as a safe read, so the bar is lower; the description still adds a real behavioral constraint the schema does not enforce — mutual exclusivity of category_id, brand and tag_id. It does not describe return shape or pagination semantics, which is the remaining gap.

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

Conciseness5/5

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

Four tight sentences: purpose and scope first, worked examples second, the exclusivity constraint and id sources third, exclusions last. No filler and the most decision-relevant content is front-loaded.

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

Completeness4/5

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

For a 9-parameter, zero-required, no-output-schema browse tool with only a readOnlyHint, the description covers selection rules, id provenance and alternatives to siblings. It omits result/pagination behavior, but with the schema carrying full parameter documentation the definition is largely sufficient to call it correctly.

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

Parameters4/5

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

Schema coverage is 100%, so baseline is 3, and the schema already documents every parameter with examples. The description goes slightly beyond by stating where each id family comes from (mk_categories, mk_brands, mk_search, mk_filters) and imposing the exactly-one-of relationship among the three selector parameters.

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

Purpose5/5

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

States a specific verb (List) and resource (products of a category, brand or tag) plus the facets it supports (sorting, price range, filters). It also explicitly separates itself from siblings by noting there is no keyword or rating sort here, pointing to mk_search / mk_reviews instead.

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

Usage Guidelines5/5

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

Gives concrete triggering queries ("cheapest Bluetooth earbuds", "Xiaomi power banks between 1 and 2 million Toman") and states the hard selection rule: pass exactly one of category_id / brand / tag_id. It names the alternatives for id lookups and for keyword/rating sorting, leaving nothing to inference.

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

mk_categoriesList categoriesA
Read-only

List MasterKala's product categories with their ids (about 100 main categories).

Use to get a category_id for mk_browse / mk_filters. mk_search also returns the categories matching a keyword.

NameRequiredDescriptionDefault
queryNoOptional filter on the Persian name or English slug, e.g. 'شارژر' or 'charger'.

TDQS

A4.2/5.0
Behavior3/5

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

The readOnlyHint=true annotation already establishes this as a safe read, so the bar is lower. The description adds useful context (the catalog size, the return of ids), but says nothing about ordering, pagination, or completeness beyond the ~100 figure.

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

Conciseness5/5

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

Two short sentences, zero filler, with the resource and the downstream use (category_id) front-loaded. Every clause earns its place.

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

Completeness4/5

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

For a simple read-only list tool with a fully documented single param and no output schema, this covers what an agent needs: what it returns (ids), how many, and why to call it. Only the optional query filter goes unmentioned in prose.

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

Parameters3/5

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

Schema description coverage is 100% and the single optional 'query' param is fully documented in the schema (Persian name / English slug, examples). The description does not mention the filter at all, so it adds nothing on this dimension; baseline 3 applies.

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

Purpose5/5

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

States a precise verb+resource ('List MasterKala's product categories with their ids') and adds scale ('about 100 main categories'). It also distinguishes itself from the sibling mk_search, which returns categories by keyword.

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

Usage Guidelines5/5

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

Explicitly says when to use it: to obtain a category_id for mk_browse / mk_filters. It also names the alternative (mk_search) and the condition that selects it, so the agent can route without opening other schemas.

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

mk_dealsCurrent dealsA
Read-only

List every product on MasterKala's discount page right now, biggest discount first.

Use for "what's on sale" / "best discounts today". ends_in_seconds is the time left in the current offer period. Discounts inside one keyword or category: mk_search / mk_browse.

NameRequiredDescriptionDefault
limitNoMax deals to return.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description adds the result ordering (biggest discount first) and explains that ends_in_seconds is the remaining time in the current offer period, which is real behavioral context with no output schema to carry it. It doesn't mention pagination or result-count behavior, so it stops short of full transparency.

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

Conciseness5/5

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

Three short sentences, front-loaded with the core action and ordering, then trigger phrases, then sibling routing. Every sentence carries information and there is no padding.

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

Completeness4/5

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

With no output schema, the description helpfully clarifies one return field (ends_in_seconds) and the sort order, which is enough for an agent to call and interpret results. Minor gaps remain around pagination or whether the list is capped beyond the limit parameter.

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

Parameters3/5

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

There is a single parameter (limit) whose schema coverage is 100%, so the schema already documents it fully. The description adds nothing about limit usage, which is the expected baseline for a fully-covered schema.

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

Purpose5/5

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

States a specific verb and resource (list products on the discount page), plus scope ('right now') and ordering ('biggest discount first'). It explicitly separates itself from mk_search/mk_browse for keyword- or category-scoped discounts, so an agent can distinguish it without opening any schema.

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

Usage Guidelines5/5

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

Gives direct trigger phrases ('what's on sale' / 'best discounts today') and names the alternative tools with the condition that selects them (discounts inside a keyword or category). It covers both when to use it and when to route elsewhere.

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

mk_filtersFilters of a category or brandA
Read-only

List the filters of a category, brand or tag page (brands, colors, attributes) with their ids, and its price range.

Use before mk_browse for a brand, color or feature filter: options map filter id -> name; pass the ids as filter_ids. Non-brand groups are cut to 40 options (omitted = the rest): pass group for all. max_price = most expensive item (Toman).

NameRequiredDescriptionDefault
brandNoBrand slug from mk_brands, e.g. 'mcdodo' or 'anker-fa'.
groupNoReturn only this filter group, in full, e.g. 'رنگ' (color) or 'برند' (brand).
tag_idNoTag id from a /tag/<id>/ link in mk_search pages, e.g. 22246.
category_idNoCategory id from mk_categories or mk_search, e.g. 606 (Bluetooth earbuds).

TDQS

A4.3/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safety profile, but the description adds real behavioral detail beyond it: non-brand groups are truncated to 40 options, `omitted` holds the remainder, and `group` returns the full set. It stops short of return format or any rate/ordering notes, so it is strong but not exhaustive.

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

Conciseness4/5

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

Three tight sentences, front-loaded with the core purpose and then the routing/workflow guidance. The back-half is somewhat dialect-specific and elliptical ('`omitted` = the rest', 'max_price = ... (Toman)'), but nothing is wasted.

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

Completeness4/5

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

For a read-only discovery tool with no output schema, the description adequately conveys what comes back (filter ids with names, price range) and the truncation caveat. An agent has enough to call it correctly and interpret the result, though exact response shape is only implied.

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

Parameters3/5

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

Schema description coverage is 100%, so each parameter is already documented in the schema; the baseline is 3. The description reinforces usage (max_price = most expensive item in Toman, `group` semantics, filter_ids linking) but does not add syntax or format detail the schema lacks.

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

Purpose5/5

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

States a specific verb ('List the filters') and resource ('of a category, brand or tag page') with concrete examples of what filters are returned (brands, colors, attributes) plus the price range. An agent can distinguish this from mk_categories, mk_brands, and mk_browse without opening any schema.

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

Usage Guidelines5/5

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

Explicitly names the downstream alternative and the condition: 'Use before mk_browse for a brand, color or feature filter.' It also explains the workflow contract ('options map filter id -> name; pass the ids as filter_ids') and the workaround for truncation ('pass `group` for all'), leaving little to inference.

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

mk_find_cheapestFind cheapest productA
Read-only

Find the cheapest in-stock products for a keyword, one flat list sorted by payable price.

Use when the user wants the lowest price for X: scans the results, keeps items buyable online now, sorts by final_price. free_shipping = basket reaches 5,000,000 Toman (bulky items never); exact fee and date: mk_shipping. complete=false: in-stock items go past scanned, raise scan.

NameRequiredDescriptionDefault
scanNoMax search results to scan, 500 per request; stops early once the in-stock items end.
limitNoMax offers to return.
queryYesProduct name or keyword, Persian or English, e.g. 'هندزفری بلوتوث' or 'xiaomi'.
match_all_wordsNoKeep only titles that contain every word of the query.
include_accessoriesNoAlso keep cases, covers, screen protectors and straps made for the product (dropped by default unless the query names them).

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description carries the rest: it discloses the free-shipping threshold (5,000,000 Toman), the bulky-item exception, and the early-stop/`complete=false` scanning behavior with a remedy ('raise scan'). That is meaningful behavioral context beyond the annotation, though return format details remain unstated.

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

Conciseness4/5

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

Front-loaded with the core purpose and usage in the first two lines, then dense terse fragments for edge rules. Efficient, though the telegraphic 'complete=false: ... raise scan' phrasing is slightly compressed at the cost of readability.

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

Completeness4/5

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

With no output schema, the description fortunately explains key return semantics (flat list, payable-price sort, complete flag, scanned boundary) and the shipping caveat. A short note on result fields or pagination would make it fully complete.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds real value by tying the `scan` parameter to output behavior ('in-stock items go past scanned, raise scan') and clarifying that free_shipping for bulky items behaves differently. It goes beyond restating the schema.

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

Purpose5/5

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

States a precise verb+resource+scope: cheapest in-stock products for a keyword, returned as one flat list sorted by payable price. This clearly distinguishes it from siblings like mk_search or mk_deals, which do not promise price-sorted stock filtering.

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

Usage Guidelines5/5

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

Explicitly states 'Use when the user wants the lowest price for X' and names an alternative destination for adjacent needs (exact fee and date -> mk_shipping). The agent can route correctly without opening any schema.

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

mk_productProduct detailsA
Read-only

Get one product's full record: price and discount (Toman), stock status and count, colors and which are buyable, brand, category path, rating, and the physical branches that have it.

Use after mk_search / mk_browse when the user picks a product. Specs table: mk_specs. Reviews: mk_reviews. Delivery date and fee: mk_shipping.

NameRequiredDescriptionDefault
full_textNoReturn the description uncut (default cuts at 300 chars).
product_idYesMasterKala product id from mk_search / mk_browse, e.g. 24855.

TDQS

A4.3/5.0
Behavior4/5

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

The annotations only provide readOnlyHint=true, so the description must carry most behavioral weight. It discloses the rich payload structure (price/discount in Toman, stock status/count, colors and buyable status, brand, category path, rating, physical branches) and the default truncation of product descriptions at 300 chars, but doesn't mention pagination, rate limits, or error conditions.

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

Conciseness4/5

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

Front-loaded with the core action and payload summary, then two efficient sentences for usage and cross-references. The 300-char truncation detail in the schema is complemented by 'Return the description uncut' in the description, keeping the body tight without redundancy.

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

Completeness4/5

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

For a read-only single-record fetch tool with two simple parameters and full schema coverage, the description covers purpose, usage routing, and returned data structure. It would benefit from a note on behavior when product_id is invalid, but overall it is sufficient.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents both parameters (product_id and full_text). The description adds no parameter-level details beyond the schema, which matches the baseline 3 for full coverage.

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

Purpose5/5

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

The description opens with a specific verb and resource ('Get one product's full record') and then enumerates the returned fields, leaving no ambiguity about what the tool does. This is clearly distinct from siblings like mk_search (search) and mk_specs (specifications).

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

Usage Guidelines5/5

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

The description explicitly states when to use it ('Use after mk_search / mk_browse when the user picks a product') and routes three related concerns to their proper tools (mk_specs, mk_reviews, mk_shipping). This is textbook usage guidance.

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

mk_reviewsProduct reviewsA
Read-only

Read customer reviews of a product (1-5 stars, newest first) with the store's replies and the star breakdown.

Use as a quality check before recommending a product. average and star_counts cover all reviews; count is the number matching stars.

NameRequiredDescriptionDefault
limitNoMax reviews to return, newest first.
starsNoOnly reviews with this many stars (1-5); 0 = all.
full_textNoReturn review and reply text uncut (default cuts at 400 chars).
product_idYesMasterKala product id from mk_search / mk_browse, e.g. 24855.

TDQS

A4.4/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safe-read profile, so the description builds on that by disclosing ordering (newest first), that replies are included, and that text is uncut by default. It also discloses non-obvious semantics: 'average and star_counts cover all reviews; count is the number matching stars' — a subtle aggregate-vs-filter distinction an agent would otherwise get wrong. Pagination and rate-limit behavior remain unstated.

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

Conciseness5/5

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

Two short sentences, front-loaded with the core capability and followed by a crisp behavioral footnote. No filler or redundant restatement of the schema.

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

Completeness4/5

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

With no output schema, the description carries the return-value burden and does reasonably well: it names the aggregate fields (average, star_counts, count), notes replies and the star breakdown, and clarifies their scope. The full response shape (field names/types beyond the three named) is still implicit, keeping it just short of complete.

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

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema cannot: the interaction between the stars filter and the aggregate fields (average/star_counts unfiltered vs count filtered). The 400-char default cut is repeated from the schema, but the aggregate semantics is genuine added value.

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

Purpose5/5

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

States a specific verb (read) and resource (customer reviews of a product) plus scope details: 1-5 stars, newest first, includes store replies and star breakdown. An agent can immediately distinguish this from siblings like mk_product, mk_specs, or mk_search without opening a schema.

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

Usage Guidelines4/5

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

Explicitly frames usage: 'Use as a quality check before recommending a product,' which gives the agent a clear decision context. It stops short of naming alternatives or when-not conditions (e.g., when mk_product's rating summary is enough), so it is clear context without exclusion guidance.

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

mk_shippingDelivery date and feeA
Read-only

Get the nearest delivery slot and shipping fee for one product: Tehran courier and post to other cities.

Use for "when will it arrive / how much is shipping". Fees are Toman, 0 = free; free above free_shipping_from (null = never free). same_day_seconds_left > 0: can still arrive today in Tehran. Estimates use a default Tehran address.

NameRequiredDescriptionDefault
product_idYesMasterKala product id from mk_search / mk_browse, e.g. 24855.

TDQS

A4.3/5.0
Behavior5/5

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

Annotations only supply readOnlyHint=true, but the description discloses real operational semantics: fees are Toman with 0 = free, the free_shipping_from threshold (null = never free), the same_day_seconds_left > 0 cutoff for same-day Tehran delivery, and that estimates assume a default Tehran address. These caveats materially affect how the agent should interpret and present results.

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

Conciseness4/5

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

Front-loaded with purpose, then usage trigger, then output semantics in compact form; every sentence carries information. The dense field-name shorthand (same_day_seconds_left, free_shipping_from) is slightly cryptic but defensible for an agent-facing spec.

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

Completeness4/5

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

With no output schema and only one parameter, the description compensates well by explaining the return values' meaning and the Tehran-default assumption. It leaves the shape of the 'delivery slot' itself and behavior on an invalid product_id unaddressed, so not fully complete.

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

Parameters3/5

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

Schema description coverage is 100% and the single parameter is documented ('MasterKala product id from mk_search / mk_browse, e.g. 24855'), so the schema does the heavy lifting. The description adds no syntax or format detail beyond it, making the baseline 3 appropriate.

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

Purpose5/5

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

Specific verb+resource: 'Get the nearest delivery slot and shipping fee for one product', with scope narrowed to Tehran courier vs. post elsewhere. No sibling tool covers shipping, so it is uniquely identifiable in the toolset.

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

Usage Guidelines4/5

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

Routes the agent by user intent: 'Use for "when will it arrive / how much is shipping"'. That is clear when-to-use guidance, though it names no alternatives or exclusions (none of the siblings overlap, so this is a minor gap).

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

mk_specsSpecs and comparisonA
Read-only

Get the specification table of 1-4 products side by side, with each product's stock count.

Use for "battery life / Bluetooth version of X" or to compare products row by row. Each spec row has one value per product id; a missing id means no value for that product. Ids that do not exist are listed in not_found.

NameRequiredDescriptionDefault
product_idsYes1 to 4 product ids, e.g. [27144, 20850].

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered; the description adds genuinely new behavioral detail: the 1-4 product cap, that a missing product id in a row means no value, and that nonexistent ids are surfaced in not_found. These edge-case and error-handling semantics are exactly the kind of context structured fields don't carry.

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

Conciseness5/5

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

The core capability is front-loaded in sentence one, followed by usage triggers and then response-shape caveats. No filler, no repetition of the schema, and every sentence adds information.

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

Completeness4/5

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

With no output schema, the description carries the burden of explaining the return shape, and it does: a spec table with per-product values and a not_found list. Minor gaps remain around value formatting/units and whether stock count is always present, but nothing needed to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 100% and the single parameter is fully documented, so baseline would be 3. The description earns the extra point by extending product_ids semantics into the response: one value per id, absent ids produce no value, invalid ids land in not_found.

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

Purpose5/5

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

States a specific verb (get) and resource (specification table) with explicit scope: 1-4 products side by side plus stock count. This cleanly distinguishes it from generic siblings like mk_product or mk_search, which would not return a comparative row-per-spec table.

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

Usage Guidelines4/5

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

Gives concrete triggering use cases ('battery life / Bluetooth version of X', row-by-row comparison), which is clear contextual guidance. It stops short of naming an alternative sibling (e.g., when to prefer mk_product for a single product), so it is not a full when/when-not treatment.

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

Tool Schema Changelog

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

  1. 14 tool updatesv0.3.0
    • Changedmk_blog_comments5 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return comment text uncut and all replies (default: 400 chars, 3 replies).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / post_id / title
        Removed value: -"Post Id"
      • removedInput schema / title
        Removed value: -"mk_blog_commentsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_blog_commentsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_blog_posts5 fields changed
      • removedInput schema / properties / category / title
        Removed value: -"Category"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / title
        Removed value: -"mk_blog_postsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_blog_postsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_branches2 fields changed
      • removedInput schema / title
        Removed value: -"mk_branchesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_branchesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_brands3 fields changed
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"mk_brandsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_brandsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_browse11 fields changed
      • removedInput schema / properties / brand / title
        Removed value: -"Brand"
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • removedInput schema / properties / filter_ids / title
        Removed value: -"Filter Ids"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / properties / tag_id / title
        Removed value: -"Tag Id"
      • removedInput schema / title
        Removed value: -"mk_browseArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_browseDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_categories3 fields changed
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"mk_categoriesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_categoriesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_deals3 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"mk_dealsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_dealsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_filters6 fields changed
      • removedInput schema / properties / brand / title
        Removed value: -"Brand"
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • removedInput schema / properties / group / title
        Removed value: -"Group"
      • removedInput schema / properties / tag_id / title
        Removed value: -"Tag Id"
      • removedInput schema / title
        Removed value: -"mk_filtersArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_filtersDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_find_cheapest7 fields changed
      • removedInput schema / properties / include_accessories / title
        Removed value: -"Include Accessories"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / match_all_words / title
        Removed value: -"Match All Words"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / scan / title
        Removed value: -"Scan"
      • removedInput schema / title
        Removed value: -"mk_find_cheapestArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_find_cheapestDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_product4 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return the description uncut (default cuts at 300 chars).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / title
        Removed value: -"mk_productArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_productDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_reviews6 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return review and reply text uncut (default cuts at 400 chars).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / properties / stars / title
        Removed value: -"Stars"
      • removedInput schema / title
        Removed value: -"mk_reviewsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_reviewsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_search6 fields changed
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"mk_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_shipping3 fields changed
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / title
        Removed value: -"mk_shippingArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_shippingDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmk_specs3 fields changed
      • removedInput schema / properties / product_ids / title
        Removed value: -"Product Ids"
      • removedInput schema / title
        Removed value: -"mk_specsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "mk_specsDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 14 tool updatesv0.1.0
    • First observedmk_blog_comments
    • First observedmk_blog_posts
    • First observedmk_branches
    • First observedmk_brands
    • First observedmk_browse
    • First observedmk_categories
    • First observedmk_deals
    • First observedmk_filters
    • First observedmk_find_cheapest
    • First observedmk_product
    • First observedmk_reviews
    • First observedmk_search
    • First observedmk_shipping
    • First observedmk_specs

TDQS

A4.2/5.0

Scored across 14 tools

Disambiguation4/5

The four product-listing tools (mk_search, mk_browse, mk_find_cheapest, mk_deals) all return product lists, which creates initial overlap, but their descriptions explicitly spell out the boundary (keyword vs category/brand/tag vs lowest-price scan vs discount page) and cross-reference each other. The remaining tools (product, specs, reviews, shipping, branches, categories, brands, filters, blog) are clearly distinct. Minor residual risk of confusing search/browse/cheapest, but descriptions resolve it.

Naming Consistency5/5

All 14 tools use a uniform mk_ prefix with lowercase snake_case naming. The set is largely resource-noun oriented (mk_product, mk_specs, mk_reviews, mk_branches) with a few action-oriented names (mk_search, mk_browse, mk_find_cheapest), but the format is fully consistent and predictable.

Tool Count5/5

14 tools is well within the healthy range and each tool maps to a genuinely distinct capability needed for store browsing. Nothing feels redundant or bolted on; the surface is scoped tightly to discovery, product detail and logistics.

Completeness4/5

Coverage is strong for an info/discovery store server: search, browse, categories, brands, filters, deals, full product records, specs, reviews, shipping and physical branches are all present, with blog/FAQ support as a bonus. The only notable gap is any cart/checkout or order-tracking flow, though that may simply be out of scope for this server.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A lightweight, stdio-based MCP server enabling AI assistants to perform local file system operations like reading, writing, searching, and executing commands.
    2,507 npm
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    A read-only MCP server that lets AI assistants answer Shopify store operations questions via tools like get_shop, list_products, get_product, and list_orders.
    4
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    MCP server for the Yandex KIT e-commerce API, built with the official Model Context Protocol SDK. It exposes 61 tools over stdio to manage catalog, orders, discounts, and webhooks.
    92
    2
    MIT