mobile-ir-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mobile-ir-mcpWhat's the cheapest Galaxy S26 Ultra 256GB now, and is its price rising?"
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.
mobile-ir-mcp: Mobile.ir (مرجع موبایل ایران) phone specs, prices and SIM numbers MCP server for AI agents
mobile-ir-mcp is an unofficial, read-only MCP server that gives AI agents Mobile.ir (mobile.ir), Iran's oldest phone database. Its 17 tools search phones, filter them by brand, price, OS and camera, read full specs, compare models, list what each shop charges now, show price history, read user comments, news and expert reviews, browse used-phone ads and search numbered SIM cards. No API key or account is needed. It works in Claude, Cursor, Copilot and any other MCP client.
For AI agents · Quick start · What it can do · Tools · FAQ · فارسی
For AI agents
What: unofficial MCP server (model context protocol) for mobile.ir: phone, tablet and smartwatch search and filters, full specifications, current shop prices (Toman) with each shop's note, price history, newest market price rows, users' used and new phone ads, and numbered SIM cards for sale.
Install:
uvx mobile-ir-mcporclaude mcp add mobile-ir -- uvx mobile-ir-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
MOBILE_IR_MCP_PROXY(HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.Access: read-only. It cannot log in, post ads or contact sellers, so no confirmation is needed before calling any tool.
Tools: 17, all prefixed
mi_. Typical sequences:mi_search->mi_phoneormi_shop_prices->mi_price_history;mi_find(budget, brand) ->mi_phone->mi_compare;mi_comments,mi_articles->mi_article;mi_shop;mi_used_search->mi_used_ad;mi_sim_search,mi_sim_summary.Use when: the user asks what a phone costs in Iran, which shop is cheapest, whether a price is rising, which phone to buy for a budget, a model's specs, what used phones are listed, or which numbered SIM cards (round numbers, an operator, certain digits) are for sale.
Do not use when: the question is about phones outside the Iranian market, or the user wants to buy, sell or contact a seller (the tools never return seller names or phone numbers).
Output: compact JSON. Prices are Toman as posted by shops and users; ratings 0-10; ids are Mobile.ir product ids. Names and notes are Persian or English as the site has them.
Machine-readable:
server.jsonand the iran-mcp catalog.
Related MCP server: zoomit-mcp
Why
Mobile.ir has tracked phones in Iran since the early 2000s: specs for tens of thousands of models, prices that
Iranian shops post every day, users' used-phone ads and a market for numbered SIM cards. Answering "what is the best
phone around 40 million Toman, and who sells it cheapest?" on the site means filtering, opening a model, opening its
shop list and reading each shop's note. With mobile-ir-mcp an agent does it in a few calls:
You: Cheapest Galaxy S26 Ultra 256 GB right now, and is the price going up?
Agent: calls
mi_search("galaxy s26 ultra"),mi_shop_prices(41113),mi_price_history(41113)The lowest 256 GB offer is 249,980,000 Toman at فروشگاه الزهرا (Tehran); فروشگاه بانه کالا asks 258,000,000. The daily lowest price over the last month moved between 198,000,000 and 250,000,000 Toman.
What it can do
Search phones, tablets and smartwatches by model name in English or Persian
Filter like the site's "mobile finder": brand, shop price range, OS, main camera megapixels, weight, name, availability, sorted by rating, date, price, camera or weight
Read specs: display, chipset, memory, cameras, battery, network bands, SIM, launch date, plus the site's rating and shop price range
Compare shop prices for a model: every shop's current price with its note (memory/RAM variant, colour), warranty and update time
Price history per shop and the daily lowest price over a week to all time
Market-wide price rows with brand, province, shop and price filters
Used and new phone ads from users: filter by brand, condition, province, price, photos; open one ad for the site's market-price estimate and other listings of the model
Numbered SIM cards for sale: operator (Hamrah-e Aval, Irancell, Rightel, Taliya, Shatel) or prefix, digits in the number (contains, starts with, ends with), round numbers, new or used, prepaid or postpaid, province, price
Read-only by design: no login, no posting. Seller names and phone numbers are never returned.
Example prompts:
"Best Android phone for 30 to 50 million Toman with a 100 MP camera."
"Is the iPhone 17 Pro cheaper in Isfahan than in Tehran?"
"Show used iPhone 15 ads in Tehran under 100 million Toman."
"Find Irancell numbers ending in 1111 under 10 million Toman."
"Compare the Galaxy S26 and S26 Ultra, and what do owners say about the battery?"
"Is there an expert review of the vivo X300 Pro?"
ارزانترین سامسونگ اس ۲۶ اولترا الان چند است و قیمتش بالا میرود؟
سیمکارت رند همراه اول با ۴ رقم آخر ۷۷۷۷ کدامها فروشی هستند؟
Quick start
You need uv. No API key or account.
claude mcp add mobile-ir -- uvx mobile-ir-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"mobile-ir": { "command": "uvx", "args": ["mobile-ir-mcp"] }
}
}Add the Claude Desktop block above to ~/.cursor/mcp.json (or .cursor/mcp.json in a project).
Click Install in VS Code above, or add to .vscode/mcp.json:
{
"servers": {
"mobile-ir": { "type": "stdio", "command": "uvx", "args": ["mobile-ir-mcp"] }
}
}codex mcp add mobile-ir -- uvx mobile-ir-mcpIt is a standard stdio MCP server: add { "command": "uvx", "args": ["mobile-ir-mcp"] } to the client's MCP config,
or pip install mobile-ir-mcp and run mobile-ir-mcp.
Tools
Product ids (41113) come from mi_search, mi_find and mi_market_prices. Brand, province and shop ids come from
mi_options; brand names such as Samsung or اپل are accepted directly.
Tool | What it does |
| Find phones, tablets and smartwatches on Mobile.ir by name and get their ids |
| Filter phones like the site's mobile finder: brand, shop price range, OS, camera, weight, name |
| Get the full specification sheet of one product with rating and price range |
| List what each shop currently charges for a phone (Toman, shop, city, note, warranty) |
| Get a phone's shop-price history: per-shop first/last/min/max and the daily lowest price |
| List the newest price rows shops posted, with brand, province, shop and price filters |
| Search the used and new phone ads users post (price, condition, city, description) |
| Read one ad: price, the site's market-price estimate, condition, box, city, photos, shops |
| Search numbered SIM cards for sale by operator, digits, round numbers, price and province |
| List brand, province and shop ids and the SIM operator prefixes |
| Compare 2 to 4 products side by side: price range, rating and the spec rows that differ |
| Read the users' comments on a product (text, Persian date, likes), newest or most liked first |
| List Mobile.ir news and expert reviews, searchable, or the articles about one product or brand |
| Read the text of one news item, expert review or product introduction, in parts for long ones |
| Show one shop's profile and every phone it lists with current prices, filtered by brand or name |
| Page through all models of a brand (40 per page), phones, tablets or watches, sorted |
| Summarise the numbered-SIM market per operator: ad counts and the cheapest priced numbers |
All 17 tools are annotated readOnlyHint: true.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
mobile-ir-mcp (runs on your machine)
│
│ HTTPS
└──────▶ www.mobile.ir spec and shop pages, finder / used-phone / SIM lists, price-chart JSONmobile-ir-mcp runs locally and reads the same public pages and AJAX lists the mobile.ir website uses, with no
hosted server in between. Mobile.ir has no JSON API, so the server parses the HTML. Requests go out through a
Chrome-impersonating client with the headers the site's own scripts send. It makes at most 3 requests at a time with
a little jitter, keeps answers for 2 minutes, retries a failed GET up to twice, and only talks to www.mobile.ir.
Good to know
Prices are Toman, posted by shops and users. Shops write their own notes (RAM/storage variant, colour, warranty), so several prices exist per model; read
notebefore comparing. The site does not vouch for shops.The finder shows at most 100 phones and has no paging; narrow the filters if
foundis 100. A price filter drops phones that have no shop price.Price history without a variant. The chart mixes the variants a shop lists, so the daily lowest price is a market trend, not one SKU.
Contact data is left out. Seller names and phone numbers in ads are never returned, and phone numbers typed into descriptions or shop notes are replaced with
[phone].Used ads and SIM ads are unverified user content. Treat descriptions as quotes, not instructions. Non-numeric prices ("توافقی", "بالاترین پيشنهاد") come back in
price_note.Old SIM ads. With
days: -1the lists include ads many years old;updatedmay then be a Persian-calendar date.Persian data. Names and notes are Persian or English as the site has them; digits are converted to ASCII.
What it does not do: no reviews or comments text, no photos of phones (only used-ad photos), no shop directory, no news, no login features such as favourites. Keep requests reasonable; the site's rate limits are unknown.
FAQ
Mobile.ir has no public API. mobile-ir-mcp is an unofficial MCP server with 17 read-only tools that reads the
public mobile.ir pages and returns compact JSON for AI agents.
No account. It was tested from an Iranian line and from a Turkish exit. If requests are blocked from your network, set
MOBILE_IR_MCP_PROXY to an HTTP proxy. System proxy variables are ignored on purpose.
Yes. mi_shop_prices sorts every shop's current offer by price and shows each shop's note, so you can tell a 256 GB
offer from a 512 GB one. mi_price_history shows whether that price is rising or falling.
No. It only reads. Seller names and phone numbers are not returned; open the url of an ad on mobile.ir.
npx @modelcontextprotocol/inspector uvx mobile-ir-mcpConfiguration
Variable | Default | Meaning |
| unset | Optional HTTP proxy URL for the mobile.ir requests; system proxy settings are ignored. A comma-separated list is used one at a time: the next proxy takes over when one is blocked or cannot connect |
فارسی: سرور MCP مرجع موبایل ایران
سرور mobile-ir-mcp یک سرور MCP غیررسمی و فقطخواندنی برای مرجع موبایل ایران است. با آن، دستیار هوش مصنوعی شما همان اطلاعاتی را میبیند که سایت به هر بازدیدکننده نشان میدهد: مشخصات گوشی، قیمت فروشگاهها، روند قیمت، آگهیهای گوشی دستدوم و سیمکارتهای فروشی.
چه کارهایی میکند
جستوجوی گوشی، تبلت و ساعت هوشمند با نام فارسی یا انگلیسی.
موبایلیاب: فیلتر بر اساس برند، محدودهٔ قیمت، سیستمعامل، دوربین، وزن و نام.
مشخصات کامل هر مدل با امتیاز کاربران و بازهٔ قیمت.
قیمت هر فروشگاه برای یک مدل، همراه با توضیح فروشنده و گارانتی، و نمودار قیمت (کمترین قیمت روزانه).
آگهیهای کاربران: گوشی نو و کارکرده بر اساس برند، استان، قیمت و عکس.
سیمکارتهای فروشی: بر اساس اپراتور، ارقام شماره، رند بودن، صفر یا کارکرده، دائمی یا اعتباری، استان و قیمت.
نکتهها
فقطخواندنی است و نام یا شمارهٔ تماس فروشندهها را برنمیگرداند.
قیمتها را فروشگاهها و کاربران درج میکنند و سایت مسئولیتی در قبال آنها ندارد.
کلید API و حساب کاربری لازم نیست. اگر شبکهٔ شما درخواستها را مسدود کرد، متغیر
MOBILE_IR_MCP_PROXYرا روی یک پراکسی HTTP بگذارید.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add mobile-ir -- uvx mobile-ir-mcpنمونه پرسشها: «ارزانترین سامسونگ اس ۲۶ اولترا الان چند است؟»، «بهترین گوشی اندروید حدود ۴۰ میلیون تومان»، «سیمکارت رند ایرانسل با ۴ رقم آخر ۱۱۱۱».
License
MIT. Unofficial; not affiliated with Mobile.ir. Built by Sepehr Radmard (LinkedIn).
Available Tools
17 toolsmi_articleRead a news article or reviewARead-onlyIdempotent
Read the text of one Mobile.ir news item, expert review or product introduction (Persian, images dropped).
Get source, id and phone_id from mi_articles. Long reviews run to tens of thousands of characters: the answer
says total_chars, so call again with offset to continue. Press-release style text: verify claims before quoting.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Article id (news id, review id, or product id for 'intro'). | |
| offset | No | Start at this character, to read a long review in parts. | |
| source | Yes | From mi_articles: 'news', 'review' or 'intro' (for 'intro' the id is the product id). | |
| phone_id | No | Product id the review belongs to (required for 'review'). | |
| max_chars | No | Characters to return. |
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 safety is covered. The description adds real behavioral context beyond them: content is Persian, images are stripped, long reviews can run to tens of thousands of characters, the response exposes total_chars to drive pagination, and press-release text may be unverified. It does not specify error behavior for bad ids, which keeps it out of the top band.
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 purpose in the first sentence, then a short second paragraph covering sourcing and pagination. The closing advisory on press-release text is mildly editorial but is short and plausibly useful for an agent quoting content.
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, so the description carries the burden of hinting at the return shape, which it does via total_chars and the dropped-images note. Combined with pagination guidance and identifier sourcing, an agent has enough to call the tool correctly, though the full response shape (title, date, author) is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the source enum, phone_id conditional requirement, offset and max_chars is already documented. The description reinforces where the identifiers come from and ties offset to the total_chars field, but adds no syntax or format detail beyond the schema. Baseline 3 applies 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 ('Read the text of one Mobile.ir news item, expert review or product introduction') and makes the single-item scope explicit, which cleanly separates it from the sibling listing tool mi_articles. An agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite chain ('Get source, id and phone_id from mi_articles') and tells the agent how to continue when the body is truncated ('call again with offset'). It stops short of stating when NOT to use it (e.g. search or comment retrieval, which belong to mi_search/mi_comments), so it is clear context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_articlesMobile.ir news and expert reviewsARead-onlyIdempotent
List the news and the expert reviews on Mobile.ir, newest first, optionally for one phone or brand.
Use it for 'is there a review of X', 'latest news about Samsung' or 'what is new'. Read one result with
mi_article, passing back its source, id and (for reviews) phone_id. News search returns at most 100 hits.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Product class for reviews. | phone |
| page | No | Page number, from 1 (20 news or 40 reviews per page). | |
| brand | No | Brand name or id for reviews (see mi_options('brands')). | |
| query | No | Words to search in the news (news only), e.g. 'سامسونگ'. | |
| source | No | 'news' = news and features; 'reviews' = expert phone reviews. | news |
| phone_id | No | Only articles about this product id: related news and intro (news) or its reviews. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuinely new behavioral facts: results are ordered newest first, news search is capped at 100 hits, and reviews are the paged/kind-scoped side of the tool. It does not spell out pagination limits beyond the schema's per-page counts, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short blocks, front-loaded with the core listing behavior, then usage examples and the follow-up tool. No filler sentences, though the phrase "passing back its `source`, `id` and (for reviews) `phone_id`" is slightly dense for the amount of information it carries.
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 six optional parameters, no output schema, and rich annotations, the description covers ordering, the 100-hit cap, the news-vs-reviews split, and the key result fields needed for follow-up. A brief note on what a result object otherwise contains would make it fully self-sufficient.
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; the description still earns above baseline by explaining that filtering is "optionally for one phone or brand" and by tying `source`/`id`/`phone_id` to the downstream mi_article call. That cross-tool meaning is not present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
"List the news and the expert reviews on Mobile.ir, newest first, optionally for one phone or brand" gives a specific verb (list), specific resource (news/reviews), scope (one phone or brand) and ordering. It also separates this tool from its closest sibling by pointing at mi_article for reading a single result.
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 supplies concrete trigger phrases ("is there a review of X", "latest news about Samsung", "what is new") and names the follow-up tool mi_article with the exact fields to hand back. It stops short of saying when to prefer the sibling search tools (mi_search, mi_find, mi_used_search), so the routing guidance is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_brand_modelsAll models of a brandARead-onlyIdempotent
Page through every model Mobile.ir lists for one brand (id, rating, year, screen, camera, lowest shop price).
Use it when mi_find's 100-row cap is too small or you want a brand's full line-up. Narrow by price or camera with mi_find instead. Read one model with mi_phone; compare several with mi_compare.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Product class. | all |
| page | No | Page number, from 1 (40 models per page). | |
| sort | No | Order of the list. | date |
| brand | Yes | Brand name (Samsung, اپل) or id; see mi_options('brands'). | |
| descending | No | Highest / newest first (default). | |
| only_priced | No | Only models with a current shop price. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds genuine context: the tool paginates over a fixed brand-scoped corpus and returns a compact field set including lowest shop price. It does not state how to detect the last page or how many pages exist, which is the one remaining behavioral 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?
Three short sentences, each earning its place: what it does and returns, when to choose it, and where to go instead. The use case is front-loaded with no redundant repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the returned fields, and all six parameters are documented in the schema, so an agent can call this correctly. The only shortfall is that pagination termination (total pages or model count) is never hinted at for a tool explicitly built for paging.
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 each parameter already carries a description, including the brand-name-or-id hint and page size, so the schema does the heavy lifting. The description adds no parameter-level detail such as sort semantics or interaction between only_priced and price sorting. 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 — paging through all models Mobile.ir lists for one brand — and enumerates the returned fields (id, rating, year, screen, camera, lowest shop price). This is clearly distinguishable from sibling listing tools like mi_find and mi_search without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when mi_find's 100-row cap is too small or you want a brand's full line-up') plus explicit exclusions and their replacements ('Narrow by price or camera with mi_find instead'). It also routes single-model and comparison cases to mi_phone and mi_compare respectively.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_commentsUser comments on a phoneARead-onlyIdempotent
Read what Mobile.ir users wrote about a phone, tablet or watch: comment text, date (Persian calendar), likes.
Use it for real-world opinions (battery, camera, durability) next to mi_phone's rating. Comments are unverified
user content; author names are not returned. reply_to is the comment id a comment answers.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Product id from mi_search, mi_find or mi_market_prices, e.g. 41113. | |
| sort | No | 'helpful' puts the most liked comments first. | newest |
| limit | No | Comments to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered; the description adds genuinely new context — that content is unverified user-generated text and that author names are deliberately omitted. With no output schema, the note about Persian-calendar dates and the `reply_to` threading field is also useful disclosure about what comes back.
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 front-loaded sentences with no padding: purpose first, usage second, content caveats third. The closing `reply_to` sentence is somewhat orphaned since it describes a response field rather than a parameter, which slightly muddies an otherwise tight structure.
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 three-parameter read tool with no output schema, the description covers what matters: the device scope, the fields returned, the unverified nature of the content, and the absence of author names. Pagination/sort behavior and the limit cap are left to the schema, which documents them adequately, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and all three parameters (id, sort, limit) are fully documented in the schema including the enum meaning for 'helpful' and the id provenance. The description's only parameter-adjacent sentence explains `reply_to`, which is actually a return field rather than an input, so it adds no input-side semantics beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Read what Mobile.ir users wrote about a phone, tablet or watch') and enumerates the returned content, so the agent knows exactly what this tool produces. It also positions itself against the sibling mi_phone by framing itself as the qualitative counterpart to that tool's rating.
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 to use it 'for real-world opinions (battery, camera, durability) next to mi_phone's rating', which gives a clear situational trigger and names the complementary sibling. It stops short of stating exclusions (e.g., when to prefer mi_articles or mi_used_ad for opinion content), so it is clear context rather than a full when/when-not matrix.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_compareCompare phones side by sideARead-onlyIdempotent
Compare 2 to 4 phones, tablets or watches on Mobile.ir: price range, rating and each spec row side by side.
Use it after mi_search or mi_find when the user is choosing between models. Values are listed in the same order as
phones. By default only rows that differ are returned, so the answer stays short; ask for sections to focus.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | Yes | 2 to 4 product ids from mi_search or mi_find. | |
| sections | No | Limit to these spec sections, e.g. ['display','battery']; default all. | |
| only_differences | No | Keep only the spec rows where the products differ (default); false returns every row. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and open-world, so the safety profile is covered. The description adds genuinely useful behavior beyond that: result values follow the order of the input ids, and by default only differing rows are returned so output stays short. It does not describe pagination or response size limits, but for a bounded 2–4 item comparison that is minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs with the capability stated first and the workflow/behavior second; no filler sentences. The dangling reference to `phones` is the one element that costs the reader a moment of confusion.
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, yet the description characterizes the return well enough (price range, rating, per-spec rows, difference-only filtering, input-ordered values). Combined with full schema coverage and read-only annotations, an agent has what it needs to call this correctly; only the stale `phones` reference is a gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented, making 3 the baseline. The description reinforces the intent of `only_differences` (short answers by default) and the focusing role of `sections`, but it also refers to `phones` when the actual parameter is `ids`, a naming mismatch that slightly muddies rather than clarifies.
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 (compare) with a bounded resource set (2 to 4 phones, tablets or watches) and names exactly what the output contains: price range, rating and each spec row side by side. An agent can distinguish this from mi_phone (single product) or mi_search (discovery) 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 sequences the tool after mi_search or mi_find and gives the triggering condition ('when the user is choosing between models'). It stops short of naming the negative case — e.g. that a single-model question should go to mi_phone — so it is clear but not fully routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_findFind phones with filtersARead-onlyIdempotent
Filter Mobile.ir's phone database like its 'mobile finder': brand, shop price range, OS, camera, weight, name.
Returns up to limit cards with id, rating (0-10), release year, screen, camera and the lowest current shop
price in Toman. Use mi_phone for the full spec of one result and mi_shop_prices to see who sells it. With a price
filter only priced phones appear. If found exceeds limit, tighten the filters; the site never shows more
than 100.
| Name | Required | Description | Default |
|---|---|---|---|
| os | No | Operating systems; default both. | |
| kind | No | Product class. | phone |
| sort | No | Order of the list. | rating |
| brand | No | Brand name (Samsung, Xiaomi, اپل) or id; see mi_options('brands'). | |
| limit | No | Rows to return (the site shows at most 100). | |
| market | No | 'available' = on sale or announced (default); 'any' adds discontinued and cancelled. | available |
| min_year | No | Released in this year or later, e.g. 2024. | |
| max_price | No | Highest shop price in Toman. | |
| min_price | No | Lowest shop price in Toman (e.g. 20000000). Phones without a shop price are dropped. | |
| descending | No | Highest first (default). | |
| min_rating | No | User rating at least this (0-10). | |
| max_weight_g | No | Weight at most this many grams. | |
| min_camera_mp | No | Main camera at least this many megapixels. | |
| name_contains | No | Part of the model name, e.g. 'ultra'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description still adds real behavioral content: the returned fields, the side effect that a price filter silently drops unpriced phones, and the hard 100-row ceiling with a corrective action when results overflow. The only soft spot is the mention of `found`, which is neither a schema parameter nor in the listed return fields, leaving its meaning slightly ambiguous.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose sentence is front-loaded and the second paragraph packs return shape, alternatives and the limit escape hatch without filler. Slight density (many clauses per sentence) and the unexplained `found` token cost a point.
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 14-parameter, zero-required discovery tool with no output schema, the description supplies what the schema cannot: the shape of returned cards and truncation behavior. Adding a clarifying note on `found` and on recursion into mi_options('brands') would make it fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter is already documented with enums, defaults and boundaries; the description only paraphrases the filter facets. The one genuine addition is the note that price filtering excludes phones without a shop price, which duplicates rather than extends the min_price description. 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 ('Filter Mobile.ir's phone database') and enumerates the filterable facets (brand, shop price range, OS, camera, weight, name). It also names what it is not, pointing to mi_phone and mi_shop_prices, so an agent can place it among the 16 siblings 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?
It gives explicit follow-up routing ('Use mi_phone for the full spec of one result and mi_shop_prices to see who sells it') and a recovery instruction when `found` exceeds `limit`. It does not, however, distinguish this tool from the other search siblings (mi_search, mi_used_search, mi_sim_search), so the when-to-use story is incomplete against the full sibling set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_market_pricesLatest shop prices market-wideARead-onlyIdempotent
List the newest price rows that shops posted on Mobile.ir (one row per shop and model), with filters.
Use it for 'cheapest/newest Xiaomi prices in Isfahan' type questions. For one model's full offer list use
mi_shop_prices. Prices are Toman, as posted by the shop; variants (memory/RAM) are in note on the model page.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Only prices updated within this many days (-1 = all). | |
| kind | No | Product class. | phone |
| page | No | Page number, from 1. | |
| sort | No | Order of the rows. | date |
| brand | No | Brand name or id; see mi_options('brands'). | |
| shop_id | No | Only this shop (id from mi_options('shops')). | |
| province | No | Province id from mi_options('provinces') (1 = Tehran, 5 = Isfahan, 14 = Khorasan Razavi). | |
| max_price | No | Toman, highest price. | |
| min_price | No | Toman, lowest price. | |
| page_size | No | Rows per page. | |
| descending | No | Descending order (newest or most expensive first). | |
| name_contains | No | Part of the model name. |
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 non-obvious behavior beyond them: result de-duplication (one row per shop and model), the price currency (Toman), and the fact that memory/RAM variants live in `note` on the model page. It stops short of describing pagination limits or how far back the index goes, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with what the tool returns and its row granularity, then routing guidance, then units/caveats. No filler or restatement of the name beyond the necessary scope detail.
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 12-parameter, all-optional read tool with strong annotations and no output schema, the description covers purpose, alternative routing, units and dedup semantics. It leaves minor gaps: nothing about result volume or how 'newest' interacts with sort/descending, and no hint that page/page_size bound the response size.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents every parameter with defaults, enums and even province id examples, so the baseline is 3. The description adds marginal but real meaning: prices are Toman 'as posted by the shop' and variant distinctions are not separate filters but a `note` field, which prevents an agent from hunting for a memory/RAM parameter.
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 the newest price rows that shops posted on Mobile.ir') plus the crucial granularity rule 'one row per shop and model'. It explicitly distinguishes itself from the sibling mi_shop_prices, so an agent can choose between them without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use it for "cheapest/newest Xiaomi prices in Isfahan" type questions' gives a concrete trigger scenario that maps onto the actual filter parameters (price, date, province). 'For one model's full offer list use mi_shop_prices' names the alternative and the condition that selects it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_optionsBrands, provinces, shops, operatorsARead-onlyIdempotent
List the ids the other Mobile.ir tools take: brands, provinces, price-listing shops, SIM operator prefixes.
Call it when a tool needs a brand, province or shop id you do not have. Brand names (English or Persian) are
also accepted directly by the brand arguments.
| Name | Required | Description | Default |
|---|---|---|---|
| what | Yes |
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 fully covered. The description adds the useful behavioral fact that this is an id-lookup dependency for other tools, but says nothing about response size, ordering, or whether names accompany ids; with annotations carrying the safety burden, a 3 is appropriate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the core purpose and followed by the trigger condition and one caveat. No filler, and the most actionable guidance (when to call it) is not buried.
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 does communicate the return shape ('list the ids'), which is the key thing an agent needs. It leaves open whether the response pairs ids with display names or how long the lists are, a minor gap for a single-enum lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0% and there is one parameter, but the description supplies meaning beyond the bare enum: 'shops' is qualified as 'price-listing shops' and 'operators' as 'SIM operator prefixes', which disambiguates what those enum values actually enumerate. The `what` parameter name itself is never explained, but the four values are.
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 the ids') and enumerates exactly which id families it covers, while framing itself as the dependency resolver for the other Mobile.ir tools. An agent can immediately tell it apart from siblings like mi_brand_models or mi_shop_prices because it returns ids rather than data.
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?
'Call it when a tool needs a brand, province or shop id you do not have' gives an explicit trigger condition. It also carves out an exception — brand names are accepted directly by `brand` arguments — which implicitly says when this tool is NOT needed for brands, though that carve-out is stated as a note rather than a clear exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_phonePhone specificationsARead-onlyIdempotent
Get the full specification sheet of one phone, tablet or smartwatch from Mobile.ir, with rating and price range.
Values are Persian/English as the site has them (display, chipset, RAM/storage, cameras, battery, launch date, SIM, network bands). Call mi_shop_prices next for who sells it and mi_price_history for the trend.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Product id from mi_search, mi_find or mi_market_prices, e.g. 41113. | |
| sections | No | Spec sections to return; default all. Use a few to keep the answer short. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so the safety profile is covered. The description contributes a genuine caveat beyond that — values come back in Persian/English as the site has them — which warns the agent about mixed-language output. It says nothing about response size limits, pagination, or failure behavior for an invalid id.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The leading sentence delivers purpose, scope and source immediately, followed by a data-fidelity caveat and a routing hint — no filler. The parenthetical field list is slightly redundant given the sections enum, but it still helps set expectations for what 'full specification' means.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only two-parameter lookup with a fully documented schema, the description covers identity, source, output shape at a field level, and downstream tool sequencing. With no output schema, slightly more on the actual return structure (single object, units, truncation with sections) would have completed 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%, with the id sourced from mi_search/mi_find/mi_market_prices and the sections enum fully documented, so the baseline is 3. The description's field list (display, chipset, RAM/storage, cameras, battery, launch date, SIM, network bands) loosely maps to the section values but adds no rules about combining sections or the cost of requesting all.
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 the full specification sheet of one phone, tablet or smartwatch') plus the data source (Mobile.ir) and what is bundled in (rating and price range). The enumerations of spec areas make it unambiguous how this differs from retrieval siblings like mi_search or mi_compare.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent onward: 'Call mi_shop_prices next for who sells it and mi_price_history for the trend,' which defines the boundary between this tool and the pricing siblings. It stops short of stating when to prefer mi_compare instead of pulling raw specs, so no full when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_price_historyPrice history of a phoneARead-onlyIdempotent
Get a phone's shop-price history from Mobile.ir: per-shop first/last/min/max and the daily lowest price in Toman.
Use it to answer whether a price is rising, falling or fair. Shops quote different variants, so use the daily lowest as the market trend rather than a single shop.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Product id from mi_search, mi_find or mi_market_prices, e.g. 41113. | |
| period | No | How far back. | month |
| shop_id | No | Only this shop (shop_id from mi_shop_prices); default all shops. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a read-only, idempotent, non-destructive, open-world tool. Beyond that, the description adds useful behavioral context: the data source, the specific aggregations returned, the currency unit, and the caveat that shops may quote different variants. It still does not describe data freshness, coverage gaps, or rate limits, but the added context is meaningful.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short paragraphs with the purpose front-loaded and the interpretive guidance following immediately. Every sentence contributes either scope or usage guidance, and there is no redundant wording.
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 tool with three fully documented parameters, safety annotations, and no output schema, the description does the remaining work: it explains what the returned price history contains, the unit, and how to interpret the daily lowest figure. Nothing critical for correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and all three parameters are already documented in the schema, including the product id source, the period enum, and shop_id filtering. The description does not add parameter-specific meaning beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: getting a phone's shop-price history from Mobile.ir. It also names the returned aggregates (per-shop first/last/min/max and daily lowest price), making the scope clear. It does not explicitly distinguish itself from siblings such as mi_market_prices or mi_shop_prices, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear use context: answering whether a price is rising, falling or fair, and it advises using the daily lowest rather than a single shop for market trend. It does not explicitly name alternative tools or state when-not-to-use conditions, so it is strong but not a full alternatives-based 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_searchSearch phones by nameARead-onlyIdempotent
Find phones, tablets and smartwatches on Mobile.ir by name and get their ids (autocomplete, up to about 20).
Use this first when the user names a model, then call mi_phone for specs or mi_shop_prices for shop prices. For filters (price range, brand, camera) use mi_find instead.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Part of a model name in English or Persian, e.g. 'galaxy s26', 'iphone 17', 'redmi note'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and non-destructive, so safety is covered. The description adds useful context beyond that: this is an autocomplete-style lookup returning up to about 20 ids rather than full records, which implies the agent must chain follow-up calls. It stops short of saying how ambiguity or zero results are handled.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: what it returns, what to call next, and which sibling to use instead. The scoping and result-limit information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter lookup without an output schema, the description supplies what the schema cannot: the return shape (ids, ~20 max) and the downstream tools. Nothing an agent needs to invoke it correctly in a chain 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% and the schema already documents the query string with English/Persian examples and length bounds. The description adds little beyond confirming name-based matching; the baseline of 3 applies 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 (find), resource (phones, tablets, smartwatches), source (Mobile.ir), and output (ids), plus a result-count bound. It also names the sibling that handles the other case (mi_find), so an agent can distinguish it 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?
Explicit sequencing: call this first when the user names a model, then mi_phone for specs or mi_shop_prices for prices. It also gives an exclusion with a named alternative — mi_find for price range, brand, or camera filters — so there is no ambiguity about 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.
mi_shopA shop's phone price listARead-onlyIdempotent
Show one Mobile.ir shop's profile and the phones it lists with their current prices in Toman.
Use it for 'what does shop X sell' or to compare a shop's prices for a brand. For one model across all shops use
mi_shop_prices. Phone numbers and e-mail of the shop are not returned; shop_url shows them on the site.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | Page number, from 1 (20 phones per page). | |
| brand | No | Only this brand (name or id). | |
| shop_id | Yes | Shop id from mi_options('shops') or mi_shop_prices. | |
| name_contains | No | Part of the model name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), so the description's job is to add context — and it does, disclosing that phone numbers and e-mail are withheld and that `shop_url` exposes them on the site. That is a real, non-obvious output limitation. It doesn't discuss pagination limits or error behavior, keeping it just short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences: what it does first, usage triggers second, caveat last. No filler, no restatement of the title, and the sibling routing is placed where an agent will read it.
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 4-parameter read-only lookup with no output schema, the definition covers purpose, selection criteria, the alternative tool, and the notable omission of contact details. A brief note on result ordering or typical volume would make it fully self-sufficient.
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 page, brand, shop_id and name_contains are already documented in the schema. The description adds only the currency unit (Toman) and a hint that shop_id comes from mi_options('shops') or mi_shop_prices — useful but marginal. 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: 'Show one Mobile.ir shop's profile and the phones it lists with their current prices in Toman.' The scope ('one shop') is explicit and immediately distinguishes it from the sibling mi_shop_prices, which is named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use triggers ('what does shop X sell', comparing a shop's prices for a brand) and an explicit routing rule: 'For one model across all shops use mi_shop_prices.' That is the when/when-not/alternative pattern at full strength.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_shop_pricesShop prices of a phoneARead-onlyIdempotent
List what each shop currently charges for a phone on Mobile.ir (price in Toman, shop, city, note, warranty).
Shops write their own notes (memory/RAM variant, colour, warranty), so prices of the same model differ; read the note. Cheapest first. Shops are advertisers: the site does not vouch for them.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Product id from mi_search, mi_find or mi_market_prices, e.g. 41113. | |
| include_old | No | Also list older, expired shop prices. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's job is to add context, and it does: prices are in Toman, the result is sorted cheapest-first, per-shop notes explain price differences, and shops are advertisers the site does not vouch for — a meaningful trust caveat. It omits any statement about result caps or what happens when no shop currently lists the product.
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 that front-load the outcome, then the caveat that makes the numbers interpretable, then the trust warning. Every sentence earns its place; the only weakness is the slightly awkward mid-sentence break around 'read the note. Cheapest first.'
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 compensates by naming the returned fields and the sort order, and annotations cover the safety profile. It is nearly complete for a simple read-only list tool, missing only edge-case behavior (empty results, stale vs. current pricing beyond the include_old flag).
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 `id` even pointing at the sibling tools that produce it and `include_old` fully explained, so the baseline is 3. The description adds no parameter-level meaning of its own and never mentions include_old or how expired prices affect the cheapest-first ordering.
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 — listing per-shop current prices for a given phone on Mobile.ir — and enumerates the returned fields (price in Toman, shop, city, note, warranty). It does not explicitly contrast itself with the closest siblings (mi_market_prices, mi_price_history), so an agent must infer the distinction from the name alone.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implied usage is clear (you want shop-by-shop offers for a known product id) and it adds a reading instruction ('read the note') plus an ordering guarantee ('Cheapest first'). However, it never says when to prefer this over mi_market_prices or mi_price_history, and there are no explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_sim_searchSearch SIM card numbersARead-onlyIdempotent
Search the SIM card numbers users sell on Mobile.ir (Iran's numbered-SIM market): operator, number, price.
Filter by operator or prefix, digits in the number (e.g. endswith 1111), new/used, prepaid/postpaid, round
numbers, province and price. Seller names and phones are not returned; open url on the site to contact.
number is the full 11-digit number as sold.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Ads updated within this many days (-1 = all). | |
| page | No | Page number, from 1 (20 ads per page). | |
| plan | No | postpaid = permanent (دائمی), prepaid = credit (اعتباری). | any |
| sort | No | Order of the ads. Unpriced ads sort as the cheapest: set min_price with sort=price to skip them. | date |
| match | No | How `number` must match. | contains |
| number | No | Digits of the 7-digit subscriber part to match (after the 09xx prefix), e.g. '1111' or '5555'. | |
| prefix | No | One exact prefix such as 0912 (overrides operator). | |
| operator | No | mci = Hamrah-e Aval (0910-0919, 0990-0996), irancell (090x, 093x), rightel (092x), taliya (0932), shatel (0998). | |
| province | No | Province id from mi_options('provinces') (1 = Tehran, 5 = Isfahan, 14 = Khorasan Razavi). | |
| condition | No | New (صفر) or used (کارکرده) line. | any |
| max_price | No | Toman, highest price (unpriced ads dropped). | |
| min_price | No | Toman, lowest price. | |
| descending | No | Newest / most expensive / highest number first. | |
| round_only | No | Only 'round' (رند) numbers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare read-only, idempotent, non-destructive, open-world behavior, so the description only needs to add context. It does: it discloses that seller names and phone numbers are absent from results and that contact happens outside the tool via `url`, which is exactly the kind of privacy/return-shape fact annotations cannot convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short paragraphs, front-loaded with the resource and destination site before the filter list. The second paragraph packs several unrelated facts (filters, contact rules, number format) into one block without bullets, but no sentence 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?
For a 14-parameter, no-output-schema search tool with strong annotations, the description covers the essentials: what is searched, what can be filtered, and what is deliberately withheld from results. Pagination and price-sorting edge cases live in the schema, and with no output schema present the absence of a fuller return-value description is a minor gap rather than a blocking one.
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; every one of the 14 parameters is already documented, including the operator ranges and the `prefix` overrides `operator` rule. The description's filter recap adds only the 'endswith 1111' framing, and its line that '`number` is the full 11-digit number as sold' is ambiguous against the schema's `number` parameter (the 7-digit subscriber part), which could mislead rather than clarify.
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 — searching SIM card numbers listed for sale on Mobile.ir — and names the domain (Iran's numbered-SIM market) and the fields carried (operator, number, price). It does not differentiate itself from siblings such as mi_sim_summary or mi_used_search, so an agent must infer the split between listing search and summary.
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 paragraph gives clear operating context: which facets can be filtered, that seller identities are withheld, and that `url` must be opened on the site to make contact. It stops short of explicit when-not or alternative-tool routing (e.g. when to use mi_sim_summary instead), so it lands just under the top band.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_sim_summarySIM number market summaryARead-onlyIdempotent
Summarise the numbered-SIM market on Mobile.ir per operator: ad counts and the three cheapest priced numbers.
Use it for 'how many Irancell numbers are for sale' or 'cheapest Rightel number'. Drill into one operator with
mi_sim_search. Prices are Toman; many ads have no price (negotiable) and are counted in ads only.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Ads updated within this many days (-1 = all). | |
| plan | No | Permanent or credit lines. | any |
| condition | No | New (صفر) or used line. | any |
| min_price | No | Toman; ignores placeholder prices such as 1 or 5 that old ads carry. | |
| round_only | No | Only 'round' (رند) numbers. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower, and the description still adds real behavioral context: prices are in Toman and many ads are price-less (negotiable) and counted only in `ads`. It doesn't cover freshness guarantees, caching, or result limits, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, output shape front-loaded, followed by use cases and then the sibling routing hint. No filler and no repetition of the tool name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five optional params and no output schema, the description reasonably carries the return-value burden by specifying ad counts plus three cheapest prices per operator, and it flags the price-less-ad caveat that affects how those cheapest slots are populated. Minor gaps remain: whether counts span all operators in one response and how many operators are returned.
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 three enums, so the schema already documents all five parameters. The description's only parameter-relevant contribution is that prices are Toman, which the schema itself states for min_price, so this is baseline 3 with no meaningful added semantics.
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 (summarise), a specific resource (numbered-SIM market on Mobile.ir), and the exact output shape: per-operator ad counts and the three cheapest priced numbers. It also explicitly contrasts itself with mi_sim_search for drill-down, so an agent can choose between them 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?
Concrete trigger phrases ('how many Irancell numbers are for sale', 'cheapest Rightel number') make the when-to-use case unambiguous, and the alternative path is named: drill into one operator with mi_sim_search. It doesn't state explicit exclusions, but the sibling pointer effectively covers the main branch point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_used_adOne used-phone adARead-onlyIdempotent
Read one used/new phone ad on Mobile.ir: price, market price, condition, box, city, description, photos, shops.
Seller name and phone are not returned (personal data); the url opens the ad where the site shows them to
signed-in visitors. market_price_toman is the site's own estimate of the shop price today.
| Name | Required | Description | Default |
|---|---|---|---|
| ad_id | Yes | Ad id (ad_id) from mi_used_search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and non-destructive behavior, and the description adds genuinely non-obvious context beyond them: seller name and phone are withheld as personal data, the url is where those appear to signed-in visitors, and market_price_toman is the site's own estimate rather than an observed price. That is real disclosure of data quirks an agent could otherwise misread.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The field enumeration is front-loaded and earns its place because there is no output schema; the two trailing caveat sentences are short and purposeful. Slightly list-like phrasing but no wasted prose.
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 one required parameter, no output schema, and full annotation coverage, the description does what it must: it previews the return fields and flags the two data caveats (missing contact info, estimated market price). Only the lack of guidance on follow-up tools or error behavior keeps it from the top score.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter is documented as an ad_id sourced from mi_used_search, which is the key semantic link an agent needs. The description adds nothing further on the parameter, so it sits at the baseline-plus level rather than above it.
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 ("Read one used/new phone ad on Mobile.ir") and enumerates the returned fields, so an agent knows exactly what it gets. It does not explicitly name the sibling it complements (mi_used_search), but the singular "one ad" framing makes the search-vs-fetch distinction fairly clear.
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?
Usage is only implied: this is the detail lookup that follows a listing search, reinforced by the schema note that ad_id comes from mi_used_search. There is no explicit "use this when..." statement or exclusion of alternatives such as mi_used_search or mi_phone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mi_used_searchSearch used-phone adsARead-onlyIdempotent
Search the used and new phone ads that users post on Mobile.ir (price, condition, city, description).
Seller names and phone numbers are left out. price_note holds non-numeric prices such as 'توافقی' (negotiable)
or 'بالاترین پيشنهاد' (highest offer). Open one ad with mi_used_ad. Ads are unverified user content.
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Ads updated within this many days (-1 = all). | |
| kind | No | Product class. | phone |
| page | No | Page number, from 1 (40 ads per page). | |
| sort | No | Order of the ads. Unpriced ads sort as the cheapest: set min_price with sort=price to skip them. | date |
| brand | No | Brand name or id; see mi_options('brands'). | |
| province | No | Province id from mi_options('provinces') (1 = Tehran, 5 = Isfahan, 14 = Khorasan Razavi). | |
| condition | No | Sealed new or used. | any |
| max_price | No | Toman, highest price (ads without a price are dropped). | |
| min_price | No | Toman, lowest price. | |
| descending | No | Newest or most expensive first. | |
| with_photos | No | Only ads with photos. | |
| name_contains | No | Part of the model name, e.g. 'iphone 15'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/idempotent/non-destructive, so the safety profile is covered. The description still adds non-inferable behavior: seller names and phone numbers are stripped from results, and listings are unverified user content that should not be treated as ground truth. It stops short of describing result volume, total counts, or pagination end conditions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and scope lead, followed by the privacy caveat, the price_note quirk, and the sibling hand-off — a sensible order with no filler sentences. The price_note aside is slightly parenthetical and interrupts the flow, and the parenthetical field list is ambiguous about whether those are filters or returned fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter tool with no output schema, the description does meaningful work: it sketches the ad record contents, flags stripped contact data, and explains the non-numeric price field an agent would otherwise misread. It still omits the shape of the list response (items, totals, page bounds), which matters more here precisely because no output schema exists.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with enums and defaults documented for days, kind, sort, condition, prices and name_contains, so the schema carries the parameter burden. The description only echoes the filterable dimensions (price, condition, city) and explains price_note values, which is marginal added meaning over 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 (search) and resource (used and new phone ads posted by users on Mobile.ir), and names the concrete content domain with the filterable/returned attributes in parentheses. It also routes to the sibling mi_used_ad for the single-ad case, so an agent can distinguish this from the detail tool 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?
"Open one ad with mi_used_ad" gives an explicit alternative for the drill-down case, and "Ads are unverified user content" tells the agent how to treat results. However, with 16 siblings including mi_search, mi_find and mi_shop_prices, the description never says when to prefer this classified-ads search over retail shop prices or the general search tools, leaving the most likely confusion unresolved.
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.
17 tool updates
v0.1.1- First observed
mi_article - First observed
mi_articles - First observed
mi_brand_models - First observed
mi_comments - First observed
mi_compare - First observed
mi_find - First observed
mi_market_prices - First observed
mi_options - First observed
mi_phone - First observed
mi_price_history - First observed
mi_search - First observed
mi_shop - First observed
mi_shop_prices - First observed
mi_sim_search - First observed
mi_sim_summary - First observed
mi_used_ad - First observed
mi_used_search
TDQS
Scored across 17 tools
Most tools occupy clearly distinct slots (phone specs, shop prices, price history, used ads, SIM ads, articles, comments), and the descriptions actively disambiguate by pointing elsewhere (e.g. mi_search vs mi_find, mi_articles vs mi_article). A few pairs still invite misselection: mi_search vs mi_find (both locate phones), mi_shop_prices vs mi_market_prices (both list shop price rows), and the singular/plural mi_article vs mi_articles split, which relies on reading the description carefully.
All 17 tools share a uniform `mi_` prefix and lowercase snake_case, so the family is predictable. Within that, however, the convention is noun-phrase rather than verb_noun, and it mixes single nouns (mi_phone, mi_shop, mi_compare) with multi-word nouns (mi_shop_prices, mi_market_prices, mi_brand_models), so the name alone does not reliably tell you whether a tool lists or details.
17 tools for a genuinely broad domain (phone database, shop prices, used ads, SIM market, editorial content, comments) is on the heavy side of reasonable but each tool maps to a real sub-surface. No obvious redundant or filler tool; a slight trim of the search cluster could tighten it.
The read-only lifecycle is well covered: discovery (search/find/brand_models), detail (phone, ad, shop, article), pricing (shop_prices, market_prices, price_history), comparison, reviews and comments, plus the SIM vertical. Gaps are mostly intentional privacy omissions (seller/shop contact, author names) and the absence of any write/account operations, which agents can work around via the returned URLs.
Maintenance
Related MCP Connectors
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Agent-first tool search. Start with search_tools({job: "your task in plain words"}); free, no key.
AI agent tools: web search, browser, 400+ LLMs, image gen, TTS, phone verify. Pay-per-use.
Independent directory of agentic AI tools — search, compare & recommend via MCP. Read-only.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables AI agents to compare prices across Iranian online and in-person shops, inspect each seller's offer with warranty and installment details, review roughly a year of price history, score deals, and find the cheapest shop for a whole basket. It is read-only, requires no account or API key, and runs locally for Claude, Cursor or Copilot.26105 PyPI1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search Iranian electronics products, read full spec tables, compare models side by side, and check shop offers and price history in Toman. It also covers category filtering, spec-based ranking, and Zoomit reviews, articles and buying guides, all read-only and without an API key.MIT
- AlicenseAqualityBmaintenanceEnables AI agents to read public Iranian car-marketplace data, including filtered used-car ads, full ad details, new-car prices and history, spec comparisons, and magazine articles, without an API key.152MIT
- AlicenseAqualityBmaintenanceEnables AI agents to read public Hamrah Mechanic data read-only with no API key: daily Iranian car market prices by brand, model, trim and year, price ranges and monthly history, filtered used and zero-km listings with full ad details, inspection fees, showroom locations, and expert reviews and magazine articles. Works in Claude, Cursor, Copilot and other MCP clients over stdio.122MIT