Skip to main content
Glama
iran-apps-mcp

iran-apps-mcp

by sepehr071

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.

PyPI Python CI MCP Registry License: MIT mcpfarsi

Install in VS Code

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-mcp or claude 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_compare or ap_app -> ap_similar. For lists, call ap_categories first and pass a slug to ap_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, installs is an approximate count, dates are YYYY-MM-DD (Gregorian), prices in Toman (0 = free).

  • Machine-readable: server.json and 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-mcp

Settings → 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-mcp

Or 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

ap_search

Search Cafe Bazaar and/or Myket for apps and games by name; returns package names, ratings and store URLs

ap_app

Get one app's metadata from one store: version, rating and rating count, installs, size, update date, developer, price, description

ap_compare

Compare one package across Cafe Bazaar and Myket: version, rating, rating count, installs, size, update date, price

ap_top

List the top ('best') or newest ('new') apps or games of a store, per category or store-wide

ap_categories

List the category slugs of a store for apps and games, to pass as ap_top category

ap_similar

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.

  • installs is 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_categories to get valid slugs for ap_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_compare gives 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-mcp

Configuration

Variable

Default

Meaning

IRAN_APPS_MCP_PROXY

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 build

Each 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.

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

MIT

Available Tools

6 tools
ap_appApp detailsA
Read-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.

NameRequiredDescriptionDefault
storeNo'bazaar' or 'myket'.bazaar
packageYesAndroid package name, e.g. 'com.whatsapp'.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_categoriesCategoriesA
Read-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.

NameRequiredDescriptionDefault
storeYes'bazaar' or 'myket'.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 storesA
Read-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).

NameRequiredDescriptionDefault
packageYesAndroid package name, e.g. 'com.whatsapp'.

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_similarRelated appsA
Read-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.

NameRequiredDescriptionDefault
storeNo'bazaar' or 'myket'.bazaar
packageYesAndroid package name, e.g. 'com.whatsapp'.

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 appsA
Read-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).

NameRequiredDescriptionDefault
kindNo'best' = top ranked, 'new' = newest (needs category).best
pageNo1-based (Bazaar 24 per page, Myket 20, about 4 pages max).
typeNoWhich category list the slug belongs to, or which store-wide list.app
limitNoMax apps.
storeYes'bazaar' or 'myket'.
categoryNoSlug from ap_categories, e.g. 'tools' (Bazaar), 'productivity' (Myket). Omit for the store-wide list.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.2.0
    • Changedap_app2 fields changed
      • changedInput schema / properties / package / description
        Previous 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'."
      • changedInput schema / properties / store / description
        Previous value: -"'bazaar' (Cafe Bazaar) or 'myket'."New value: +"'bazaar' or 'myket'."
    • Changedap_compare1 field changed
      • changedInput schema / properties / package / description
        Previous 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'."
    • Changedap_search4 fields changed
      • changedInput schema / properties / limit / description
        Previous value: -"Max apps returned per store."New value: +"Max apps per store."
      • changedInput schema / properties / page / description
        Previous value: -"1-based result page (Bazaar 24 per page, Myket 20)."New value: +"1-based (Bazaar 24 per page, Myket 20)."
      • changedInput schema / properties / query / description
        Previous value: -"Search text, Persian or English, e.g. 'تاکسی' or 'snapp'."New value: +"Persian or English, e.g. 'تاکسی'."
      • changedInput schema / properties / store / description
        Previous value: -"'bazaar' (Cafe Bazaar), 'myket' or 'both' (default, results side by side)."New value: +"'bazaar', 'myket' or 'both'."
    • Changedap_similar1 field changed
      • changedInput schema / properties / package / description
        Previous 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'."
    • Changedap_top5 fields changed
      • changedInput schema / properties / category / description
        Previous 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."
      • changedInput schema / properties / kind / description
        Previous value: -"'best' = top ranked, 'new' = newest in the category."New value: +"'best' = top ranked, 'new' = newest (needs category)."
      • changedInput schema / properties / limit / description
        Previous value: -"Max apps returned."New value: +"Max apps."
      • changedInput schema / properties / page / description
        Previous 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)."
      • changedInput schema / properties / type / description
        Previous 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."
  2. 6 tool updatesv0.1.0
    • First observedap_app
    • First observedap_categories
    • First observedap_compare
    • First observedap_search
    • First observedap_similar
    • First observedap_top

TDQS

A4/5.0

Scored across 6 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    D
    maintenance
    Enables 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.
    20
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    8
    21
    409 PyPI
    38
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables 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.
    26
    209 PyPI
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables 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.
    7
    98 PyPI
    MIT