shopino-mcp
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
Let your AI agent shop for clothes, bags and shoes across thousands of Iranian shops on Shopino. Search one catalog of about 960,000 products from 10,000 online and Instagram shops, 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.
Quick start · What it can do · Tools · FAQ · فارسی
Why
Shopino puts the products of about 10,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.
Related MCP server: SnappShop MCP Server
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"] }
}
}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?"
ارزان‌ترین کفش ورزشی سایز ۴۰ با ارسال پیک در تهران چند است؟
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.
Tools
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 tools are annotated readOnlyHint: true and return compact structured JSON, so they don't flood the agent's context.
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).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.
Persian queries match best (
مانتو کتان,کفش ورزشی مردانه).
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.
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.
The server retries a dropped connection once. If it still fails, check your internet connection. System proxy
variables are ignored on purpose; set SHOPINO_MCP_PROXY if you need a proxy.
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. |
فارسی
shopino-mcp به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد در شاپینو، میان محصولات هزاران فروشگاه اینترنتی و اینستاگرامی جستجو کند، ارزان‌ترین محصول موجود را پیدا کند، موجودی هر رنگ و سایز را ببیند، امتیاز و نظرسنجی خریداران هر فروشگاه را بررسی کند و تخفیف‌های شگفت‌انگیز و کدهای تخفیف را پیدا کند.
فقط خواندنی است: وارد حساب نمی‌شود، سبد خرید نمی‌سازد، سفارش ثبت نمی‌کند و چیزی را لایک نمی‌کند.
قیمت‌ها به تومان است.
روی سیستم خود شما اجرا می‌شود و به هیچ سرور واسطی داده نمی‌فرستد.
نصب در Claude Code:
claude mcp add shopino -- uvx shopino-mcpبعد بپرسید: «ارزان‌ترین مانتو کتان زنانه سایز L زیر ۲ میلیون تومان از یک فروشگاه خوش‌نام کدام است؟»
Development
git clone https://github.com/sepehr071/shopino-mcp && cd shopino-mcp
uv sync
uv run pytest # offline, against recorded responses
uv run 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.
Disclaimer
Unofficial and not affiliated with or endorsed by Shopino. It uses the public endpoints of the shopino.app website, which can change without notice. Please keep request rates reasonable.
License
Available Tools
14 toolssh_blog_postRead a blog postARead-onlyIdempotent
Read one Shopino blog post as plain text, with its category id for sh_browse.
Use after sh_blog_search to answer style questions with the post's advice.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Post slug from sh_blog_search, e.g. 'مدل-مانتو-شب'. | |
| max_chars | No | Cut the text after this many characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 value by disclosing the return shape (plain text) and a side output (category id) that the annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler; the core action and return format come first, and the workflow hint follows. 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 an output schema, full parameter descriptions, and a complete annotation set, the only thing the description must add is workflow placement, which it does. Nothing needed to invoke this simple read tool 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%: both parameters are documented in the schema, including the slug example and the truncation semantics of max_chars. The description adds no parameter detail 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 Shopino blog post'), names the output format (plain text), and adds a distinguishing detail (returns the category id for sh_browse). An agent can separate this from sh_blog_search, which finds posts rather than fetching one.
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 sequences the tool ('Use after sh_blog_search') and states the goal ('answer style questions with the post's advice'). It gives clear context but names no when-not condition or alternative for the case where a post is unknown.
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 Shopino blog (style guides and model galleries: manteau, dress, bag, shoe models, ...), newest first. Without a query: the latest posts.
Use when the user asks what is in fashion or which model to choose; read a post with sh_blog_post(slug), then find products with sh_search.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (3 posts per page). | |
| query | No | Topic, Persian, e.g. 'مدل مانتو' or 'ست کردن کیف و کفش'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld, non-destructive, so the safety profile is covered. The description usefully adds behavior beyond that: results are ordered newest first and omitting the query returns the latest posts. It doesn't discuss paging behavior, though the schema documents it.
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?
Compact and front-loaded, with scope and ordering in the first sentence and the workflow in the second. The parenthetical content list is slightly dense but every line carries information; nothing is redundant.
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?
An output schema exists, so return values need not be explained. Between the scope statement, the empty-query behavior, and the sibling routing, an agent has everything needed to select and call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds real meaning for the nullable query parameter by stating that an omitted query returns the latest posts, which the schema's 'default: null' does not explain.
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 Shopino blog') plus its content scope (style guides, model galleries) and ordering (newest first). It is clearly distinguishable from siblings like sh_search (products) and sh_blog_post (read a single post).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the triggering question ('what is in fashion or which model to choose') and lays out the follow-on workflow: read with sh_blog_post(slug), then find products with sh_search. It both says when to use it and which sibling to use next.
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: the official brand shops Shopino features (each is a shop: browse it with sh_browse(shop_id=...)). With shop_id: the brands that shop sells, with brand ids for the brand_id filter of sh_search / sh_browse (only watch shops have brands).
Use for "show me brand X" (find its shop) or to filter a watch shop by brand.
| Name | Required | Description | Default |
|---|---|---|---|
| shop_id | No | A shop id (e.g. 1771, a watch shop) to list its brands with brand ids. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description's added value is the dual-mode semantics and the 'only watch shops have brands' constraint, which prevents a failed call. It adds no notes on return shape, but an output schema exists so that burden is lifted.
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 conditional structure is front-loaded and each sentence carries information, but the heavy parenthetical nesting makes it denser than it needs to be. Still, no sentence is 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?
With an output schema present, one optional parameter, and full annotation coverage, the description supplies everything an agent needs: both modes, the downstream use of the returned brand ids, and the eligibility constraint. Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description genuinely adds meaning beyond the schema by defining what the absence of shop_id returns versus what passing it returns. The schema alone only documents the positive case.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific resource (brands) and splits it into two clearly distinguished behaviors based on the presence of shop_id, which an agent can act on directly. It also disambiguates from siblings by pointing at sh_browse and the brand_id filter of sh_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit when-to-use cases ('show me brand X' to find its shop, or to filter a watch shop by brand) and names the concrete alternative tools (sh_browse, sh_search) plus the constraint that only watch shops carry brands. Nothing about routing 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_browseBrowse a category, shop, tag or listingARead-onlyIdempotent
List products of a category, a shop, a product tag or a curated listing, with sorting, price range and filters.
Use for "cheapest women's manteau in size L under 2,000,000 Toman", "newest products of shop X", "biggest discounts in bags" (discounted_only + biggest_discount). With no category / shop / tag / listing it browses all shops (e.g. today's discounts). Ids: sh_categories, sh_shops, sh_brands; size values: sh_filters. Details of a product: sh_product. More results: pass next_cursor back as cursor with the same other arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Product tag slug from sh_product `tags`, e.g. 'مانتو-بلند-مشکی-زنانه'. Only sort, in_stock_only and discounted_only apply. | |
| city | No | Only shops with same-day courier delivery in this city, e.g. 'تهران' (list in sh_filters). | |
| sort | No | Order: relevance (Shopino's ranking), cheapest / most_expensive (price to pay), newest, biggest_discount. | relevance |
| limit | No | Products per page (a tag always gives 16 per page). | |
| sizes | No | Sizes in the chosen size_system (any of them), e.g. ['M', 'L'] or ['40']. | |
| cursor | No | next_cursor of the previous reply, for the next page (keep the other arguments the same). | |
| listing | No | Curated listing slug from sh_campaign tabs, e.g. 'پیراهن-مردانه'. Only sort, in_stock_only and discounted_only apply. | |
| shop_id | No | List one shop's products (id from sh_shops / sh_shop), e.g. 489. | |
| brand_id | No | Brand id from sh_brands(shop_id=...) (watch brands), e.g. 12 (Tommy Hilfiger). | |
| 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 (women's manteaus); includes sub-categories. | |
| size_system | No | 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. | |
| in_stock_only | No | Only products in stock now. | |
| discounted_only | No | Only discounted products. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds genuinely useful behavior: pagination via next_cursor with identical other arguments, and the fact that an unfiltered call spans all shops. It does not discuss result volume, ranking caveats, or rate 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?
Dense but front-loaded: purpose first, then example invocations, then fallback behavior, then id lookups, then routing, then pagination. No filler sentences; the telegraphic style is appropriate for a high-parameter browse tool.
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?
An output schema exists, so return values need not be explained, and all 15 parameters carry schema descriptions. Combined with the description's coverage of pagination, defaults, id provenance and sibling routing, an agent has everything needed to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented in the schema, including id sources, size systems and filter applicability per tag/listing. The description restates id sources and notes the discounted_only + biggest_discount combination, which is marginal added value over structured fields. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb (List) and enumerates the exact resources it browses (category, shop, tag, curated listing), plus sorting/price/filter scope. It is immediately distinguishable from sh_search (query-driven) and sh_product (single-item details), both of which are named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use examples ('cheapest women's manteau in size L under 2,000,000 Toman', 'biggest discounts in bags'), states the no-filter fallback behavior (browses all shops, e.g. today's discounts), and routes to siblings for ids (sh_categories, sh_shops, sh_brands, sh_filters) and for details (sh_product). Alternatives and conditions are explicit.
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 Shopino campaign or landing page: its product rows (with prices) and its tabs.
Each tab names where its products come from: listing -> sh_browse(listing=...), shop_id ->
sh_browse(shop_id=...), category_id -> sh_browse(category_id=...), flash_sale -> sh_deals.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | Campaign / landing slug from sh_deals campaigns, e.g. 'sale07', or a top category's: 'clothing', 'bag', 'shoes', 'sports'. | |
| per_row | No | Products to show per product row. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds the structural fact that tab contents are not resolved in-place but must be fetched via other tools, which is genuinely useful behavioral context. It does not mention pagination, auth, or how many tabs/rows a real campaign returns, so it stays at a solid-but-not-rich 3.
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 action in one sentence, then follows with a compact, structured mapping of tab types to sibling calls. Nearly every token earns its place; the arrow notation is dense but readable and avoids narrative padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and annotations carry the safety profile. Parameters are fully described in the schema, and the tab-routing note closes the main ambiguity (where product content actually comes from). Only minor gaps remain, such as no note on slug validity beyond the pattern or on empty/invalid campaigns.
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%: both slug (with pattern, examples and source) and per_row (default 6, range 1-12) are fully documented in the schema. The description adds no parameter-level detail beyond what the schema states, 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 (Open) and resource (Shopino campaign or landing page) and names what it returns: product rows with prices and tabs. The tab-routing sentence explicitly distinguishes this tool from sibling surfaces (sh_browse, sh_deals), so an agent can tell what this tool owns versus what it delegates.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear mapping of tab types to the sibling tool and parameter that resolves them (listing/shop_id/category_id -> sh_browse, flash_sale -> sh_deals), which is real routing guidance. It stops short of an explicit 'use this instead of X when Y' statement, but the slug description ('campaign slug from sh_deals campaigns') implies the discovery-then-open workflow.
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 Shopino's category tree (clothing, bags, shoes, accessories, watches, jewelry, gold, cosmetics, ...) with ids, URL paths and levels, plus the 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 | Optional filter on the Persian name or English slug path, any level, e.g. 'مانتو' or 'sneakers'. | |
| max_level | No | Deepest level to list when no query is given (1 = the 14 top categories). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this readOnly/idempotent/non-destructive, and the description goes beyond that with real behavioral detail: without a query only levels up to max_level are returned, with a query every level is searched, and the payload includes counts. That conditional scope behavior isn't derivable from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with what is returned and then how to use it. The parenthetical category enumeration ('clothing, bags, shoes, ...') is mildly expendable but adds domain grounding without bloating the text.
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?
An output schema exists, so the returned-field list is partly redundant, but the description covers the mode selection, parameter interaction, and downstream purpose needed to call it correctly. Nothing operationally important is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds the interaction between the two parameters — query triggers a full-depth search while max_level only applies when no query is given. That cross-parameter semantics is not stated in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List Shopino's category tree') and enumerates what is returned: ids, URL paths, levels, plus product and shop counts. That detail plus the category examples clearly separate it from siblings like sh_brands and sh_filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use to get a category_id for sh_search / sh_browse / sh_find_cheapest', naming three sibling tools and the condition that selects them. It also states the query vs no-query behavior, so the agent knows which mode to pick.
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 featured deals from the Shopino home page: the flash sale (شگفت انگیز) with its end time, best sellers, newest and themed rows, biggest discount first, plus running campaigns and the shop discount codes seen on those products.
Use for "what's on sale" / "best discounts today". Open a campaign with sh_campaign(slug); for every discounted product of a category use sh_browse(discounted_only=true, sort='biggest_discount').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max deals to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 the safety profile is covered. The description adds genuinely new behavioral detail: results are ordered biggest-discount-first and the payload includes flash-sale end time and shop discount codes – facts an agent cannot derive from the annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then supporting content detail, then usage and alternatives in two tight sentences. No filler and no repetition of structured fields.
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?
An output schema exists, so return values need no explanation; the description still conveys scope, ordering, and when to prefer siblings. For a read-only single-parameter listing tool, everything needed to select and invoke it is present.
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?
Only one parameter (limit) and schema description coverage is 100%, so the schema already documents it. The description says nothing about the limit or its default of 30, which is acceptable but adds no value over the schema – the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List today's featured deals from the Shopino home page') and enumerates the content rows returned (flash sale, best sellers, newest, themed, campaigns, discount codes). It is immediately distinguishable from sh_browse, sh_search and sh_campaign by naming them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use for "what's on sale" / "best discounts today"') and routes to alternatives with their conditions: sh_campaign(slug) to open a campaign, sh_browse(discounted_only=true, sort='biggest_discount') for every discounted product in a category.
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 with their sizes, sort orders, cities with same-day courier delivery, and (with category_id) the sub-categories of a category.
Use before filtering by size or city. Price range is free (Toman); brand ids (watches only) come from sh_brands. Shopino has no color filter that works (the site's own color filter returns nothing).
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | No | Category id from sh_categories: adds its sub-categories. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 still adds non-obvious behavioral context: price is unconstrained by Toman range, brand filtering is watches-only, and the color filter is non-functional. It does not discuss pagination or result size, which is the only 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?
Front-loaded with the core deliverable in sentence one, followed by usage triggers and caveats. The parenthetical enumerations are dense but each earns its place; the trailing color-filter aside is slightly tangential but genuinely useful.
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 an output schema present, annotations covering safety, and the parameter fully documented, the description's remaining job is to say when and why to call it — which it does, including cross-tool routing and known dead ends.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is already documented in the schema. The description adds a semantic layer the schema lacks: that supplying category_id switches the output to that category's sub-categories, which clarifies the mode change rather than just the field type.
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 names a specific verb (list) and resource (filter values accepted by sh_search/sh_browse), then enumerates what those values cover: size systems, sort orders, cities, and sub-categories. It explicitly ties itself to the sibling tools whose behavior it describes, making it instantly distinguishable from 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 gives an explicit trigger ("Use before filtering by size or city") and routes the agent elsewhere for related data: price is a free-range input, brand ids come from sh_brands. It also warns that the site's color filter is broken, which prevents a wasted call path.
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 (Toman).
Use when the user wants the lowest price for X. The site sorts in-stock matches by price to pay;
this drops loose matches whose title lacks a query word (match_all_words) and items without a
price. Narrow with category_id (sh_categories) or city. A product's price is its cheapest
variant: check the wanted size / color with sh_product. complete=false: matches go on past
scanned, raise scan.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Only shops with same-day courier delivery in this city, e.g. 'تهران' (list in sh_filters). | |
| scan | No | Max search results to scan, cheapest first, 200 per request. | |
| limit | No | Max offers to return. | |
| query | Yes | Product name or keyword, Persian works best, e.g. 'مانتو کتان' or 'کفش ورزشی'. | |
| category_id | No | Category id from sh_categories, e.g. 385 (women's manteaus); includes sub-categories. | |
| match_all_words | No | Keep only products whose title or shop name contains every word of the query. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, yet the description adds real behavioral context: results are sorted by price to pay, loose matches lacking a query word and price-less items are dropped, and complete=false indicates matches continue past `scanned` requiring a higher scan. This is substantive disclosure beyond the structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and sorting behavior are front-loaded, then usage, then edge cases, with every sentence carrying information. Formatting is a bit run-on/inline rather than cleanly bulleted, which slightly hurts scannability, but there is 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?
For an open-world 6-parameter tool with an output schema, the description covers what the list contains, how it is ordered, how to narrow, how variants relate to price, and the pagination/scan caveat. An agent has everything needed to call it correctly without guessing.
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 3 baseline applies, but the description adds genuine meaning: it explains that match_all_words drops loose title matches, ties category_id to sh_categories and city to sh_filters, and explains scan/complete interplay. That goes beyond the schema's per-parameter 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 and scope: find the cheapest in-stock products for a keyword across all shops, returned as one flat list sorted by price to pay. An agent can distinguish it from sh_search, sh_deals and sh_similar without opening schemas, since the cheapest-price intent is explicit in both name and description.
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 when the user wants the lowest price for X' gives a clear trigger condition, and it routes refinement to siblings (category_id via sh_categories, city via sh_filters, variant checks via sh_product). It doesn't explicitly state when NOT to use it versus sh_search/sh_deals, so it falls short of full exclusion guidance, but the positive routing is strong.
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 and discount (Toman), every color / size variant with its own price and units in stock, size guide, description, tags, the selling shop with its rating and buyer survey, and the original link on the shop's own website.
Use after sh_search / sh_browse when the user picks a product, to check that their size and color is in stock and what it costs, and whether the shop is trustworthy. Same item elsewhere: sh_similar. More from the shop: sh_browse(shop_id=...). Related products: sh_browse(tag=...).
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Product id from sh_search / sh_browse, e.g. 2578018. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds value by enumerating the fields a record carries (variants, stock, shop rating, buyer survey), but says nothing about auth needs, rate limits, or behavior when the product id is stale/removed. Adequate but not rich beyond structured data.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, then a dense field list, then routing guidance. Every clause is informative, though the long comma-separated field inventory is close to the limit of what belongs in a description when an output schema already exists.
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-id lookup with full schema coverage, complete annotations, and an output schema, an agent needs purpose, trigger, and sibling routing — all present. Nothing required to invoke or interpret the call 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?
Only one parameter, and schema coverage is 100% — the schema already documents product_id with bounds (1..100000000) and an example id (2578018) plus its provenance. The description adds no additional parameter semantics, 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 and resource ('Get one product's full record') and then enumerates the actual contents (price/discount in Toman, variants with stock, size guide, shop rating, original link). This clearly distinguishes it from sh_search/sh_browse (which find products) and sh_similar (which finds substitutes).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use after sh_search / sh_browse when the user picks a product') plus the intent behind the call (check size/color stock, price, shop trustworthiness), and names concrete alternatives with argument hints: sh_similar, sh_browse(shop_id=...), sh_browse(tag=...).
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 Shopino shops by keyword: price to pay, discount, stock and selling shop.
Use first for "price of X" / "where can I buy X". Narrow with category_id (sh_categories), shop_id, size, price range or city (same-day courier). For the cheapest matches in one flat list use sh_find_cheapest. Sizes, colors and stock per variant: sh_product. More results: pass next_cursor back as cursor (keep the other arguments the same).
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Only shops with same-day courier delivery in this city, e.g. 'تهران' (list in sh_filters). | |
| sort | No | Order: relevance (Shopino's ranking), cheapest / most_expensive (price to pay), newest, biggest_discount. | relevance |
| limit | No | Products per page. | |
| query | Yes | Product name or keyword, Persian works best, e.g. 'مانتو کتان' or 'کفش ورزشی'. | |
| sizes | No | Sizes in the chosen size_system (any of them), e.g. ['M', 'L'] or ['40']. | |
| cursor | No | next_cursor of the previous reply, for the next page (keep the other arguments the same). | |
| shop_id | No | Search inside one shop (id from sh_shops / sh_shop), 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 (women's manteaus); includes sub-categories. | |
| size_system | No | 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. | |
| in_stock_only | No | Only products in stock now. | |
| discounted_only | No | Only discounted products. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, openWorld, idempotent, and non-destructive. The description adds operational context: city filter means same-day courier availability, and cursor pagination requires keeping other args constant. No safety or mutation details are contradicted, but no additional auth or rate-limit behavior is disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose then usage guidance, with no wasted sentences. Each sentence (purpose, usage, alternatives, pagination) earns its place for a complex 13-parameter tool.
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?
All structured fields are rich: 100% schema coverage, full annotations, and an output schema. The description provides routing guidance and pagination behavior, leaving return values to the output schema. Nothing critical is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 13 parameters are fully documented in the schema. The description echoes some filters (category, shop, size, price, city) but adds no new syntax or constraints beyond what the schema provides. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Search products') and resource with scope ('across all Shopino shops by keyword') plus what data is returned (price, discount, stock, selling shop). It also distinguishes itself from sh_find_cheapest and sh_product, so an agent can route correctly.
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 tells the agent to use this first for price/buy queries, names filters to narrow results, and directs to alternatives for cheapest matches (sh_find_cheapest) and variant details (sh_product). It also explains pagination via cursor, covering when to use, when not to, and alternatives.
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: rating, customer rating, buyer survey (satisfied, quality, price, on-time delivery %), followers, product count, main categories, courier city, contacts and website.
Use to judge whether a shop is trustworthy before buying, or to see what it sells. 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'. | |
| similar_shops | No | Also list up to 10 similar shops. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered. The description adds the shape of the returned profile (survey percentages, courier city), but says nothing about permissions, rate limits, or freshness of ratings, so it adds only modest context beyond structured fields.
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 the verb and payload, followed by selection guidance and cross-references. The field enumeration is dense but every item earns its place by helping the agent judge relevance.
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 an output schema present, annotations covering the safety profile, and 100% schema description coverage, the description only needs to supply purpose and routing — both are present and unambiguous. Nothing required for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters ('shop' id/username pattern, 'similar_shops' boolean) are documented in the schema, so the baseline is 3. The description never mentions the shop identifier semantics or the similar-shops option, so it adds nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a shop's profile') and enumerates the exact contents (rating, buyer survey, followers, product count, categories, courier city, contacts, website), so an agent knows both what it returns and how it differs from sh_product / sh_shops. No ambiguity about scope.
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?
Explicit when-to-use ('judge whether a shop is trustworthy before buying, or to see what it sells') plus concrete routing to alternatives with parameter hints: products via sh_browse(shop_id=...) or sh_search(shop_id=...), brands via sh_brands. This is exactly the sibling differentiation an agent needs.
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 Shopino shops (online and Instagram shops) by name, category group, gender or courier city, with rating, number of buyer surveys, followers and product count.
Use to get a shop_id for sh_shop / sh_browse(shop_id=...) / sh_search(shop_id=...), or for "best-known women's clothing shops with delivery in Tehran" (order='most_followed').
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | Only shops with same-day courier delivery here, e.g. 'تهران'. | |
| page | No | Page number, from 1. | |
| limit | No | Shops per page. | |
| order | No | relevance (Shopino's order), most_followed (Instagram followers) or 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
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 genuinely non-structured context: the data universe is Shopino shops including Instagram shops, and each result carries rating, buyer-survey count, followers and product count. It does not discuss pagination or result limits, which is the only real 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?
Two sentences, front-loaded with the verb and resource before the routing advice. The second sentence packs several downstream tool references and an example, which is dense but each clause carries routing value.
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 an output schema present and 100% parameter coverage, the description only needs to establish the discovery role, the data scope, and downstream consumers — all of which it does. Minor omission: no note on pagination semantics or result-set size limits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and every parameter (city, query, gender, category_group, order, page, limit) is already documented in the schema with examples. The description restates the same filter fields without adding syntax or interaction rules, so it sits at the baseline 3.
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 Shopino shops') and enumerates the filterable dimensions (name, category group, gender, courier city) plus the returned attributes, so the agent knows exactly what surface this tool covers. It also names the sibling tools it feeds (sh_shop, sh_browse, sh_search), which cleanly separates it from them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it: to obtain a shop_id for sh_shop / sh_browse(shop_id=...) / sh_search(shop_id=...), and gives a worked example ('best-known women's clothing shops with delivery in Tehran' → order='most_followed'). It stops short of excluding the other discovery siblings (sh_filters, sh_categories, sh_brands), so the routing is clear but not fully disambiguated.
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, with prices, discount, stock and shop.
Use when the product is out of stock, too expensive, or to check whether another shop sells the same item cheaper (kind='visual', sort='cheapest'). The product itself is left out.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | visual = products from all shops whose photo looks like this one (best to find the same item cheaper); similar = Shopino's 10 related products. | visual |
| sort | No | relevance (as returned) or cheapest first (price to pay). | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this a read-only, idempotent, open-world, non-destructive operation, so the safety profile is covered. The description adds a real behavioral detail beyond them: the queried product itself is excluded from results, which shapes how the agent interprets the output set. It does not discuss result volume or defaults, but that is largely schema territory.
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 the core action and followed by the usage conditions; no padding or repetition of schema details. 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 an output schema present, return-value explanation is unnecessary, and the description still names the key payload fields. Purpose, trigger conditions, scope exclusion, and a recommended parameter pairing are all present, leaving nothing material missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond that by recommending a specific parameter combination ('kind=\'visual\', sort=\'cheapest\') tied to a concrete user goal, which is semantic guidance the schema's per-field text does not supply.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb and resource ('Find products like this one at other shops') and enumerates the data returned (prices, discount, stock, shop), plus the scope exclusion ('The product itself is left out'). It is clearly distinguishable from sh_product or sh_search in intent, though it does not explicitly name any sibling it competes with, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit triggering conditions: use when the product is out of stock, too expensive, or to check whether another shop sells it cheaper. It even supplies the parameter pairing (kind='visual', sort='cheapest') for that scenario. It stops short of naming alternatives such as sh_find_cheapest for price-hunting, so no exclusion routing is provided.
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.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 targets a distinct action or resource (browse, search, cheapest, details, shops, blogs), and descriptions explicitly guide usage. However, sh_search and sh_find_cheapest overlap heavily, and sh_browse with discounted_only overlaps with sh_deals, creating minor confusion.
All tool names follow a consistent pattern: lowercase snake_case with the sh_ prefix, mixing nouns for resources (sh_product) and verbs for actions (sh_search). No deviations in casing or prefixing.
14 tools are well-scoped for an e-commerce discovery server, covering product search, browsing, details, shops, blogs, deals, and metadata. Each tool earns its place without redundancy in count.
The surface covers core discovery workflows: searching, browsing, finding cheapest, product details, similar items, shop profiles, blog content, deals, filters, categories, and brands. Minor gaps exist (e.g., no direct comparison tool or user-generated product reviews beyond shop surveys), but agents can work around them.
Maintenance
Related MCP Connectors
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.
Visual fashion search across retailers and resale, with localized prices and app handoffs.
Related MCP Servers
- FlicenseAqualityDmaintenanceEnables intelligent product discovery on Digikala (Iran's largest e-commerce platform) with bilingual search, query optimization, price filtering in Toomans, product details, recommendations, and AI-powered semantic search for clothing and accessories.54-
- AlicenseNot gradedqualityBmaintenanceEnables LLMs to search products, fetch detailed specifications, and browse categories from SnappShop in real-time.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to search Snappfood restaurants and SnappMarket stores across Iran, compare true order costs including packaging and delivery, read menus, minimum orders, ETAs and reviews, and surface live flash deals. All operations are read-only, with no login, basket, ordering or payment access.21MIT
- 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.231MIT