masterkala-mcp
This is an unofficial read-only MCP server for shopping research on MasterKala, an Iranian gadget and mobile-accessories shop, with prices in Toman and Persian/English queries.
Search products by keyword and find the cheapest in-stock match, filtering out cases/covers by default.
Browse categories, brands, tags, price ranges, filters, and current deals/discounts.
Get product details: price/discount, stock, colors, brand/category, rating, specs/comparison, reviews, and which physical branches stock it.
Check delivery estimates and shipping fees for Tehran and other cities by post.
List MasterKala physical branches in Tehran.
Read blog buying guides/comparisons and reader questions with store replies.
It cannot log in, use a cart, place orders, make payments, manage wishlists, or post reviews; it only helps find and compare items.
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., "@masterkala-mcpCheapest Xiaomi power bank I can order now, delivered to Tehran?"
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.
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.
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-mcporclaude 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 withmk_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_priceis what you pay), ratings 1-5 (null= no reviews). Numeric product ids pass between tools.Machine-readable:
server.jsonand 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-mcpSettings → 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-mcpOr 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 |
| Search by keyword: price, discount, stock, plus matching categories and tag pages |
| Cheapest in-stock matches for a keyword, one flat list sorted by payable price (accessories filtered out) |
| A category, brand or tag sorted by price / stock / date, with price range and filters |
| Brand, color and feature filter ids and the price range of a category, brand or tag |
| Product categories and their ids (about 100 main categories) |
| Brands and their slugs (about 135) |
| Everything on the discount page, biggest discount first, with the time left |
Tool | What it does |
| Price, discount, stock status and count, colors, brand, category, rating, shops that have it |
| Specification table of 1-4 products side by side |
| Customer reviews with star breakdown and the store's replies |
| Next delivery slot and fee for Tehran and other cities, same-day cut-off |
| MasterKala's physical shops in Tehran with address, phone and map location |
Tool | What it does |
| Buying guides, comparisons and how-tos, newest first |
| 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 pagesmasterkala-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_priceis what you pay,priceis before discount,discount_pctis 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_shippinggivesfree_shipping_from: nullfor them); below that, Tehran courier and post were 150,000 / 155,000 Toman on 2026-10-03. There is no address API, somk_shippingestimates for Tehran and "other cities by post".Stock:
in_stockmeans 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 frommk_search,mk_find_cheapestandmk_browse; 240 px frommk_deals; the original jpg frommk_specs).mk_productgives a 600 pximageplus animageslist (up to 4). Null/empty fields are omitted from results,stock_statusonly appears when it is not "موجود" (in stock), and review / comment text is cut to 400 characters (blog threads keep 3 replies,more_repliescounts the rest).Ratings are 1–5,
nullwhen 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_searchormk_find_cheapest; usemk_browsewith 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_PROXYif 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-mcpConfiguration
Variable | Default | Meaning |
| unset | Optional HTTP proxy URL for every request to masterkala.com, e.g. |
فارسی: سرور 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.
Related servers
iran-mcp: catalog of all Iranian-service MCP servers
Digikala MCP server for Iran's largest online store
Technolife MCP server for electronics prices, with installment prices
Torob MCP server for comparing prices across Iranian shops
Okala MCP server for online grocery shopping
Banimode MCP server for fashion
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
If this saves you clicks, a star helps others find it.
Available Tools
14 toolsmk_blog_commentsBlog post commentsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max comment threads to return, newest first. | |
| post_id | Yes | Blog post id from mk_blog_posts, e.g. 330. | |
| full_text | No | Return comment text uncut and all replies (default: 400 chars, 3 replies). |
TDQS
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.
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.
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.
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.
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.
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 guidesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 0, newest first. | |
| limit | No | Posts per page. | |
| category | No | Blog section, e.g. 'buying_guide' (راهنمای خرید) or 'comparison_review' (مقایسه و بررسی). | buying_guide |
TDQS
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.
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.
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.
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.
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.
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 branchesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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 brandsARead-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').
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional filter on the brand name, English only, e.g. 'xiaomi' or 'anker'. |
TDQS
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.
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.
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.
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.
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.
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 brandARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 0. | |
| sort | No | Order of the listing. In-stock items always come first. | cheapest |
| brand | No | Brand slug from mk_brands, e.g. 'mcdodo' or 'anker-fa'. | |
| limit | No | Products per page. | |
| tag_id | No | Tag id from a /tag/<id>/ link in mk_search pages, e.g. 22246. | |
| max_price | No | Maximum payable price (final_price) in Toman, e.g. 5000000. | |
| min_price | No | Minimum payable price (final_price) in Toman, e.g. 3000000. | |
| filter_ids | No | Filter ids from mk_filters: 'm30' brand, 'o78' color, '117' attribute. Example: ['m30', 'o52']. | |
| category_id | No | Category id from mk_categories or mk_search, e.g. 606 (Bluetooth earbuds). |
TDQS
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.
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.
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.
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.
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.
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 categoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional filter on the Persian name or English slug, e.g. 'شارژر' or 'charger'. |
TDQS
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.
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.
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.
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.
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.
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 dealsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max deals to return. |
TDQS
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.
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.
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.
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.
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.
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 brandARead-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).
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Brand slug from mk_brands, e.g. 'mcdodo' or 'anker-fa'. | |
| group | No | Return only this filter group, in full, e.g. 'رنگ' (color) or 'برند' (brand). | |
| tag_id | No | Tag id from a /tag/<id>/ link in mk_search pages, e.g. 22246. | |
| category_id | No | Category id from mk_categories or mk_search, e.g. 606 (Bluetooth earbuds). |
TDQS
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.
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.
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.
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.
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.
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 productARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| scan | No | Max search results to scan, 500 per request; stops early once the in-stock items end. | |
| limit | No | Max offers to return. | |
| query | Yes | Product name or keyword, Persian or English, e.g. 'هندزفری بلوتوث' or 'xiaomi'. | |
| match_all_words | No | Keep only titles that contain every word of the query. | |
| include_accessories | No | Also keep cases, covers, screen protectors and straps made for the product (dropped by default unless the query names them). |
TDQS
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.
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.
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.
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.
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.
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 detailsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| full_text | No | Return the description uncut (default cuts at 300 chars). | |
| product_id | Yes | MasterKala product id from mk_search / mk_browse, e.g. 24855. |
TDQS
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.
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.
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.
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.
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.
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 reviewsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max reviews to return, newest first. | |
| stars | No | Only reviews with this many stars (1-5); 0 = all. | |
| full_text | No | Return review and reply text uncut (default cuts at 400 chars). | |
| product_id | Yes | MasterKala product id from mk_search / mk_browse, e.g. 24855. |
TDQS
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.
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.
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.
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.
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.
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_searchSearch productsARead-only
Search MasterKala products by keyword: price, discount and stock of each match.
Use first for "price of X" / "do you have X". In-stock items come first. Also returns matching categories (ids for mk_browse) and brand/tag pages. Cheapest: mk_find_cheapest. One product: mk_product.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 0. | |
| limit | No | Products per page. | |
| query | Yes | Product name or keyword, Persian or English, e.g. 'هندزفری بلوتوث' or 'xiaomi'. | |
| in_stock_only | No | Drop items that cannot be bought online now. In-stock items come first, so an empty page means no more in-stock matches (total still counts all matches). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering the safety profile, the description adds genuine behavioral context beyond annotations: in-stock results are ordered first, and the response also contains matching categories (with ids for mk_browse) and brand/tag pages. It does not mention pagination limits or result-size constraints, so it stops short of full disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose then routing, with zero filler. Every clause carries information an agent needs for selection.
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, yet the description enumerates the return payload (price, discount, stock, categories, brand/tag pages) and the ordering rule, while parameters are fully covered by the schema. An agent has everything needed to call and interpret this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so query, page, limit and in_stock_only are all documented in the schema itself, including the empty-page semantics. The description only gestures at keyword search and stock ordering, adding no syntax or format detail beyond the structured fields; 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 ('Search MasterKala products by keyword') plus the payload returned (price, discount, stock per match), which is exactly what an agent needs to distinguish this from siblings like mk_browse or mk_product.
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 ('Use first for "price of X" / "do you have X"') and names both routing alternatives with their conditions: mk_find_cheapest for cheapest and mk_product for a single product. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mk_shippingDelivery date and feeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | MasterKala product id from mk_search / mk_browse, e.g. 24855. |
TDQS
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.
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.
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.
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.
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.
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 comparisonARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| product_ids | Yes | 1 to 4 product ids, e.g. [27144, 20850]. |
TDQS
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.
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.
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.
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.
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.
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.
14 tool updates
v0.3.0- Changed
mk_blog_comments5 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return comment text uncut and all replies (default: 400 chars, 3 replies).", + "type": "boolean" +} - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / post_id / titleRemoved value: -"Post Id" - removed
Input schema / titleRemoved value: -"mk_blog_commentsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_blog_commentsDictOutput", - "type": "object" -}New value: +null
- Changed
mk_blog_posts5 fields changed- removed
Input schema / properties / category / titleRemoved value: -"Category" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / titleRemoved value: -"mk_blog_postsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_blog_postsDictOutput", - "type": "object" -}New value: +null
- Changed
mk_branches2 fields changed- removed
Input schema / titleRemoved value: -"mk_branchesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_branchesDictOutput", - "type": "object" -}New value: +null
- Changed
mk_brands3 fields changed- removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"mk_brandsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_brandsDictOutput", - "type": "object" -}New value: +null
- Changed
mk_browse11 fields changed- removed
Input schema / properties / brand / titleRemoved value: -"Brand" - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - removed
Input schema / properties / filter_ids / titleRemoved value: -"Filter Ids" - 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 / page / titleRemoved value: -"Page" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / properties / tag_id / titleRemoved value: -"Tag Id" - removed
Input schema / titleRemoved value: -"mk_browseArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_browseDictOutput", - "type": "object" -}New value: +null
- Changed
mk_categories3 fields changed- removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"mk_categoriesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_categoriesDictOutput", - "type": "object" -}New value: +null
- Changed
mk_deals3 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"mk_dealsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_dealsDictOutput", - "type": "object" -}New value: +null
- Changed
mk_filters6 fields changed- removed
Input schema / properties / brand / titleRemoved value: -"Brand" - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - removed
Input schema / properties / group / titleRemoved value: -"Group" - removed
Input schema / properties / tag_id / titleRemoved value: -"Tag Id" - removed
Input schema / titleRemoved value: -"mk_filtersArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_filtersDictOutput", - "type": "object" -}New value: +null
- Changed
mk_find_cheapest7 fields changed- removed
Input schema / properties / include_accessories / titleRemoved value: -"Include Accessories" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / match_all_words / titleRemoved value: -"Match All Words" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / scan / titleRemoved value: -"Scan" - removed
Input schema / titleRemoved value: -"mk_find_cheapestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_find_cheapestDictOutput", - "type": "object" -}New value: +null
- Changed
mk_product4 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return the description uncut (default cuts at 300 chars).", + "type": "boolean" +} - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / titleRemoved value: -"mk_productArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_productDictOutput", - "type": "object" -}New value: +null
- Changed
mk_reviews6 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return review and reply text uncut (default cuts at 400 chars).", + "type": "boolean" +} - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / properties / stars / titleRemoved value: -"Stars" - removed
Input schema / titleRemoved value: -"mk_reviewsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_reviewsDictOutput", - "type": "object" -}New value: +null
- Changed
mk_search6 fields changed- removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"mk_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_searchDictOutput", - "type": "object" -}New value: +null
- Changed
mk_shipping3 fields changed- removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / titleRemoved value: -"mk_shippingArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_shippingDictOutput", - "type": "object" -}New value: +null
- Changed
mk_specs3 fields changed- removed
Input schema / properties / product_ids / titleRemoved value: -"Product Ids" - removed
Input schema / titleRemoved value: -"mk_specsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "mk_specsDictOutput", - "type": "object" -}New value: +null
14 tool updates
v0.1.0- First observed
mk_blog_comments - First observed
mk_blog_posts - First observed
mk_branches - First observed
mk_brands - First observed
mk_browse - First observed
mk_categories - First observed
mk_deals - First observed
mk_filters - First observed
mk_find_cheapest - First observed
mk_product - First observed
mk_reviews - First observed
mk_search - First observed
mk_shipping - First observed
mk_specs
TDQS
Scored across 14 tools
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.
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.
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.
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
Related MCP Connectors
Hosted MCP for e-commerce: live product catalog, stock, and pricing for AI agents.
MCP server of "Usilitel Signala" (usilitel-signala.ru), an online shop and installer of cellular signal boosters in Moscow and the Moscow region, Russia. It gives AI assistants live, read-only access to the catalog: repeaters, ready-made kits, boosters, antennas, coaxial cable and cable assemblies, 4G routers and accessories from VEGATEL, Baltic Signal, DalSvyaz and KROKS — more than 1,100 products. Features: • product search and comparison with live prices and stock (synced with the website every 5 minutes); • equipment picks for a site: area, mobile operator or frequency band, calls or internet; • texts of catalog sections, collections, installation services and blog articles; • recent catalog changes: new products, price and stock updates; • contacts, delivery, payment and returns; • a link to the order form on the website, pre-filled with the selection — the customer enters the phone number on the website; no personal data passes through the assistant. Read-only, no authentication required. Data language: Russian.
Merchant product catalogs for AI agents: price, availability, specs, variants, buy links. Read-only.
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
Related MCP Servers
- AlicenseCqualityCmaintenanceA Model Context Protocol server enabling product searches across e-commerce platforms, price history tracking, and product specification-based searches using natural language prompts.2123 PyPI19MIT
- AlicenseNot gradedqualityDmaintenanceA lightweight, stdio-based MCP server enabling AI assistants to perform local file system operations like reading, writing, searching, and executing commands.2,507 npmMIT
- AlicenseAqualityDmaintenanceA 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.4MIT
- AlicenseAqualityAmaintenanceMCP 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.922MIT