Skip to content

APKCube

com.apkcube/apkcubeapkcube.comstreamable-httpv1.0.0Scanned

Search Android apps, check APK signing and scans, and get verified APK download links.

36 tools: 2 can delete or cancel things, 7 change things and 27 only read.

Tools: 2 delete, 0 irreversible, 7 write, 27 read.
  • Reads private data · 2
  • Reads text others write · 27
  • Can send data out · 0
  • 2 findings

Anlyon alternative

9 of these tools change something. Run those as governed actions.

Declare what an action changes, and Anlyon puts it under a shared limit, binds every approval to the exact request, and grades the outcome. It works on any HTTPS API you can describe as an action.

Anlyon does not run, proxy or govern this MCP server. A tool your own code calls directly is not routed through Anlyon and is not governed by it.

Import an OpenAPI spec →

Tools

Grouped by what each tool does, most consequential first. Open one for its reasons and full description; descriptions are the publisher's own words.

36 tools

Deletes or cancels 2Claude Code: deny
  • console_set_version_noticePut a warning on one stored build of your app — `vulnerable` or `withdrawn`, a message of up to 300 characters, and optionally the version code to use instead — or lift it (`lift: …No findings

    Why it is in this group

    • The name "console_set_version_notice" says "set": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Put a warning on one stored build of your app — `vulnerable` or `withdrawn`, a message of up to 300 characters, and optionally the version code to use instead — or lift it (`lift: true`). With `blockDownload: true` downloads of that build are refused. Applies immediately and is reversible; it does not delete anything. Take `apkId` from console_security_report. Needs the uploader role or above.

    Annotations the server declares

    • title: Pull a release of my app
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
  • console_update_listingChange the text visitors read on your app's page: the short description (≤80 characters), full description (≤4000, plain text), what's new (≤500) and a YouTube link.No findings

    Why it is in this group

    • The name "console_update_listing" says "update": a word for a change.
    • The server marks it destructive (destructiveHint: true).
    Description, as the server wrote it
    Change the text visitors read on your app's page: the short description (≤80 characters), full description (≤4000, plain text), what's new (≤500) and a YouTube link. Omit a field to keep it; pass null or an empty string to show Google Play's text for it. Goes live immediately; our moderators review afterwards. Needs the admin or owner role. Name and icon cannot be changed.

    Annotations the server declares

    • title: Edit my app's listing text
    • readOnlyHint: false
    • destructiveHint: true
    • idempotentHint: true
    • openWorldHint: false
Changes things 7Claude Code: ask
  • check_availabilityFree.Reads text others writeNo findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Free. Whether we hold a downloadable build of each of up to 100 packages, the newest one's versionName and versionCode, and `versions`: every build we hold by versionCode and versionName, highest code first — the cheap way to check for updates before calling list_versions or get_download_url. Send every package you are checking in one call rather than looping. Each lands in one of three lists: `items` for packages we know (`available` false when we hold no build), `notFound` for ones we have never seen, and `refused` for ones we will not serve at all, with the reason a download would give.

    Annotations the server declares

    • title: Check app availability
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • console_app_statsDownloads of one of your apps: per UTC day for the last 30 days (with the 30 before for comparison), the lifetime total, and the top countries of the last 7 days.No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Downloads of one of your apps: per UTC day for the last 30 days (with the 30 before for comparison), the lifetime total, and the top countries of the last 7 days. Counts come from our own download log, not Google Play. Free.

    Annotations the server declares

    • title: Download stats for my app
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: false
  • console_security_reportEvery build we store for one of your apps with our scan verdict, VirusTotal counts, signature scheme, how its signing key compares with the keys on record, and any notice you have …No findings

    Why it is in this group

    • Nothing in its name or description says what it does, so it is counted as a write.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
    Description, as the server wrote it
    Every build we store for one of your apps with our scan verdict, VirusTotal counts, signature scheme, how its signing key compares with the keys on record, and any notice you have put on it — plus a one-line verdict on the signing history. `verdict: null` means not scanned, which is not the same as clean. The `apkId` here is what console_set_version_notice takes. Free.

    Annotations the server declares

    • title: Security report for my app
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: false
  • console_upload_statusWhere one upload stands, with the scan summary once it has one (VirusTotal counts, signing certificates and how each compares with the keys on record).1 finding

    Why it is in this group

    • The name "console_upload_status" says "upload": a word for a change.
    • The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.

    Findings

    • Warn

      The server marks "console_upload_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

      Matched text

      annotations: {"readOnlyHint":true,"idempotentHint":false,"openWorldHint":false}; The name "console_upload_status" says "upload": a word for a change.

      What this check looks for
    Description, as the server wrote it
    Where one upload stands, with the scan summary once it has one (VirusTotal counts, signing certificates and how each compares with the keys on record). Poll every 15–30 seconds while status is verifying, scanning or publishing; `held` waits for a person and can take days. Free.

    Annotations the server declares

    • title: Check one uploaded build
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: false
  • get_download_urlMint a short-lived signed URL for one build — the newest held unless you pass an apkId from list_versions.Reads text others write1 finding

    Why it is in this group

    • The name "get_download_url" says "get": a word for reading.
    • The server marks it as not read-only (readOnlyHint: false).

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe name "get_download_url" says "get" and "url": it reads web pages, which anyone can write.
    • untrusted-inputThe description's first sentence says "url": it reads web pages, which anyone can write.

    Findings

    • Warn

      The server marks "get_download_url" as not read-only (readOnlyHint: false), and its words say it reads.

      Matched text

      annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_download_url" says "get": a word for reading.

      What this check looks for
    Description, as the server wrote it
    Mint a short-lived signed URL for one build — the newest held unless you pass an apkId from list_versions. Costs 10 credits — the most expensive call here, and the only one that hands over a file. Check get_version_security before handing anything to a person. The URL expires in about 5 minutes; fetch it promptly and do not store it. The response carries the file's `sha256` — verify what you downloaded against it, because the signature is on the URL and not on the bytes.

    Annotations the server declares

    • title: Get a download URL
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • request_fetchAsk us to download an app from Google Play when list_versions came back empty.Reads text others writeNo findings

    Why it is in this group

    • The name "request_fetch" says "request": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Ask us to download an app from Google Play when list_versions came back empty. Costs 10 credits, even when we already have builds (`READY`) or Google Play doesn't list the app — so call list_versions first. Free only when a fetch for the app is already running (`FETCHING`). A fetch usually takes a few minutes. Poll get_fetch_status every 10–30 seconds — not this tool — and call list_versions once it says READY. Paid apps and apps Google Play will not deliver to us are refused with the reason. An app not in the catalogue yet is looked up on Google Play live, for up to 20 seconds; UPSTREAM_UNAVAILABLE / UPSTREAM_BUSY then is refunded and means Play did not answer in time, not that the app does not exist — retry after a few seconds.

    Annotations the server declares

    • title: Fetch a missing app
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
  • request_variantAsk for an on-demand build of an app's newest release that the ordinary download does not carry: every language (`+all-langs`), the 32-bit ARM build (`armeabi-v7a`), both ARM ABIs …Reads text others writeNo findings

    Why it is in this group

    • The name "request_variant" says "request": a word for a change.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Ask for an on-demand build of an app's newest release that the ordinary download does not carry: every language (`+all-langs`), the 32-bit ARM build (`armeabi-v7a`), both ARM ABIs in one bundle (`universal`), the newest build for an older Android version (`@sdkNN`), or exactly what one real device gets (`device:<slug>`). We must already hold the ordinary build — call list_versions first, and request_fetch if it is empty. Costs 10 credits, even when the variant is already built (`READY`); free only when a build of that variant is already running (`FETCHING`). A build usually takes a few minutes: poll get_variant_status, not this tool, then pass its `variantId` to get_download_url. Builds are temporary — see `expiresAt`.

    Annotations the server declares

    • title: Request a variant build
    • readOnlyHint: false
    • destructiveHint: false
    • idempotentHint: false
    • openWorldHint: true
Only reads 27Show 27 read-only tools
  • compare_versionsWhat changed between two releases: permissions gained and lost, whether the signing key moved, size and minimum Android.Reads text others writeNo findings

    Why it is in this group

    • The name "compare_versions" says "compare": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    What changed between two releases: permissions gained and lost, whether the signing key moved, size and minimum Android. Name either side by version name or by version code — the code is tried first, because a version name is free text the developer sets and is often a placeholder. Order does not matter; the higher build number is treated as the newer. Check `permissionsKnown` before reading two empty permission lists as 'nothing changed'.

    Annotations the server declares

    • title: Compare two builds
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • console_list_appsThe apps you manage in the APKCube Developers Console — every app of every developer whose team you are on, 50 a page, with your role on each.No findings

    Why it is in this group

    • The name "console_list_apps" says "list": a word for reading.
    Description, as the server wrote it
    The apps you manage in the APKCube Developers Console — every app of every developer whose team you are on, 50 a page, with your role on each. Only works for a signed-in user (OAuth) on a verified developer's team. Free.

    Annotations the server declares

    • title: List my apps (Developers Console)
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: false
  • console_list_uploadsBuilds submitted for your apps from the console or the Publishing API, newest first, with each one's status (uploading, verifying, scanning, held, published, rejected …) and, for a…No findings

    Why it is in this group

    • The name "console_list_uploads" says "list": a word for reading.
    Description, as the server wrote it
    Builds submitted for your apps from the console or the Publishing API, newest first, with each one's status (uploading, verifying, scanning, held, published, rejected …) and, for a held or rejected build, the reason and its stable code. Pass packageName for one app. Free.

    Annotations the server declares

    • title: List my uploaded builds
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: false
  • get_accountHow many credits are left on the key you are using, and what that key is.No findings

    Why it is in this group

    • The name "get_account" says "get": a word for reading.
    Description, as the server wrote it
    How many credits are left on the key you are using, and what that key is. Free. Every successful call also reports this in `_meta`, so reach for this one when you need to know before you spend — a download costs 10 — or when your calls have been failing and you have not seen a balance in a while.

    Annotations the server declares

    • title: Check credits
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: false
  • get_appFull record for one package: description, screenshots, rating, tags, and whether a download would be refused.Reads text others writeNo findings

    Why it is in this group

    • The name "get_app" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Full record for one package: description, screenshots, rating, tags, and whether a download would be refused. Does NOT list downloadable files — use list_versions for those. An app not in the catalogue yet is looked up on Google Play live, for up to 20 seconds; UPSTREAM_UNAVAILABLE / UPSTREAM_BUSY then is refunded and means Play did not answer in time, not that the app does not exist — retry after a few seconds.

    Annotations the server declares

    • title: Get app details
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_appsSummary rows for up to 100 package ids in one call — use this instead of calling get_app in a loop.Reads text others writeNo findings

    Why it is in this group

    • The name "get_apps" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Summary rows for up to 100 package ids in one call — use this instead of calling get_app in a loop. Costs 1 credit PER PACKAGE, so a hundred ids cost a hundred credits however they arrive. Ids we do not hold come back in `notFound` rather than failing the call. Returns the SUMMARY row, not the full record: it is cheaper than get_app (5) because it answers less, so reach for get_app only when you need the description or the screenshots for a particular one.

    Annotations the server declares

    • title: Look up several apps
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_fetch_statusWhere the fetch request_fetch started stands now: FETCHING (keep waiting), READY (call list_versions), or FAILED with a reason.Reads text others writeNo findings

    Why it is in this group

    • The name "get_fetch_status" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Where the fetch request_fetch started stands now: FETCHING (keep waiting), READY (call list_versions), or FAILED with a reason. Free when the fetch is still running (`FETCHING`); the final answer costs 1 credit, and so does a check when no fetch was requested (`FETCH_NOT_FOUND`). When FAILED carries `terminal: true`, Google Play will not deliver this app to us and asking again will not help; otherwise request_fetch may be retried.

    Annotations the server declares

    • title: Check a fetch
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: true
  • get_manifestWhat the artifact's own AndroidManifest.xml says beyond the permissions it requests — targetSdk, compileSdk, debuggable, cleartext traffic, backup, sharedUserId, install location, …Reads text others writeNo findings

    Why it is in this group

    • The name "get_manifest" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    What the artifact's own AndroidManifest.xml says beyond the permissions it requests — targetSdk, compileSdk, debuggable, cleartext traffic, backup, sharedUserId, install location, uses-feature, uses-library, and the components it exports without a permission guard — plus the native libraries it ships, and our rules read off the pair as `findings`. Defaults to the newest build. A KEY ABSENT INSIDE `manifest` means the manifest is silent about that attribute, never that it declares the platform default; `manifest: null` means nobody read it at all, and an empty `findings` beside that is not an all-clear. `versionMismatch` is the one to escalate: non-null means the file's own version disagrees with what the listing claims, which is what a swapped or relabelled artifact looks like. Use get_raw_scan if you want the stored record without our rules applied.

    Annotations the server declares

    • title: Read what a build declares about itself
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_play_detailsGoogle Play's full store listing for one package, in any storefront: the star histogram, install estimate, IAP price range, release date, declared permissions, content-rating descr…Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "get_play_details" says "get": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "contact": it reads contacts.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Google Play's full store listing for one package, in any storefront: the star histogram, install estimate, IAP price range, release date, declared permissions, content-rating descriptors, legal publisher and contact details — the store data get_app leaves out. Usually null: the written-review count, sale pricing and the Play Pass and pre-registration flags. Pass `lang`/`country` for another storefront (prices, text and availability differ); the default en/us listing is served from our own scrape while it is fresh and scraped and stored otherwise. Works for packages outside the catalogue. Charged even when Google Play doesn't list the app (`APP_NOT_FOUND`); a busy or failed Google Play is refunded.

    Annotations the server declares

    • title: Get the Google Play listing
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_protectionWhether this build is wrapped in a commercial protector — DexProtector, Jiagu, Bangcle, Legu, AppSealing, Google's own PairIP — and what that means for everything else you can find…Reads text others writeNo findings

    Why it is in this group

    • The name "get_protection" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Whether this build is wrapped in a commercial protector — DexProtector, Jiagu, Bangcle, Legu, AppSealing, Google's own PairIP — and what that means for everything else you can find out about it. Defaults to the newest build. A PROTECTOR IS NOT A MALWARE SIGNAL: anti-piracy, anti-tamper and anti-cheat are what these are sold for, and saying an app is 'suspicious' because it is packed is wrong about a large part of the catalogue. What it does mean is that the app's real code is not in classes.dex for anyone to read, so an empty SDK list, a short permission list or any other analysis of the same artifact is a floor and not a census — call this BEFORE you report that a build carries no trackers. `analyzed: false` means the archive was never opened, which is not the same as an unpacked build. Relay `summary` whole: it carries the finding and the bound in one sentence.

    Annotations the server declares

    • title: Check whether a build is packed
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_raw_scanThe whole stored analysis record for one build, exactly as stored and with none of our rules applied — for when you want to judge the facts yourself rather than read our conclusion…Reads text others writeNo findings

    Why it is in this group

    • The name "get_raw_scan" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    The whole stored analysis record for one build, exactly as stored and with none of our rules applied — for when you want to judge the facts yourself rather than read our conclusions. It carries two things no other tool publishes: the EVIDENCE DIGEST every SDK match is drawn from (dex package prefixes, manifest component names, intent actions, how much code was read), so you can match it against your own corpus; and each signing certificate's serial and signature algorithm. Also the raw VirusTotal counters and every flagging vendor. Prefer the narrower tools when you want an answer — get_version_security, get_protection, list_trackers, list_permissions, get_manifest — and reach for this when you want the inputs. A build nobody has scanned is `scanned: false`, which is not a clean result.

    Annotations the server declares

    • title: Read the stored scan record verbatim
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_signing_historyWhich certificate signed which releases of a package, and where the key moved.Reads text others writeNo findings

    Why it is in this group

    • The name "get_signing_history" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Which certificate signed which releases of a package, and where the key moved. Android will only install an update signed by the key that signed what is already on the device, so a `hasKeyReplacement: true` means the newer build is not an update of the older one — it is a different app under the same package name, which is what a repackaged app looks like. `unreadVersions` lists releases whose signature we never read; those are gaps, not agreement.

    Annotations the server declares

    • title: Trace the signing key
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • get_variant_statusWhere one variant of an app stands: READY with the build (its `variantId` goes to get_download_url), FETCHING (keep waiting, 10–30 seconds between checks), FAILED with a reason (re…Reads text others writeNo findings

    Why it is in this group

    • The name "get_variant_status" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe description's first sentence says "url": it reads web pages, which anyone can write.
    Description, as the server wrote it
    Where one variant of an app stands: READY with the build (its `variantId` goes to get_download_url), FETCHING (keep waiting, 10–30 seconds between checks), FAILED with a reason (request_variant retries), or NEEDS_FETCH (nobody has asked for it, or it expired — call request_variant). Free when the build is still running (`FETCHING`); any other answer costs 1 credit, including when nobody has requested that variant (`NEEDS_FETCH`).

    Annotations the server declares

    • title: Check a variant build
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: true
  • get_version_securityWhat one build actually IS: its SHA-256, the anti-malware verdict, the certificates that signed it, and every Android permission it declares with a plain-English gloss.Reads text others writeNo findings

    Why it is in this group

    • The name "get_version_security" says "get": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    What one build actually IS: its SHA-256, the anti-malware verdict, the certificates that signed it, and every Android permission it declares with a plain-English gloss. Defaults to the newest build, so you do not need list_versions first. `findings` is the part to read first: it applies our rules to the manifest and native facts on the same response and names what they imply — a debuggable build, a version that disagrees with the listing, cleartext traffic, components any app on the device can start, a packer. Two severities, `warning` and `notice`, and NEITHER is a verdict; an empty `findings` is not an all-clear, because a manifest nobody read produces no findings either. Read this BEFORE recommending an install, and read the nulls carefully — `scanned: false` and `virusTotal: null` mean nobody has looked, which is not the same as clean, and `permissions: null` means the manifest was never read, which is not the same as an app that asks for nothing.

    Annotations the server declares

    • title: Check a build's integrity
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_categoriesThe category taxonomy, for filtering a search.No findings

    Why it is in this group

    • The name "list_categories" says "list": a word for reading.
    Description, as the server wrote it
    The category taxonomy, for filtering a search. Free — this call costs no credits.

    Annotations the server declares

    • title: List categories
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: false
  • list_chartA ranked section of the catalogue.Reads text others writeNo findings

    Why it is in this group

    • The name "list_chart" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    A ranked section of the catalogue. Google Play's charts (hot, grossing, latest, editors-choice), the catalogue's newest releases (new), what people downloaded here in about the last day (popular), or the newest builds we stored (updated). An unrecognised section falls back to 'hot' rather than failing.

    Annotations the server declares

    • title: List a chart
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_developer_appsEvery app we hold from one publisher, most-installed first.Reads text others writeNo findings

    Why it is in this group

    • The name "list_developer_apps" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Every app we hold from one publisher, most-installed first. The slug comes from `developerSlug` on any app row.

    Annotations the server declares

    • title: List a publisher's apps
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_developer_certificatesEvery signing key on record for one publisher's apps — lookup_certificate read the other way round.Reads text others writeNo findings

    Why it is in this group

    • The name "list_developer_certificates" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Every signing key on record for one publisher's apps — lookup_certificate read the other way round. Each key says how many of the publisher's apps it signs and, in `elsewhere`, how many packages OUTSIDE the publisher it is also on: zero is ordinary, above zero is a key shared across the publisher's accounts or somebody else's builds signed with it, and lookup_certificate on that fingerprint lists which. All keys in one answer, no pages. BOUNDED, and `note` says how: it covers the publisher's apps we have ingested and scanned. Free when we hold no signing record for any of the publisher's apps (`total: 0`). The slug comes from `developerSlug` on any app row.

    Annotations the server declares

    • title: List a publisher's signing keys
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_permissionsEvery Android permission this build declares, sensitive ones first, each with a readable label, its capability family and a sentence saying what the app can actually do with it.Reads text others writeNo findings

    Why it is in this group

    • The name "list_permissions" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Every Android permission this build declares, sensitive ones first, each with a readable label, its capability family and a sentence saying what the app can actually do with it. Defaults to the newest build. This is the same labelling compare_versions diffs, so the two cannot name the same permission differently. THE NULL IS THE PART TO READ: `permissions: null` means the manifest was never read and is NOT a claim that the app asks for nothing — an empty array is that claim. `sensitive` is the count worth quoting; a long list of ordinary permissions is what almost every app looks like. `defines` is separate and often misread: those are permissions this app declares for OTHER apps to hold, not things it is asking for.

    Annotations the server declares

    • title: List what a build asks the device for
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_reviewsOne page of Google Play user reviews for a package, live: stars, text, helpful votes, the app version the reviewer ran, and the developer's reply.Reads text others writeNo findings

    Why it is in this group

    • The name "list_reviews" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    • untrusted-inputThe name "list_reviews" says "list" and "review": it reads comments, which other people can write.
    • untrusted-inputThe description's first sentence says "review": it reads comments, which other people can write.
    Description, as the server wrote it
    One page of Google Play user reviews for a package, live: stars, text, helpful votes, the app version the reviewer ran, and the developer's reply. Sort by newest (default), rating or helpfulness; up to 100 a page. Walk further pages by passing `nextCursor` back as `cursor` with the same sort, num and storefront — each page is a separate charge, so ask for what you need. Free when the page is empty (an empty `items`); a busy or failed Google Play is refunded.

    Annotations the server declares

    • title: List Google Play reviews
    • readOnlyHint: true
    • idempotentHint: false
    • openWorldHint: true
  • list_sdksWhat OTHER companies' code is inside an app: the ad, analytics, attribution, crash-reporting, push and sign-in libraries matched in the build, each with its vendor and where it was…Reads text others writeNo findings

    Why it is in this group

    • The name "list_sdks" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    What OTHER companies' code is inside an app: the ad, analytics, attribution, crash-reporting, push and sign-in libraries matched in the build, each with its vendor and where it was recognised. Defaults to the newest build. This is the privacy question, not the safety one — these libraries are ordinary parts of shipping an app, so report them as what the app carries and never as evidence of harm. READ THE BOUNDS BEFORE THE LIST: `analyzed: false` means nobody looked; `codeCoverage` says whether the app's own code was read at all, and in full; a non-empty `protectors` means the build is packed and its real code was never open to inspection. An empty `sdks` is only close to 'none' when `analyzed` is true and `codeCoverage` is `full`. Relay `summary` whole — it states the finding and its bound in one sentence, and dropping the second half is the standard way to get this wrong.

    Annotations the server declares

    • title: List a build's third-party SDKs
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_similar_appsApps related to one package — alternatives and neighbours, as the app's page on the site shows them.Reads text others writeNo findings

    Why it is in this group

    • The name "list_similar_apps" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Apps related to one package — alternatives and neighbours, as the app's page on the site shows them. Free when there is nothing to list (an empty `items`). A package that is not in the catalogue is a 404 rather than a guess.

    Annotations the server declares

    • title: List similar apps
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_trackersThe privacy question on its own: which advertising, analytics, install-attribution, crash-reporting, push and social sign-in SDKs are in this build, and nothing else.Reads text others writeNo findings

    Why it is in this group

    • The name "list_trackers" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    The privacy question on its own: which advertising, analytics, install-attribution, crash-reporting, push and social sign-in SDKs are in this build, and nothing else. `list_sdks` is the same evidence unfiltered — every recognised library including HTTP clients and UI toolkits — so use that one when you want the full inventory and this one when somebody asked what an app sends about them. A CATEGORY IS NOT AN ACCUSATION: all six are ordinary parts of shipping an app, and `unclassified` counts recognised libraries that are neither (unclassified means we take no position, never that a library is harmless). READ THE BOUNDS BEFORE THE LIST: `analyzed: false` means nobody looked; `codeCoverage` says whether the app's own code was read at all and in full; a non-empty `protectors` means the real code was never readable, and an empty list under one says nothing about the app. Relay `summary` whole — 'no trackers found' without its second clause is the standard way to get this wrong.

    Annotations the server declares

    • title: List a build's tracking and advertising SDKs
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • list_versionsEvery APK/XAPK build held for a package, newest first, each with its SHA-256.Reads text others writeNo findings

    Why it is in this group

    • The name "list_versions" says "list": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Every APK/XAPK build held for a package, newest first, each with its SHA-256. Call this before get_download_url when you want a specific build — the apkId it returns is what that tool takes; without one it serves the newest. Free when we hold no builds for the package (an empty list); request_fetch is how to get the app. A package we will not serve at all is refused here with the same reason a download would give, so you learn it without spending a download.

    Annotations the server declares

    • title: List downloadable versions
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • lookup_certificateEvery package we hold that one signing certificate is on record for.Reads text others writeNo findings

    Why it is in this group

    • The name "lookup_certificate" says "lookup": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Every package we hold that one signing certificate is on record for. Android only installs an update signed by the key that signed what is already on the device, which makes the signing key the closest thing an app has to an identity across package names — so a key you found on one repackaged app is worth asking about, because it has usually signed others. Takes the SHA-256 fingerprint of the DER certificate (64 hex, colons and case fine). A SHA-1 IS REFUSED, free, with the reason: the record stores one fingerprint per certificate and a SHA-1 cannot be resolved to it — get the SHA-256 (keytool prints both). BOUNDED, and `note` says how: it covers packages we have ingested and scanned, never every app the key has signed, so it is free when we hold nothing signed by the key (`total: 0`), which is not to say the key signs nothing; charged even when every package the key signed has been removed (an empty `items`). `blocked: true` means the key is on our catalogue-wide blocklist and nothing it signed can be downloaded here. Taken-down packages are counted in `blockedCount` and not listed, so a page may be shorter than `perPage`.

    Annotations the server declares

    • title: Find what a signing key signs
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • lookup_hashWhich app and which build a file checksum names.Reads private dataReads text others writeNo findings

    Why it is in this group

    • The name "lookup_hash" says "lookup": a word for reading.

    What it can reach

    • private-dataThe description's first sentence says "file": it reads files.
    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Which app and which build a file checksum names. Use this when you have a hash and no package name — an APK pulled off a device, a sample from a threat feed, a digest in an incident report. Takes an MD5 (32 hex), SHA-1 (40) or SHA-256 (64) and works out which from the length, so do not try to label it; colons, spaces and upper case are fine and are normalised. A miss is a real answer, not an error, and it is free when nothing matches (`found: false`): we hold no build with that checksum, and says nothing about whether the file exists elsewhere. READ `note`: only SHA-256 is carried by every stored build, so a SHA-1 or MD5 miss can mean we hold the file and never computed that digest for it — re-check with the SHA-256 if you have it. Once you have the packageName and apkId, the per-build tools will tell you what the file is.

    Annotations the server declares

    • title: Identify a file by its checksum
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true
  • search_appsSearch the APK catalogue by name, publisher or package id.Reads text others writeNo findings

    Why it is in this group

    • The name "search_apps" says "search": a word for reading.

    What it can reach

    • untrusted-inputThe server marks it openWorldHint: true: it reaches things outside the server's own data.
    Description, as the server wrote it
    Search the APK catalogue by name, publisher or package id. Start here when you have a phrase and need a package name. Returns 24 results a page out of at most 60 matches, so paging stops at page 3 — narrow the phrase rather than paging for more. `facets` counts the matches by type and category before filtering, so it tells you which filter would narrow a broad phrase. Searching an exact package id works as a lookup. A phrase nobody has searched before asks Google Play live and can take up to 20 seconds; UPSTREAM_UNAVAILABLE / UPSTREAM_BUSY there is refunded and means Play did not answer in time, not that nothing matches — retry the same phrase after a few seconds.

    Annotations the server declares

    • title: Search apps
    • readOnlyHint: true
    • idempotentHint: true
    • openWorldHint: true

This is not a safety rating, and no finding is not a safety guarantee. The groups and findings come from fixed checks of the tool definitions the server returned on the date shown, not from its code or what it does when called. How the checks work.

Exfil surface

Which tools read private data, which read text someone else can write, and which can send data out. One of each is a path a prompt injection can use.

No private-data, untrusted-input, outbound path in this server alone: no tool is tagged outbound.

Reads private data2
Reads files, mail, messages, databases, secrets, calendars or repositories.
Reads text others write27
Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
Can send data out0
Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.

Other servers in the same agent add their own tools to these paths. Audit your whole setup to see them together.

Findings

Matches of fixed checks, with the text they matched.

2 warn
  • The server marks "get_download_url" as not read-only (readOnlyHint: false), and its words say it reads.

    Matched text

    annotations: {"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":true}; The name "get_download_url" says "get": a word for reading.

    What this check looks for
  • The server marks "console_upload_status" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

    Matched text

    annotations: {"readOnlyHint":true,"idempotentHint":false,"openWorldHint":false}; The name "console_upload_status" says "upload": a word for a change.

    What this check looks for

History

Changes to its tool definitions and to its remote endpoint, newest first.

No change seen yet. Its tools are rescanned every day, and a remote endpoint is looked at once a week.

Install

Pinned to version 1.0.0. Values in angle brackets are yours to fill in.

claude mcp add --transport http apkcube https://apkcube.com/api/mcp
claude mcp add --transport http apkcube https://apkcube.com/api/mcp

Run in a terminal.

Claude Code permissions

Allow the reads, ask before a change or a way out, deny the deletes. Paste into .claude/settings.json.

.claude/settings.json
{
  "permissions": {
    "allow": [
      "mcp__apkcube__search_apps",
      "mcp__apkcube__get_app",
      "mcp__apkcube__list_versions",
      "mcp__apkcube__get_fetch_status",
      "mcp__apkcube__get_variant_status",
      "mcp__apkcube__list_developer_apps",
      "mcp__apkcube__list_categories",
      "mcp__apkcube__list_chart",
      "mcp__apkcube__list_similar_apps",
      "mcp__apkcube__get_play_details",
      "mcp__apkcube__list_reviews",
      "mcp__apkcube__get_version_security",
      "mcp__apkcube__list_sdks",
      "mcp__apkcube__get_protection",
      "mcp__apkcube__list_trackers",
      "mcp__apkcube__list_permissions",
      "mcp__apkcube__get_manifest",
      "mcp__apkcube__get_raw_scan",
      "mcp__apkcube__lookup_hash",
      "mcp__apkcube__lookup_certificate",
      "mcp__apkcube__list_developer_certificates",
      "mcp__apkcube__get_signing_history",
      "mcp__apkcube__compare_versions",
      "mcp__apkcube__get_apps",
      "mcp__apkcube__get_account",
      "mcp__apkcube__console_list_apps",
      "mcp__apkcube__console_list_uploads"
    ],
    "ask": [
      "mcp__apkcube__check_availability",
      "mcp__apkcube__get_download_url",
      "mcp__apkcube__request_fetch",
      "mcp__apkcube__request_variant",
      "mcp__apkcube__console_app_stats",
      "mcp__apkcube__console_upload_status",
      "mcp__apkcube__console_security_report"
    ],
    "deny": [
      "mcp__apkcube__console_update_listing",
      "mcp__apkcube__console_set_version_notice"
    ]
  }
}

Tools that only read are allowed, tools that change things ask first, tools that delete or cancel are denied. A read that can send data out (it takes a URL, say) asks first too. It assumes the server is installed as apkcube. Review it before you use it.

Capability tags behind 27 rules
  • mcp__apkcube__search_apps untrusted-input
  • mcp__apkcube__get_app untrusted-input
  • mcp__apkcube__check_availability untrusted-input
  • mcp__apkcube__list_versions untrusted-input
  • mcp__apkcube__get_download_url untrusted-input
  • mcp__apkcube__request_fetch untrusted-input
  • mcp__apkcube__get_fetch_status untrusted-input
  • mcp__apkcube__request_variant untrusted-input
  • mcp__apkcube__get_variant_status untrusted-input
  • mcp__apkcube__list_developer_apps untrusted-input
  • mcp__apkcube__list_chart untrusted-input
  • mcp__apkcube__list_similar_apps untrusted-input
  • mcp__apkcube__get_play_details private-data, untrusted-input
  • mcp__apkcube__list_reviews untrusted-input
  • mcp__apkcube__get_version_security untrusted-input
  • mcp__apkcube__list_sdks untrusted-input
  • mcp__apkcube__get_protection untrusted-input
  • mcp__apkcube__list_trackers untrusted-input
  • mcp__apkcube__list_permissions untrusted-input
  • mcp__apkcube__get_manifest untrusted-input
  • mcp__apkcube__get_raw_scan untrusted-input
  • mcp__apkcube__lookup_hash private-data, untrusted-input
  • mcp__apkcube__lookup_certificate untrusted-input
  • mcp__apkcube__list_developer_certificates untrusted-input
  • mcp__apkcube__get_signing_history untrusted-input
  • mcp__apkcube__compare_versions untrusted-input
  • mcp__apkcube__get_apps untrusted-input

Pin

Keep the decision: fail CI when the tools change, follow every change, or show a badge.

Pin in CI

Fail a build when the tools you reviewed are not the tools the server serves today.

curl -s "https://anlyon.dev/api/v1/servers/com.apkcube/apkcube/verify?hash=dd8e89197fb03e8d0c8921d49180cd71ad8fad655075ec20bb502044b2a4c660" | jq -e '.changed == false'

Pinned hash dd8e89197fb0, from Nov 3, 2026, 18:18 UTC.

Watch

Get told when its tools change: a new tool, a new description, a new class.

https://anlyon.dev/servers/com.apkcube/apkcube/changes.xml

An Atom feed. Works in any feed reader or Slack's RSS app.

Badge

anlyon.dev badge for com.apkcube/apkcube
[![anlyon.dev](https://anlyon.dev/badge/com.apkcube/apkcube.svg)](https://anlyon.dev/servers/com.apkcube/apkcube)

Source: MCP Registry. Synced Nov 3, 2026, 19:17 UTC.