snapp-mcp
snapp-mcp is an unofficial, read-only MCP server that lets an AI agent search, compare and price food and groceries on Snappfood and SnappMarket across Iran.
Locate places: turn an address, landmark or neighbourhood into coordinates (
find_location), describe coordinates back into words (reverse_geocode), and list all served cities with their center points (list_cities).Find dishes and true cheapest food: search dishes by name with price and discount (
food_search) or scan nearby menus plus FoodParty for the lowest total of food + packaging + delivery (food_find_cheapest).Browse restaurants: list and rank restaurants near a point by rating, delivery fee, ETA, coupons, free delivery or discounts (
food_restaurants,food_discounted_vendors).Read menus and order conditions: get a full menu with prices, discounts, packaging fees and availability (
food_menu), plus delivery fee, ETA, minimum order and coupons (food_order_costs).Check quality and deals: read customer reviews with ratings, text and vendor replies (
food_reviews), and catch flash deals like FoodParty, single-person meals under 299k Toman, and live Gem hunts (food_party_deals,food_meal_for_one).Find and compare groceries: search a product across stores (
market_search) or get one flat cheapest-first list of in-stock offers (market_find_cheapest).Browse stores and catalogs: list stores by delivery fee or rating (
market_stores), get one store's fees, minimum order, hours and coupons (market_store_info), and browse or search its products by category (market_store_products,market_categories,market_product).Catch grocery deals and reviews: list Market Party flash deals by biggest discount (
market_party_deals) and read a store's top customer comments (market_reviews).
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: 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.
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-mcporclaude 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_PROXYto 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, thenfood_*andmarket_*. Most food and market tools needlatandlong(notfood_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 (passfull_text: truetofood_reviews,market_reviewsormarket_productfor the whole text). Restaurant and storevendor_codevalues pass between tools. FoodParty and Gem deals only run in time windows.Machine-readable:
server.jsonand 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-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,
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 |
| 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 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
ratingmeans 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_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
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-mcpConfiguration
Variable | Default | Meaning |
| unset | HTTP proxy for every request, e.g. |
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.
Related servers
Okala MCP server for grocery prices and deals across stores
awesome-iran-mcp: catalog of all Iranian-service MCP servers
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
If this saves you clicks, a star helps others find it.
Available Tools
21 toolsfind_locationFind locationARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max places to return. | |
| query | Yes | Place, street or landmark, e.g. 'میدان ونک'. | |
| near_lat | No | Bias latitude (e.g. a city center from list_cities). | |
| near_long | No | Bias longitude. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so 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.
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.
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.
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.
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.
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 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: food_menu has prices.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds 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.
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.
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.
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.
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.
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 dishARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| limit | No | Max dishes. | |
| query | Yes | Dish word, e.g. 'پیتزا'. | |
| max_restaurants | No | Open restaurants' menus to scan (more = slower). |
TDQS
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.
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.
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.
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.
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.
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 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 minimum basket.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| limit | No | Max meals. | |
| max_price | No | Max final price, Toman. |
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 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.
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.
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.
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.
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.
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_order_costsOrder costsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| vendor_code | Yes | Vendor code, e.g. '947evd' (from food_search / food_restaurants). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the description 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.
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.
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.
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.
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.
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 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 starts/ends; outside it the list is empty.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| sort | No | Order of the deals. | biggest_discount |
| limit | No | Max deals. | |
| query | No | Only deals whose title contains this. |
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). 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.
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.
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.
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.
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.
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 restaurantsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| page | No | Page of 20, from 0. | |
| sort | No | Order; *_expensive rank by price class, not delivery fee. | default |
| query | No | Restaurant name filter, e.g. 'پیتزا'. | |
| open_only | No | Hide closed or non-delivering restaurants. | |
| has_coupon | No | With a coupon only. | |
| has_discount | No | Discounted only. | |
| free_delivery | No | Free delivery only. |
TDQS
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.
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.
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.
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.
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.
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 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.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page of 10, newest first, from 0. | |
| full_text | No | Return review and reply text uncut (default cut to 400 chars). | |
| vendor_code | Yes | Vendor code, e.g. '947evd' (from food_search / food_restaurants). |
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 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.
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.
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.
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.
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.
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.
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". relevance is one fast index call; cheapest / biggest_discount drop side items and confirm prices on live menus. For the cheapest X across many menus use food_find_cheapest.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| sort | No | Order of the results. | relevance |
| limit | No | Max dishes. | |
| query | Yes | Dish word, e.g. 'پیتزا'. | |
| discounted_only | No | Only dishes with a discount. | |
| include_protein | No | Also search protein stores (butchers, eggs), hidden by default. |
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). The description adds genuine behavioral context beyond that: 'relevance is one fast index call' discloses relative latency, and cheapest/biggest_discount are flagged as dropping side items and confirming prices on live menus, which warns about result-quality tradeoffs. It stops short of describing result shape or pagination.
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, then usage triggers, then per-sort behavior and the sibling handoff. No filler or restated field names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema the description still tells the agent what a result contains (price, discount, restaurant) and how sorting changes result composition. Minor gaps remain around result volume/pagination and the hidden protein-store behavior, but nothing essential to a correct call 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 earns extra by explaining what the sort enum values actually do to results rather than restating them. It does not, however, touch limit, discounted_only or include_protein beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Search dishes by name') plus the scoping constraint ('near a delivery point, with price, discount and restaurant'). It also explicitly names the sibling it is not (food_find_cheapest), so an agent can separate it from the other food_* tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete trigger phrasings ('find X near me', 'discounted X') and an explicit exclusion rule: use food_find_cheapest for the cheapest X across many menus. It also explains which sort mode suits which intent, which is real when-to-use guidance.
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 as a rough delivery point when the user only names a city.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Filter on Persian title or English code, e.g. 'شیراز'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so 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.
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.
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.
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.
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.
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 categoriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so safety is covered. The description adds 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.
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.
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.
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.
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.
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 groceriesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| limit | No | Max offers. | |
| pages | No | Pages to scan, 12 stores each. | |
| query | Yes | Product name, e.g. 'شیر کم چرب'. |
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), 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.
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.
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.
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.
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.
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 dealsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| limit | No | Max deals. |
TDQS
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.
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.
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.
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.
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.
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 detailsARead-onlyIdempotent
Get one product's details and price in one store.
Use to confirm the current price of an item the user picked.
| Name | Required | Description | Default |
|---|---|---|---|
| full_text | No | Return the description uncut (default cut to 400 chars). | |
| product_id | Yes | Product id from a market_* list. | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. |
TDQS
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.
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.
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.
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.
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.
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 reviewsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| full_text | No | Return comment text uncut (default cut to 400 chars). | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. |
TDQS
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.
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.
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.
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.
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.
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_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: stores (open or not) with up to ~5 matching products each. For one flat cheapest-first list use market_find_cheapest.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| page | No | Page, from 0. | |
| limit | No | Stores per page. | |
| query | Yes | Product name, e.g. 'شیر'. |
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 genuine result-shape context: the response is grouped by store, includes closed stores, and caps at roughly 5 matching products per store. It does not discuss pagination limits, but that is largely in the 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 sentences, no filler. The core behavior is front-loaded and the alternative-tool routing is compressed into a single trailing clause.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does describe the store-grouped structure and per-store product cap. It stops short of describing pagination semantics or an empty-result case, which are the remaining unknowns for an agent.
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/page/limit are all documented in the schema itself. The description only implies the geographic filter ('delivering to the point') and adds no format or constraint detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (grocery product) plus the scope that defines it: across all SnappMarket stores delivering to the given point. The scope clause alone differentiates it from nearby siblings like market_stores and market_store_products.
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 the use case ('see which stores carry an item and at what price') and names the alternative for the contrasting need ('For one flat cheapest-first list use market_find_cheapest'). This is exactly the when-to-use / when-to-use-something-else guidance that routing requires.
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. 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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. |
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 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.
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.
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.
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.
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.
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 storeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| page | No | Page, from 0. | |
| query | No | Search inside this store, e.g. 'ماست'. | |
| category_id | No | Top-level category id (from this tool without arguments). | |
| vendor_code | Yes | Store code from market_search / market_stores, e.g. '32xxwe'. | |
| subcategory_id | No | Sub-category id; needs category_id. |
TDQS
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.
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.
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.
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.
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.
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 storesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Delivery point latitude. | |
| long | Yes | Delivery point longitude. | |
| page | No | Page, from 0. | |
| sort | No | Order of the stores. | lowest_delivery_price |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds 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.
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.
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.
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.
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.
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 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 | Delivery point latitude. | |
| long | Yes | Delivery point longitude. |
TDQS
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.
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.
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.
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.
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.
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.
21 tool updates
v0.2.0- Changed
find_location9 fields changed- removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / near_lat / descriptionPrevious 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)." - removed
Input schema / properties / near_lat / titleRemoved value: -"Near Lat" - changed
Input schema / properties / near_long / descriptionPrevious value: -"Bias results toward this longitude."New value: +"Bias longitude." - removed
Input schema / properties / near_long / titleRemoved value: -"Near Long" - changed
Input schema / properties / query / descriptionPrevious value: -"Place, street, landmark or neighbourhood, Persian works best, e.g. 'میدان ونک'."New value: +"Place, street or landmark, e.g. 'میدان ونک'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"find_locationArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "find_locationDictOutput", - "type": "object" -}New value: +null
- Changed
food_discounted_vendors6 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - removed
Input schema / titleRemoved value: -"food_discounted_vendorsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_discounted_vendorsDictOutput", - "type": "object" -}New value: +null
- Changed
food_find_cheapest13 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max dishes to return."New value: +"Max dishes." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / max_restaurants / descriptionPrevious value: -"How many open restaurants' menus to scan (more = slower, more complete)."New value: +"Open restaurants' menus to scan (more = slower)." - removed
Input schema / properties / max_restaurants / titleRemoved value: -"Max Restaurants" - changed
Input schema / properties / query / descriptionPrevious value: -"Dish or food word, Persian works best, e.g. 'پیتزا', 'کباب'."New value: +"Dish word, e.g. 'پیتزا'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"food_find_cheapestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_find_cheapestDictOutput", - "type": "object" -}New value: +null
- Changed
food_meal_for_one11 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -30New value: +15 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max meals to return."New value: +"Max meals." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / max_price / descriptionPrevious value: -"Only meals at or under this final price, Toman."New value: +"Max final price, Toman." - removed
Input schema / properties / max_price / titleRemoved value: -"Max Price" - removed
Input schema / titleRemoved value: -"food_meal_for_oneArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_meal_for_oneDictOutput", - "type": "object" -}New value: +null
- Changed
food_menu13 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -100New value: +30 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max items to return."New value: +"Max items." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / query / descriptionPrevious value: -"Only items whose title contains this text."New value: +"Only items whose title contains this." - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / vendor_code / descriptionPrevious value: -"Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants)."New value: +"Vendor code, e.g. '947evd' (from food_search / food_restaurants)." - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"food_menuArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_menuDictOutput", - "type": "object" -}New value: +null
- Changed
food_order_costs8 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / vendor_code / descriptionPrevious value: -"Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants)."New value: +"Vendor code, e.g. '947evd' (from food_search / food_restaurants)." - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"food_order_costsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_order_costsDictOutput", - "type": "object" -}New value: +null
- Changed
food_party_deals12 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -30New value: +15 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max deals to return."New value: +"Max deals." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / query / descriptionPrevious value: -"Only deals whose dish title contains this text."New value: +"Only deals whose title contains this." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"food_party_dealsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_party_dealsDictOutput", - "type": "object" -}New value: +null
- Changed
food_restaurants20 fields changed- changed
Input schema / properties / free_delivery / descriptionPrevious value: -"Only restaurants with free delivery."New value: +"Free delivery only." - removed
Input schema / properties / free_delivery / titleRemoved value: -"Free Delivery" - changed
Input schema / properties / has_coupon / descriptionPrevious value: -"Only restaurants offering a coupon."New value: +"With a coupon only." - removed
Input schema / properties / has_coupon / titleRemoved value: -"Has Coupon" - changed
Input schema / properties / has_discount / descriptionPrevious value: -"Only restaurants running a discount."New value: +"Discounted only." - removed
Input schema / properties / has_discount / titleRemoved value: -"Has Discount" - changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / open_only / descriptionPrevious value: -"Hide restaurants that are closed or don't deliver here."New value: +"Hide closed or non-delivering restaurants." - removed
Input schema / properties / open_only / titleRemoved value: -"Open Only" - changed
Input schema / properties / page / descriptionPrevious value: -"Zero-based page of 20 restaurants."New value: +"Page of 20, from 0." - removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / query / descriptionPrevious value: -"Filter by restaurant name, e.g. 'پیتزا' or a brand name."New value: +"Restaurant name filter, e.g. 'پیتزا'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / sort / descriptionPrevious value: -"Order; least_expensive/most_expensive rank by price class, not delivery fee."New value: +"Order; *_expensive rank by price class, not delivery fee." - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"food_restaurantsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_restaurantsDictOutput", - "type": "object" -}New value: +null
- Changed
food_reviews7 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return review and reply text uncut (default cut to 400 chars).", + "type": "boolean" +} - changed
Input schema / properties / page / descriptionPrevious value: -"Zero-based page of 10 reviews, newest first."New value: +"Page of 10, newest first, from 0." - removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / vendor_code / descriptionPrevious value: -"Snappfood vendor code, e.g. '947evd' (from food_search / food_restaurants)."New value: +"Vendor code, e.g. '947evd' (from food_search / food_restaurants)." - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"food_reviewsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_reviewsDictOutput", - "type": "object" -}New value: +null
- Changed
food_search15 fields changed- removed
Input schema / properties / discounted_only / titleRemoved value: -"Discounted Only" - changed
Input schema / properties / include_protein / descriptionPrevious value: -"Also search protein stores (butchers, poultry, eggs), which are hidden by default."New value: +"Also search protein stores (butchers, eggs), hidden by default." - removed
Input schema / properties / include_protein / titleRemoved value: -"Include Protein" - changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max dishes to return."New value: +"Max dishes." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / query / descriptionPrevious value: -"Dish or food word, Persian works best, e.g. 'پیتزا', 'کباب'."New value: +"Dish word, e.g. 'پیتزا'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"food_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "food_searchDictOutput", - "type": "object" -}New value: +null
- Changed
list_cities4 fields changed- changed
Input schema / properties / query / descriptionPrevious 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. 'شیراز'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"list_citiesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "list_citiesDictOutput", - "type": "object" -}New value: +null
- Changed
market_categories6 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - removed
Input schema / titleRemoved value: -"market_categoriesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_categoriesDictOutput", - "type": "object" -}New value: +null
- Changed
market_find_cheapest13 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +10 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max offers to return."New value: +"Max offers." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / pages / descriptionPrevious value: -"Search pages to scan, 12 stores each."New value: +"Pages to scan, 12 stores each." - removed
Input schema / properties / pages / titleRemoved value: -"Pages" - changed
Input schema / properties / query / descriptionPrevious value: -"Product name, Persian works best, e.g. 'شیر کم چرب'."New value: +"Product name, e.g. 'شیر کم چرب'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"market_find_cheapestArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_find_cheapestDictOutput", - "type": "object" -}New value: +null
- Changed
market_party_deals9 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -30New value: +15 - changed
Input schema / properties / limit / descriptionPrevious value: -"Max deals to return."New value: +"Max deals." - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - removed
Input schema / titleRemoved value: -"market_party_dealsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_party_dealsDictOutput", - "type": "object" -}New value: +null
- Changed
market_product6 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return the description uncut (default cut to 400 chars).", + "type": "boolean" +} - changed
Input schema / properties / product_id / descriptionPrevious value: -"Product id from a market_* product list."New value: +"Product id from a market_* list." - removed
Input schema / properties / product_id / titleRemoved value: -"Product Id" - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"market_productArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_productDictOutput", - "type": "object" -}New value: +null
- Changed
market_reviews4 fields changed- added
Input schema / properties / full_textAdded value: +{ + "default": false, + "description": "Return comment text uncut (default cut to 400 chars).", + "type": "boolean" +} - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"market_reviewsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_reviewsDictOutput", - "type": "object" -}New value: +null
- Changed
market_search12 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / limit / defaultPrevious value: -20New value: +8 - removed
Input schema / properties / limit / titleRemoved value: -"Limit" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / page / descriptionPrevious value: -"Page number, from 0."New value: +"Page, from 0." - removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / query / descriptionPrevious value: -"Product name, Persian works best, e.g. 'شیر' or 'ماست کاله'."New value: +"Product name, e.g. 'شیر'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - removed
Input schema / titleRemoved value: -"market_searchArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_searchDictOutput", - "type": "object" -}New value: +null
- Changed
market_store_info7 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"market_store_infoArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_store_infoDictOutput", - "type": "object" -}New value: +null
- Changed
market_store_products15 fields changed- changed
Input schema / properties / category_id / descriptionPrevious value: -"Top-level category id (from this tool without arguments, or market_categories)."New value: +"Top-level category id (from this tool without arguments)." - removed
Input schema / properties / category_id / titleRemoved value: -"Category Id" - changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / page / descriptionPrevious value: -"Page number, from 0."New value: +"Page, from 0." - removed
Input schema / properties / page / titleRemoved value: -"Page" - changed
Input schema / properties / query / descriptionPrevious value: -"Search text inside this store, e.g. 'ماست'."New value: +"Search inside this store, e.g. 'ماست'." - removed
Input schema / properties / query / titleRemoved value: -"Query" - changed
Input schema / properties / subcategory_id / descriptionPrevious value: -"Sub-category id; needs its parent category_id."New value: +"Sub-category id; needs category_id." - removed
Input schema / properties / subcategory_id / titleRemoved value: -"Subcategory Id" - removed
Input schema / properties / vendor_code / titleRemoved value: -"Vendor Code" - removed
Input schema / titleRemoved value: -"market_store_productsArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_store_productsDictOutput", - "type": "object" -}New value: +null
- Changed
market_stores9 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - changed
Input schema / properties / page / descriptionPrevious value: -"Page number, from 0."New value: +"Page, from 0." - removed
Input schema / properties / page / titleRemoved value: -"Page" - removed
Input schema / properties / sort / titleRemoved value: -"Sort" - removed
Input schema / titleRemoved value: -"market_storesArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "market_storesDictOutput", - "type": "object" -}New value: +null
- Changed
reverse_geocode6 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the delivery point (Iran: ~25 to ~40)."New value: +"Delivery point latitude." - removed
Input schema / properties / lat / titleRemoved value: -"Lat" - changed
Input schema / properties / long / descriptionPrevious value: -"Longitude of the delivery point (Iran: ~44 to ~63)."New value: +"Delivery point longitude." - removed
Input schema / properties / long / titleRemoved value: -"Long" - removed
Input schema / titleRemoved value: -"reverse_geocodeArguments" - changed
Output schema / (root)Previous value: -{ - "additionalProperties": true, - "title": "reverse_geocodeDictOutput", - "type": "object" -}New value: +null
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
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).
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.
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.
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
Related MCP Connectors
Search live store shelves, verify delivery windows, and run instant AI agent checkouts.
Recipe search, ingredient matching, nutrition filters and a private cookbook for any AI agent.
- 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.
Related MCP Servers
- 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.216MIT
- FlicenseCqualityBmaintenanceEnables 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-
- AlicenseAqualityCmaintenanceEnables 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.13MIT