Skip to main content
Glama

snapp-mcp: Snappfood and SnappMarket MCP server for AI agents

Let your AI agent shop around on Snappfood and SnappMarket (اسنپ‌فود و اسنپ‌مارکت). An unofficial, read-only MCP server for Iran's food delivery and grocery apps: search dishes and groceries, compare real prices across hundreds of restaurants and stores, read menus and reviews, and catch today's flash deals, all from Claude, Cursor or Copilot.

PyPI Python CI MCP Registry License: MIT

Install in Cursor Install in VS Code

For AI agents · Quick start · What it can do · Tools · FAQ · فارسی


For AI agents

  • What: unofficial MCP server for Snappfood (snappfood.ir, restaurant delivery) and SnappMarket (snapp.market, groceries) in Iran. Queries in Persian match best; prices in Toman.

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

  • Auth: none, no API key or account. Snappfood only accepts Iranian IPs: run it from Iran without a VPN, or set SNAPP_MCP_PROXY to an HTTP proxy that exits in Iran.

  • Access: read-only. No login, basket, orders or payment, so no confirmation is needed before calling any tool.

  • Tools: 21: find_location, reverse_geocode, list_cities, then food_* and market_*. Most food and market tools need lat and long (not food_reviews, market_reviews, market_product, list_cities). Typical sequence: find_location -> food_find_cheapest -> food_order_costs (groceries: market_find_cheapest -> market_store_info).

  • Use when: comparing the real total (food + packaging + delivery) of dishes or groceries near an address in Iran.

  • Do not use when: the user wants to order, or is outside Iran with no Iranian IP or proxy (Snappfood answers HTTP 403).

  • Output: compact JSON. Prices in Toman, ratings 0-5. Null and empty fields are omitted (a missing rating = not rated); review and description texts are cut to 400 characters (pass full_text: true to food_reviews, market_reviews or market_product for the whole text). Restaurant and store vendor_code values pass between tools. FoodParty and Gem deals only run in time windows.

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

Related MCP server: sheypoor-mcp

Why

Snappfood shows you one restaurant at a time. Finding the cheapest pizza that actually reaches your door means opening dozens of menus, adding packaging and delivery fees in your head, and checking each restaurant's minimum order. An agent with snapp-mcp does that in seconds:

You: Cheapest pizza delivered to Vanak Square right now, including delivery?

Agent: calls find_location(query="میدان ونک") → food_find_cheapest(query="پیتزا", lat=35.7577, long=51.4095)

Total

Dish

Restaurant

Breakdown

296,400

پیتزا سوسیس مینی + نوشابه

پیتزاتو (گاندی)

food 296,400 · free delivery

410,000

پیتزا اسمارت وجی لاور

پیتزا دومینوز (جردن)

food 360,000 + delivery 50,000

464,000

پیتزا پپرونی اسلایسی

تله پیتزا (سعادت آباد)

food 315,000 + delivery 149,000

The Pizzato combo is cheapest overall. Want me to check its minimum order and coupons with food_order_costs?

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

What it can do

  • 🔎 Search dishes and grocery products by name near any address in Iran

  • 💸 Find the true cheapest option: food price after discount + packaging + delivery, checked against live menus

  • 🏪 Browse restaurants and stores with filters: free delivery, discount, coupon, rating, distance

  • 📋 Read full menus, store catalogs, minimum orders, delivery fees, ETAs and coupons

  • ⚡ Catch deals: FoodParty flash deals, meals for one, Gem hunts, Market Party

  • ⭐ Check quality with customer reviews before recommending anything

  • 🔒 Read-only by design: no login, no basket, no orders, no payment

Quick start

You need uv and an Iranian IP address (Snappfood blocks most foreign IPs; see FAQ).

claude mcp add snapp -- uvx snapp-mcp

Settings → Developer → Edit Config, then add:

{
  "mcpServers": {
    "snapp": { "command": "uvx", "args": ["snapp-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": {
    "snapp": { "type": "stdio", "command": "uvx", "args": ["snapp-mcp"] }
  }
}

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

Then just ask:

  • "Which restaurants near Tajrish have free delivery and at least 4.5 stars?"

  • "Show FoodParty deals with more than 40% off near me."

  • "Where is low-fat milk cheapest near Jordan, Tehran? Include delivery."

  • ارزان‌ترین کباب نزدیک میدان آزادی شیراز با هزینه ارسال؟

How it works

  AI agent  (Claude, Cursor, Copilot, ...)
      │
      │  MCP over stdio
      ▼
  snapp-mcp  (runs on your machine, uses your IP)
      │
      │  HTTPS
      ├──────▶  snappfood.ir    restaurants
      └──────▶  snapp.market    groceries

snapp-mcp runs locally and calls the same public endpoints the Snappfood and SnappMarket web apps use, with a Chrome-like TLS and header profile, at most 2 requests at a time and small random delays. There's no hosted server in between, no API key, and nothing about you is sent anywhere else.

Tools

Every food and grocery tool takes lat / long, because menus, prices and delivery fees depend on the delivery point. The agent gets them from find_location or list_cities first.

Tool

What it does

find_location

Address, landmark or street → coordinates

reverse_geocode

Coordinates → street / neighbourhood names

list_cities

Every served city with its center point

Tool

What it does

food_search

Search dishes by name; price sorts are re-checked against live menus

food_find_cheapest

Scan nearby menus + FoodParty for the lowest total price (food + packaging + delivery)

food_restaurants

Restaurants with filters (free delivery, discount, coupon) and sorting

food_menu

One restaurant's full menu with prices, packaging fees and availability

food_order_costs

Delivery fee, ETA, minimum order and coupons of one restaurant

food_reviews

Customer reviews, with what they ordered and the restaurant's reply

food_party_deals

FoodParty flash deals still in stock, with the deal window

food_meal_for_one

Single-person meals up to 299k Toman with free delivery

food_discounted_vendors

Restaurants running discounts now, plus live Gem deals

Tool

What it does

market_search

Search a product across stores, grouped by store

market_find_cheapest

Cheapest in-stock offers for a product, one flat list

market_stores

Stores delivering to a point, by delivery fee or rating

market_store_info

Delivery fee, minimum order, opening hours and coupons of a store

market_store_products

Search inside a store, or browse it by category

market_categories

Product categories and their ids

market_product

One product's details and price in a store

market_party_deals

Market Party flash deals, biggest discount first

market_reviews

Customer comments on a store

All 21 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 (1 Toman = 10 Rial). Ratings are normalized to 0–5, like the apps; a missing rating means not rated yet (null/empty fields are omitted).

  • True cost of a food order = price − discount + packaging + delivery − coupon, and the basket must reach the restaurant's minimum order. food_find_cheapest and food_order_costs give the agent every piece of that.

  • Persian queries match best (پیتزا, کباب, شیر). Name filters treat Arabic ي/ك and half-space vs space as equal.

FAQ

Yes: snapp-mcp is an unofficial MCP server with 21 read-only tools for dishes, menus, groceries, delivery fees and deals. It calls the same public endpoints the Snappfood and SnappMarket web apps use; no API key is needed.

Add the server with claude mcp add snapp -- uvx snapp-mcp (or the matching config in Quick start for Claude Desktop, Cursor and VS Code), then ask for a dish near an address, in Persian or English.

It is unofficial and not affiliated with Snapp. It is read-only (no login, basket or payment), runs on your machine, and is free under the MIT license. Outside Iran, Snappfood blocks most IPs, so use an Iranian IP or SNAPP_MCP_PROXY.

Snappfood's firewall only accepts Iranian IP addresses. Run the server on a machine in Iran with the VPN off. If you must use a VPN, set SNAPP_MCP_PROXY to an HTTP proxy that exits in Iran (several, comma-separated, are fine). Normal system proxy variables are ignored on purpose, because a foreign VPN exit would get blocked. SnappMarket is less strict.

No, and that's deliberate. It has no login and never touches the basket, order or payment endpoints. The agent finds the best option; you tap order in the app.

Those deals only run in time windows. active: false or gem: null means no window is live right now.

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

npx @modelcontextprotocol/inspector uvx snapp-mcp

Configuration

Variable

Default

Meaning

SNAPP_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

If Snapp answers with a bot-check page, the server can solve it with a headless browser: install snapp-mcp[browser] (e.g. uvx --from 'snapp-mcp[browser]' snapp-mcp), then run patchright install chromium. Off by default.

فارسی: سرور MCP اسنپ‌فود و اسنپ‌مارکت

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

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

  • قیمت نهایی را با بسته‌بندی، هزینه ارسال و حداقل سفارش حساب می‌کند.

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

نصب در Claude Code:

claude mcp add snapp -- uvx snapp-mcp

بعد بپرسید: «ارزان‌ترین پیتزا با هزینه ارسال نزدیک میدان ونک کجاست؟»

نکته: سرور باید روی سیستمی با IP ایران و بدون VPN اجرا شود، چون اسنپ‌فود درخواست‌های خارج از ایران را مسدود می‌کند.

Development

git clone https://github.com/sepehr071/snapp-mcp && cd snapp-mcp
uv sync
uv run python -m pytest            # offline, against recorded responses
uv run python -m pytest -m live    # real APIs (needs an Iranian IP)
uv run ruff check .

Tools live in src/snapp_mcp/food.py, market.py and location.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 API 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 Snapp. It uses the public endpoints of the snappfood.ir and snapp.market web apps, which can change without notice. Please keep request rates reasonable.

License

MIT

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

Available Tools

21 tools
find_locationFind locationA
Read-onlyIdempotent

Turn a place name or address into latitude/longitude.

Use first when the user gives an address; food_* and market_* tools need lat/long. Biased toward near_lat/near_long (default Tehran): pass a city center for other cities.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax places to return.
queryYesPlace, street or landmark, e.g. 'میدان ونک'.
near_latNoBias latitude (e.g. a city center from list_cities).
near_longNoBias longitude.

TDQS

A4.6/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 safety is covered. The description adds real behavioral context beyond that: results are geographically biased toward near_lat/near_long and default to Tehran, which materially affects output.

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 lines, purpose front-loaded, followed by usage and the bias caveat. No filler sentences and every clause carries actionable 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 annotations and full schema coverage in place, the description covers purpose, workflow position, and the bias quirk. It does not describe the shape of the returned list (multiple place results given the 'limit' param) and no output schema exists to compensate, leaving a minor gap.

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 earns an extra point by explaining the intent of near_lat/near_long ('Biased toward... pass a city center for other cities'), clarifying a parameter whose schema text alone is terse.

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 transformation: 'Turn a place name or address into latitude/longitude.' This clearly distinguishes it from the sibling reverse_geocode, which does the opposite direction. An agent can select it without ambiguity.

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 explicit sequencing ('Use first when the user gives an address') and names the downstream consumers ('food_* and market_* tools need lat/long'). It also documents the default bias location and how to override it for other cities, which is the key routing decision an agent must make.

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

food_discounted_vendorsDiscounted restaurantsA
Read-onlyIdempotent

List restaurants running a discount now, plus the short "Gem" hunt discount if one is live.

Use for "which restaurants have offers". Vendor-level only: food_menu has prices.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.

TDQS

A4/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 one genuine behavioral detail beyond that: results conditionally include the short 'Gem' hunt discount when live, and the result set is vendor-level only. That is useful but thin, and no pagination or result-size behavior is described.

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

Conciseness5/5

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

Two short sentences, zero filler, and the primary purpose plus the sibling-differentiation constraint are front-loaded. The trigger phrase follows immediately after.

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 usefully signals what comes back (vendor-level discount list, optionally including the Gem hunt offer) and the annotations cover safety. It is nearly complete; only result size/ordering behavior is unaddressed for a geo-scoped listing tool.

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

Parameters3/5

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

Schema description coverage is 100% and both parameters (lat, long) carry bounds and meaning in the schema. The description adds nothing about the coordinate parameters, 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?

States a specific verb and resource ('List restaurants running a discount now') and explicitly delineates its granularity against the sibling food_menu ('Vendor-level only: food_menu has prices'). An agent can distinguish it from food_menu, food_party_deals and food_find_cheapest 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 Guidelines4/5

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

Provides an explicit trigger phrase ('Use for "which restaurants have offers"') and names an alternative for a closely-related need (food_menu for prices). It lacks any when-not-to-use guidance against the other food_* deal tools, so it is clear context without exclusions.

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

food_find_cheapestFind cheapest dishA
Read-onlyIdempotent

Find the cheapest way to get a dish: scans menus of nearby open restaurants plus FoodParty deals.

Use for the lowest total price of X. Ranks by food price after discount + packaging + delivery fee; check min_order, a cheap dish may not reach the minimum basket. Slower than food_search.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
limitNoMax dishes.
queryYesDish word, e.g. 'پیتزا'.
max_restaurantsNoOpen restaurants' menus to scan (more = slower).

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, open-world, non-destructive, so the safety bar is low. The description adds real behavioral value beyond that: the ranking formula (food price after discount + packaging + delivery fee), the min_order caveat, and the latency trade-off versus food_search.

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 tight sentences, front-loaded with what the tool does, followed by usage, then the caveat and trade-off. Nothing is padding.

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

Completeness4/5

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

There is no output schema, but the description tells the agent what it effectively returns (dishes ranked by total landed price) and warns about the min_order edge case. It is complete enough to call correctly, though the shape of results and result count behavior are only implied.

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

Parameters3/5

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

Schema description coverage is 100%, so lat, long, query, limit, and max_restaurants are already documented with meaning, defaults, and bounds. The description explains the cost model that drives ranking but adds no parameter-specific syntax or format beyond the schema, so baseline 3 applies.

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

Purpose5/5

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

States a specific verb and resource (find the cheapest way to get a dish) plus the exact mechanism (scans nearby open restaurant menus and FoodParty deals). An agent can distinguish this from food_search and food_party_deals without opening any schema.

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

Usage Guidelines5/5

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

Explicitly says when to use it ("Use for the lowest total price of X") and routes the agent away from the sibling by contrast ("Slower than food_search"). It also gives a concrete precondition to check: min_order, since a cheap dish may not reach the basket minimum.

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

food_meal_for_oneMeals for oneA
Read-onlyIdempotent

List single-person meals (at most 299k Toman, free delivery), cheapest first.

Use for "cheap meal for one". Check min_order: a cheap meal may not reach the minimum basket.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
limitNoMax meals.
max_priceNoMax final price, Toman.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld, and non-destructive, so safety is covered structurally. The description adds real behavioral context beyond that: result ordering (cheapest first), a hard price ceiling, free-delivery requirement, and the warning that a cheap meal may fail the minimum basket — a genuinely useful operational caveat. Return format/pagination is not described, keeping it below 5.

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 sentences, zero filler, with the tool's scope and constraints front-loaded and the caveat placed last as an actionable warning. Every clause carries information an agent can act on.

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 is responsible for signaling the shape of results; it does so via 'cheapest first' and the price/delivery constraints. Four parameters are fully covered by the schema, and the min_order caveat closes the main operational gap, though the absence of any note on result limits or empty results is a minor shortfall.

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 coverage is 100%, with lat/long bounds, limit default, and max_price all documented in-schema, so the baseline is 3. The description's 299k price ceiling and cheapest-first ordering give indirect meaning to max_price and the result ordering but add no syntax or format detail beyond what the schema already carries.

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 precise verb+resource ('List single-person meals') with concrete constraints: price ceiling of 299k Toman, free delivery, and cheapest-first ordering. It distinguishes itself from generic siblings like food_search by the single-person/cheap scope, though it never names the closest alternative (e.g. food_find_cheapest) so the differentiation is inferential rather than explicit.

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 a direct trigger phrase ('Use for "cheap meal for one"') and adds a practical prerequisite caveat about checking min_order before committing. It does not state when NOT to use it or name sibling alternatives, so it stops short of the top tier.

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

food_menuRestaurant menuA
Read-onlyIdempotent

Get one restaurant's menu: every item with price, discount, packaging fee and availability.

Use after picking a restaurant. final_price = price - discount; packaging is added per item at checkout.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
limitNoMax items.
queryNoOnly items whose title contains this.
vendor_codeYesVendor code, e.g. '947evd' (from food_search / food_restaurants).

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, open-world and non-destructive, so the bar is low; the description adds real domain behavior by stating final_price = price - discount and that packaging is charged per item at checkout. That is value beyond the structured fields, though auth/pagination/rate-limit context is absent.

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 sentences, no filler; the core purpose is front-loaded and the pricing rule follows as supporting detail. 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?

For a read-only menu lookup with no output schema, the description covers what is returned, when to call it, and how prices resolve. Combined with 100% schema coverage and a full safety annotation set, nothing essential 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 all five parameters (vendor_code, lat, long, limit, query) are already documented in the schema. The description's price/discount/packaging language describes outputs rather than adding parameter meaning, so 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 (get) and resource (one restaurant's menu) and enumerates the returned fields (price, discount, packaging fee, availability). It clearly differs from restaurant-listing siblings, though it never names an alternative 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?

'Use after picking a restaurant' gives a clear sequencing cue that places it downstream of food_search / food_restaurants, and the schema notes vendor_code comes from those tools. No explicit when-not-to-use guidance is offered, keeping it short of a 5.

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

food_order_costsOrder costsA
Read-onlyIdempotent

Get the extra costs and conditions of ordering from one restaurant.

Use before recommending a restaurant: delivery fee, ETA, minimum order and coupons (with the basket total each needs and whether it is first-order only). Packaging is per item in food_menu.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
vendor_codeYesVendor code, e.g. '947evd' (from food_search / food_restaurants).

TDQS

A4.3/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), so the description earns credit for disclosing the payload shape: delivery fee, ETA, minimum order, coupon conditions with required basket total, first-order-only flag. It does not mention that results are location-dependent beyond the implied lat/long inputs, nor any rate/caching behavior.

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

Conciseness5/5

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

Two tight sentences: the action first, then the usage trigger, then the enumerated return fields. The trailing pointer to food_menu for packaging is dense with routing value and costs nothing in length.

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 the meaningful return fields (fees, ETA, minimum, coupon conditions, basket thresholds). Combined with the read-only annotations and fully documented inputs, an agent has everything needed to call and interpret it.

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%, including where vendor_code comes from, so the schema already carries the parameter burden. The description adds only that lat/long select the restaurant's delivery point, which is a marginal over-specification of the obvious.

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

Purpose5/5

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

Specific verb + resource: 'Get the extra costs and conditions of ordering from one restaurant', with the scope (one vendor, per delivery point) made explicit. It also carves out a boundary against food_menu by stating packaging costs live there instead.

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 before recommending a restaurant' gives a concrete decision point in the agent's workflow, which is unusually actionable. It does not state any exclusion or negative case (e.g. what to use when no coordinates are known), so it stops short of full when/when-not guidance.

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

food_party_dealsFoodParty dealsA
Read-onlyIdempotent

List today's FoodParty flash deals (deep discounts, limited stock, time window) still in stock.

Use for "what's on a big discount right now". Deals run only inside starts/ends; outside it the list is empty.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
sortNoOrder of the deals.biggest_discount
limitNoMax deals.
queryNoOnly deals whose title contains this.

TDQS

A4/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). The description adds genuinely new behavioral context beyond them: results are scoped to the current deal window, are stock-limited, and return empty outside the window. It does not mention rate limits, pagination, or auth needs, but for a read-only list tool this is solid disclosure.

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

Conciseness5/5

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

Two short sentences, front-loaded with the verb and resource, with the scoping caveat immediately after. No filler, no restatement of the title, and the quote-style usage hint is the only stylistic decoration.

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

Completeness4/5

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

With no output schema, the description carries the burden of indicating what comes back, and it does so at a conceptual level (deals with discount depth, stock status, and time window). Geographic/temporal scope and the empty-window edge case are covered; exact return shape, freshness of 'today', and result ordering are left unstated but are minor for a read-only listing.

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 coverage is 100%, so lat/long, sort, limit and query are all documented structurally, which sets the baseline at 3. The description adds only implicit semantics ('still in stock' explains the implicit availability filter) and says nothing about sort ordering, limit behavior, or title-substring matching that would supplement the schema.

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 opens with a specific verb and resource ('List today's FoodParty flash deals') and enriches it with the defining attributes: deep discounts, limited stock, time window, still in stock. That is enough to distinguish it from a generic search, but it never names or contrasts with nearby siblings like food_discounted_vendors or market_party_deals, which an agent may reasonably confuse it with.

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 gives a clear usage trigger ('Use for "what's on a big discount right now"') and a hard operating condition: deals only exist inside starts/ends, and the list is empty outside that window. It stops short of telling the agent when NOT to use it or which sibling to prefer for adjacent needs (e.g. cheapest meal vs. flash deal).

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

food_restaurantsList restaurantsA
Read-onlyIdempotent

List restaurants delivering to a point, with rating, delivery fee, ETA and coupon info.

Use to browse or rank restaurants or to find a vendor code by name. No dish prices: use food_menu.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
pageNoPage of 20, from 0.
sortNoOrder; *_expensive rank by price class, not delivery fee.default
queryNoRestaurant name filter, e.g. 'پیتزا'.
open_onlyNoHide closed or non-delivering restaurants.
has_couponNoWith a coupon only.
has_discountNoDiscounted only.
free_deliveryNoFree delivery only.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly, openWorld, idempotent and non-destructive, so safety is covered. The description adds real value beyond that by disclosing what comes back (rating, fee, ETA, coupon) and, importantly, what does not (no dish prices), which prevents a wrong call.

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

Conciseness5/5

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

Two tight sentences with zero waste: the capability and its returned fields come first, then the usage note and the alternative. Nothing is padded or restated.

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

Completeness4/5

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

For a 9-parameter listing tool with no output schema, the description covers purpose, key returned fields, and the main boundary against a sibling. Pagination and sort semantics live in the schema, but the absence of any note on result volume or paging behavior is a minor gap.

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

Parameters3/5

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

Schema description coverage is 100% and every one of the 9 parameters is documented in-schema, including the sort enum and the price-class caveat, so the description need not repeat them. The description adds no syntax or constraint detail beyond the schema, making the baseline 3 appropriate.

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

Purpose5/5

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

States a specific verb and resource ('List restaurants') plus the scope ('delivering to a point') and the payload it returns (rating, delivery fee, ETA, coupon). It also explicitly distinguishes itself from the dish-price sibling by naming food_menu, so an agent can route without opening a schema.

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

Usage Guidelines4/5

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

Gives clear usage context ('browse or rank restaurants or find a vendor code by name') and one explicit exclusion pointing at food_menu for dish prices. It stops short of naming other close siblings like food_find_cheapest or food_discounted_vendors, which an agent might also want signposted.

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

food_reviewsRestaurant reviewsA
Read-onlyIdempotent

Read recent customer reviews of a restaurant (rating, text, what they ordered, vendor reply).

Use to judge quality, delays or packaging before recommending.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage of 10, newest first, from 0.
full_textNoReturn review and reply text uncut (default cut to 400 chars).
vendor_codeYesVendor code, e.g. '947evd' (from food_search / food_restaurants).

TDQS

A3.8/5.0
Behavior3/5

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 the review content shape, which is useful, but says nothing about pagination limits, rate limits, or whether reviews can be absent for a vendor.

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 sentences, zero filler: the first states the operation and the returned fields, the second states the decision context. Information is front-loaded and every clause earns its place.

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

Completeness4/5

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

With no output schema, the description usefully summarizes the return contents (rating, text, order items, vendor reply) and the schema covers paging and truncation. Missing only edge-case behavior such as empty review sets or maximum page depth.

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%, with page, full_text and vendor_code all documented including the 400-char default and the source of the vendor code. The description adds no parameter-level detail beyond what the schema already supplies, so 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 recent customer reviews of a restaurant') and enumerates what the reviews contain (rating, text, ordered items, vendor reply). It does not explicitly contrast with the parallel market_reviews sibling, but the 'restaurant' qualifier implicitly scopes it, so an agent can distinguish them by resource type.

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

Usage Guidelines4/5

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

The second sentence gives clear situational guidance: use it to judge quality, delays or packaging before recommending. It does not name alternatives or state when not to use it (e.g. market_reviews for non-food stores), which keeps it just short of a 5.

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

list_citiesList citiesA
Read-onlyIdempotent

List cities Snappfood serves, with id, names and center coordinates.

Use the center as a rough delivery point when the user only names a city.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFilter on Persian title or English code, e.g. 'شیراز'.

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, openWorldHint and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds useful context by disclosing the returned fields and the approximate nature of center coordinates, but says nothing about pagination, filtering behavior, or result size.

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 with zero filler, front-loading the resource and scope before the practical tip. 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 no output schema, the description helpfully enumerates the returned fields and explains the coordinate semantics. Combined with annotations that cover the safety profile, this is nearly complete; only filtering/pagination behavior is absent.

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

Parameters3/5

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

Schema description coverage is 100% and there is only one optional parameter, so the schema fully documents the query filter (Persian title or English code). The description adds no parameter detail, which is acceptable at this coverage level but earns only the baseline.

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 gives a specific verb and resource ('List cities Snappfood serves') and names the returned fields (id, names, center coordinates), which cleanly separates it from reverse_geocode/find_location siblings. It stops short of explicitly naming an alternative tool, so it is clear but not maximally differentiated.

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

Usage Guidelines3/5

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

It provides one usage condition ('Use the center as a rough delivery point when the user only names a city'), which implies when the tool is useful, but it never states when to prefer a sibling like reverse_geocode or find_location. Guidance is present but partial.

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

market_categoriesGrocery categoriesA
Read-onlyIdempotent

List SnappMarket product categories and sub-categories with their ids.

The ids work as category_id / subcategory_id in market_store_products. Id 99999999 is the virtual kalabarg (government e-coupon) category.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds genuine extra context the annotations cannot: the special virtual kalabarg category id 99999999 and the downstream role of the returned ids. It says nothing about return shape or hierarchy, but with annotations carrying the behavioral profile that is a minor gap.

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

Conciseness5/5

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

Two short sentences with no filler: the core action first, then the integration detail and the one exceptional id. Nothing is repeated from the schema or annotations, and every sentence earns its place.

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

Completeness4/5

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

With no output schema, the description usefully summarizes the return value (categories and sub-categories plus ids) and flags the one special id, which is the kind of thing an agent would otherwise get wrong. It stops short of clarifying whether sub-categories are nested or returned as a flat list, but it is sufficient for a two-parameter, read-only reference tool.

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 lat/long are already documented as the delivery point and the schema documents the numeric bounds. The description adds no parameter-level detail and does not explain why a location is required to list categories. 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?

States a specific verb and resource ('List SnappMarket product categories and sub-categories with their ids') and names the sibling that consumes the output, market_store_products. An agent can distinguish this reference-data lookup from the search/cheapest/store tools in the market_* family 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 Guidelines3/5

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

The description explains what to do with the output ('The ids work as category_id / subcategory_id in market_store_products'), which implies the intended workflow, but it never states when to call this tool versus alternatives such as market_search or market_stores. Usage is implied rather than explicit, and no prerequisites or exclusions are given.

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

market_find_cheapestFind cheapest groceriesA
Read-onlyIdempotent

Find the cheapest in-stock offers for a grocery product near the point.

Use for the lowest price of an item. Scans open stores that deliver to the point; one flat list sorted by final price. Check delivery_fee and min_order before recommending a store.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
limitNoMax offers.
pagesNoPages to scan, 12 stores each.
queryYesProduct name, e.g. 'شیر کم چرب'.

TDQS

A3.7/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), and the description usefully adds behavioral detail beyond them: it scans only open stores that deliver to the point, returns a single flat list sorted by final price, and flags delivery_fee/min_order as requester-side checks. With no output schema, this return-shape disclosure carries real value.

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 short sentences, front-loaded with the core purpose and free of filler. Minor slack in 'near the point' phrasing, but nothing that wastes the agent's attention.

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

Completeness4/5

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

With no output schema and 5 parameters, the description fills the most important gap by describing the return (a flat list sorted by final price) and the post-call checks. It does not explain what limit/pages trade off against latency, but the schema bounds make that largely inferable.

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 lat/long/query/limit/pages are already documented in the schema itself. The description gestures at 'near the point' and 'grocery product' but adds no format, unit, or constraint detail beyond what the schema states; 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 ('Find the cheapest in-stock offers for a grocery product') plus the geographic scope ('near the point'). It distinguishes itself implicitly from the near-identical sibling food_find_cheapest via the 'grocery' framing, but never names that sibling, so the differentiation is left to inference.

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

Usage Guidelines3/5

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

'Use for the lowest price of an item' states the intended context, and the closing note on checking delivery_fee/min_order is a useful invocation guideline. However, with food_find_cheapest sitting in the sibling list, the absence of any explicit when-not-to-use or alternative-tool routing is a real gap.

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

market_party_dealsGrocery party dealsA
Read-onlyIdempotent

List current SnappMarket "market party" flash deals near the point, biggest discount first.

Use for the best grocery discounts right now. An order may hold at most capacity_per_order deal items; segment 'new_user' deals are for new customers only.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
limitNoMax deals.

TDQS

A4.1/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, openWorld). Description adds valuable beyond-annotation context: sorting is by biggest discount, and critically the business rules about capacity_per_order limit and 'new_user' segment restrictions. Does not describe pagination or return format, but annotations lower the bar.

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 sentences, front-loaded with the primary purpose. No wasted words, though the last sentence packs two separate business rules (capacity_per_order and new_user segment) which could be split for clarity.

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?

Complete for a read-only list tool: purpose, scope, sorting, and key business constraints are present. An agent knows what it gets and the ordering. Missing only pagination details or a sample return structure, which is acceptable given no output schema.

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 lat/long/limit are fully documented in the schema including ranges. The description adds no new parameter syntax or format detail beyond referencing 'the point' for location. Baseline 3 applies when 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 (List) and resource (SnappMarket market party flash deals), plus scope (near the point) and ordering (biggest discount first). Distinguishes itself from siblings like market_search and market_find_cheapest which lack the deal semantics.

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 says 'Use for the best grocery discounts right now' which gives clear context. However it doesn't name alternative tools like food_party_deals or market_find_cheapest as alternatives, nor when-not to use it.

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

market_productGrocery product detailsA
Read-onlyIdempotent

Get one product's details and price in one store.

Use to confirm the current price of an item the user picked.

ParametersJSON Schema
NameRequiredDescriptionDefault
full_textNoReturn the description uncut (default cut to 400 chars).
product_idYesProduct id from a market_* list.
vendor_codeYesStore code from market_search / market_stores, e.g. '32xxwe'.

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, non-destructive and openWorld, so the safety profile is covered. The description adds only the per-store scoping nuance ('in one store'), and says nothing about rate limits, auth, or what the truncated default response looks like.

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

Conciseness5/5

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

Two short sentences, zero waste, with the core action front-loaded before the usage hint. Nothing redundant or padded.

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

Completeness4/5

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

For a simple read-only lookup with fully documented parameters and no output schema, 'details and price' adequately signals the return content. A brief note on what 'details' includes (or the 400-char truncation default) would make it complete, but the essentials for correct invocation are present.

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 product_id, vendor_code and full_text are fully documented in the schema. The description's 'one product's details and price in one store' loosely reinforces the two required identifiers but adds no format or constraint detail beyond the schema. Baseline 3.

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?

Specific verb and resource: 'Get one product's details and price in one store.' This clearly separates it from list-style siblings like market_store_products or market_search by scoping to a single product. It stops short of naming a sibling explicitly, so it doesn't reach a 5.

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

Usage Guidelines3/5

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

'Use to confirm the current price of an item the user picked' gives a concrete usage context, which is better than nothing. However it offers no when-not guidance or routing to alternatives such as market_find_cheapest or market_search when the product id is unknown.

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

market_reviewsGrocery store reviewsA
Read-onlyIdempotent

Read a store's 30 most relevant customer comments, rating 0-5.

Use as a quality check before recommending a store. No paging: the API returns the same 30 comments.

ParametersJSON Schema
NameRequiredDescriptionDefault
full_textNoReturn comment text uncut (default cut to 400 chars).
vendor_codeYesStore code from market_search / market_stores, e.g. '32xxwe'.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare this a safe, idempotent read. The description adds genuinely new behavioral facts: the result set is capped at 30 comments, there is no paging, and repeated calls return the same set — all useful for deciding whether the tool is worth calling.

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, with the core operation front-loaded ahead of the usage hint. The trailing 'rating 0-5' phrase is slightly ambiguous (rating field range vs. overall score) but costs little.

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 responsibly describes the return shape (30 comments with ratings) and the fixed result-set behavior. An agent has enough to call it and interpret results, though the rating-range phrasing could be clearer.

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 parameters are fully documented in the schema. The description adds only the rating scale (0-5) and the 30-comment cap, which does not materially extend what the schema already conveys.

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 states a specific verb and resource ('Read a store's 30 most relevant customer comments'), which is far more precise than the title alone. It implicitly separates itself from food_reviews by scoping to stores, but never names that sibling to make the distinction explicit.

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 as a quality check before recommending a store' gives a concrete decision context for invoking the tool. It offers no exclusions or comparison against the restaurant-review sibling, so it falls short of full when/when-not guidance.

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

market_store_infoGrocery store detailsA
Read-onlyIdempotent

Get one store's delivery fee, minimum order, opening hours, rating and coupons for the point.

Use before recommending a store. Basket cost = sum(final prices) + delivery_fee - coupon, and it must reach min_order. Read each coupon's conditions; is_applicable is false when logged out.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
vendor_codeYesStore code from market_search / market_stores, e.g. '32xxwe'.

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, openWorld and non-destructive, so safety is covered; the description still adds real behavioral context beyond them. Specifically it warns that coupons carry conditions and that is_applicable returns false when logged out, plus that results are point-dependent. That is meaningful disclosure on top of the annotations.

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

Conciseness4/5

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

Front-loaded with the payload enumeration, then usage, then caveats — a sensible ordering with no filler. The basket-cost formula sentence is useful for interpreting delivery_fee and min_order, though it is slightly tangential since this tool does not compute baskets itself.

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 takes on the burden of describing returns and does so by naming the key fields. Read-only/idempotent semantics are covered by annotations, and the logged-out coupon caveat closes the main behavioral gap. Only minor omissions remain (no mention of failure behavior for an invalid vendor_code).

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%, including the vendor_code pattern and its sourcing from market_search / market_stores, so the schema carries the parameter burden. The description only hints at the geo scope via 'for the point' and adds no format or sourcing detail beyond what is already documented. Baseline 3 is appropriate.

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

Purpose5/5

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

States a specific verb and resource (get one store) and enumerates exactly what is returned: delivery fee, minimum order, opening hours, rating and coupons. The scope qualifier 'for the point' plus 'one store's' cleanly separates it from list-oriented siblings like market_stores and market_search. An agent can tell what this tool yields 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?

'Use before recommending a store' gives a concrete when-to-use context, which is more than most siblings offer. It does not name an alternative or a when-not condition (e.g., vs. market_store_products or market_reviews), so it stops short of full routing guidance.

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

market_store_productsBrowse a grocery storeA
Read-onlyIdempotent

Browse or search the products of one store.

  • query: search the store (wins over category ids).

  • category_id (+ optional subcategory_id): that category's products.

  • neither: the store's categories and sub-categories with ids.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
pageNoPage, from 0.
queryNoSearch inside this store, e.g. 'ماست'.
category_idNoTop-level category id (from this tool without arguments).
vendor_codeYesStore code from market_search / market_stores, e.g. '32xxwe'.
subcategory_idNoSub-category id; needs category_id.

TDQS

A4.1/5.0
Behavior4/5

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

Annotations already cover readOnly/idempotent/non-destructive/open-world, so the description only needs to add mode semantics — and it does, disclosing the surprising no-argument behavior (returns the store's categories and sub-categories) and the query-vs-category precedence rule. Pagination and result 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.

Conciseness5/5

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

One lead sentence plus three short bullets, front-loaded with the tool's identity and then the argument branches. No filler, no repetition of schema text.

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 read tool with no output schema and full annotation coverage, the mode behavior and precedence rules are the critical missing pieces and they are present. The absence of any hint about result shape or page semantics leaves a small gap.

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 description coverage, the schema already documents each parameter, so 3 is the baseline. The description earns an increment by documenting cross-parameter relationships the schema cannot express: query overriding category_id and subcategory_id requiring category_id.

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 with explicit scope ('Browse or search the products of one store'), and the three bullets clarify the distinct output modes. It does not, however, address overlap with siblings like market_categories or market_stores, which the no-argument mode partially duplicates.

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 bullets give concrete conditions per argument combination and even resolve precedence ('query ... wins over category ids'), so an agent knows how to choose. There is no explicit when-not or naming of alternative tools (e.g. market_categories for category listing), which keeps it below a 5.

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

market_storesList grocery storesA
Read-onlyIdempotent

List SnappMarket stores delivering to the point, with delivery fee, minimum order and rating.

Use to pick a store before browsing it with market_store_products.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.
pageNoPage, from 0.
sortNoOrder of the stores.lowest_delivery_price

TDQS

A4/5.0
Behavior3/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 the safety profile is covered. The description adds that results are geo-scoped to a delivery point and discloses the surfaced fields, which is useful, but it says nothing about pagination behavior, result caps, or what happens when no store delivers to a point.

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 sentences, zero filler. The capability statement comes first and the routing guidance second, so the agent gets the essential information immediately.

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

Completeness4/5

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

No output schema exists, and the description compensates by naming the key returned fields (delivery fee, minimum order, rating). Combined with the fully documented input schema, an agent has enough to call it correctly; only edge-case and pagination behavior is unaddressed.

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 lat, long, page and sort are already documented with ranges and enum values. The description only hints at the geo requirement ('delivering to the point') and the rating/fee fields that sort operates on, adding little beyond the schema. Baseline 3 applies.

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

Purpose5/5

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

States a specific verb (List) and resource (SnappMarket stores) plus the scope qualifier (delivering to the point) and names what it returns (delivery fee, minimum order, rating). It also names the sibling market_store_products, so an agent can distinguish it without inspecting schemas.

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 gives the use case: 'Use to pick a store before browsing it with market_store_products,' which establishes a clear ordering relative to that sibling. It stops short of excluding the other plausible alternatives (market_search, market_find_cheapest, market_store_info), so 4 rather than 5.

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

reverse_geocodeDescribe coordinatesA
Read-onlyIdempotent

Describe coordinates in words (point of interest, street, neighbourhood).

Use to confirm a delivery point with the user before searching.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesDelivery point latitude.
longYesDelivery point longitude.

TDQS

A3.8/5.0
Behavior3/5

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

The annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false. The description adds output examples and a workflow context, but it does not add deeper behavioral details such as precision, coordinate system, error handling, or rate limits.

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 are front-loaded with the core action and immediately followed by the intended workflow. There is no filler or repetition.

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

Completeness4/5

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

For a simple two-parameter read-only tool with rich schema coverage and safety annotations, the description is nearly sufficient. It gives output examples and a use case, though it does not explain what happens when coordinates fall outside a serviceable area.

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 lat and long are already documented as delivery point coordinates with bounds. The description does not add syntax, format, or precision details beyond the schema, 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?

The description states a specific verb and resource: 'Describe coordinates in words', with examples of the kind of textual output produced. It is clear what the tool does, but it does not explicitly distinguish itself from siblings such as find_location or list_cities.

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 second sentence gives a clear intended use case: 'confirm a delivery point with the user before searching.' It lacks explicit when-not-to-use guidance or named alternatives, so it falls short of a 5.

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

Tool Schema Changelog

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

  1. 21 tool updatesv0.2.0
    • Changedfind_location9 fields changed
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / near_lat / description
        Previous value: -"Bias results toward this latitude (e.g. a city center from list_cities)."New value: +"Bias latitude (e.g. a city center from list_cities)."
      • removedInput schema / properties / near_lat / title
        Removed value: -"Near Lat"
      • changedInput schema / properties / near_long / description
        Previous value: -"Bias results toward this longitude."New value: +"Bias longitude."
      • removedInput schema / properties / near_long / title
        Removed value: -"Near Long"
      • changedInput schema / properties / query / description
        Previous value: -"Place, street, landmark or neighbourhood, Persian works best, e.g. 'میدان ونک'."New value: +"Place, street or landmark, e.g. 'میدان ونک'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"find_locationArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "find_locationDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_discounted_vendors6 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • removedInput schema / title
        Removed value: -"food_discounted_vendorsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_discounted_vendorsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_find_cheapest13 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Max dishes to return."New value: +"Max dishes."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / max_restaurants / description
        Previous value: -"How many open restaurants' menus to scan (more = slower, more complete)."New value: +"Open restaurants' menus to scan (more = slower)."
      • removedInput schema / properties / max_restaurants / title
        Removed value: -"Max Restaurants"
      • changedInput schema / properties / query / description
        Previous value: -"Dish or food word, Persian works best, e.g. 'پیتزا', 'کباب'."New value: +"Dish word, e.g. 'پیتزا'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"food_find_cheapestArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_find_cheapestDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_meal_for_one11 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -30New value: +15
      • changedInput schema / properties / limit / description
        Previous value: -"Max meals to return."New value: +"Max meals."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / max_price / description
        Previous value: -"Only meals at or under this final price, Toman."New value: +"Max final price, Toman."
      • removedInput schema / properties / max_price / title
        Removed value: -"Max Price"
      • removedInput schema / title
        Removed value: -"food_meal_for_oneArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_meal_for_oneDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_menu13 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -100New value: +30
      • changedInput schema / properties / limit / description
        Previous value: -"Max items to return."New value: +"Max items."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / query / description
        Previous value: -"Only items whose title contains this text."New value: +"Only items whose title contains this."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / vendor_code / description
        Previous value: -"Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants)."New value: +"Vendor code, e.g. '947evd' (from food_search / food_restaurants)."
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"food_menuArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_menuDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_order_costs8 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / vendor_code / description
        Previous value: -"Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants)."New value: +"Vendor code, e.g. '947evd' (from food_search / food_restaurants)."
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"food_order_costsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_order_costsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_party_deals12 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -30New value: +15
      • changedInput schema / properties / limit / description
        Previous value: -"Max deals to return."New value: +"Max deals."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / query / description
        Previous value: -"Only deals whose dish title contains this text."New value: +"Only deals whose title contains this."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"food_party_dealsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_party_dealsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_restaurants20 fields changed
      • changedInput schema / properties / free_delivery / description
        Previous value: -"Only restaurants with free delivery."New value: +"Free delivery only."
      • removedInput schema / properties / free_delivery / title
        Removed value: -"Free Delivery"
      • changedInput schema / properties / has_coupon / description
        Previous value: -"Only restaurants offering a coupon."New value: +"With a coupon only."
      • removedInput schema / properties / has_coupon / title
        Removed value: -"Has Coupon"
      • changedInput schema / properties / has_discount / description
        Previous value: -"Only restaurants running a discount."New value: +"Discounted only."
      • removedInput schema / properties / has_discount / title
        Removed value: -"Has Discount"
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / open_only / description
        Previous value: -"Hide restaurants that are closed or don't deliver here."New value: +"Hide closed or non-delivering restaurants."
      • removedInput schema / properties / open_only / title
        Removed value: -"Open Only"
      • changedInput schema / properties / page / description
        Previous value: -"Zero-based page of 20 restaurants."New value: +"Page of 20, from 0."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / query / description
        Previous value: -"Filter by restaurant name, e.g. 'پیتزا' or a brand name."New value: +"Restaurant name filter, e.g. 'پیتزا'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / sort / description
        Previous value: -"Order; least_expensive/most_expensive rank by price class, not delivery fee."New value: +"Order; *_expensive rank by price class, not delivery fee."
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"food_restaurantsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_restaurantsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_reviews7 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return review and reply text uncut (default cut to 400 chars).",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / page / description
        Previous value: -"Zero-based page of 10 reviews, newest first."New value: +"Page of 10, newest first, from 0."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / vendor_code / description
        Previous value: -"Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants)."New value: +"Vendor code, e.g. '947evd' (from food_search / food_restaurants)."
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"food_reviewsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_reviewsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedfood_search15 fields changed
      • removedInput schema / properties / discounted_only / title
        Removed value: -"Discounted Only"
      • changedInput schema / properties / include_protein / description
        Previous value: -"Also search protein stores (butchers, poultry, eggs), which are hidden by default."New value: +"Also search protein stores (butchers, eggs), hidden by default."
      • removedInput schema / properties / include_protein / title
        Removed value: -"Include Protein"
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Max dishes to return."New value: +"Max dishes."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / query / description
        Previous value: -"Dish or food word, Persian works best, e.g. 'پیتزا', 'کباب'."New value: +"Dish word, e.g. 'پیتزا'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"food_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "food_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedlist_cities4 fields changed
      • changedInput schema / properties / query / description
        Previous value: -"Optional filter on the Persian title or English code, e.g. 'شیراز' or 'Shiraz'."New value: +"Filter on Persian title or English code, e.g. 'شیراز'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"list_citiesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "list_citiesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_categories6 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • removedInput schema / title
        Removed value: -"market_categoriesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_categoriesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_find_cheapest13 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +10
      • changedInput schema / properties / limit / description
        Previous value: -"Max offers to return."New value: +"Max offers."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / pages / description
        Previous value: -"Search pages to scan, 12 stores each."New value: +"Pages to scan, 12 stores each."
      • removedInput schema / properties / pages / title
        Removed value: -"Pages"
      • changedInput schema / properties / query / description
        Previous value: -"Product name, Persian works best, e.g. 'شیر کم چرب'."New value: +"Product name, e.g. 'شیر کم چرب'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"market_find_cheapestArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_find_cheapestDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_party_deals9 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -30New value: +15
      • changedInput schema / properties / limit / description
        Previous value: -"Max deals to return."New value: +"Max deals."
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • removedInput schema / title
        Removed value: -"market_party_dealsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_party_dealsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_product6 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return the description uncut (default cut to 400 chars).",
        +  "type": "boolean"
        +}
      • changedInput schema / properties / product_id / description
        Previous value: -"Product id from a market_* product list."New value: +"Product id from a market_* list."
      • removedInput schema / properties / product_id / title
        Removed value: -"Product Id"
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"market_productArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_productDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_reviews4 fields changed
      • addedInput schema / properties / full_text
        Added value: +{
        +  "default": false,
        +  "description": "Return comment text uncut (default cut to 400 chars).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"market_reviewsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_reviewsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_search12 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / limit / default
        Previous value: -20New value: +8
      • removedInput schema / properties / limit / title
        Removed value: -"Limit"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / page / description
        Previous value: -"Page number, from 0."New value: +"Page, from 0."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / query / description
        Previous value: -"Product name, Persian works best, e.g. 'شیر' or 'ماست کاله'."New value: +"Product name, e.g. 'شیر'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • removedInput schema / title
        Removed value: -"market_searchArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_searchDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_store_info7 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"market_store_infoArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_store_infoDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_store_products15 fields changed
      • changedInput schema / properties / category_id / description
        Previous value: -"Top-level category id (from this tool without arguments, or market_categories)."New value: +"Top-level category id (from this tool without arguments)."
      • removedInput schema / properties / category_id / title
        Removed value: -"Category Id"
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / page / description
        Previous value: -"Page number, from 0."New value: +"Page, from 0."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • changedInput schema / properties / query / description
        Previous value: -"Search text inside this store, e.g. 'ماست'."New value: +"Search inside this store, e.g. 'ماست'."
      • removedInput schema / properties / query / title
        Removed value: -"Query"
      • changedInput schema / properties / subcategory_id / description
        Previous value: -"Sub-category id; needs its parent category_id."New value: +"Sub-category id; needs category_id."
      • removedInput schema / properties / subcategory_id / title
        Removed value: -"Subcategory Id"
      • removedInput schema / properties / vendor_code / title
        Removed value: -"Vendor Code"
      • removedInput schema / title
        Removed value: -"market_store_productsArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_store_productsDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedmarket_stores9 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • changedInput schema / properties / page / description
        Previous value: -"Page number, from 0."New value: +"Page, from 0."
      • removedInput schema / properties / page / title
        Removed value: -"Page"
      • removedInput schema / properties / sort / title
        Removed value: -"Sort"
      • removedInput schema / title
        Removed value: -"market_storesArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "market_storesDictOutput",
        -  "type": "object"
        -}New value: +null
    • Changedreverse_geocode6 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude."
      • removedInput schema / properties / lat / title
        Removed value: -"Lat"
      • changedInput schema / properties / long / description
        Previous value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude."
      • removedInput schema / properties / long / title
        Removed value: -"Long"
      • removedInput schema / title
        Removed value: -"reverse_geocodeArguments"
      • changedOutput schema / (root)
        Previous value: -{
        -  "additionalProperties": true,
        -  "title": "reverse_geocodeDictOutput",
        -  "type": "object"
        -}New value: +null
  2. 21 tool updatesv0.1.1
    • First observedfind_location
    • First observedfood_discounted_vendors
    • First observedfood_find_cheapest
    • First observedfood_meal_for_one
    • First observedfood_menu
    • First observedfood_order_costs
    • First observedfood_party_deals
    • First observedfood_restaurants
    • First observedfood_reviews
    • First observedfood_search
    • First observedlist_cities
    • First observedmarket_categories
    • First observedmarket_find_cheapest
    • First observedmarket_party_deals
    • First observedmarket_product
    • First observedmarket_reviews
    • First observedmarket_search
    • First observedmarket_store_info
    • First observedmarket_store_products
    • First observedmarket_stores
    • First observedreverse_geocode

TDQS

A3.9/5.0

Scored across 21 tools

Disambiguation4/5

The paired tools food_search/food_find_cheapest and market_search/market_find_cheapest are the closest sources of confusion, but the descriptions explicitly differentiate them (fast relevance search vs. ranked cheapest) and cross-reference each other. The food_ vs market_ domains and the store-level vs product-level vs menu-level split keep most tools cleanly separable. Only minor overlap remains (e.g., food_discounted_vendors vs food_party_deals).

Naming Consistency4/5

The dominant pattern is consistent domain-prefixed snake_case (food_*, market_*) which is easy to scan. The location helpers (reverse_geocode, find_location, list_cities) break the prefix scheme and mix verb+noun (food_search, market_find_cheapest) with bare nouns (food_menu, market_stores), a minor inconsistency.

Tool Count3/5

21 tools is on the heavy side for the domain burden, since discovery features (search, find_cheapest, listings, reviews, deals) are essentially mirrored once for food and once for market. Each tool does earn its place and none are redundant, but the set sits in the borderline 16-25 range.

Completeness4/5

For a discovery/recommendation surface the coverage is strong: location resolution, city lookup, food search/menu/costs/reviews/deals, and market stores/products/categories/reviews are all present. The apparent gap is ordering/cart/checkout, though the descriptions suggest the server is intentionally scoped to search and comparison.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    C
    quality
    B
    maintenance
    Enables AI clients to search, fetch and cross-compare products, prices, sellers, offers, availability and specifications between Digikala and SnappShop, with tools for finding the best price or best-value offer using explicit filters and explainable reasoning. It also supports remote Streamable HTTP deployment so the same capabilities can be registered as a custom connector in clients such as Grok.
    11
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables an AI assistant to browse restaurants and menus, manage a cart, reorder past orders, review checkout details, and place food delivery orders, returning a payment link to complete payment.
    13
    MIT