rustore-apk-mcp
Click on "Install 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., "@rustore-apk-mcpDownload the APK for com.spotify.music"
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.
Getting an APK into an agent's workspace is normally a chore: find the listing, fight a download page, dodge a mirror of unknown provenance, and then just hope the file is the app you asked for. This MCP server removes the whole detour.
you ▸ Download the APK for ru.foodfox.client and tell me where it is.
agent ▸ download_apk(package_name="ru.foodfox.client")
↳ /Users/you/Downloads/rustore-apks/ru.foodfox.client-250000235.apk
version 25.0.0 (250000235) · 84.1 MB
sha256 b9f4…c1a7
verified: ZIP CRC, manifest package/version and APK signature
verified; certificate matches RuStoreOne tool call. A real file. A verification chain you can point at.
Why this exists
Typical APK mirror / scraper |
| |
Provenance | "trust the mirror" | RuStore's own API + CDN, nothing else |
Integrity | maybe a checksum | ZIP CRC + manifest + APK signature |
Identity | filename says so |
|
Authenticity | — | signing cert pinned to the SHA-256 RuStore reports |
Auth | login walls, captchas | none — no account, no API key |
Mechanism | headless browser, brittle | plain HTTPS calls |
Agent fit | glue scripts | native MCP tools with output schemas |
Related MCP server: App Store Publisher MCP
Quickstart
Requirements: Python 3.11+, uv, Java, and Android SDK
Build Tools (aapt, apksigner). The build tools are auto-discovered from PATH,
ANDROID_HOME, ANDROID_SDK_ROOT, and the standard SDK locations on macOS and Linux.
git clone https://github.com/kirvigen/rustore-apk-mcp.git
cd rustore-apk-mcp
uv sync --locked
uv run --locked rustore-apk-mcpThe server speaks MCP over stdio, so an empty prompt after startup is expected —
stdout belongs to the protocol.
Connect it to your agent
codex mcp add rustore-apk \
--env APK_MCP_DOWNLOAD_DIR="$PWD/downloads/mcp" \
-- "$PWD/.venv/bin/rustore-apk-mcp"Then add tool_timeout_sec = 600 under [mcp_servers.rustore-apk] in your Codex config —
large APKs plus signature verification need the headroom.
claude mcp add rustore-apk \
--env APK_MCP_DOWNLOAD_DIR="$PWD/downloads/mcp" \
-- "$PWD/.venv/bin/rustore-apk-mcp"{
"mcpServers": {
"rustore-apk": {
"command": "/absolute/path/to/rustore-apk-mcp/.venv/bin/rustore-apk-mcp",
"env": {
"APK_MCP_DOWNLOAD_DIR": "/absolute/path/to/downloads"
}
}
}
}Set the client's per-call timeout to at least 600 seconds.
That's it. A fresh agent needs nothing more than:
"Download the APK for
com.example.appvia rustore-apk and give me the path."
Tools
get_apk_info(package_name)
Latest release metadata — app name, version name and code, minimum Android SDK, price, signing certificate, store URL. Read-only, no download.
download_apk(package_name, max_mib=1024)
Downloads and verifies the latest free standalone APK, then returns:
{
"package_name": "com.example.app",
"version_name": "1.4.2",
"version_code": 10402,
"path": "/abs/path/com.example.app-10402.apk",
"bytes": 44236800,
"sha256": "…",
"certificate_sha256": "…",
"verification": "ZIP CRC, manifest package/version and APK signature verified; certificate matches RuStore",
"cached": false
}Calling download_apk directly is fine — get_apk_info is optional.
Verification: what actually gets checked
Every byte is checked before the file is moved into place. A download that fails any
step never becomes an .apk in your directory.
Host pinning — the CDN URL must be
https://static.rustore.ru; redirects are not followed.Declared size — the stream is cut off the moment it exceeds what the API promised.
ZIP integrity — CRC of every entry, with a 4 GiB decompression bound against zip bombs.
Identity —
packageNameandversionCodeare read fromAndroidManifest.xmlviaaaptand must match the release you asked for.Signature —
apksigner verifymust pass.Certificate pinning — the signing certificate's SHA-256 must equal the one RuStore reports for that listing.
Cached copies are re-verified the same way on every call; a corrupted or mismatched cache entry is silently re-fetched. Partial files are cleaned up on any failure.
Signature verification proves the file isintact and from the same publisher RuStore lists — it is not a behavioural or malware analysis. The server never installs or executes anything it downloads.
Limits (the honest list)
Latest version only; no version history.
Free apps only — a non-zero price is refused outright.
Standalone APKs only; split APKs / bundles are not supported yet.
Listings backed by an external source are refused rather than guessed at.
Coverage is whatever RuStore's catalogue has.
The download profile is fixed: Android SDK 36,
arm64-v8a, 480 dpi,withoutSplits=true.RuStore's consumer API is not a stable public contract; it can change without warning.
HTTP 403/429 stops the call immediately, with no retries — call again later.
Hard ceilings: 5-minute download,
max_mibbytes, 4 GiB uncompressed for verification.
Configuration
Variable | Default |
|
|
| auto-discovered |
| auto-discovered |
|
|
Files are named <package_name>-<version_code>.apk.
Tests
uv run pytest -q
# Opt-in live check: metadata, download and cache reuse over a real MCP stdio client.
uv run python scripts/smoke_mcp.py com.yolo_price_mobileLast verified end-to-end on 2026-09-09: com.yolo_price_mobile 0.9.55 (611).
Also in this repo
apk_scrapper.cli is an earlier, standalone APKPure page-parsing CLI (apk-scrapper entry
point). It predates the MCP server, is not used by it, and is kept only for reference — the
MCP tools talk to RuStore and nothing else.
Contributing
Issues and PRs are welcome — split-APK support and broader catalogue coverage are the two most useful things anyone could add. Keep the verification chain intact: nothing lands on disk that hasn't passed every check above.
References
License
Not affiliated with, endorsed by, or connected to RuStore or VK. Use it in line with RuStore's terms and the licence of whatever app you download.
Available Tools
2 toolsdownload_apkA
Download the latest free standalone APK from RuStore using just its package name.
Returns absolute local path, version, byte size, SHA-256, certificate and cached flag. Verifies the package/version in AndroidManifest and APK signature against RuStore. Reuses a verified cached copy of the same version. max_mib: 1..4096, default 1024. Requires Android SDK aapt/apksigner and Java on the server host. May take several minutes. Does not install or run the APK. Call sequentially for a package list; stop on HTTP 403/429.
| Name | Required | Description | Default |
|---|---|---|---|
| max_mib | No | ||
| package_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations by disclosing file output, caching, verification of manifest/signature, host prerequisites (Android SDK aapt/apksigner, Java), potential multi-minute duration, and the fact that it does not install or run the APK. No contradiction with readOnlyHint=false or destructiveHint=false.
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?
Every sentence earns its place: output fields, verification/caching behavior, prerequisites, runtime, and rate-limit guidance are packed in a compact, front-loaded description. The dense 'max_mib:' line is an efficient way to encode parameter constraints.
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 tool with an output schema, this description covers the return values, external prerequisites, runtime expectations, HTTP failure handling, and side-effect boundaries. Nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
With 0% schema description coverage, the description compensates by explaining that package_name is the sole required identifier and by giving max_mib's range and default (1..4096, 1024). It could more explicitly define max_mib as the maximum download size in MiB, but the title plus range is reasonably self-explanatory.
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 ('Download'), resource ('APK from RuStore'), and input ('using just its package name'), clearly distinguishing this from a generic download or info-only sibling. The 'latest free standalone' qualifier further narrows the operation.
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 clear operational guidance: call sequentially for a package list and stop on HTTP 403/429. It does not explicitly say when to prefer the sibling get_apk_info instead, so it stops short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_apk_infoARead-only
Get latest RuStore release metadata by exact Android package name, e.g. com.yolo_price_mobile.
Returns name, version, minimum Android SDK, price and source. Does not download any APK. A listing does not guarantee that a standalone APK is available.
| Name | Required | Description | Default |
|---|---|---|---|
| package_name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint: true, and the description reinforces this by stating it does not download an APK. It also adds behavioral transparency about result semantics: 'A listing does not guarantee that a standalone APK is available,' which is valuable caveat history beyond the annotations. It does not disclose potential rate limits or error conditions, though the output schema mitigates some of that 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?
The description is compact and front-loaded: the first sentence states the action and key parameter, the next brief sentence lists the returned fields, and the final sentence adds a critical caveat. Every clause serves a distinct purpose; no filler or repeated information from the schema.
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 tool with an output schema, the description covers the purpose, the required input format, the return fields, and an important behavioral caveat. It also differentiates from the sibling download tool. There is no missing information an agent needs to call it correctly or interpret its output.
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?
The schema has 0% description coverage, but the description compensates reasonably well by defining the parameter as 'exact Android package name' and providing a concrete example (com.yolo_price_mobile). It conveys the precision requirement. However, it does not explain what happens with nonexistent or similar package names, or how the exact match is enforced.
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 ('get latest RuStore release metadata' by 'exact Android package name' with a concrete example). It clearly differentiates from the sibling tool download_apk by explicitly scoping the result to metadata and stating 'Does not download any APK.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when you need metadata for a specific RuStore package, with emphasis on a known package name. It indirectly contrasts with download_apk by disclaiming APK download, but it does not explicitly name the alternative or provide a when-not-to-use condition beyond that exclusion.
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.
2 tool updates
v0.1.0- First observed
download_apk - First observed
get_apk_info
TDQS
Scored across 2 tools
The two tools are clearly distinct: one retrieves metadata without downloading, the other downloads the APK. There is no overlap in functionality, and the descriptions explicitly differentiate their purposes.
Both tools follow a consistent verb_noun pattern: get_apk_info and download_apk. The naming is predictable and clearly indicates the action and resource.
With only two tools, the surface is thin, but for a narrowly scoped server (RuStore APK retrieval) it may be sufficient. It is borderline but not excessive; the tools cover the core operations.
The tools cover the primary operations of retrieving metadata and downloading APKs. A minor gap is the lack of a discovery/search tool, but the server's stated purpose is to work with exact package names, so this is a reasonable boundary.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Live App Store & Google Play data for AI agents: app discovery, ASO keywords, reviews.
Web search, page reading and structured extraction for AI agents, with strong RU coverage
AI agent infrastructure for discovery, authorization, execution, identity, and signed receipts.
PDF, image, video, OCR, screenshot, SQL, QR and text tools for agents. No API key, no signup.
Related MCP Servers
- FlicenseAqualityCmaintenanceEnables AI agents to interact with Android devices through UI manipulation, screen capture, touch gestures, text input, and app management via ADB. Provides comprehensive mobile automation capabilities including element detection, navigation, and application control for Android device testing and interaction.94-
- AlicenseCqualityCmaintenanceEnables publishing Android apps to Samsung Galaxy Store and Huawei AppGallery directly from AI agents, with tools for uploading binaries, updating listings, submitting apps, and verifying Samsung IAP receipts.11MIT
- AlicenseBqualityBmaintenanceEnables AI agents to control Android TV/Android devices through ADB, including screen capture, remote control, app management, and more.2444MIT
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to perform autonomous Android security analysis, including static analysis, dynamic analysis, and Frida instrumentation, powered by MobSF.2MIT