iran-apps-mcp
Read-only MCP server for querying Cafe Bazaar and Myket app metadata in Persian or English.
Search apps and games in one or both stores and get package names, ratings, and store URLs.
Fetch one app's details: version, rating/count, installs, size, update date, developer, price, and description.
Compare the same package across both stores, including newer version and rating difference.
List top/best or new apps/games per category or store-wide.
List category slugs for each store.
Find similar/related apps.
Metadata only: no downloads/APK links, login, reviews, purchases, or Google Play data.
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., "@iran-apps-mcpcompare Telegram on Cafe Bazaar vs Myket"
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.
iran-apps-mcp: Cafe Bazaar and Myket MCP server for AI agents
Let your AI agent look up apps on the Iranian Android stores. An unofficial, read-only MCP server for Cafe Bazaar (کافه‌بازار) and Myket (مایکت): search apps and games, compare one package across both stores, and list top or new apps, from Claude, Cursor or Copilot.
For AI agents · Quick start · What it can do · Tools · FAQ · فارسی
For AI agents
What: unofficial MCP server (model context protocol) for the two big Iranian Android app stores, Cafe Bazaar (cafebazaar.ir) and Myket (myket.ir). Queries work in Persian and English.
Install:
uvx iran-apps-mcporclaude mcp add iran-apps -- uvx iran-apps-mcp. Transport: stdio. Needs uv (Python 3.10+).Auth: none, no API key or account. Optional
IRAN_APPS_MCP_PROXY(HTTP proxy URL, or a comma-separated list); system proxy settings are ignored.Access: read-only, metadata only. It cannot log in, post reviews or download anything, so no confirmation is needed before calling any tool. Every result carries the store page URL.
Tools: 6, all prefixed
ap_. Typical sequence:ap_search(get the package name) ->ap_compareorap_app->ap_similar. For lists, callap_categoriesfirst and pass a slug toap_top.Use when: the user asks about an Android app's version, rating, installs, size or update date on the Iranian stores; whether Myket lags Bazaar; top or new apps in a category; alternatives to an app.
Do not use when: the user wants to install or download an app (no download or APK links), or needs Google Play data.
Output: compact JSON. An app is identified by its Android package name (same in both stores). Ratings are 1-5 per store,
installsis an approximate count, dates areYYYY-MM-DD(Gregorian), prices in Toman (0 = free).Machine-readable:
server.jsonand the iran-mcp catalog.
Related MCP server: snapp-mcp
Why
Cafe Bazaar and Myket are where most Iranian Android users get their apps, and neither offers a public API. Checking
"is the Myket version of this app behind Bazaar, and how do users rate it in each store?" means opening both sites and
reading two different pages. With iran-apps-mcp an agent answers it in one call and returns a short summary.
You: Is Telegram up to date on Myket compared with Cafe Bazaar?
Agent: calls
ap_search(query="telegram")->ap_compare(package="org.telegram.messenger")It reads both versions, says which store has the newer one, and shows the rating difference.
What it can do
Search apps and games in Cafe Bazaar, Myket or both, by Persian or English name
Read one app: version, rating and rating count, installs, size, update date, developer, price and description
Compare the same package in both stores side by side, with which store is newer and the rating difference
List top or new apps per category (apps and games), or the store-wide trending or editorial list
List categories of each store (slugs differ between the stores)
Find similar apps the store itself shows as related
Read-only by design: no login, no reviews, no downloads
Example prompts:
"Search Cafe Bazaar and Myket for Snapp and show the ratings."
"Compare the Digikala app on both stores: version, rating, installs."
"What are the best new games on Myket this week?"
"Top apps in the finance category on Cafe Bazaar."
"Which apps do users also install along with Divar?"
اپلیکیشن بله را در کافه‌بازار و مایکت جستجو کن و نسخه و امتیازش را مقایسه کن.
بهترین بازی‌های جدید مایکت کدام‌اند؟
برنامه‌های مشابه اسنپ در کافه‌بازار را نشان بده.
Quick start
You need uv. No API key or account.
claude mcp add iran-apps -- uvx iran-apps-mcpSettings → Developer → Edit Config, then add:
{
"mcpServers": {
"iran-apps": { "command": "uvx", "args": ["iran-apps-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": {
"iran-apps": { "type": "stdio", "command": "uvx", "args": ["iran-apps-mcp"] }
}
}codex mcp add iran-apps -- uvx iran-apps-mcpOr in ~/.codex/config.toml:
[mcp_servers.iran-apps]
command = "uvx"
args = ["iran-apps-mcp"]Add to ~/.gemini/settings.json:
{
"mcpServers": {
"iran-apps": { "command": "uvx", "args": ["iran-apps-mcp"] }
}
}Add the Claude Desktop block to ~/.codeium/windsurf/mcp_config.json.
It is a standard stdio MCP server: run uvx iran-apps-mcp, or pip install iran-apps-mcp and run iran-apps-mcp.
Tools
An app is identified by its Android package name (for example com.whatsapp). Get it from ap_search.
Tool | What it does |
| Search Cafe Bazaar and/or Myket for apps and games by name; returns package names, ratings and store URLs |
| Get one app's metadata from one store: version, rating and rating count, installs, size, update date, developer, price, description |
| Compare one package across Cafe Bazaar and Myket: version, rating, rating count, installs, size, update date, price |
| List the top ('best') or newest ('new') apps or games of a store, per category or store-wide |
| List the category slugs of a store for apps and games, to pass as |
| List apps the store shows as related to one app: Bazaar gives three groups (related, others also installed, similar), Myket one |
All 6 tools are annotated readOnlyHint: true.
How it works
AI agent (Claude, Cursor, Copilot, ...)
│
│ MCP over stdio
▼
iran-apps-mcp (runs on your machine)
│
│ HTTPS
├──────▶ api.cafebazaar.ir JSON API of the Bazaar web app
└──────▶ myket.ir page HTML (schema.org JSON-LD, facts table)iran-apps-mcp runs locally and has no hosted server in between and no API key. Cafe Bazaar is read through the JSON
requests its own web app uses; Myket has no JSON API, so its data is parsed from page HTML. Requests go out through a
Chrome-impersonating client, at most 4 at a time with a little jitter, and a failed request is retried up to twice.
It only reads.
Good to know
Prices are in Toman, 0 means free. Both stores quote Rial internally; the server divides by 10.
installsis approximate. Bazaar returns a range, Myket a text such as "32 million", so compare magnitudes, not exact numbers.Ratings are per store (1-5) and collected separately by each. A rating is omitted when the store has none.
Paging: Bazaar returns 24 apps per page, Myket 20. Myket lists stop after about 4 pages.
Categories differ between the stores; use
ap_categoriesto get valid slugs forap_top. Bazaar's game category list was found by probing and may be incomplete.Names: Bazaar names are often English, Myket's Persian. An app can be missing from one store (
ap_comparegives null there); Google Play-only apps are in neither.Myket depends on page HTML, so a site redesign can break it. Bazaar uses its web app's JSON API, which is undocumented and can change.
Network: both stores answered directly from Iran and through a foreign proxy exit when tested. If your network needs a proxy, set
IRAN_APPS_MCP_PROXY.What it does not do: no download or APK links, no login, no reviews or comments, no purchases, no Google Play data. Developer descriptions and taglines are untrusted text.
FAQ
Neither store documents a public API. iran-apps-mcp is an unofficial MCP server with 6 read-only tools that reads
Cafe Bazaar through its web app's API and Myket from its pages, and returns compact JSON for AI agents.
Add the server with claude mcp add iran-apps -- uvx iran-apps-mcp, or use the matching config in
Quick start, then ask in plain language, in Persian or English.
No. It returns metadata and the store page URL only.
Find the package name with ap_search, then call ap_compare. It shows both versions, which store is newer and the
rating difference.
Toman. Both stores quote Rial internally and the server converts. 0 means free.
The stores do not publish exact counts: Bazaar returns a range and Myket a rounded text. The server gives an approximate integer.
No. It only sees what is listed on Cafe Bazaar and Myket.
Usually not. Both stores answered directly and through a foreign exit when tested. If your network blocks them, set
IRAN_APPS_MCP_PROXY to an HTTP proxy. System proxy variables are ignored on purpose.
npx @modelcontextprotocol/inspector uvx iran-apps-mcpConfiguration
Variable | Default | Meaning |
| unset | Optional HTTP proxy URL for cafebazaar.ir and myket.ir; system proxy settings are ignored. A comma-separated list is tried in turn |
فارسی: سرور MCP کافه‌بازار و مایکت
iran-apps-mcp یک سرور MCP غیررسمی و فقط‌خواندنی برای دو فروشگاه برنامهٔ اندروید ایران، کافه‌بازار و مایکت، است. این سرور به دستیار هوش مصنوعی شما (Claude، Cursor، Copilot و ...) اجازه می‌دهد برنامه و بازی را در هر دو فروشگاه جستجو کند.
چه کارهایی می‌کند
جستجوی برنامه و بازی در کافه‌بازار، مایکت یا هر دو، با نام فارسی یا انگلیسی.
اطلاعات یک برنامه: نسخه، امتیاز و تعداد امتیاز، تعداد نصب، حجم، تاریخ به‌روزرسانی، توسعه‌دهنده، قیمت و توضیحات.
مقایسهٔ یک بسته در دو فروشگاه، مثلاً اینکه نسخهٔ مایکت عقب است یا نه.
برترین و جدیدترین برنامه‌ها و بازی‌ها به تفکیک دسته.
برنامه‌های مشابه که خود فروشگاه نشان می‌دهد.
نکته‌ها
فقط خواندنی است: وارد حساب نمی‌شود، نظر ثبت نمی‌کند و لینک دانلود یا APK نمی‌دهد.
قیمت‌ها به تومان، امتیازها از ۱ تا ۵ برای هر فروشگاه جدا، و تعداد نصب تقریبی است. تاریخ‌ها میلادی هستند.
کلید API لازم نیست و روی سیستم خود شما اجرا می‌شود. برای پراکسی از متغیر
IRAN_APPS_MCP_PROXYاستفاده کنید.
نصب (اول uv را نصب کنید). در Claude Code:
claude mcp add iran-apps -- uvx iran-apps-mcpدر Claude Desktop، Cursor و بقیه برنامه‌ها همان تنظیم بخش Quick start را بگذارید.
نمونه پرسش‌ها
«اپلیکیشن بله را در کافه‌بازار و مایکت مقایسه کن.»
«بهترین بازی‌های جدید مایکت کدام‌اند؟»
«برنامه‌های مشابه اسنپ را نشان بده.»
Development
git clone https://github.com/sepehr071/iran-apps-mcp && cd iran-apps-mcp
uv sync
uv run ruff check . && uv run ruff format --check .
uv run python -m pytest -q # offline unit tests on recorded fixtures
uv run python -m pytest -m live -q # calls the real stores
uv buildEach tool is a typed async function in src/iran_apps_mcp/tools.py with a docstring that tells the agent when to use
it. Issues and PRs are welcome.
Releases: bump the version in pyproject.toml and server.json, then push a v* tag. GitHub Actions publishes to PyPI.
Related servers
iran-mcp: catalog of all Iranian-service MCP servers
iran-downloads-mcp for Iranian download sites
digikala-mcp for Digikala product search and prices
torob-mcp for price comparison on Torob
divar-mcp for Divar classified ads
Listed on mcpfarsi.ir, the Persian MCP marketplace
Disclaimer
Unofficial and not affiliated with or endorsed by Cafe Bazaar or Myket. It is read-only and uses the web endpoints and pages of the two stores, which can change without notice. App data is informational.
Author
Built and maintained by Sepehr Radmard (سپهر رادمرد). Connect on LinkedIn or follow @sepehr071 on GitHub for more MCP servers for Iranian websites, all listed in iran-mcp. If this saves you time, a star on the repo helps other people find it.
License
Available Tools
6 toolsap_appApp detailsARead-onlyIdempotent
Get one app's metadata from one store: version, rating and rating count, installs, size, update date, developer, price, description.
Bazaar also gives version_code, a 1-5 star histogram, changelog and permission count; Myket also the first publish date and developer_id. installs is approximate (a rounded range). Prices are Toman, 0 = free. Metadata only: no APK download. To see both stores at once use ap_compare.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | 'bazaar' (Cafe Bazaar) or 'myket'. | bazaar |
| package | Yes | Android package name, the id in store URLs, e.g. 'ir.mci.ecareapp' or 'com.whatsapp'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's job is to add context beyond that, which it does: store-dependent field availability, approximate/rounded installs, currency in Toman with 0 = free, and no binary download. It stops short of error behavior (e.g., unknown package) 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?
Front-loaded with the core purpose and return fields, then progressively adds store-specific and unit caveats; every sentence carries information. The middle sentence is dense and list-like, which slows scanning slightly, but nothing is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must carry the return-value burden, and it does so well: field list, store-specific extras, precision caveats, and currency semantics. Remaining gaps are minor (failure modes, whether fields can be null for a given store).
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 credit by explaining the consequence of the store enum value (Bazaar adds version_code, histogram, changelog, permission count; Myket adds first publish date and developer_id). The package parameter's meaning is only implied by 'one app's metadata'.
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+resource ('Get one app's metadata from one store') and immediately enumerates the returned fields, so the agent knows exactly what the tool produces. It also explicitly distinguishes itself from ap_compare and from APK-download tools, making sibling selection unambiguous.
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 routes the agent to an alternative with a condition ('To see both stores at once use ap_compare') and states a scope exclusion ('Metadata only: no APK download'). It does not, however, contrast with ap_search or ap_similar, which occupy adjacent lookup use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ap_categoriesCategoriesARead-onlyIdempotent
List the category slugs of a store for apps and games, to pass as ap_top category.
Slugs differ between the stores (Bazaar 'tools' = Myket 'productivity'). Myket names are Persian. The Bazaar game list is the set that was verified to return results, not necessarily every game category.
| Name | Required | Description | Default |
|---|---|---|---|
| store | Yes | 'bazaar' or 'myket'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds real context beyond them: slugs are store-specific (Bazaar 'tools' = Myket 'productivity'), Myket names are Persian, and the Bazaar game list is not guaranteed complete.
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 it does and the consumer, followed by only the caveats an agent actually needs (store divergence, Persian naming, non-exhaustive game list). Nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of explaining the return and does state it returns category slugs plus important caveats about store divergence. It does not describe the concrete return shape (list of strings vs. objects with names), which is the one remaining gap for a tool with 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% and the single 'store' parameter is an enum already documented in the schema, so the baseline is 3. The description reinforces store-specific behavior but adds no syntax or format detail about the parameter itself.
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 category slugs of a store') and ties the output to its downstream consumer ('to pass as ap_top category'), which cleanly separates it from ap_top, ap_search, and the other siblings. An agent knows exactly what this returns and why.
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 context: call this to obtain valid category slugs before invoking ap_top, and it warns that the Bazaar game list is a verified subset rather than exhaustive. It stops short of explicitly naming a 'do not use this for X' exclusion, so it falls just under the top bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ap_compareCompare storesARead-onlyIdempotent
Compare one package across Cafe Bazaar and Myket: version, rating, rating count, installs, size, update date, price.
Returns each store's figures (null when the app is not listed there) and a diff: which store has the newer version, the rating difference (bazaar minus myket). Use for "is the app up to date on Myket?" or "which store rates it higher". Ratings are not shared between stores.
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes | Android package name, the id in store URLs, e.g. 'ir.mci.ecareapp' or 'com.whatsapp'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower, yet the description adds genuinely non-obvious behavior: null values when the app is absent from a store, the diff direction (bazaar minus myket), and the caveat that ratings are not shared between stores. It does not mention auth, rate limits, or error behavior, so it falls short of a full behavioral picture.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the compared fields, then the return shape and diff semantics, in two tight sentences. Every clause carries information; nothing is redundant with the name or title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description must explain the return value, and it does: per-store figures plus a diff identifying the newer version and the rating delta. Combined with full annotation coverage, an agent has everything needed to call and interpret this 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?
There is a single parameter with 100% schema description coverage, including format and examples ('ir.mci.ecareapp'), so the schema carries the semantics. The description only refers to it obliquely as "one package" and adds no syntax or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (one package across Cafe Bazaar and Myket) and enumerates exactly which fields are compared: version, rating, rating count, installs, size, update date, price. This is clearly distinguishable from siblings like ap_app (single-store detail) or ap_search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete use-case triggers ("is the app up to date on Myket?", "which store rates it higher"), which tells the agent when this tool is the right pick. It stops short of explicitly naming when NOT to use it or pointing to ap_app/ap_search as the single-store alternative, so it is clear context rather than full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ap_searchSearch appsARead-onlyIdempotent
Search Cafe Bazaar and/or Myket for apps and games by name; returns package names, ratings and store URLs.
Use first to find a package name, then ap_app for details or ap_compare for both stores. Bazaar cards carry rating, category, approximate installs and a price when paid; Myket cards only name and tagline (ap_app has the rest).
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based result page (Bazaar 24 per page, Myket 20). | |
| limit | No | Max apps returned per store. | |
| query | Yes | Search text, Persian or English, e.g. 'تاکسی' or 'snapp'. | |
| store | No | 'bazaar' (Cafe Bazaar), 'myket' or 'both' (default, results side by side). | both |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds genuinely useful non-annotation detail: what a result card contains and the asymmetry between stores ('Myket cards only name and tagline (ap_app has the rest)'), which sets expectations for result completeness.
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 what it does and what it returns, followed by routing and per-store caveats; every sentence carries information. The clause 'ap_app has the rest' is slightly parenthetical but still 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?
No output schema exists, so the description must convey what comes back; it names package names, ratings and store URLs and then qualifies store-specific payload differences. Pagination and limits live in the schema, so the remaining gap is minor.
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 store enum semantics and per-store page sizes, so the schema does the heavy lifting. The description adds only indirect meaning (search is by name, Persian or English is already in the schema), so 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 ('Search Cafe Bazaar and/or Myket for apps and games by name') plus the scope of each store, and distinguishes itself from siblings by naming ap_app and ap_compare as the follow-up tools. An agent can tell it apart from ap_top/ap_categories 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?
Explicitly prescribes the workflow ('Use first to find a package name, then ap_app for details or ap_compare for both stores'), which is clear routing guidance. It does not cover when an agent should skip search entirely (e.g. ap_top for charts or ap_categories for browsing), so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ap_similarRelated appsARead-onlyIdempotent
List apps the store shows as related to one app: Bazaar gives three groups (related, others also installed, similar), Myket one.
Use to find alternatives or competitors of an app; then ap_compare or ap_app on a result.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | 'bazaar' or 'myket'. | bazaar |
| package | Yes | Android package name, the id in store URLs, e.g. 'ir.mci.ecareapp' or 'com.whatsapp'. |
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). Beyond that, the description discloses a behavioral trait the annotations do not: the per-store variation in returned result groups (three for Bazaar, one for Myket), which materially affects how an agent interprets the output. Error/empty-result behavior is not covered.
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 filler; the core behavior and its store-specific nuance come first, and the usage/workflow hint follows. 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 explains the shape of the result (grouped related/also-installed/similar) and points to next-step tools, which is what an agent needs to act. Minor gaps remain around result size, pagination, or behavior for an unknown package.
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 both parameters (package, store) documented including an example package name and enum values, so the schema does the heavy lifting. The description adds no syntax or format detail beyond the schema, making 3 the correct baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (related apps for one app), and adds the store-dependent result shape (Bazaar: three groups; Myket: one). This is clearly distinguishable from siblings like ap_search and ap_top 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 names the use case ('find alternatives or competitors of an app') and the follow-on workflow ('then ap_compare or ap_app on a result'). No explicit when-not-to-use or negative routing against siblings such as ap_search, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ap_topTop and new appsARead-onlyIdempotent
List the top ('best') or newest ('new') apps or games of a store, per category or store-wide.
Store-wide 'best' is Bazaar's trending list or Myket's editorial must-have list (no ranking guarantee). 'new' needs a category. Get slugs from ap_categories (they differ per store). Then ap_app or ap_compare on a package. Categories are the store's own labels, so Myket 'productivity' is «ابزارهای کاربردی» (utilities: ride-hailing, operator and government apps, file sharing, AI assistants) rather than office productivity.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 'best' = top ranked, 'new' = newest in the category. | best |
| page | No | 1-based page (Bazaar 24 per page, Myket 20, Myket stops after about 4 pages). | |
| type | No | 'app' or 'game': which category list the slug belongs to, and which store-wide list when no category. | app |
| limit | No | Max apps returned. | |
| store | Yes | 'bazaar' or 'myket'. | |
| category | No | Category slug from ap_categories, e.g. 'tools' (Bazaar) or 'productivity' (Myket). Omit for the store-wide list (best only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/open-world, and the description adds real behavioral context beyond them: store-wide 'best' is a trending or editorial list with no ranking guarantee, and store-specific category labeling differs (Myket 'productivity' means utilities). It does not describe the returned payload shape, which is the remaining gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core verb and the two modes, then follow-on instructions. Slightly dense, and the parenthetical unpacking of Myket's 'productivity' category is a tangent that could be trimmed, but nothing is redundant.
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 six-parameter, read-only listing tool with no output schema, the description covers selection logic, prerequisites, and follow-up tools. The one omission is what the results look like (packages, names, ranking fields), which matters because there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaning the schema cannot: category slugs differ per store, the same slug maps to different real-world app sets, and category is only valid with kind='best'. That is genuine disambiguation beyond the enum descriptions.
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 top ('best') or newest ('new') apps/games of a store, per category or store-wide. It also immediately disambiguates the two modes and names the sibling tools (ap_categories, ap_app, ap_compare) that handle adjacent jobs.
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 routing rules: get category slugs from ap_categories first, then use ap_app or ap_compare on a package. It also states the constraint that 'new' requires a category while store-wide only works for 'best', which is exactly the decision an agent must make before calling.
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.
6 tool updates
v0.1.0- First observed
ap_app - First observed
ap_categories - First observed
ap_compare - First observed
ap_search - First observed
ap_similar - First observed
ap_top
TDQS
Scored across 6 tools
Each tool targets a distinct operation: discovery (ap_search), single-app metadata (ap_app), cross-store diff (ap_compare), listings (ap_top), category lookup (ap_categories), and related apps (ap_similar). Descriptions explicitly sequence them (search → app/compare) and ap_app even points to ap_compare for the two-store view, so overlap is resolved rather than left implicit.
All six tools use the same ap_snake_case form with a shared prefix, and the suffix reads as a consistent noun/action label (app, top, categories, compare, similar, search). No mixed conventions or stray casing anywhere in the set.
Six tools is well-scoped for a read-only two-store metadata server: one each for search, details, comparison, listings, categories, and related apps. Nothing looks like filler, and no obvious near-duplicate is padded in to inflate the count.
The surface covers the full browse lifecycle — find a package, inspect it, enumerate categories and top lists, compare stores, and explore alternatives — with APK download explicitly out of scope. Minor gaps remain, such as a dedicated developer-listing or review-listing operation, which agents must work around via search or ap_similar.
Maintenance
Related MCP Connectors
App intelligence across Google Play and the App Store: details, reviews, and search in one API.
Live App Store and Google Play data for AI agents: revenue and download estimates for 3.6M+ apps, app search and filters, ASO keyword research, reviews and listing change history. Read-only tools; API key from GetAppNiche (https://getappniche.com/mcp).
Live App Store and Google Play data: app details, reviews, search, top charts for 175+ storefronts.
Your agent needs app-store data — what an app looks like on the App Store and Google Play, what reviewers say, and what ranks for a search in a given country. **What you can ask for** • "What does this app's store listing look like, and how is it rated?" • "Pull recent reviews for this app and group the complaints." • "What apps rank for this search term in Japan?" • "List the top apps in this category on both stores." • "Compare this app's listing on iOS and Android." **How to use it** Point any MCP client at https://mcp.aisa.one/seo-apps/mcp and sign in with OAuth — there is no key to create or paste. 37 tools: Apple App Store and Google Play app info, app lists, category listings, reviews and store search results, in live and queued forms, with categories, languages and locations for each. **It is also a door to the rest** The same login reaches 26 sources and 580+ operations. Read the store listing here, then ask the same agent what the app's website ranks for — without adding a second server. **What it costs** Finding and inspecting an operation is free. Running one is billed per call at API prices, with no seat and no monthly minimum, and every call takes max_price_usd so an agent cannot overspend by accident. **Where else it reaches** https://mcp.aisa.one/seo/mcp for all of it at once — rankings, keywords, backlinks, site health and AI-answer visibility across DataForSEO, Semrush and Ahrefs.
Related MCP Servers
- AlicenseCqualityDmaintenanceEnables querying and retrieving data from App Store and Google Play Store, including app details, reviews, ratings, rankings, permissions, and search capabilities across both iOS and Android platforms.20MIT
- AlicenseAqualityAmaintenanceEnables AI agents to search Snappfood restaurants and SnappMarket stores across Iran, compare true order costs including packaging and delivery, read menus, minimum orders, ETAs and reviews, and surface live flash deals. All operations are read-only, with no login, basket, ordering or payment access.21395 PyPI37MIT
- 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
- AlicenseAqualityAmaintenanceEnables AI agents to search products on Iran's marketplace of independent shops with price, category, shipping and discount filters, find the cheapest in-stock offers, and read product details, shops, categories and customer reviews. It is read-only and needs no authentication, so it can be used straight from Claude, Cursor or Copilot.798 PyPIMIT