snapp-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@snapp-mcpCheapest pizza delivered to Vanak Square, delivery included?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
🍕 snapp-mcp
Let your AI agent shop around on Snappfood and SnappMarket. 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.
Quick start · What it can do · Tools · FAQ · فارسی
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.
Related MCP server: Yandex Eats MCP
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-mcpSettings → 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 groceriessnapp-mcp runs locally and calls the same public endpoints the Snappfood and SnappMarket web apps use.
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 |
| Address, landmark or street → coordinates |
| Coordinates → street / neighbourhood names |
| Every served city with its center point |
Tool | What it does |
| Search dishes by name; price sorts are re-checked against live menus |
| Scan nearby menus + FoodParty for the lowest total price (food + packaging + delivery) |
| Restaurants with filters (free delivery, discount, coupon) and sorting |
| One restaurant's full menu with prices, packaging fees and availability |
| Delivery fee, ETA, minimum order and coupons of one restaurant |
| Customer reviews, with what they ordered and the restaurant's reply |
| FoodParty flash deals still in stock, with the deal window |
| Single-person meals up to 299k Toman with free delivery |
| Restaurants running discounts now, plus live Gem deals |
Tool | What it does |
| Search a product across stores, grouped by store |
| Cheapest in-stock offers for a product, one flat list |
| Stores delivering to a point, by delivery fee or rating |
| Delivery fee, minimum order, opening hours and coupons of a store |
| Search inside a store, or browse it by category |
| Product categories and their ids |
| One product's details and price in a store |
| Market Party flash deals, biggest discount first |
| Customer comments on a store |
All tools are annotated readOnlyHint: true and return compact structured JSON, so they don't flood the agent's context.
Good to know
Prices are in Toman (1 Toman = 10 Rial). Ratings are normalized to 0–5, like the apps;
nullmeans not rated yet.True cost of a food order = price − discount + packaging + delivery − coupon, and the basket must reach the restaurant's minimum order.
food_find_cheapestandfood_order_costsgive the agent every piece of that.Persian queries match best (
پیتزا,کباب,شیر). Name filters treat Arabic ي/ك and half-space vs space as equal.
FAQ
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. 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-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
فارسی
snapp-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 pytest # offline, against recorded responses
uv run 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
Available Tools
21 toolsfind_locationFind locationARead-onlyIdempotent
Turn a place name or address into latitude/longitude.
Use first when the user gives an address instead of coordinates; every food_* and market_* tool needs lat/long. Results are biased toward near_lat/near_long (default Tehran), so pass a city center for other cities.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max places to return. | |
| query | Yes | Place, street, landmark or neighbourhood, Persian works best, e.g. 'میدان ونک'. | |
| near_lat | No | Bias results toward this latitude (e.g. a city center from list_cities). | |
| near_long | No | Bias results toward this longitude. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: results are geographically biased toward near_lat/near_long and default to Tehran, which is a ranking quirk an agent must know. It doesn't discuss result count/pagination, but the output schema presumably handles returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: purpose, ordering rule, and geobias caveat. The most decision-relevant instruction ('use first') is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and rich annotations, the description only needs to add routing and behavior context, which it does fully. An agent knows when to call it, what it returns conceptually, and the bias caveat.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description contributes meaning the schema does not: the schema lists near_lat/near_long defaults as null while the description reveals the effective default bias is Tehran. That is genuine added semantics for the geobias parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise transformation ('place name or address into latitude/longitude') with a clear verb and resource. It is implicitly differentiated from the inverse sibling reverse_geocode and from the food_*/market_* consumers that require its output.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ('Use first when the user gives an address instead of coordinates') and explains the downstream dependency ('every food_* and market_* tool needs lat/long'). It also instructs to pass a city center for non-Tehran cities, covering the when-not default case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_discounted_vendorsDiscounted restaurantsARead-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; open food_menu for prices.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description adds genuinely new behavioral context by disclosing the conditional 'Gem' hunt discount that may or may not be live, and by clarifying the result granularity is vendor-level.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, zero filler. The primary purpose is front-loaded and the boundary/alternative note comes after, which is the right ordering.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present the description needn't explain return values, and annotations cover safety. The remaining gap is minor: it does not hint at how many vendors come back or any pagination/limit behavior, but nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both lat/long carry inline ranges and Iran-specific bounds, so the schema does the heavy lifting. The description adds no syntax or format detail about the coordinates beyond what is already there, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List restaurants running a discount now') and adds scope boundaries: vendor-level only, with food_menu named as the place for prices. An agent can distinguish it from food_search, food_restaurants and food_menu without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger phrase ('which restaurants have offers') and routes a related need to the alternative tool (food_menu for prices). It stops short of stating exclusions or prerequisites, but the alternative routing is clear.
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 dishARead-onlyIdempotent
Find the cheapest way to get a dish: scans menus of nearby open restaurants plus FoodParty deals.
Use when the user wants the lowest total price for X. Ranks by total = food price after discount + packaging + delivery fee; check min_order, since a cheap dish may not reach the restaurant's minimum basket. Slower than food_search.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| limit | No | Max dishes to return. | |
| query | Yes | Dish or food word, Persian works best, e.g. 'پیتزا', 'کباب'. | |
| max_restaurants | No | How many open restaurants' menus to scan (more = slower, more complete). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare this is a read-only, idempotent, non-destructive, open-world read, so safety is covered. The description adds genuine value beyond that: the ranking formula (food after discount + packaging + delivery), the min_order caveat, and the relative slowness 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and scoping, then usage and the pricing caveat. No filler; minor room to tighten the ranking/caveat sentence but it earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value explanation isn't needed. The description covers purpose, trigger condition, ranking semantics, the min_order pitfall, and sibling routing, which is everything an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so lat/long/query/limit/max_restaurants are all documented in the schema. The description adds conceptual context (total price components, min_order) but no parameter-specific syntax or format beyond what the schema already provides, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find the cheapest) and resource (a dish via restaurant menus + FoodParty deals), and explicitly contrasts itself with the sibling food_search. An agent can distinguish it from food_search without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use when the user wants the lowest total price for X" gives clear usage context, and "Slower than food_search" signals the alternative and trade-off. It stops short of an explicit when-not rule, but the cost/speed trade-off effectively routes the agent.
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 oneARead-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 restaurant's minimum basket on its own.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| limit | No | Max meals to return. | |
| max_price | No | Only meals at or under this final price, Toman. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely non-structured behavior: the fixed 299k/free-delivery scope, the cheapest-first ordering, and the min_order caveat that a cheap meal may not meet a restaurant's basket minimum.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the scope and constraint, then the trigger phrase, then the caveat – three short units with no filler. The line breaks are slightly awkward formatting but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the annotations cover safety. Given the simplicity of a 4-param, non-nested read tool, the description supplies the scope, ordering, and caveat an agent needs; only sibling-relative routing is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so lat/long bounds, limit, and max_price are already fully documented in the input schema. The description's 'at most 299k Toman' is a fixed scope cap rather than an explanation of the max_price parameter, so it adds little parameter meaning beyond the schema baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (single-person meals) with concrete qualifiers: at most 299k Toman, free delivery, cheapest first. It does not name or differentiate from close siblings like food_find_cheapest or food_menu, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly gives the triggering intent ('Use for "cheap meal for one"') and adds a real caveat about min_order that affects whether results are usable. It stops short of naming alternative tools or stating when-not to use it, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_order_costsOrder costsARead-onlyIdempotent
Get the extra costs and conditions of ordering from one restaurant.
Use before recommending a restaurant: delivery fee and ETA here, minimum order, and coupons (each with the basket total it needs and whether it is first-order only). Per-item packaging fees are in food_menu.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| vendor_code | Yes | Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is lower. The description adds real behavioral context about what the operation surfaces: delivery fee and ETA, minimum order, and coupon semantics including the required basket total and first-order-only constraints. It doesn't disclose failure modes (e.g. unsupported coordinates/vendor), but that is a minor gap given annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first sentence, usage guidance follows, and the closing cross-reference to food_menu prevents double-fetching. Every sentence carries information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description still summarizes the key response contents and coupon logic. It supplies usage timing and a sibling cross-reference. Slightly short of 5 only because it omits any note on error/edge conditions for out-of-range coordinates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents vendor_code, lat, and long, including the vendor-code origin. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb ('Get') plus precise resource ('the extra costs and conditions of ordering from one restaurant') with clearly enumerated scope: delivery fee, ETA, minimum order, coupons. It also distinguishes itself from the sibling food_menu by noting that per-item packaging fees live there, so an agent can tell the two apart without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before recommending a restaurant' gives an explicit trigger condition, which is strong. It also names food_menu as the complementary source for packaging fees. It stops short of stating when NOT to use it or naming a full alternative for the cost-comparison task (e.g. food_find_cheapest), so it falls just short of 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_party_dealsFoodParty dealsARead-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 the window (starts/ends); outside it the list is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| sort | No | Order of the deals. | biggest_discount |
| limit | No | Max deals to return. | |
| query | No | Only deals whose dish title contains this text. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, open-world, non-destructive), so the bar is lower. The description nonetheless adds non-obvious behavior: deals are constrained to a time window and the list is empty outside it, plus limited-stock framing. Return format is not described, but an output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, the resource and scope front-loaded, followed by the usage trigger and the key edge case. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers what the tool returns and the empty-outside-window edge case. It doesn't note the required lat/long or the Iran-bounded coordinate semantics, but the schema handles those.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (lat, long, sort, limit, query) are already documented in the schema. The description adds no syntax, format, or defaulting detail beyond that, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('List today's FoodParty flash deals') and qualifies scope with 'deep discounts, limited stock, time window'. It is clear but does not distinguish itself from close siblings like food_discounted_vendors or market_party_deals, leaving the agent to infer the difference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use for "what's on a big discount right now"' gives a concrete situational trigger, which is real guidance. However, it names no alternative tool and no when-not condition, so an agent choosing between this and food_discounted_vendors gets no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_restaurantsList restaurantsARead-onlyIdempotent
List restaurants delivering to a point, with rating, delivery fee, ETA and coupon info.
Use to browse or rank restaurants (best rated, free delivery, with discount) or to find a restaurant's vendor code by name. No dish prices: use food_menu for those.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| page | No | Zero-based page of 20 restaurants. | |
| sort | No | Order; least_expensive/most_expensive rank by price class, not delivery fee. | default |
| query | No | Filter by restaurant name, e.g. 'پیتزا' or a brand name. | |
| open_only | No | Hide restaurants that are closed or don't deliver here. | |
| has_coupon | No | Only restaurants offering a coupon. | |
| has_discount | No | Only restaurants running a discount. | |
| free_delivery | No | Only restaurants with free delivery. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety and idempotency are covered. The description adds the scoping note that dish prices are absent and that vendor codes come from this call, but gives no auth, rate-limit, or pagination depth beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded purpose sentence followed by a compact usage block; every sentence earns its place and there is no filler. Slightly longer than strictly necessary but well organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value details are legitimately omitted. For a nine-parameter read-only listing tool the description covers purpose, usage, and the menu-vs-listing boundary, leaving only minor behavioral specifics unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all nine parameters are already documented in the schema. The description only hints at the sort/filter dimensions through prose ('best rated, free delivery, with discount') without adding syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List restaurants') and enriches it with the delivered-to-a-point scope plus rating, delivery fee, ETA and coupon content. It differentiates from food_menu by explicitly excluding dish prices, though it doesn't name the full sibling set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it – browsing or ranking (best rated, free delivery, with discount) or finding a vendor code by name – and names the alternative for a related need ('No dish prices: use food_menu for those'). The condition selecting each path is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_reviewsRestaurant reviewsARead-onlyIdempotent
Read recent customer reviews of a restaurant (rating, text, what they ordered, vendor reply).
Use to judge quality, delays or packaging before recommending a restaurant.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Zero-based page of 10 reviews, newest first. | |
| vendor_code | Yes | Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and openWorldHint, so the safety profile is covered. The description adds the 'newest first' framing and the shape of a review, but says nothing about refresh cadence, moderation, or vendor-reply availability that would be novel beyond the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the purpose up front and the usage note second. The parenthetical field list ('rating, text, what they ordered, vendor reply') is mildly redundant given a dedicated output schema, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with full schema coverage, complete annotations and an output schema, the description covers what an agent needs: what is fetched and why to fetch it. No gap remains that would cause a mis-call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both parameters are fully documented in the schema, including the page size of 10 and the vendor_code format with its source tools. The description adds no parameter-level meaning beyond 'recent', so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read recent customer reviews of a restaurant') and lists the payload fields. The 'restaurant/vendor' scope implicitly separates it from market_reviews, though it never names that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete decision context: 'Use to judge quality, delays or packaging before recommending a restaurant.' That tells the agent when this tool is worth calling, but offers no exclusions or named alternatives when restaurant data is not what's needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
food_searchSearch dishesARead-onlyIdempotent
Search dishes by name near a delivery point, with price, discount and restaurant.
Use for "find X near me" or "discounted X". With sort=relevance it is one fast call on the search index; cheapest / biggest_discount also drop side items (sauces, drinks, extras) and confirm prices against the live menus. For the cheapest X across many restaurant menus use food_find_cheapest.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| sort | No | Order of the results. | relevance |
| limit | No | Max dishes to return. | |
| query | Yes | Dish or food word, Persian works best, e.g. 'پیتزا', 'کباب'. | |
| discounted_only | No | Only dishes with a discount. | |
| include_protein | No | Also search protein stores (butchers, poultry, eggs), which are hidden by default. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), yet the description still adds real behavior: sort=relevance is a single fast search-index call, while cheapest/biggest_discount drop side items and re-confirm prices against live menus, implying slower/fresher results. It stops short of stating index staleness or coverage trade-offs for relevance sort, or any rate/auth limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action and routing rule, followed by the sort-mode behavior and the alternative tool. No sentence is filler or restates a structured field.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present (no need to describe returns), full annotation coverage, and 100% parameter documentation, the description supplies everything else an agent needs: purpose, invocation triggers, sort trade-offs, and the sibling alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds genuine meaning to the sort parameter by explaining what each mode does to results (fast index lookup vs side-item filtering plus live price confirmation), which the schema's bare "Order of the results." does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) plus resource (dishes by name), scope (near a delivery point), and returned fields (price, discount, restaurant). It also explicitly differentiates from the sibling food_find_cheapest, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrases ("find X near me", "discounted X") and names the alternative (food_find_cheapest) with the exact condition that selects it (cheapest X across many restaurant menus). The when-to-use / when-to-use-something-else boundary is fully resolved.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_citiesList citiesARead-onlyIdempotent
List cities Snappfood serves, with id, names and center coordinates.
Use the center coordinates as a rough delivery point when the user only names a city.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Optional filter on the Persian title or English code, e.g. 'شیراز' or 'Shiraz'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a safe, idempotent read operation, so the description is not burdened with the safety profile. It adds meaningful context by disclosing the return fields (id, names, center coordinates) and a practical caveat about coordinate precision.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences front-load the core purpose and then add one actionable usage note. No filler or redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the low complexity, output schema, and rich annotations, the description is nearly complete. The main remaining gap is that it does not help the agent choose this tool over nearby location siblings such as find_location or reverse_geocode.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the only parameter (query) is fully documented in the schema with examples. The description adds no additional filtering syntax or behavior beyond what the schema already provides, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource (list cities) and scopes it to cities Snappfood serves, with the returned fields named. It is clear enough to distinguish from food/market tools, but it does not explicitly differentiate from location siblings like find_location or reverse_geocode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Adds a useful usage tip about treating center coordinates as a rough delivery point when the user only names a city. However, it gives no explicit when-to-use vs alternatives guidance and no exclusions relative to the many sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_categoriesGrocery categoriesARead-onlyIdempotent
List SnappMarket product categories and sub-categories with their ids.
The ids work as category_id / subcategory_id in market_store_products. The first entry (id 99999999) is the virtual kalabarg (government e-coupon eligible) category.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the full safety profile (readOnly, idempotent, non-destructive, open-world), so the bar is low. The description still adds real behavioral value by flagging the non-obvious virtual 'kalabarg' entry (id 99999999) that would otherwise look like a normal category, which is a genuine data caveat beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, purpose front-loaded, followed only by the two facts an agent actually needs (id reuse in market_store_products, the special kalabarg entry). No filler or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations cover the safety profile. The description supplies the one piece of domain knowledge that structured fields cannot (the magic id 99999999), making it complete for a two-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both lat and long are documented with type and valid ranges — so the schema carries this dimension. The description adds nothing about the parameters themselves; baseline 3 applies per the coverage rule.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'List SnappMarket product categories and sub-categories with their ids.' It also names the sibling that consumes the output ('The ids work as category_id / subcategory_id in market_store_products'), so an agent can place this tool in the workflow without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The cross-reference to market_store_products clearly signals the intended use: fetch ids here, then filter products there. That is strong contextual guidance, though it never explicitly says 'use this before market_store_products' or states when not to use it, and no alternative listing tool is named.
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 groceriesARead-onlyIdempotent
Find the cheapest in-stock offers for a grocery product near the point.
Use when the user wants the lowest price for an item. Scans the search results of open stores that deliver to the point and returns one flat list sorted by final price (price - discount). Check delivery_fee and min_order before recommending a store.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| limit | No | Max offers to return. | |
| pages | No | Search pages to scan, 12 stores each. | |
| query | Yes | Product name, Persian works best, e.g. 'شیر کم چرب'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, open-world), so the description's added value is the ranking definition ('sorted by final price (price - discount)') and the scan scope (search results of open stores that deliver to the point). The caveat about delivery_fee/min_order hints that those costs sit outside the ranking, which is genuinely useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action, then the trigger, then the ranking and a practical caveat. Every sentence carries information; nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required, and the description still usefully states the sort order. Combined with full schema coverage and annotations, the definition gives the agent what it needs to call the tool correctly; only the sibling boundary is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents lat/long/limit/pages/query including the Iran bounding boxes. The description only loosely gestures at 'near the point' and adds no syntax or format detail beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('find the cheapest in-stock offers for a grocery product near the point') with clear scope. It implies the grocery/market domain but never explicitly contrasts itself with the very similar sibling food_find_cheapest, leaving the agent to infer the boundary from the tool name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('Use when the user wants the lowest price for an item') plus a follow-up rule about checking delivery_fee and min_order before recommending. It stops short of naming alternatives such as market_search or food_find_cheapest, so the when-not condition is absent.
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 dealsARead-onlyIdempotent
List current SnappMarket "market party" flash deals near the point, biggest discount first.
Use when the user wants the best grocery discounts right now. Each order may contain at most capacity_per_order deal items. segment 'new_user' deals are only for new customers.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| limit | No | Max deals to return. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, open-world, non-destructive behavior. The description adds two useful operational constraints not in the annotations: capacity_per_order limits deal items per order, and segment 'new_user' deals are restricted to new customers. It does not mention return shape or pagination, but an output schema exists. Credit for the extra constraints, no more.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, front-loaded sentences with no filler. The first sentence carries purpose and ordering; the next two carry usage and constraint. It could be slightly tighter, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with a full schema and output schema, the description covers purpose, ordering, usage cue, and key purchase constraints. It lacks explicit sibling differentiation from food_party_deals, but otherwise contains what an agent needs to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so lat, long, and limit are already documented with ranges and defaults. The description adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (list) and resource (SnappMarket 'market party' flash deals), and notes the sort order (biggest discount first). It does not explicitly differentiate itself from the closest sibling food_party_deals, but the 'grocery' / 'SnappMarket' framing and 'market party' label give enough specificity that an agent can identify the correct vertical.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a when-to-use cue ('when the user wants the best grocery discounts right now') but no when-not-to-use and no named alternative. With food_party_deals present as a direct sibling, an agent would benefit from knowing which vertical to pick, and that routing is left implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_productGrocery product detailsARead-onlyIdempotent
Get one product's details and price in one store.
Use to confirm the current price/discount of an item the user picked.
| Name | Required | Description | Default |
|---|---|---|---|
| product_id | Yes | Product id from a market_* product list. | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, covering the safety profile. The description adds only the purpose and a use case, without extra behavioral context like rate limits, auth needs, or response characteristics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core action and followed by a usage note. No wasted words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, 100% schema coverage, rich annotations, and an existing output schema, the description covers the essential purpose and usage. It could be slightly more complete by mentioning sibling alternatives for routing, but nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents both parameters (product_id and vendor_code). The description adds no additional semantic detail beyond what the schema provides, which is the baseline for high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: 'Get one product's details and price in one store.' This clearly distinguishes it from list-oriented siblings like market_store_products, but does not explicitly name any alternative tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides a clear use case: 'Use to confirm the current price/discount of an item the user picked.' It does not mention when not to use it or suggest alternatives such as market_search or market_find_cheapest.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_reviewsGrocery store reviewsARead-onlyIdempotent
Read a store's 30 most relevant customer comments, rating 0-5.
Use as a quality check before recommending a store. The API returns the same 30 comments whatever the page, so there is no paging.
| Name | Required | Description | Default |
|---|---|---|---|
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly, idempotent, and non-destructive behavior, so the description only needs to add what structured fields cannot. It does that well by disclosing the fixed 30-comment result set and explicitly stating there is no paging, which prevents wasted paging calls. It does not mention ordering/recency semantics of 'most relevant' or failure behavior for an unknown code.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, both earning their place: the first defines the payload, the second gives the usage trigger, and the no-paging note closes the loop. Nothing redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-shape details are rightly omitted, and the description covers the calling caveats an agent actually needs: the fixed 30-item payload and the absence of paging. Complete for a single-parameter read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% – vendor_code has a pattern, an example, and a pointer to market_search / market_stores as its source. The description adds no parameter guidance, so the baseline 3 applies; the schema is doing all the work here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read a store's 30 most relevant customer comments') and even scopes it with a count and rating scale. It implicitly distinguishes itself from food_reviews by targeting stores rather than restaurants, but it does not name a sibling outright.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use as a quality check before recommending a store' gives a clear condition for reaching for this tool over store metadata tools. It stops short of naming alternatives (e.g. market_store_info for factual attributes vs reviews for sentiment) or stating 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_searchSearch groceriesARead-onlyIdempotent
Search a grocery product across all SnappMarket stores delivering to the point.
Use to see which stores carry an item and at what price. Returns stores (open or not) with up to ~5 matching products each. For a single flat cheapest-first list use market_find_cheapest instead.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| page | No | Page number, from 0. | |
| limit | No | Stores per page. | |
| query | Yes | Product name, Persian works best, e.g. 'شیر' or 'ماست کاله'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds real behavioral value that annotations cannot: results include closed stores and cap at ~5 matching products per store, which shapes how the agent should interpret and present output.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with the core action and scope, then result shape, then the routing alternative. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search with an output schema and 100% schema coverage, the description covers scope, result shape and sibling routing adequately. Pagination behavior across page/limit is left entirely to the schema, which is acceptable given the output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with lat/long ranges, Persian query guidance and page/limit constraints all documented in the schema. The description adds no parameter detail beyond what the schema already provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: search a grocery product across ALL SnappMarket stores delivering to a given point. It explicitly separates itself from the sibling market_find_cheapest, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a positive use case ('see which stores carry an item and at what price') and names the alternative tool with the condition that selects it ('for a single flat cheapest-first list use market_find_cheapest instead'). Explicit when-to-use and when-to-use-something-else.
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 detailsARead-onlyIdempotent
Get one store's delivery fee, minimum order, opening hours, rating and coupons for the point.
Use before recommending a store to know the true cost of a basket: sum(final prices) + delivery_fee - applicable coupon, and the basket must reach min_order. Read each coupon's conditions; isApplicable is false for logged-out users.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower, yet the description adds real behavioral context: the true-cost formula, the min_order requirement, and the logged-out caveat that 'isApplicable is false for logged-out users.' That logged-out behavior is a genuinely useful disclosure not present in the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded in the first sentence, followed by the practical cost formula and a caveat. It is compact and every line earns its place, though the multi-line formula fragment is slightly less tidy than a single clean paragraph.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained; the description covers purpose, when to use, the cost calculation, and a key behavioral caveat. Complete for an agent to call it correctly, with only minor room for naming alternatives.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so lat, long, and vendor_code are already fully documented in the schema, including ranges and the vendor_code pattern. The description adds no parameter-level syntax or format detail 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.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('one store's delivery fee, minimum order, opening hours, rating and coupons'), and the enumerations make the returned scope concrete. The 'one store's' framing distinguishes it from list-oriented siblings like market_stores and market_search without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use before recommending a store to know the true cost of a basket' gives an explicit usage context, reinforced by the cost formula and the min_order constraint. It stops short of naming alternative tools or stating when-not to use it, so it is clear context without 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 storeARead-onlyIdempotent
Browse or search the products of one store.
With query: search the store (takes precedence over category ids).
With category_id (and optional subcategory_id): list that category's products.
With neither: list the store's categories and sub-categories with their ids.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| page | No | Page number, from 0. | |
| query | No | Search text inside this store, e.g. 'ماست'. | |
| category_id | No | Top-level category id (from this tool without arguments, or market_categories). | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. | |
| subcategory_id | No | Sub-category id; needs its parent category_id. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/non-destructive, so the safety profile is covered. The description adds genuinely useful behavior beyond that: the no-argument fallback returns categories and sub-categories with their ids, and query overrides category filters. It does not discuss pagination beyond the schema's page param, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight bullets, front-loaded with the core purpose, then the branching logic in the order an agent would evaluate it. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 parameters fully documented in the schema and an output schema present, the description only needs to explain the invocation modes, which it does completely. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description contributes a semantic the schema does not encode: the precedence of query over category_id and the coupling of subcategory_id to its parent category_id. That is real added meaning beyond the field-level docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence gives a specific verb pair (browse/search) and a precise resource (products of one store), which cleanly separates it from siblings like market_product (single product), market_categories, and market_stores (store discovery). An agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description enumerates three mutually exclusive modes — query, category_id (+subcategory_id), or neither — and states precedence explicitly ('takes precedence over category ids'). This is exactly the when-to-use guidance an agent needs, with no inference required.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
market_storesList grocery storesARead-onlyIdempotent
List SnappMarket stores delivering to the point, with delivery fee, minimum order and rating.
Use to pick a store (cheapest delivery or best rated) before browsing it with market_store_products.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). | |
| page | No | Page number, from 0. | |
| sort | No | Order of the stores. | lowest_delivery_price |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so safety and mutability are covered. The description adds useful result-content context (fee, minimum order, rating) but says nothing about pagination behaviour despite a page parameter, leaving the behavioural picture only partially filled in beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the core action and scope front-loaded and the workflow guidance second. Nothing is redundant with the title or annotations, and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value details need not be restated, and annotations cover the safety profile, so the description only needs to establish purpose, usage, and sequencing — which it does. The one omission is pagination behaviour for the page parameter, a minor gap for a listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and all four parameters carry descriptions with ranges and defaults, so the schema does the heavy lifting and the baseline of 3 applies. The phrase 'cheapest delivery or best rated' indirectly mirrors two of the three sort enum values, but the description never names the sort or page parameters or adds format/syntax detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('List SnappMarket stores delivering to the point') and even enumerates the returned attributes (delivery fee, minimum order, rating), so the agent knows exactly what this tool produces. Sibling differentiation is partial: it names the follow-on tool market_store_products but does not distinguish itself from look-alikes such as market_store_info, market_find_cheapest, or market_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use to pick a store (cheapest delivery or best rated) before browsing it with market_store_products' gives a clear use context and the logical next step in the workflow. It does not state when NOT to use it or how it differs from the other market_* discovery tools, so it stops 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.
reverse_geocodeDescribe coordinatesARead-onlyIdempotent
Describe coordinates in words (point of interest, street, neighbourhood).
Use to confirm a delivery point with the user before searching.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the delivery point (Iran: ~25 to ~40). | |
| long | Yes | Longitude of the delivery point (Iran: ~44 to ~63). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds that the result is a human-readable place description and frames the confirm-before-search workflow, but says nothing extra about latency, accuracy, or failure behavior beyond what annotations and the output schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, output semantics first and usage second, with zero filler. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, and annotations carry the safety profile. The description covers what the tool does and when to call it; only explicit routing against find_location is missing, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both parameters carry range and Iran-specific context, so the schema does the heavy lifting. The description adds no coordinate-format or precision detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource (describe coordinates in words) and enumerates the kind of output (point of interest, street, neighbourhood), so an agent can tell it apart from search-oriented siblings. It does not explicitly name its natural counterpart find_location, but the reverse-geocoding intent is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear condition for use: 'Use to confirm a delivery point with the user before searching.' That is actionable timing guidance. It stops short of naming the alternative tool (find_location) or when not to use it, which would be needed for 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.
21 tool updates
v0.1.1- First observed
find_location - First observed
food_discounted_vendors - First observed
food_find_cheapest - First observed
food_meal_for_one - First observed
food_menu - First observed
food_order_costs - First observed
food_party_deals - First observed
food_restaurants - First observed
food_reviews - First observed
food_search - First observed
list_cities - First observed
market_categories - First observed
market_find_cheapest - First observed
market_party_deals - First observed
market_product - First observed
market_reviews - First observed
market_search - First observed
market_store_info - First observed
market_store_products - First observed
market_stores - First observed
reverse_geocode
TDQS
Scored across 21 tools
Each tool targets a distinct resource+action, and overlapping pairings (food_search vs food_find_cheapest, market_search vs market_find_cheapest, food_restaurants vs food_discounted_vendors) are explicitly differentiated in their descriptions. A few deal/discovery tools (party_deals, discounted_vendors, meal_for_one) sit close together, but the descriptions give clear routing cues.
Strong, predictable grouping with food_* and market_* prefixes and snake_case verb_noun names throughout (food_search, market_stores, market_store_products). Minor deviations exist: the location utilities (find_location, reverse_geocode, list_cities) carry no domain prefix, and some names embed the verb mid-string (food_find_cheapest).
21 tools is on the heavy side, but it serves two full commerce domains (Snappfood and SnappMarket), each with a coherent search/browse/detail/deals/reviews surface. No tool feels redundant given the dual-domain scope, though it is near the upper bound of comfortable scoping.
Covers discovery, menus/products, cost breakdown (delivery, min order, coupons), reviews and flash deals across both verticals, leaving few dead ends for a browsing/research workflow. The main gap is transactional tools (cart/order placement) and user-specific info, though these may be intentionally out of scope.
Maintenance
Related MCP Connectors
- OpenAjanOAuthcom.openajan
Find local shops, read live menus and free times, and order or book on the user's behalf.
Directory of APIs, merchants, and tools AI agents can actually use.
AI-agent product catalog: search, lookup & purchase routing over verified merchant data.
Pickup orders at Japanese restaurants for AI agents: find stores, read menus, place orders. No auth.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables AI agents to search restaurants, browse menus, and manage DoorDash carts through structured JSON data. It leverages a background browser to handle authentication and direct GraphQL API calls for efficient interaction.710 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables searching restaurants and menu items, viewing availability and full menus, and managing restaurant carts via the private Yandex.Eats web API, secured with single-user OAuth, without exposing sensitive account or location data.8 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables LLMs to search products, fetch detailed specifications, and browse categories from SnappShop in real-time.MIT
- AlicenseAqualityBmaintenanceEnables AI clients to search and browse Sheypoor classifieds, fetch product details, and manage account features such as bookmarks, chats, and login.212MIT