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. Prices are Toman, 0 = free. For both stores at once use ap_compare.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | 'bazaar' or 'myket'. | bazaar |
| package | Yes | Android package name, e.g. 'com.whatsapp'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and openWorld, so safety is covered. The description adds real substance beyond that: which fields each store returns, that Bazaar's extra fields include version_code, histogram, changelog and permission count, and that prices are in Toman with 0 meaning free. Only the shape/format of the response (flat object vs nested) is left implicit.
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 action, then store-specific deltas, then a routing pointer. The store-specific sentences are dense but each carries field-level information an agent would otherwise have to discover empirically; minor redundancy in re-listing the base fields twice.
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 describing returns and does so field by field, including store-specific extras and price units. Complete enough to call correctly and interpret results; only the structural form of the response is unspecified.
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 more by explaining what the store parameter actually buys you: bazaar yields version_code, star histogram, changelog and permission count, while myket yields first publish date and developer_id. That is decision-relevant meaning the enum labels do not provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get one app's metadata from one store') and enumerates the returned attributes (version, rating, installs, size, developer, price). The 'one store' scope immediately distinguishes it from ap_compare, which is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear routing rule: use this for a single store, use ap_compare for both stores at once. No explicit exclusion for ap_search or ap_similar, but the single-app scope makes the boundary reasonably clear from context.
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 may be incomplete.
| 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 read-only, idempotent, non-destructive, open-world access, so safety is covered. The description adds genuinely non-obvious behavioral context: slugs are store-specific with an explicit cross-store mapping example, Myket names are Persian, and the Bazaar game list may be incomplete — all of which change how an agent should interpret and reuse results.
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, purpose first, caveats second; nothing is redundant. The abrupt line breaks inside sentences slightly hurt scanability but cost no clarity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read tool with no output schema, the description covers purpose, downstream use, and the data-quality pitfalls that matter. Only the shape of the returned slug list (ordering, approximate count) is left implicit, which 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 coverage is 100% and the single enum is already documented, so the baseline is 3. The description earns above baseline by explaining the consequence of the store choice — that it selects a different slug vocabulary and name language — which is meaning the enum list alone does not convey.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ("List the category slugs of a store") and adds the downstream consumer ("to pass as ap_top category"), which pins its role relative to the ap_top sibling. An agent can tell this apart from ap_search/ap_app without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The intended use is concrete: call this to obtain a category slug before calling ap_top. It does not state exclusions (e.g. what to do if you already know the slug, or when to skip ap_top entirely), so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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 not listed there) and a diff: newer version and rating difference (bazaar minus myket).
| Name | Required | Description | Default |
|---|---|---|---|
| package | Yes | Android package name, e.g. 'com.whatsapp'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds genuine value beyond that by disclosing the return shape: per-store figures with null for unlisted stores, plus a diff where rating difference is signed bazaar minus myket and version indicates which is newer. It does not say what happens when the package is absent from both stores, which is a meaningful edge case for an open-world lookup.
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, front-loaded with the purpose, then the compared fields, then the return contract. The field list is dense but each item is informative; the line break between the two parts aids scanning without wasted phrasing.
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 one-parameter read tool with no output schema, the description carries the return contract well: per-store figures, null handling, and diff direction. Minor gap is the unspecified behavior when neither store lists the package, which matters given the openWorld hint.
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 'package' parameter already documents the expected Android package-name format with an example. The description only implies that one package is supplied, adding no syntax, normalization, or lookup semantics beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (compare) and resource (one package across Cafe Bazaar vs Myket) and enumerates the exact attributes compared: version, rating, rating count, installs, size, update date, price. This is clearly distinguishable from ap_app (single-store details) and ap_search (discovery).
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 implied by the verb and the two named stores, so an agent can infer this is the cross-store comparison tool. However, no sibling is named and no when-not conditions are given (e.g. that ap_app should be used for a single store, or ap_search to find a package name first).
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. Bazaar cards carry rating, category, installs and price when paid; Myket cards only name and tagline.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based (Bazaar 24 per page, Myket 20). | |
| limit | No | Max apps per store. | |
| query | Yes | Persian or English, e.g. 'تاکسی'. | |
| store | No | 'bazaar', 'myket' or 'both'. | both |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description goes beyond them by disclosing a real asymmetry in results: Bazaar entries carry rating, category, installs and price when paid, while Myket entries only carry name and tagline. It does not mention throttling, empty-result behavior, or partial failure when one store errors.
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 no filler: what it does and returns, then how to use it, then a caveat about differing card contents. The line break mid-sentence and the colloquial 'cards' term slightly blunt readability, but nothing is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly takes on the job of describing return fields and their per-store variance, which is the main thing an agent needs here. What remains thin is failure and edge behavior — zero-hit queries, one store failing while 'both' is selected — for an openWorld search tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with page size, limits, language and the store enum all documented inline, so the schema does the parameter work. The description adds only indirect meaning — that the 'store' choice changes which fields appear in results — and nothing about pagination depth or per-store page sizes. 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) plus the exact resource (apps and games across Cafe Bazaar and/or Myket) and names what comes back (package names, ratings, store URLs). That is enough for an agent to separate it from ap_app (lookup), ap_top (rankings), ap_similar (related) and ap_compare 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?
'Use first to find a package name' gives a concrete sequencing rule that ties this tool to the downstream ap_app/ap_compare workflow. It stops short of stating when NOT to use it (e.g. when the package name is already known), so it falls one step shy of the top mark.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| store | No | 'bazaar' or 'myket'. | bazaar |
| package | Yes | Android package name, e.g. 'com.whatsapp'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, and open-world behavior. The description adds genuinely new information not in any structured field: that output is grouped, and that Bazaar returns three groups (related, others also installed, similar) while Myket returns one — important for an agent interpreting results with no output schema available.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the operation, followed by the usage hint. Nothing is wasted, though the parenthetical mid-sentence break slightly interrupts readability and the store-group detail could be tightened.
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 two-parameter, read-only lookup, the definition covers what is returned structurally per store, which is the main thing missing from the schema (no output schema). It does not address ordering, result limits, or empty-result behavior, leaving mild gaps for an agent planning around the response.
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 both `store` (enum with default) and `package` fully documented in the schema itself. The description's reference to "one app" and store-specific group counts adds context but no new parameter syntax, format, or constraint details — 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 — "List apps the store shows as related to one app" — and clarifies the return grouping per store. It is clearly distinguishable from ap_app (single app details) and ap_search (query-based lookup), though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use to find alternatives or competitors of an app" gives a concrete selection context, which separates it from discovery tools like ap_search. It stops short of exclusionary guidance (e.g., that ap_search is for keyword discovery rather than similarity), so it sits below the top of the scale.
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. Slugs differ per store (see ap_categories). Myket 'productivity' is «ابزارهای کاربردی» (utilities: ride-hailing, operator and government apps).
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | 'best' = top ranked, 'new' = newest (needs category). | best |
| page | No | 1-based (Bazaar 24 per page, Myket 20, about 4 pages max). | |
| type | No | Which category list the slug belongs to, or which store-wide list. | app |
| limit | No | Max apps. | |
| store | Yes | 'bazaar' or 'myket'. | |
| category | No | Slug from ap_categories, e.g. 'tools' (Bazaar), 'productivity' (Myket). Omit for the store-wide list. |
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 store-specific semantics that annotations cannot convey (trending vs editorial for 'best', per-store slugs, Myket's 'productivity' actually being utilities). It says nothing about result shape or how ranking ties are ordered.
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 core purpose is front-loaded in one sentence, with store-specific qualifications following. The parenthetical enum callouts are useful because they tie prose to the actual enum values, though the line-broken layout and the trailing Myket taxonomy note add density without much 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?
With no output schema, the description should hint at what comes back, and 'list ... of a store' does convey that it is an enumeration of apps. Pagination and page-size limits are already carried by the schema, so the remaining gap is only the exact return shape and ordering guarantees.
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 every parameter is already documented in the input schema — baseline is 3. The description does go slightly beyond by explaining that slugs are store-dependent and that Myket's 'productivity' covers ride-hailing/operator/government apps, but it does not clarify the interaction between 'type', 'category', and 'kind' beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb and resource — 'List the top (best) or newest (new) apps or games of a store' — and pins the scope as 'per category or store-wide', which separates it from a general search like ap_search. It stops short of naming the sibling it is not, so an agent must infer that ap_search handles keyword queries.
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 real operating context: store-wide 'best' means Bazaar's trending list vs Myket's editorial list, and slug conventions differ per store (see ap_categories). The parenthetical spells out which enum value ('best'/'new') maps to which behavior, though it offers no explicit when-not-to-use guidance or a named alternative for keyword lookups.
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.
5 tool updates
v0.2.0- Changed
ap_app2 fields changed- changed
Input schema / properties / package / descriptionPrevious value: -"Android package name, the id in store URLs, e.g. 'ir.mci.ecareapp' or 'com.whatsapp'."New value: +"Android package name, e.g. 'com.whatsapp'." - changed
Input schema / properties / store / descriptionPrevious value: -"'bazaar' (Cafe Bazaar) or 'myket'."New value: +"'bazaar' or 'myket'."
- Changed
ap_compare1 field changed- changed
Input schema / properties / package / descriptionPrevious value: -"Android package name, the id in store URLs, e.g. 'ir.mci.ecareapp' or 'com.whatsapp'."New value: +"Android package name, e.g. 'com.whatsapp'."
- Changed
ap_search4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Max apps returned per store."New value: +"Max apps per store." - changed
Input schema / properties / page / descriptionPrevious value: -"1-based result page (Bazaar 24 per page, Myket 20)."New value: +"1-based (Bazaar 24 per page, Myket 20)." - changed
Input schema / properties / query / descriptionPrevious value: -"Search text, Persian or English, e.g. 'تاکسی' or 'snapp'."New value: +"Persian or English, e.g. 'تاکسی'." - changed
Input schema / properties / store / descriptionPrevious value: -"'bazaar' (Cafe Bazaar), 'myket' or 'both' (default, results side by side)."New value: +"'bazaar', 'myket' or 'both'."
- Changed
ap_similar1 field changed- changed
Input schema / properties / package / descriptionPrevious value: -"Android package name, the id in store URLs, e.g. 'ir.mci.ecareapp' or 'com.whatsapp'."New value: +"Android package name, e.g. 'com.whatsapp'."
- Changed
ap_top5 fields changed- changed
Input schema / properties / category / descriptionPrevious value: -"Category slug from ap_categories, e.g. 'tools' (Bazaar) or 'productivity' (Myket). Omit for the store-wide list (best only)."New value: +"Slug from ap_categories, e.g. 'tools' (Bazaar), 'productivity' (Myket). Omit for the store-wide list." - changed
Input schema / properties / kind / descriptionPrevious value: -"'best' = top ranked, 'new' = newest in the category."New value: +"'best' = top ranked, 'new' = newest (needs category)." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max apps returned."New value: +"Max apps." - changed
Input schema / properties / page / descriptionPrevious value: -"1-based page (Bazaar 24 per page, Myket 20, Myket stops after about 4 pages)."New value: +"1-based (Bazaar 24 per page, Myket 20, about 4 pages max)." - changed
Input schema / properties / type / descriptionPrevious value: -"'app' or 'game': which category list the slug belongs to, and which store-wide list when no category."New value: +"Which category list the slug belongs to, or which store-wide list."
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 maps to a distinct query type: name search, single-app metadata, cross-store comparison, top/new charts, category slug lookup, and related apps. The only near-overlap is ap_app vs ap_compare, but the description explicitly states when to use ap_compare instead, so misselection risk is low.
All six tools share a uniform 'ap_' prefix with lowercase snake_case, so scanning the set is predictable. The second token mixes verbs (search, compare) with nouns (app, top, categories, similar), a minor stylistic deviation but still readable and consistent-looking.
Six tools is well-scoped for a read-only two-store app-directory server. Every tool covers a genuinely different access path (discovery, detail, comparison, rankings, taxonomy, related) with no filler.
The surface covers the main read workflows: discovery, metadata, cross-store diff, charts, categories and related apps. Gaps exist for a read-only directory—no reviews/ratings-listing tool, no 'list apps by developer' even though developer_id is returned, and no bulk package lookup.
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.
App Store and Google Play reviews, ratings, sentiment and developer replies as agent tools.
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
- AlicenseAqualityBmaintenanceEnables 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.821409 PyPI38MIT
- AlicenseBqualityBmaintenanceEnables 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.26209 PyPI1MIT
- AlicenseAqualityBmaintenanceEnables 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