Skip to main content
Glama
sepehr071

shopino-mcp

by sepehr071

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.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

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


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-mcp or claude mcp add shopino -- uvx shopino-mcp. Transport: stdio. Needs uv (Python 3.10+).

  • Auth: none, no API key or account. Optional SHOPINO_MCP_PROXY sets 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 with sh_find_cheapest, sh_search, sh_product, sh_shop or sh_deals. Typical sequence: sh_find_cheapest -> sh_product -> sh_shop, then sh_similar to 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_price is what the buyer pays, price is before discount, discount_pct is a whole percent, null price means no price shown (usually out of stock). Pass a product's id from sh_search or sh_browse as product_id to sh_product and sh_similar, and its shop_id to sh_shop. Page with the returned next_cursor.

  • Network: talks to api-go.shopino.app and api.shopino.app directly 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-mcp

Settings → 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-mcp

Or 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

sh_search

Search every shop by keyword: price, discount, stock, shop; filter by category, shop, size, price, city

sh_find_cheapest

Cheapest in-stock matches for a keyword, one flat list sorted by price to pay

sh_browse

A category, shop, tag or curated listing sorted by price / date / discount, with price range and size filters

sh_filters

Size systems and sizes, sort orders, courier cities and the sub-categories of a category

sh_categories

Category tree with ids and paths, plus total product and shop counts

sh_brands

Featured official brand shops, or the brands (with ids) a watch shop sells

sh_deals

Flash sale with end time, best sellers and themed rows, biggest discount first, campaigns and discount codes

sh_campaign

A campaign page's product rows and tabs

Tool

What it does

sh_product

Every color / size with its own price and units in stock, size guide, description, shop trust signals, original link

sh_similar

Products that look like this one at other shops (cheapest first), or Shopino's related products

Tool

What it does

sh_shops

Find shops by name, category group, gender or courier city, with rating, surveys and followers

sh_shop

A shop's rating, buyer survey, followers, main categories, contacts, website and similar shops

Tool

What it does

sh_blog_search

Style guides and model galleries from the Shopino blog

sh_blog_post

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, blog

shopino-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_price is what you pay, price is before discount, discount_pct is a whole percent. null means the shop shows no price (usually out of stock). Shop ratings are 0-5, null when not rated.

  • Every product has an image (absolute https URL of its first photo); sh_product also gives up to 4 in images.

  • Sizes and colors can differ in price and stock. A product's final_price is its cheapest variant; sh_product lists each color / size with its own price and stock (units left).

  • Each product is sold by one shop. Many can be bought in the Shopino cart; shop_site_only / shopino_cart: false means 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_city means 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_sale items 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 / surveys come from Shopino's buyer surveys; the stars the site shows next to a shop are customer_rating (customer_rating_count) in sh_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_search and sh_browse return next_cursor; Shopino's own page numbers drop the sort order, so this server does not send them.

  • Persian queries match best (مانتو کتان, کفش ورزشی مردانه).

  • Brands exist only for watch shops; sh_brands without 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.txt asks 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-mcp

Configuration

Variable

Default

Meaning

SHOPINO_MCP_PROXY

unset

HTTP proxy for every request, e.g. http://user:pass@host:port. A comma-separated list is used one at a time: the next proxy takes over when one is blocked (403/429) or cannot connect

فارسی

سرور 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.

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

MIT

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

Available Tools

14 tools
sh_blog_postRead a blog postA
Read-onlyIdempotent

Read one blog post as plain text, with its category id for sh_browse (after sh_blog_search).

NameRequiredDescriptionDefault
slugYesPost slug from sh_blog_search, e.g. 'مدل-مانتو-شب'.
max_charsNoCut text after this many characters; up to 20000 for long posts.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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

With no output schema, the description 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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_brandsBrandsA
Read-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).

NameRequiredDescriptionDefault
shop_idNoWatch shop id, e.g. 1771: lists its brands with brand ids.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 listingA
Read-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.

NameRequiredDescriptionDefault
tagNoTag slug from sh_product `tags`, e.g. 'مانتو-بلند-مشکی-زنانه'. Only sort, in_stock_only, discounted_only apply.
cityNoSame-day courier city, e.g. 'تهران' (sh_filters).
sortNoOrder; cheapest / most_expensive use the price to pay.relevance
limitNoProducts per page (a tag gives 16).
sizesNoSizes in size_system (any of them), e.g. ['M', 'L'].
cursorNonext_cursor of the previous reply (keep the other arguments the same).
listingNoListing slug from sh_campaign tabs, e.g. 'پیراهن-مردانه'. Only sort, in_stock_only, discounted_only apply.
shop_idNoOne shop's id (sh_shops), e.g. 489.
brand_idNoWatch brand id from sh_brands(shop_id=...), e.g. 12.
max_priceNoMaximum price to pay in Toman, e.g. 2000000.
min_priceNoMinimum price to pay in Toman, e.g. 500000.
category_idNoCategory id from sh_categories, e.g. 385; includes sub-categories.
size_systemNoSize system for `sizes` (values: sh_filters); freesize = only free-size items.
in_stock_onlyNoOnly products in stock now.
discounted_onlyNoOnly discounted products.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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 pageA
Read-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.

NameRequiredDescriptionDefault
slugYesSlug from sh_deals campaigns, e.g. 'sale07', or 'clothing', 'bag', 'shoes', 'sports'.
per_rowNoProducts per row.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 categoriesA
Read-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.

NameRequiredDescriptionDefault
queryNoFilter on Persian name or English slug path, any level, e.g. 'مانتو' or 'sneakers'.
max_levelNoDeepest level without a query (1 = the 14 top categories).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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

With no output schema, the description carries 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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema 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.

Purpose5/5

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

States a specific verb and resource (list 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.

Usage Guidelines4/5

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 campaignsA
Read-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').

NameRequiredDescriptionDefault
limitNoMax deals to return.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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

With no output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb ('List') and resource ('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.

Usage Guidelines5/5

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 listingsA
Read-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.

NameRequiredDescriptionDefault
category_idNoCategory id (sh_categories): adds its sub-categories.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 productA
Read-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.

NameRequiredDescriptionDefault
cityNoSame-day courier city, e.g. 'تهران' (sh_filters).
scanNoMax results to scan, cheapest first.
limitNoMax offers to return.
queryYesKeyword, Persian works best, e.g. 'مانتو کتان'.
category_idNoCategory id from sh_categories, e.g. 385; includes sub-categories.
match_all_wordsNoKeep only products whose title or shop name has every query word.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 detailsA
Read-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=...).

NameRequiredDescriptionDefault
full_textNoReturn size guide and description uncut.
product_idYesProduct id from sh_search / sh_browse, e.g. 2578018.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, 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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

The description opens with a specific verb+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.

Usage Guidelines5/5

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_shopShop profileA
Read-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.

NameRequiredDescriptionDefault
shopYesShop id or username, e.g. '489' or 'papionlady'.
full_textNoReturn the shop description uncut.
similar_shopsNoAlso list up to 10 similar shops.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

States a specific verb ('Get') and resource ('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.

Usage Guidelines5/5

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 shopsA
Read-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').

NameRequiredDescriptionDefault
cityNoSame-day courier city, e.g. 'تهران'.
pageNoPage number, from 1.
limitNoShops per page.
orderNomost_followed = Instagram followers; newest = newest on Shopino.relevance
queryNoShop name, e.g. 'پاپیون' or 'papion'.
genderNoOnly women's or men's shops.
category_groupNoOnly shops selling this group.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description opens with a specific verb and resource ('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.

Usage Guidelines4/5

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 productsA
Read-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').

NameRequiredDescriptionDefault
kindNovisual = photo-alike products from all shops (to find the same item cheaper); similar = Shopino's 10 related products.visual
sortNorelevance (as returned) or cheapest first.relevance
limitNoMax products to return.
product_idYesProduct id from sh_search / sh_browse, e.g. 2578018.
in_stock_onlyNoOnly products in stock now.

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 14 tool updatesv0.3.0
    • Changedsh_blog_post6 fields changed
      • changedInput schema / properties / max_chars / default
        Previous value: -6000New value: +4000
      • changedInput schema / properties / max_chars / description
        Previous value: -"Cut the text after this many characters."New value: +"Cut text after this many characters; up to 20000 for long posts."
      • removedInput schema / properties / max_chars / title
        Removed value: -"Max Chars"
      • removedInput schema / properties / slug / title
        Removed value: -"Slug"
      • removedInput schema / title
        Removed value: -"sh_blog_postArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_blog_postDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_blog_search5 fields changed
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / query / description
        Previous value: -"Topic, Persian, e.g. 'مدل مانتو' or 'ست کردن کیف و کفش'."New value: +"Topic, Persian, e.g. 'مدل مانتو'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"sh_blog_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_blog_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_brands4 fields changed
      • changedInput schema / properties / shop_id / description
        Previous 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."
      • removedInput schema / properties / shop_id / title
        Removed value: -"Shop Id"
      • removedInput schema / title
        Removed value: -"sh_brandsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_brandsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_browse29 fields changed
      • changedInput schema / properties / brand_id / description
        Previous 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."
      • removedInput schema / properties / brand_id / title
        Removed value: -"Brand Id"
      • changedInput schema / properties / category_id / description
        Previous 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."
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • changedInput schema / properties / city / description
        Previous 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)."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • changedInput schema / properties / cursor / description
        Previous 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)."
      • removedInput schema / properties / cursor / title
        Removed value: -"Cursor"
      • removedInput schema / properties / discounted_only / title
        Removed value: -"Discounted Only"
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • changedInput schema / properties / limit / default
        Previous value: -24New value: +20
      • changedInput schema / properties / limit / description
        Previous value: -"Products per page (a tag always gives 16 per page)."New value: +"Products per page (a tag gives 16)."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / listing / description
        Previous 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."
      • removedInput schema / properties / listing / title
        Removed value: -"Listing"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • changedInput schema / properties / shop_id / description
        Previous 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."
      • removedInput schema / properties / shop_id / title
        Removed value: -"Shop Id"
      • changedInput schema / properties / size_system / description
        Previous 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."
      • removedInput schema / properties / size_system / title
        Removed value: -"Size System"
      • changedInput schema / properties / sizes / description
        Previous 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']."
      • removedInput schema / properties / sizes / title
        Removed value: -"Sizes"
      • changedInput schema / properties / sort / description
        Previous 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."
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • changedInput schema / properties / tag / description
        Previous 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."
      • removedInput schema / properties / tag / title
        Removed value: -"Tag"
      • removedInput schema / title
        Removed value: -"sh_browseArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_browseDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_campaign6 fields changed
      • changedInput schema / properties / per_row / description
        Previous value: -"Products to show per product row."New value: +"Products per row."
      • removedInput schema / properties / per_row / title
        Removed value: -"Per Row"
      • changedInput schema / properties / slug / description
        Previous 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'."
      • removedInput schema / properties / slug / title
        Removed value: -"Slug"
      • removedInput schema / title
        Removed value: -"sh_campaignArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_campaignDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_categories6 fields changed
      • changedInput schema / properties / max_level / description
        Previous 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)."
      • removedInput schema / properties / max_level / title
        Removed value: -"Max Level"
      • changedInput schema / properties / query / description
        Previous 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'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"sh_categoriesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_categoriesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_deals4 fields changed
      • changedInput schema / properties / limit / default
        Previous value: -30New value: +20
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / title
        Removed value: -"sh_dealsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_dealsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_filters4 fields changed
      • changedInput schema / properties / category_id / description
        Previous value: -"Category id from sh_categories: adds its sub-categories."New value: +"Category id (sh_categories): adds its sub-categories."
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • removedInput schema / title
        Removed value: -"sh_filtersArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_filtersDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_find_cheapest13 fields changed
      • changedInput schema / properties / category_id / description
        Previous 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."
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • changedInput schema / properties / city / description
        Previous 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)."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / match_all_words / description
        Previous 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."
      • removedInput schema / properties / match_all_words / title
        Removed value: -"Match All Words"
      • changedInput schema / properties / query / description
        Previous value: -"Product name or keyword, Persian works best, e.g. 'مانتو کتان' or 'کفش ورزشی'."New value: +"Keyword, Persian works best, e.g. 'مانتو کتان'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / scan / description
        Previous value: -"Max search results to scan, cheapest first, 200 per request."New value: +"Max results to scan, cheapest first."
      • removedInput schema / properties / scan / title
        Removed value: -"Scan"
      • removedInput schema / title
        Removed value: -"sh_find_cheapestArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_find_cheapestDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_product4 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return size guide and description uncut.",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / title
        Removed value: -"sh_productArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_productDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_search23 fields changed
      • changedInput schema / properties / category_id / description
        Previous 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."
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • changedInput schema / properties / city / description
        Previous 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)."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • changedInput schema / properties / cursor / description
        Previous 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)."
      • removedInput schema / properties / cursor / title
        Removed value: -"Cursor"
      • removedInput schema / properties / discounted_only / title
        Removed value: -"Discounted Only"
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / properties / min_price / title
        Removed value: -"Min Price"
      • changedInput schema / properties / query / description
        Previous value: -"Product name or keyword, Persian works best, e.g. 'مانتو کتان' or 'کفش ورزشی'."New value: +"Keyword, Persian works best, e.g. 'مانتو کتان'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / shop_id / description
        Previous 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."
      • removedInput schema / properties / shop_id / title
        Removed value: -"Shop Id"
      • changedInput schema / properties / size_system / description
        Previous 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."
      • removedInput schema / properties / size_system / title
        Removed value: -"Size System"
      • changedInput schema / properties / sizes / description
        Previous 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']."
      • removedInput schema / properties / sizes / title
        Removed value: -"Sizes"
      • changedInput schema / properties / sort / description
        Previous 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."
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"sh_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_shop6 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return the shop description uncut.",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / shop / pattern
        Previous value: -"^[A-Za-z0-9._]{1,60}$"New value: +"^[A-Za-z0-9_][A-Za-z0-9._]{0,59}$"
      • removedInput schema / properties / shop / title
        Removed value: -"Shop"
      • removedInput schema / properties / similar_shops / title
        Removed value: -"Similar Shops"
      • removedInput schema / title
        Removed value: -"sh_shopArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_shopDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_shops11 fields changed
      • removedInput schema / properties / category_group / title
        Removed value: -"Category Group"
      • changedInput schema / properties / city / description
        Previous value: -"Only shops with same-day courier delivery here, e.g. 'تهران'."New value: +"Same-day courier city, e.g. 'تهران'."
      • removedInput schema / properties / city / title
        Removed value: -"City"
      • removedInput schema / properties / gender / title
        Removed value: -"Gender"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / order / description
        Previous value: -"relevance (Shopino's order), most_followed (Instagram followers) or newest on Shopino."New value: +"most_followed = Instagram followers; newest = newest on Shopino."
      • removedInput schema / properties / order / title
        Removed value: -"Order"
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"sh_shopsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_shopsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedsh_similar9 fields changed
      • removedInput schema / properties / in_stock_only / title
        Removed value: -"In Stock Only"
      • changedInput schema / properties / kind / description
        Previous 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."
      • removedInput schema / properties / kind / title
        Removed value: -"Kind"
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • changedInput schema / properties / sort / description
        Previous value: -"relevance (as returned) or cheapest first (price to pay)."New value: +"relevance (as returned) or cheapest first."
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"sh_similarArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "sh_similarDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 14 tool updatesv0.1.0
    • First observedsh_blog_post
    • First observedsh_blog_search
    • First observedsh_brands
    • First observedsh_browse
    • First observedsh_campaign
    • First observedsh_categories
    • First observedsh_deals
    • First observedsh_filters
    • First observedsh_find_cheapest
    • First observedsh_product
    • First observedsh_search
    • First observedsh_shop
    • First observedsh_shops
    • First observedsh_similar

TDQS

A4.1/5.0

Scored across 14 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    23
    743 PyPI
    36
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    26
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    7
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables 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.
    7
    MIT