shopino-mcp
An unofficial, read-only MCP server for searching and comparing fashion products, shops and deals on Shopino.
Search all shops by keyword with price, discount, stock, size, city, category and shop filters.
Find the cheapest in-stock products for a keyword, optionally within a category or courier city.
Browse categories, shops, tags, curated listings and brands with sorting and price/size filters.
Get filter values such as size systems, sizes, sort orders, courier cities and sub-categories.
List the category tree with ids, paths and product/shop counts.
List featured official brand shops or the brands sold by a watch shop.
See today's flash sale, best sellers, campaigns and shop discount codes.
Open campaign/landing pages with product rows and tabs.
Get full product details: variants, per-size/color prices and stock, size guide, description, tags and shop trust signals.
Find visually similar products at other shops, cheapest first, or Shopino's related products.
Search the Shopino style blog and read individual posts as plain text.
Find shops by name, category group, gender or courier city with ratings, surveys and followers.
View a shop profile with ratings, buyer survey percentages, contacts, website and similar shops.
It cannot log in, manage a cart, place orders, apply discount codes, like/follow, or calculate shipping.
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., "@shopino-mcpCheapest linen manteau in stock in my size from a well-rated shop?"
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.
shopino-mcp: Shopino MCP server for AI agents
Let your AI agent shop for clothes, bags and shoes on Shopino (شاپینو). An unofficial, read-only MCP server for Shopino, the Iranian fashion marketplace that gathers the products of about 11,000 online and Instagram shops: search one catalog, compare real prices, check which size and color is in stock, judge the shop and catch today's flash sale, all from Claude, Cursor or Copilot.
For AI agents · Why · What it can do · Quick start · Tools · How it works · Good to know · FAQ · Configuration · فارسی · Development · Related
For AI agents
What: unofficial MCP server (model context protocol) for Shopino (shopino.app, شاپینو), an Iranian fashion marketplace that gathers products from thousands of online and Instagram shops. Queries work best in Persian; prices are in Toman.
Install:
uvx shopino-mcporclaude mcp add shopino -- uvx shopino-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
SHOPINO_MCP_PROXYsets an HTTP proxy (or a comma-separated list) for requests to shopino.app; system proxy settings are ignored.Access: read-only. No login, cart, orders or likes, so no write tools exist and no confirmation is needed before calling any tool.
Tools: 14, all prefixed
sh_. Start withsh_find_cheapest,sh_search,sh_product,sh_shoporsh_deals. Typical sequence:sh_find_cheapest->sh_product->sh_shop, thensh_similarto compare the same item at other shops.Use when: comparing clothing, bag and shoe prices, sizes and stock, judging a shop by its rating and buyer surveys, or checking the flash sale and discount codes.
Do not use when: the user wants to buy something (no cart or checkout), or needs a shipping fee (quoted per shop and address at checkout, which needs a login).
Output: compact JSON. Prices in Toman.
final_priceis what the buyer pays,priceis before discount,discount_pctis a whole percent,nullprice means no price shown (usually out of stock). Pass a product'sidfromsh_searchorsh_browseasproduct_idtosh_productandsh_similar, and itsshop_idtosh_shop. Page with the returnednext_cursor.Network: talks to
api-go.shopino.appandapi.shopino.appdirectly from your machine. If Shopino serves a bot-check page, see the FAQ.Machine-readable:
server.json, and the catalog of all Iranian MCP servers at iran-mcp (TOOLS.md, servers.json, llms.txt).
Related MCP server: torob-mcp
Why
Shopino puts the products of about 11,000 Iranian online and Instagram shops in one place. A search for
"linen manteau" mixes out-of-stock items, colors and sizes with their own stock, shops you've never heard of,
and discount codes hidden in small labels. Finding the cheapest one in your size from a shop you can trust
means a lot of clicking. An agent with shopino-mcp does that in seconds:
You: Cheapest linen manteau in stock right now, from a well-rated shop?
Agent: calls
sh_find_cheapest(query="مانتو کتان")→sh_shop(shop="489")
Price
Product
Shop
999,000 (56% off)
مانتو کتان ازالیا (1123)
وایت گالری پلاس (not rated yet)
999,000 (47% off)
مانتو کتان زنانه 442170
صنم گالری, 4.6, same-day courier in Tehran
1,100,000 (21% off)
6556-مانتو کتان قلبی
پاپیون لیدی, 4.9 from 3,507 buyer surveys, 92% satisfied
The two cheapest cost the same; Sanam Gallery is rated and delivers same-day in Tehran. Papion Lady costs 101,000 more but has the best buyer record. Want me to check which sizes are left with
sh_product?
Real tool output from 2026-10-06; prices change all the time. Prices are in Toman.
What it can do
Search every shop at once in Persian or English, with price, discount, stock and the selling shop
Find the cheapest in-stock match for a keyword, optionally in one category or with courier delivery in your city
Browse any category, shop, tag or curated listing sorted by price, date or biggest discount, with price range and size filters
Check sizes: every color and size of a product with its own price and units left, plus the shop's size guide
Judge the shop: rating, buyer surveys (satisfied, quality, price, on-time %), followers, contacts and website
Find the same item elsewhere by photo similarity, cheapest first
Catch deals: the flash sale with its end time, best sellers, campaigns and the shops' discount codes
Read style guides from the Shopino blog
Read-only by design: no login, no cart, no orders, no likes
Quick start
You need uv. No API key or account.
claude mcp add shopino -- uvx shopino-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"shopino": { "command": "uvx", "args": ["shopino-mcp"] }
}
}Click Install in Cursor above, or add the Claude Desktop block to ~/.cursor/mcp.json.
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"shopino": { "type": "stdio", "command": "uvx", "args": ["shopino-mcp"] }
}
}codex mcp add shopino -- uvx shopino-mcpOr in ~/.codex/config.toml:
[mcp_servers.shopino]
command = "uvx"
args = ["shopino-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"shopino": { "command": "uvx", "args": ["shopino-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It's a standard stdio MCP server: run uvx shopino-mcp, or pip install shopino-mcp and run shopino-mcp.
Then just ask:
"Cheapest women's manteau in size L under 2,000,000 Toman, from a shop with good reviews?"
"Is this product (2578018) cheaper at another shop?"
"What's in today's flash sale, and are there any discount codes?"
"Show the watch shops and the brands they sell, then list the cheapest watches in stock."
"Find me a well-rated shop for gold jewelry that delivers by courier in Tehran."
ارزان‌ترین کفش ورزشی سایز ۴۰ با ارسال پیک در تهران چند است؟
مانتو کتان زنانه زیر ۱ میلیون تومان از فروشگاه‌های خوش‌نام پیدا کن.
تخفیف شگفت‌انگیز امروز شاپینو چیست؟
Tools
Every list returns compact product cards (id, title, price, discount, stock, shop, a photo URL in image and the product url).
Tool | What it does |
| Search every shop by keyword: price, discount, stock, shop; filter by category, shop, size, price, city |
| Cheapest in-stock matches for a keyword, one flat list sorted by price to pay |
| A category, shop, tag or curated listing sorted by price / date / discount, with price range and size filters |
| Size systems and sizes, sort orders, courier cities and the sub-categories of a category |
| Category tree with ids and paths, plus total product and shop counts |
| Featured official brand shops, or the brands (with ids) a watch shop sells |
| Flash sale with end time, best sellers and themed rows, biggest discount first, campaigns and discount codes |
| A campaign page's product rows and tabs |
Tool | What it does |
| Every color / size with its own price and units in stock, size guide, description, shop trust signals, original link |
| Products that look like this one at other shops (cheapest first), or Shopino's related products |
Tool | What it does |
| Find shops by name, category group, gender or courier city, with rating, surveys and followers |
| A shop's rating, buyer survey, followers, main categories, contacts, website and similar shops |
Tool | What it does |
| Style guides and model galleries from the Shopino blog |
| One blog post as plain text |
All 14 tools are annotated readOnlyHint: true and return compact structured JSON, so they don't flood the agent's context.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
shopino-mcp (runs on your machine)
│
│ HTTPS
├──────▶ api-go.shopino.app search, products, shops, deals
└──────▶ api.shopino.app curated listings, similar shops, blogshopino-mcp runs locally and calls the same public endpoints the shopino.app website uses.
There's no hosted server in between, no API key, and nothing about you is sent anywhere else.
Requests go out with a browser-like TLS fingerprint, at most two at a time with a short random pause, and
the server retries a timeout, 429 or 5xx reply twice with backoff.
Good to know
Prices are in Toman.
final_priceis what you pay,priceis before discount,discount_pctis a whole percent.nullmeans the shop shows no price (usually out of stock). Shop ratings are 0-5,nullwhen not rated.Every product has an
image(absolute https URL of its first photo);sh_productalso gives up to 4 inimages.Sizes and colors can differ in price and stock. A product's
final_priceis its cheapest variant;sh_productlists each color / size with its own price andstock(units left).Each product is sold by one shop. Many can be bought in the Shopino cart;
shop_site_only/shopino_cart: falsemeans only on the shop's own site (original_url).Shipping is not public. It is quoted per shop and address at checkout (needs a login), so the order total is items + the shop's shipping − one discount code.
courier_citymeans same-day courier delivery in that city.Discount codes come from the shops' promotion labels (
promo, e.g. "1 میلیون تخفیف با کد: hana70"); one code per order, entered at checkout.Some "before" prices are inflated. A 90% discount can be real or a made-up list price; compare with
sh_similar.Flash-sale items sort and filter on their pre-sale price. Shopino ranks
flash_saleitems by their usual price, so in a "cheapest" list or a price range they can show up below the range or out of order (the site shows them the same way).Two shop ratings.
rating/surveyscome from Shopino's buyer surveys; the stars the site shows next to a shop arecustomer_rating(customer_rating_count) insh_product/sh_shop.There is no working color filter on Shopino (the site's own color filter returns nothing); put the color in the search words.
Paging uses a cursor.
sh_searchandsh_browsereturnnext_cursor; Shopino's ownpagenumbers drop the sort order, so this server does not send them.Persian queries match best (
مانتو کتان,کفش ورزشی مردانه).Brands exist only for watch shops;
sh_brandswithout a shop lists featured official brand shops.One card per product. Some shops list one card per color under the same id; the server merges them.
What it does not do: no login, cart, checkout, discount-code entry, gift cards, likes, notify-me, saved shops, returns, tickets or image-upload search. Shipping fees and the order total are not available.
Be gentle. Shopino's
robots.txtasks crawlers not to hit search pages hard; the server keeps two requests at a time with jitter, so keep agent loops modest.
FAQ
No, and that's deliberate. It has no login and never touches the cart, checkout, discount code, like, follow, board, review or ticket endpoints. The agent finds the best option; you buy it on shopino.app or the shop's own site.
Shopino doesn't publish an official API for agents. shopino-mcp is an unofficial MCP server that wraps the public
endpoints of shopino.app as 14 read-only tools, so any MCP client can search and compare products.
Install the server once (see Quick start), then ask in plain language, in Persian or English. In Claude Code
the install is claude mcp add shopino -- uvx shopino-mcp.
It is unofficial and free (MIT). It is read-only, needs no account or API key, and runs on your machine with no hosted server in between.
sh_search and sh_browse return a next_cursor. Pass it back as cursor with the same other arguments for the
next page. (Shopino's own page numbers drop the sort order, so this server pages with the API's cursor.)
It keeps only in-stock items with a price whose title or shop name contains every word of your query
(match_all_words: false turns that off). It scans up to 400 results, cheapest first; complete: false means more
matches lie past that, so raise scan (up to 1,000) or narrow with category_id.
Shops show a price of 0 for items that are out of stock, and the server turns that into null. Searches that need a
price, like sh_find_cheapest, skip those items.
The server retries a dropped connection or a 429/5xx reply twice with a short backoff. If it still fails, check your
internet connection. System proxy variables are ignored on purpose; set SHOPINO_MCP_PROXY if you need a proxy. If
Shopino serves a bot-check page, install the browser extra (pip install shopino-mcp[browser], then
patchright install chromium) so a headless browser can clear it.
Use the full path to uvx (where uvx on Windows, which uvx on macOS/Linux) as command.
npx @modelcontextprotocol/inspector uvx shopino-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
فارسی
سرور MCP شاپینو برای دستیار هوش مصنوعی
shopino-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای شاپینو است؛ بازار اینترنتی ایرانی پوشاک که محصولات حدود ۱۱ هزار فروشگاه اینترنتی و اینستاگرامی را یک‌جا جمع می‌کند. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در شاپینو جستجو کند، ارزان‌ترین محصول موجود را پیدا کند، موجودی هر رنگ و سایز را ببیند، امتیاز و نظرسنجی خریداران هر فروشگاه را بررسی کند و تخفیف‌های شگفت‌انگیز و کدهای تخفیف را پیدا کند.
چه کارهایی می‌کند
جستجو در همه فروشگاه‌ها به فارسی یا انگلیسی، با قیمت، تخفیف، موجودی و نام فروشگاه.
ارزان‌ترین محصول موجود برای یک کلیدواژه، در یک دسته یا با پیک در شهر شما.
مرور دسته‌ها، فروشگاه‌ها و برچسب‌ها بر اساس قیمت، تاریخ یا بیشترین تخفیف، با فیلتر بازه قیمت و سایز.
سایز و رنگ: قیمت و موجودی هر رنگ و سایز و راهنمای سایز فروشگاه.
ارزیابی فروشگاه: امتیاز، نظرسنجی خریداران (رضایت، کیفیت، قیمت، به‌موقع بودن)، دنبال‌کننده‌ها و راه‌های تماس.
همان کالا در فروشگاه‌های دیگر با شباهت تصویری، از ارزان به گران.
تخفیف‌ها: شگفت‌انگیز با زمان پایان، پرفروش‌ها، کمپین‌ها و کدهای تخفیف فروشگاه‌ها.
مقاله‌های وبلاگ شاپینو درباره استایل و ست لباس.
نکته‌ها
فقط خواندنی است: وارد حساب نمی‌شود، سبد خرید نمی‌سازد، سفارش ثبت نمی‌کند و چیزی را لایک نمی‌کند.
قیمت‌ها به تومان است.
هزینه ارسال عمومی نیست و فقط هنگام پرداخت (پس از ورود) محاسبه می‌شود.
روی سیستم خود شما اجرا می‌شود، کلید API لازم ندارد و به هیچ سرور واسطی داده نمی‌فرستد.
جستجوی فارسی بهترین نتیجه را می‌دهد.
کلیدواژه‌ها: شاپینو، shopino، سرور MCP شاپینو، خرید آنلاین لباس، مانتو، کیف و کفش، مقایسه قیمت، ارزان‌ترین قیمت، تخفیف شگفت‌انگیز، فروشگاه اینستاگرامی، پوشاک زنانه و مردانه، ساعت، طلا و جواهر.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add shopino -- uvx shopino-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
نمونه پرسش‌ها
«ارزان‌ترین مانتو کتان زنانه سایز L زیر ۲ میلیون تومان از یک فروشگاه خوش‌نام کدام است؟»
«کفش ورزشی مردانه سایز ۴۰ با پیک در تهران چند است؟»
«این محصول در فروشگاه دیگری ارزان‌تر هست؟»
«تخفیف شگفت‌انگیز امروز چیست و کد تخفیفی هست؟»
Development
git clone https://github.com/sepehr071/shopino-mcp && cd shopino-mcp
uv sync
uv run python -m pytest # offline, against recorded responses
uv run python -m pytest -m live # real shopino.app
uv run ruff check .Tools live in src/shopino_mcp/catalog.py, product.py, shop.py and info.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
Banimode MCP server for fashion and clothing
Khanoumi MCP server for cosmetics and skin care prices
Asal Banoo MCP server for skin care, hair care and make-up
Torob MCP server for price comparison across Iranian shops
Digikala MCP server for Iran's largest online store
iran-mcp: catalog of all Iranian-service MCP servers
Disclaimer
Unofficial and not affiliated with or endorsed by Shopino. It is read-only and uses the public endpoints of the shopino.app 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 toolssh_blog_postRead a blog postARead-onlyIdempotent
Read one blog post as plain text, with its category id for sh_browse (after sh_blog_search).
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Post slug from sh_blog_search, e.g. 'مدل-مانتو-شب'. | |
| max_chars | No | Cut text after this many characters; up to 20000 for long posts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, so the safety profile is fully covered without the description. The description adds modest value by noting the return is plain text and includes a category id, but says nothing about truncation behavior, pagination, or failure modes for a bad slug.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is arguably too terse in its phrasing ('with its category id for sh_browse'), but every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does the minimum job of indicating the return shape (plain text plus category id), and annotations cover safety. The only real gap is truncation/format detail, which the max_chars schema description largely covers.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both slug and max_chars are already documented in the schema with format, range, and default. The description adds no parameter-level meaning beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read one blog post') plus the output form ('as plain text') and an extra artifact ('its category id'), which clearly separates it from sh_blog_search and sh_browse. The parenthetical workflow note is slightly compressed but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The 'after sh_blog_search' clause tells the agent this is a second-step tool fed by a search result, and naming sh_browse signals where the returned category id is consumed. It gives clear sequencing context but no explicit when-not-to-use or error/fallback guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_blog_searchSearch the style blogARead-onlyIdempotent
Search the style blog (guides and model galleries), newest first; no query = latest posts.
Use for what is in fashion or which model to choose; read a post with sh_blog_post(slug), then sh_search.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (3 posts per page). | |
| query | No | Topic, Persian, e.g. 'مدل مانتو'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds genuinely new behavior: results are ordered newest-first and omitting the query returns the latest posts. It does not cover result shape or result-count limits, but the ordering/default semantics are meaningful additions.
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 primary purpose and ordering front-loaded before the workflow routing. The trailing 'then sh_search' is slightly terse and its sequencing is a bit compressed, costing a point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, read-only search with no output schema, the description covers purpose, default behavior, ordering, and the follow-up workflow. Nothing essential to correct invocation is missing, though the relationship between the blog search and the generic sh_search could be spelled out more fully.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (page, query) are already documented, including the 3-per-page size and the Persian-language query example. The description only restates the null-query default ('no query = latest posts'), which the schema already declares as default null; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search the style blog'), scopes it ('guides and model galleries', 'newest first'), and differentiates it from the sibling sh_blog_post, which it names explicitly. An agent can distinguish it from sh_search and sh_blog_post without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete use cases ('what is in fashion or which model to choose') and routes the agent to the correct sibling for the follow-up step ('read a post with sh_blog_post(slug)'), plus names sh_search as the next stage. The when-to-use condition is explicit rather than inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_brandsBrandsARead-onlyIdempotent
Without shop_id: featured official brand shops (browse one with sh_browse(shop_id=...)). With shop_id: the brands that shop sells, with ids for the brand_id filter of sh_browse (watch shops only).
| Name | Required | Description | Default |
|---|---|---|---|
| shop_id | No | Watch shop id, e.g. 1771: lists its brands with brand ids. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds genuine context beyond that: the returned data feeds sh_browse's brand_id filter, and the shop_id variant only works for watch shops, which is a real behavioral constraint.
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 a parallel 'Without shop_id: ... With shop_id: ...' structure that is front-loaded and wastes no words. Both sentences earn their place by describing distinct result modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter read tool with no output schema, the description covers both invocation modes, the output content (brand shops vs. brand ids), and the downstream use of those ids. Minor gaps like pagination or result ordering are not addressed but are not critical.
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 there is only one optional parameter, so the schema already documents shop_id. The description still adds meaning by contrasting the no-shop_id and with-shop_id result sets and noting the id output is intended for the brand_id filter, beyond the schema's 'Watch shop id, e.g. 1771'.
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 specifies the resource (brands) and gives distinct semantics for each mode: featured official brand shops without shop_id, and the brands a given shop sells with shop_id. It is clear about what is returned in both branches, though the verb 'lists/returns' is implicit rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It routes the agent explicitly: browse a featured brand shop via sh_browse(shop_id=...), and use the returned ids as the brand_id filter for sh_browse. It does not cover when to prefer this over sh_shops or sh_categories, so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_browseBrowse a category, shop, tag or listingARead-onlyIdempotent
List products of a category, shop, tag or curated listing, with sort, price range and filters.
Use for "cheapest manteau in size L under 2,000,000 Toman", "newest of shop X", "biggest discounts in bags" (discounted_only + biggest_discount). With no category / shop / tag / listing it browses all shops. Ids: sh_categories, sh_shops, sh_brands; sizes: sh_filters. Next page: pass next_cursor back as cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Tag slug from sh_product `tags`, e.g. 'مانتو-بلند-مشکی-زنانه'. Only sort, in_stock_only, discounted_only apply. | |
| city | No | Same-day courier city, e.g. 'تهران' (sh_filters). | |
| sort | No | Order; cheapest / most_expensive use the price to pay. | relevance |
| limit | No | Products per page (a tag gives 16). | |
| sizes | No | Sizes in size_system (any of them), e.g. ['M', 'L']. | |
| cursor | No | next_cursor of the previous reply (keep the other arguments the same). | |
| listing | No | Listing slug from sh_campaign tabs, e.g. 'پیراهن-مردانه'. Only sort, in_stock_only, discounted_only apply. | |
| shop_id | No | One shop's id (sh_shops), e.g. 489. | |
| brand_id | No | Watch brand id from sh_brands(shop_id=...), e.g. 12. | |
| max_price | No | Maximum price to pay in Toman, e.g. 2000000. | |
| min_price | No | Minimum price to pay in Toman, e.g. 500000. | |
| category_id | No | Category id from sh_categories, e.g. 385; includes sub-categories. | |
| size_system | No | Size system for `sizes` (values: sh_filters); freesize = only free-size items. | |
| in_stock_only | No | Only products in stock now. | |
| discounted_only | No | Only discounted products. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, non-destructive, open-world behavior, so the bar is lower. The description adds genuinely useful operational detail the annotations lack: pagination via next_cursor passed back as cursor with the other arguments unchanged, and the fallback behavior when no scope filter is given.
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 paragraphs with purpose first, then intent examples, then id sources and pagination. Every sentence carries information; the illustrative examples in quotes are dense but each maps to a distinct parameter pattern, so there is little waste.
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 15-parameter, zero-required browsing tool with no output schema, the definition covers scope, defaults, id provenance, and paging. Minor gaps remain around what a product entry contains and how multiple filters combine (e.g. brand_id plus category_id), which the agent must infer from the schema alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds value beyond it by cross-referencing where each id comes from (sh_categories, sh_shops, sh_brands, sh_filters) and by showing how free-text intents map onto sort/filter combinations. It stops short of explaining interactions among the 15 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 and resource with the exact scope: listing products of a category, shop, tag or curated listing. The explicit inventory of what can be browsed, plus the note that omitting all of them browses all shops, cleanly separates it from siblings like sh_search and sh_deals.
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?
Maps concrete user intents to parameter combinations ("cheapest manteau in size L under 2,000,000 Toman", "biggest discounts in bags" -> discounted_only + biggest_discount), and points to sh_categories/sh_shops/sh_brands/sh_filters for obtaining ids. It never explicitly contrasts sh_browse with sh_search or sh_find_cheapest, so the when-not 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.
sh_campaignCampaign pageARead-onlyIdempotent
Open a campaign or landing page: its product rows (with prices) and tabs.
A tab's source: listing -> sh_browse(listing=...), shop_id / category_id -> sh_browse(same), flash_sale -> sh_deals.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Slug from sh_deals campaigns, e.g. 'sale07', or 'clothing', 'bag', 'shoes', 'sports'. | |
| per_row | No | Products per row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so safety is covered. The description adds genuinely non-structured behavior: the page contains product rows with prices plus tabs, and tabs are not resolved inline but must be fetched via sh_browse or sh_deals. Pagination and the exact row/tab response shape remain undisclosed.
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 primary action and output, then the routing table for tab sources. No filler, though the backtick/arrow notation is terse enough to require a second read.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter read tool with full schema coverage and no output schema, the description supplies the essentials: what the page yields, how tabs resolve, and which sibling tools continue the flow. It omits pagination and whether per_row changes the returned structure, which are minor gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both `slug` and `per_row` are already documented in the schema, including the slug pattern, defaults and bounds. The description's mention of 'campaign or landing page' only loosely corroborates the slug semantics and adds no format or constraint detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('open') and resource ('campaign or landing page') and enumerates the returned content (product rows with prices, tabs). It also distinguishes itself implicitly by routing tab sources to sh_browse and sh_deals, though the boundary versus sh_shop is not drawn explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives conditional routing: a tab whose source is `listing`, `shop_id` or `category_id` goes to sh_browse, and `flash_sale` goes to sh_deals. That is clear follow-up guidance, but there is no explicit statement of when to call sh_campaign instead of sh_shop or sh_search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_categoriesList categoriesARead-onlyIdempotent
List the category tree with ids, URL paths and levels, plus total product and shop counts.
Use to get a category_id for sh_search / sh_browse / sh_find_cheapest. Without a query only levels up to max_level are listed; with a query every level is searched.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Filter on Persian name or English slug path, any level, e.g. 'مانتو' or 'sneakers'. | |
| max_level | No | Deepest level without a query (1 = the 14 top categories). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: that a query switches the tool from a depth-limited listing to a full-depth search, and that counts are aggregates. Pagination and result-size limits are not mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the output contents front-loaded, followed by the downstream use and the query/max_level behavior. No filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries responsibility for return values and does describe them (ids, paths, levels, product/shop counts). The parameter interaction is covered too. It stops short of describing ordering, size, or pagination of the returned tree.
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 does not: the interaction between the two parameters (max_level applies only when query is absent; a query searches every level). That is genuine semantic value above the per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list the category tree) and enumerates the returned fields (ids, URL paths, levels, product/shop counts), which distinguishes it cleanly from siblings like sh_brands and sh_shops. An agent knows exactly what this tool produces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: use it to obtain a category_id for sh_search / sh_browse / sh_find_cheapest, and explains the two operating modes (no query = levels up to max_level, query = all levels searched). No explicit when-not-to-use case is given, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_dealsDeals, flash sale and campaignsARead-onlyIdempotent
List today's home-page deals (flash sale with end time, best sellers, themed rows), biggest discount first, plus running campaigns and shop discount codes.
Use for "what's on sale". Open a campaign: sh_campaign(slug); a category's discounts: sh_browse(discounted_only=true, sort='biggest_discount').
| 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 already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description nonetheless adds useful behavior: results are ordered biggest-discount-first, include flash sales with end times, best sellers, themed rows, campaigns and discount codes. It stops short of disclosing freshness semantics (how 'today' is computed) or any 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?
Front-loaded with the core resource and scope, followed by ordering, a usage trigger, and two pointer sentences. No filler; every clause carries information the agent needs.
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 compensates by enumerating what comes back (flash sale with end time, best sellers, themed rows, campaigns, shop discount codes) and the sort order. Combined with annotations covering safety, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single 'limit' parameter with a clear default and range, so the schema does the heavy lifting. The description adds no extra meaning about limit (e.g. how it distributes across deal types), which is the expected baseline when coverage is complete.
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 ('today's home-page deals... plus running campaigns and shop discount codes'), and names the scoping distinctions that separate it from siblings. An agent can tell it apart from sh_browse and sh_campaign 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 says 'Use for "what's on sale"' and routes two adjacent cases to alternatives: sh_campaign(slug) for opening a campaign and sh_browse(discounted_only=true, sort='biggest_discount') for category discounts. When-to-use and when-to-use-something-else are both stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_filtersFilters for listingsARead-onlyIdempotent
List the filter values sh_search / sh_browse accept: size systems and sizes, sorts, courier cities, and (with category_id) a category's sub-categories.
Use before filtering by size or city. Price range is free (Toman); brand ids: sh_brands. No color filter works.
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | No | Category id (sh_categories): adds its sub-categories. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely new behavioral detail beyond them: price ranges are raw Toman with no server-side range enforcement, brand filtering must be resolved through sh_brands, and color filtering is unsupported. It does not describe the shape of the returned filter lists, which is the main 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?
Purpose and scope are front-loaded in the first sentence, and the follow-up sentence packs prerequisites and caveats into one line. The trailing fragment ("No color filter works") is slightly clipped in tone but carries real information, so nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a one-parameter schema, no output schema, and read-only annotations, the description is nearly sufficient: it enumerates the filter domains an agent will receive and explains the category_id branch. It stops short of describing how the values are structured (list of ids vs. labels) or that size/sort tokens must be passed verbatim to sh_search.
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% for the single category_id parameter, and the description's "with category_id, a category's sub-categories" essentially restates the schema text. It does imply the contrast case (omitting it yields global filter values), but that is inference rather than added specification, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a concrete verb ("List") on a concrete resource ("the filter values sh_search / sh_browse accept") and enumerates the return categories: size systems/sizes, sorts, courier cities, and category sub-categories. By naming sh_search and sh_browse as the consumers, it is immediately distinguishable from siblings like sh_categories or sh_brands.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states the triggering condition ("Use before filtering by size or city"), points to the alternative tool for a related need ("brand ids: sh_brands"), and closes off a dead end ("No color filter works"). That covers when to call it, what to call instead for adjacent data, and an explicit non-capability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_find_cheapestFind cheapest productARead-onlyIdempotent
Find the cheapest in-stock products for a keyword across all shops, one flat list sorted by price to pay.
Use for the lowest price of X. Drops loose matches (match_all_words) and unpriced items. Price is the
cheapest variant: check size / color with sh_product. complete=false: more matches past scanned, raise scan.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Same-day courier city, e.g. 'تهران' (sh_filters). | |
| scan | No | Max results to scan, cheapest first. | |
| limit | No | Max offers to return. | |
| query | Yes | Keyword, Persian works best, e.g. 'مانتو کتان'. | |
| category_id | No | Category id from sh_categories, e.g. 385; includes sub-categories. | |
| match_all_words | No | Keep only products whose title or shop name has every query word. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive). Beyond that the description discloses real behavior: it drops loose matches via match_all_words, drops unpriced items, reports the cheapest variant price, and explains the complete=false/scanned/scan pagination loop. Return format isn't described, but the operational traits are well surfaced.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose, then layers triggers, caveats, and pagination hints in compact prose. Dense but every clause carries information; minor terseness ('price to pay') doesn't hurt readability enough to drop below 4.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-param read tool with full schema coverage and safety annotations already handled, the description covers filtering behavior, the key cross-reference (sh_product for variants), and partial-result handling via complete/scan. No output schema, but the flat sorted list is implied, so remaining gaps are minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 100% schema coverage the baseline is 3, but the description adds genuine meaning: it explains that match_all_words filters loose matches and unpriced items are excluded, and that 'scan' governs how far past the results pagination goes. This clarifies the intent behind scan/limit beyond the terse schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Find the cheapest in-stock products for a keyword across all shops') and adds the differentiator of a single price-sorted list. It doesn't explicitly name the sibling it is not (unlike a 'use X instead' pattern), but the scope is unambiguous enough to distinguish it from sh_search or sh_browse.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for the lowest price of X' gives a clear positive trigger, and it routes the user to sh_product for size/color variant checks. It stops short of explicit when-not-to-use or naming alternative siblings for broader searches, so it's clear context rather than a full routing guide.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_productProduct detailsARead-onlyIdempotent
Get one product's full record: price, every color / size variant with its own price and stock, size guide, description, tags, the selling shop with trust signals, and the shop-site link.
Use when the user picks a product, to check their size / color is in stock and the shop is trustworthy. Same item elsewhere: sh_similar. More from the shop: sh_browse(shop_id=...). Related: sh_browse(tag=...).
| Name | Required | Description | Default |
|---|---|---|---|
| full_text | No | Return size guide and description uncut. | |
| product_id | Yes | Product id from sh_search / sh_browse, e.g. 2578018. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is covered. The description adds genuine behavioral value by spelling out the shape of the returned payload (variants each carrying their own price and stock, trust signals on the selling shop) — information the annotations do not convey. It stops short of noting any rate limiting or truncation behavior beyond what the full_text param implies.
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 what-it-returns inventory is front-loaded and the routing alternatives are compressed into a single dense line with no filler. The first sentence is a long comma-chained list, which is efficient but slightly taxing to parse; otherwise 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?
There is no output schema, so the description must carry the burden of describing return content — and it does, enumerating every significant field of the product record. For a two-parameter, single-record lookup with annotations covering safety, nothing an agent needs to call this 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 description coverage is 100%, so both product_id and full_text are already documented in the schema, including the "uncut" semantics of full_text and the example id. The description only alludes to these fields indirectly by listing size guide and description as part of the record. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource ("Get one product's full record") and enumerates exactly what that record contains — price, per-variant price/stock, size guide, description, tags, shop trust signals, site link. That level of detail lets an agent distinguish this from sh_similar, sh_browse, and sh_shop 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?
It states the triggering condition ("when the user picks a product"), the purpose of the call (check size/color stock and shop trustworthiness), and then names three concrete alternatives with the parameter that selects each: sh_similar for the same item elsewhere, sh_browse(shop_id=...) for more from the shop, sh_browse(tag=...) for related items. This is explicit routing, not inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_searchSearch productsARead-onlyIdempotent
Search products across all shops by keyword: price to pay, discount, stock, selling shop.
Use first for "price of X" / "where to buy X". Cheapest matches as one flat list: sh_find_cheapest. Variants (size, color, stock): sh_product. Next page: pass next_cursor back as cursor.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Same-day courier city, e.g. 'تهران' (sh_filters). | |
| sort | No | Order; cheapest / most_expensive use the price to pay. | relevance |
| limit | No | Products per page. | |
| query | Yes | Keyword, Persian works best, e.g. 'مانتو کتان'. | |
| sizes | No | Sizes in size_system (any of them), e.g. ['M', 'L']. | |
| cursor | No | next_cursor of the previous reply (keep the other arguments the same). | |
| shop_id | No | One shop's id (sh_shops), e.g. 489. | |
| max_price | No | Maximum price to pay in Toman, e.g. 2000000. | |
| min_price | No | Minimum price to pay in Toman, e.g. 500000. | |
| category_id | No | Category id from sh_categories, e.g. 385; includes sub-categories. | |
| size_system | No | Size system for `sizes` (values: sh_filters); freesize = only free-size items. | |
| in_stock_only | No | Only products in stock now. | |
| discounted_only | No | Only discounted products. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds behavior beyond that: the shape of each result (price to pay, discount, stock, selling shop) and the cursor round-trip for paging. It stops short of stating rate limits or result-count behavior, 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?
Four short lines, front-loaded with purpose then routing then pagination; every line carries information. The telegraphic fragment style ('Variants (size, color, stock): sh_product') is dense but readable, with no filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 13-parameter search with full schema coverage and no output schema, the description supplies the missing routing layer and the pagination contract. It does not need to explain return values, but it could say more about how the many filters combine or what an empty result means, which keeps it short of a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3 and the schema already documents city, sort, sizes, price bounds, category and the rest with examples. The description's only parameter-adjacent content is the cursor instruction, which largely restates the schema's own 'next_cursor of the previous reply' note, so it adds little beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Starts with a specific verb+resource ('Search products across all shops by keyword') and immediately lists what each result carries (price to pay, discount, stock, selling shop). It also names the two most confusable siblings, sh_find_cheapest and sh_product, so an agent can separate this broad search from the cheapest-only and variant-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 entry condition ('Use first for "price of X" / "where to buy X"') and routes two distinct cases to named alternatives: sh_find_cheapest for a flat cheapest list and sh_product for size/color/stock variants. It closes the loop with a pagination rule ('pass next_cursor back as cursor'), 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.
sh_shopShop profileARead-onlyIdempotent
Get a shop's profile: ratings, buyer survey %, followers, product count, main categories, courier city, contacts and website.
Use to judge whether a shop is trustworthy. Its products: sh_browse(shop_id=...) or sh_search(shop_id=...); its brands (watch shops): sh_brands.
| Name | Required | Description | Default |
|---|---|---|---|
| shop | Yes | Shop id or username, e.g. '489' or 'papionlady'. | |
| full_text | No | Return the shop description uncut. | |
| similar_shops | No | Also list up to 10 similar shops. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds useful context about what data is returned, but says nothing about pagination, rate limits, or how 'similar_shops'/'full_text' change the payload.
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 clauses, front-loaded with the resource and payload, followed by usage and cross-references. Every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description compensates by enumerating the profile fields returned. It omits any note on response shape or size limits, so it is slightly short of fully complete, but adequate for a read-only profile fetch.
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 'shop', 'full_text' and 'similar_shops' are already documented in the schema. The description adds no syntax, format, or default guidance beyond that, which is the expected baseline when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('shop's profile') and enumerates the returned content: ratings, buyer survey %, followers, product count, categories, courier city, contacts, website. It also differentiates itself from siblings by routing product and brand lookups elsewhere.
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 use case ('judge whether a shop is trustworthy') and names the alternatives with their conditions: products via sh_browse(shop_id=...) or sh_search(shop_id=...), brands via sh_brands. 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.
sh_shopsFind shopsARead-onlyIdempotent
Find shops by name, category group, gender or courier city, with rating, surveys, followers and product count.
Use to get a shop_id for sh_shop / sh_browse / sh_search, or "best-known women's clothing shops in Tehran" (order='most_followed').
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Same-day courier city, e.g. 'تهران'. | |
| page | No | Page number, from 1. | |
| limit | No | Shops per page. | |
| order | No | most_followed = Instagram followers; newest = newest on Shopino. | relevance |
| query | No | Shop name, e.g. 'پاپیون' or 'papion'. | |
| gender | No | Only women's or men's shops. | |
| category_group | No | Only shops selling this group. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety and mutation profile is fully covered externally. The description adds only the returned attribute list; it says nothing about result counts, pagination interplay with page/limit, or rate limits, so the added behavioral context is modest.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose followed by usage, with no filler. The second sentence's embedded example is slightly awkwardly punctuated but still earns its place by demonstrating a realistic invocation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter, zero-required, no-output-schema search tool, the description covers filters, returned fields, and downstream routing well. It is thin on pagination/result-volume expectations and on how the default 'relevance' ranking behaves, which are the remaining gaps for an agent planning a query.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven parameters are documented in the schema itself and the baseline is 3. The description's phrasing ('by name, category group, gender or courier city') largely restates the schema's query/category_group/gender/city fields rather than adding syntax, format, or interaction rules; the only genuine additions are the 'courier city' gloss and the order='most_followed' usage example.
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 ('Find shops') and enumerates the exact filter dimensions (name, category group, gender, courier city), which lets an agent distinguish it from siblings like sh_search or sh_browse. It also states what each result carries (rating, surveys, followers, product count), so the tool's output surface is identifiable without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says the tool is for obtaining a shop_id for downstream calls to sh_shop / sh_browse / sh_search, and gives a concrete example query with the order parameter ('best-known women's clothing shops in Tehran'). It does not, however, state when NOT to use it versus siblings such as sh_filters, sh_categories, or sh_brands, so the routing guidance is clear but incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sh_similarSimilar productsARead-onlyIdempotent
Find products like this one at other shops (itself left out).
Use when it is out of stock or too expensive, or to find the same item cheaper (kind='visual', sort='cheapest').
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | visual = photo-alike products from all shops (to find the same item cheaper); similar = Shopino's 10 related products. | visual |
| sort | No | relevance (as returned) or cheapest first. | relevance |
| limit | No | Max products to return. | |
| product_id | Yes | Product id from sh_search / sh_browse, e.g. 2578018. | |
| in_stock_only | No | Only products in stock now. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered structurally. The description adds one genuine behavioral fact beyond that ('itself left out') and the cross-shop search scope, but says nothing about result volume, ordering behavior, or how results are aggregated across shops.
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, no filler, with the core action front-loaded and usage guidance second. The parenthetical exclusion note is placed immediately after the action it qualifies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter read-only tool with 100% schema coverage and no output schema, the description covers purpose, triggers, and the key parameter pairing. It stops short of describing what the returned product records contain or how the cross-shop results are ordered beyond the sort 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 baseline is 3. The description exceeds that by tying parameter values to intent (kind='visual' with sort='cheapest' for the cheaper-alternative use case), which is meaning the schema enumerations alone do not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('find products like this one') plus a scope qualifier ('at other shops') that clearly separates it from sh_search (query-based) and sh_product (single-item detail). The exclusion of the source product is stated explicitly, so an agent knows exactly what the result set contains.
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 trigger conditions ('out of stock or too expensive') and even prescribes a parameter combination for the cheaper-item goal (kind='visual', sort='cheapest'). It does not, however, distinguish itself from the closest sibling sh_find_cheapest, leaving some routing ambiguity.
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
sh_blog_post6 fields changed- changed
Input schema / properties / max_chars / defaultPrevious value: -6000New value: +4000 - changed
Input schema / properties / max_chars / descriptionPrevious value: -"Cut the text after this many characters."New value: +"Cut text after this many characters; up to 20000 for long posts." - removed
Input schema / properties / max_chars / titleRemoved value: -"Max Chars" - removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"sh_blog_postArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_blog_postDictOutput", - "type": "object" -}New value: +null
- Changed
sh_blog_search5 fields changed- removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / query / descriptionPrevious value: -"Topic, Persian, e.g. 'مدل مانتو' or 'ست کردن کیف و کفش'."New value: +"Topic, Persian, e.g. 'مدل مانتو'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"sh_blog_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_blog_searchDictOutput", - "type": "object" -}New value: +null
- Changed
sh_brands4 fields changed- changed
Input schema / properties / shop_id / descriptionPrevious value: -"A shop id (e.g. 1771, a watch shop) to list its brands with brand ids."New value: +"Watch shop id, e.g. 1771: lists its brands with brand ids." - removed
Input schema / properties / shop_id / titleRemoved value: -"Shop Id" - removed
Input schema / titleRemoved value: -"sh_brandsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_brandsDictOutput", - "type": "object" -}New value: +null
- Changed
sh_browse29 fields changed- changed
Input schema / properties / brand_id / descriptionPrevious value: -"Brand id from sh_brands(shop_id=...) (watch brands), e.g. 12 (Tommy Hilfiger)."New value: +"Watch brand id from sh_brands(shop_id=...), e.g. 12." - removed
Input schema / properties / brand_id / titleRemoved value: -"Brand Id" - changed
Input schema / properties / category_id / descriptionPrevious value: -"Category id from sh_categories, e.g. 385 (women's manteaus); includes sub-categories."New value: +"Category id from sh_categories, e.g. 385; includes sub-categories." - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - changed
Input schema / properties / city / descriptionPrevious value: -"Only shops with same-day courier delivery in this city, e.g. 'تهران' (list in sh_filters)."New value: +"Same-day courier city, e.g. 'تهران' (sh_filters)." - removed
Input schema / properties / city / titleRemoved value: -"City" - changed
Input schema / properties / cursor / descriptionPrevious value: -"next_cursor of the previous reply, for the next page (keep the other arguments the same)."New value: +"next_cursor of the previous reply (keep the other arguments the same)." - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - removed
Input schema / properties / discounted_only / titleRemoved value: -"Discounted Only" - removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - changed
Input schema / properties / limit / defaultPrevious value: -24New value: +20 - changed
Input schema / properties / limit / descriptionPrevious value: -"Products per page (a tag always gives 16 per page)."New value: +"Products per page (a tag gives 16)." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / listing / descriptionPrevious value: -"Curated listing slug from sh_campaign tabs, e.g. 'پیراهن-مردانه'. Only sort, in_stock_only and discounted_only apply."New value: +"Listing slug from sh_campaign tabs, e.g. 'پیراهن-مردانه'. Only sort, in_stock_only, discounted_only apply." - removed
Input schema / properties / listing / titleRemoved value: -"Listing" - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / properties / min_price / titleRemoved value: -"Min Price" - changed
Input schema / properties / shop_id / descriptionPrevious value: -"List one shop's products (id from sh_shops / sh_shop), e.g. 489."New value: +"One shop's id (sh_shops), e.g. 489." - removed
Input schema / properties / shop_id / titleRemoved value: -"Shop Id" - changed
Input schema / properties / size_system / descriptionPrevious value: -"Size system for `sizes` (values in sh_filters): standard (S, M, L...), european (38, 40...), shoe, kid_shoe, pants, underwear, baby, kid; freesize = only free-size items."New value: +"Size system for `sizes` (values: sh_filters); freesize = only free-size items." - removed
Input schema / properties / size_system / titleRemoved value: -"Size System" - changed
Input schema / properties / sizes / descriptionPrevious value: -"Sizes in the chosen size_system (any of them), e.g. ['M', 'L'] or ['40']."New value: +"Sizes in size_system (any of them), e.g. ['M', 'L']." - removed
Input schema / properties / sizes / titleRemoved value: -"Sizes" - changed
Input schema / properties / sort / descriptionPrevious value: -"Order: relevance (Shopino's ranking), cheapest / most_expensive (price to pay), newest, biggest_discount."New value: +"Order; cheapest / most_expensive use the price to pay." - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - changed
Input schema / properties / tag / descriptionPrevious value: -"Product tag slug from sh_product `tags`, e.g. 'مانتو-بلند-مشکی-زنانه'. Only sort, in_stock_only and discounted_only apply."New value: +"Tag slug from sh_product `tags`, e.g. 'مانتو-بلند-مشکی-زنانه'. Only sort, in_stock_only, discounted_only apply." - removed
Input schema / properties / tag / titleRemoved value: -"Tag" - removed
Input schema / titleRemoved value: -"sh_browseArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_browseDictOutput", - "type": "object" -}New value: +null
- Changed
sh_campaign6 fields changed- changed
Input schema / properties / per_row / descriptionPrevious value: -"Products to show per product row."New value: +"Products per row." - removed
Input schema / properties / per_row / titleRemoved value: -"Per Row" - changed
Input schema / properties / slug / descriptionPrevious value: -"Campaign / landing slug from sh_deals campaigns, e.g. 'sale07', or a top category's: 'clothing', 'bag', 'shoes', 'sports'."New value: +"Slug from sh_deals campaigns, e.g. 'sale07', or 'clothing', 'bag', 'shoes', 'sports'." - removed
Input schema / properties / slug / titleRemoved value: -"Slug" - removed
Input schema / titleRemoved value: -"sh_campaignArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_campaignDictOutput", - "type": "object" -}New value: +null
- Changed
sh_categories6 fields changed- changed
Input schema / properties / max_level / descriptionPrevious value: -"Deepest level to list when no query is given (1 = the 14 top categories)."New value: +"Deepest level without a query (1 = the 14 top categories)." - removed
Input schema / properties / max_level / titleRemoved value: -"Max Level" - changed
Input schema / properties / query / descriptionPrevious value: -"Optional filter on the Persian name or English slug path, any level, e.g. 'مانتو' or 'sneakers'."New value: +"Filter on Persian name or English slug path, any level, e.g. 'مانتو' or 'sneakers'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"sh_categoriesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_categoriesDictOutput", - "type": "object" -}New value: +null
- Changed
sh_deals4 fields changed- changed
Input schema / properties / limit / defaultPrevious value: -30New value: +20 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / titleRemoved value: -"sh_dealsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_dealsDictOutput", - "type": "object" -}New value: +null
- Changed
sh_filters4 fields changed- changed
Input schema / properties / category_id / descriptionPrevious value: -"Category id from sh_categories: adds its sub-categories."New value: +"Category id (sh_categories): adds its sub-categories." - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - removed
Input schema / titleRemoved value: -"sh_filtersArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_filtersDictOutput", - "type": "object" -}New value: +null
- Changed
sh_find_cheapest13 fields changed- changed
Input schema / properties / category_id / descriptionPrevious value: -"Category id from sh_categories, e.g. 385 (women's manteaus); includes sub-categories."New value: +"Category id from sh_categories, e.g. 385; includes sub-categories." - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - changed
Input schema / properties / city / descriptionPrevious value: -"Only shops with same-day courier delivery in this city, e.g. 'تهران' (list in sh_filters)."New value: +"Same-day courier city, e.g. 'تهران' (sh_filters)." - removed
Input schema / properties / city / titleRemoved value: -"City" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / match_all_words / descriptionPrevious value: -"Keep only products whose title or shop name contains every word of the query."New value: +"Keep only products whose title or shop name has every query word." - removed
Input schema / properties / match_all_words / titleRemoved value: -"Match All Words" - changed
Input schema / properties / query / descriptionPrevious value: -"Product name or keyword, Persian works best, e.g. 'مانتو کتان' or 'کفش ورزشی'."New value: +"Keyword, Persian works best, e.g. 'مانتو کتان'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / scan / descriptionPrevious value: -"Max search results to scan, cheapest first, 200 per request."New value: +"Max results to scan, cheapest first." - removed
Input schema / properties / scan / titleRemoved value: -"Scan" - removed
Input schema / titleRemoved value: -"sh_find_cheapestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_find_cheapestDictOutput", - "type": "object" -}New value: +null
- Changed
sh_product4 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return size guide and description uncut.", + "type": "boolean" +} - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / titleRemoved value: -"sh_productArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_productDictOutput", - "type": "object" -}New value: +null
- Changed
sh_search23 fields changed- changed
Input schema / properties / category_id / descriptionPrevious value: -"Category id from sh_categories, e.g. 385 (women's manteaus); includes sub-categories."New value: +"Category id from sh_categories, e.g. 385; includes sub-categories." - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - changed
Input schema / properties / city / descriptionPrevious value: -"Only shops with same-day courier delivery in this city, e.g. 'تهران' (list in sh_filters)."New value: +"Same-day courier city, e.g. 'تهران' (sh_filters)." - removed
Input schema / properties / city / titleRemoved value: -"City" - changed
Input schema / properties / cursor / descriptionPrevious value: -"next_cursor of the previous reply, for the next page (keep the other arguments the same)."New value: +"next_cursor of the previous reply (keep the other arguments the same)." - removed
Input schema / properties / cursor / titleRemoved value: -"Cursor" - removed
Input schema / properties / discounted_only / titleRemoved value: -"Discounted Only" - removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - 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" - changed
Input schema / properties / query / descriptionPrevious value: -"Product name or keyword, Persian works best, e.g. 'مانتو کتان' or 'کفش ورزشی'."New value: +"Keyword, Persian works best, e.g. 'مانتو کتان'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / shop_id / descriptionPrevious value: -"Search inside one shop (id from sh_shops / sh_shop), e.g. 489."New value: +"One shop's id (sh_shops), e.g. 489." - removed
Input schema / properties / shop_id / titleRemoved value: -"Shop Id" - changed
Input schema / properties / size_system / descriptionPrevious value: -"Size system for `sizes` (values in sh_filters): standard (S, M, L...), european (38, 40...), shoe, kid_shoe, pants, underwear, baby, kid; freesize = only free-size items."New value: +"Size system for `sizes` (values: sh_filters); freesize = only free-size items." - removed
Input schema / properties / size_system / titleRemoved value: -"Size System" - changed
Input schema / properties / sizes / descriptionPrevious value: -"Sizes in the chosen size_system (any of them), e.g. ['M', 'L'] or ['40']."New value: +"Sizes in size_system (any of them), e.g. ['M', 'L']." - removed
Input schema / properties / sizes / titleRemoved value: -"Sizes" - changed
Input schema / properties / sort / descriptionPrevious value: -"Order: relevance (Shopino's ranking), cheapest / most_expensive (price to pay), newest, biggest_discount."New value: +"Order; cheapest / most_expensive use the price to pay." - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"sh_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_searchDictOutput", - "type": "object" -}New value: +null
- Changed
sh_shop6 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return the shop description uncut.", + "type": "boolean" +} - changed
Input schema / properties / shop / patternPrevious value: -"^[A-Za-z0-9._]{1,60}$"New value: +"^[A-Za-z0-9_][A-Za-z0-9._]{0,59}$" - removed
Input schema / properties / shop / titleRemoved value: -"Shop" - removed
Input schema / properties / similar_shops / titleRemoved value: -"Similar Shops" - removed
Input schema / titleRemoved value: -"sh_shopArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_shopDictOutput", - "type": "object" -}New value: +null
- Changed
sh_shops11 fields changed- removed
Input schema / properties / category_group / titleRemoved value: -"Category Group" - changed
Input schema / properties / city / descriptionPrevious value: -"Only shops with same-day courier delivery here, e.g. 'تهران'."New value: +"Same-day courier city, e.g. 'تهران'." - removed
Input schema / properties / city / titleRemoved value: -"City" - removed
Input schema / properties / gender / titleRemoved value: -"Gender" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / order / descriptionPrevious value: -"relevance (Shopino's order), most_followed (Instagram followers) or newest on Shopino."New value: +"most_followed = Instagram followers; newest = newest on Shopino." - removed
Input schema / properties / order / titleRemoved value: -"Order" - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"sh_shopsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_shopsDictOutput", - "type": "object" -}New value: +null
- Changed
sh_similar9 fields changed- removed
Input schema / properties / in_stock_only / titleRemoved value: -"In Stock Only" - changed
Input schema / properties / kind / descriptionPrevious value: -"visual = products from all shops whose photo looks like this one (best to find the same item cheaper); similar = Shopino's 10 related products."New value: +"visual = photo-alike products from all shops (to find the same item cheaper); similar = Shopino's 10 related products." - removed
Input schema / properties / kind / titleRemoved value: -"Kind" - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - changed
Input schema / properties / sort / descriptionPrevious value: -"relevance (as returned) or cheapest first (price to pay)."New value: +"relevance (as returned) or cheapest first." - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"sh_similarArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "sh_similarDictOutput", - "type": "object" -}New value: +null
14 tool updates
v0.1.0- First observed
sh_blog_post - First observed
sh_blog_search - First observed
sh_brands - First observed
sh_browse - First observed
sh_campaign - First observed
sh_categories - First observed
sh_deals - First observed
sh_filters - First observed
sh_find_cheapest - First observed
sh_product - First observed
sh_search - First observed
sh_shop - First observed
sh_shops - First observed
sh_similar
TDQS
Scored across 14 tools
Each tool has a clearly distinct purpose: keyword search, cheapest products, category/shop/tag browsing, filter metadata, categories, brands, deals, campaigns, product detail, similar products, blog search, blog post, shop search, and shop profile. The descriptions explicitly cross-reference related tools and give 'Use for' guidance that resolves any potential overlap between search, browse, and find_cheapest.
All tools share a consistent sh_ prefix and snake_case formatting, which is predictable and readable. However, the pattern is not strictly verb_noun: several tools are noun-based (sh_shop, sh_product, sh_campaign) while others use verbs (sh_search, sh_browse), so it falls short of perfect consistency.
14 tools are well-scoped for a shopping discovery server covering products, shops, deals, campaigns, and blog content. Each tool serves a distinct role without redundancy, and the count sits comfortably within the typical 3–15 range.
The surface covers core discovery workflows: product search, cheapest finding, filtered browsing, metadata lookups, product details, similar items, shops, deals, and blog content. Minor gaps remain, such as no explicit review or Q&A retrieval for products, but these are not critical for the primary discovery purpose.
Maintenance
Related MCP Connectors
Read-only fashion and beauty product search across popular online shops, any price, any language.
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
Search and get fashion products recommendations across multiple e-ecom stores
Open, verified shop database for AI agents: products, offers, price comparison, trust and coupons.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI agents to search Digikala's catalogue, compare every seller's offers and prices, review ~30 days of price history, read customer reviews and Q&A, and surface current deals, all through read-only tools.23743 PyPI36MIT
- AlicenseAqualityAmaintenanceEnables AI agents to compare prices across Iranian online and in-person shops, inspect each seller's offer with warranty and installment details, review roughly a year of price history, score deals, and find the cheapest shop for a whole basket. It is read-only, requires no account or API key, and runs locally for Claude, Cursor or Copilot.261MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search products on Iran's marketplace of independent shops with price, category, shipping and discount filters, find the cheapest in-stock offers, and read product details, shops, categories and customer reviews. It is read-only and needs no authentication, so it can be used straight from Claude, Cursor or Copilot.7MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search and compare home appliances, TVs, electronics and tools on the Iranian shop Baneh, find the cheapest in-stock matches, browse by category or brand, and read product details and buyer reviews. Runs read-only with no authentication, with prices returned in Toman.7MIT