Android Developer MCP by Nova (CIVAI)
co.civai.nova/mcp-android_developernova.civai.costreamable-httpv1.0.0Scanned
Ship a new Android app from chat. AI runs Google Play Console listings, screenshots, releases, uplo…
38 tools: 1 do something that can't be undone, 27 change things and 10 only read.
- Reads private data · 1
- Reads text others write · 4
- Can send data out · 1
- 3 findings
Anlyon alternative
28 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.
38 tools
Can't be undone 1Claude Code: ask
send_app_for_reviewSend the app's pending changes to Google Play review — the API behind Play Console's "Send app for review".Can send data outNo findings
Why it is in this group
- The name "send_app_for_review" says "send": a word for sending, and what is sent cannot be taken back.
What it can reach
- outboundThe name "send_app_for_review" says "send": it sends or publishes something to other people.
Description, as the server wrote it Send the app's pending changes to Google Play review — the API behind Play Console's "Send app for review". OUTWARD-FACING AND NOT FREELY REVERSIBLE: for an app that has never shipped this is the submission that decides whether it can be published at all. DRY-RUN BY DEFAULT — it reports what would be sent and sends nothing until commit="true". Confirm with the user first, exactly like start_rollout. It fetches the publishing page's continuation token itself and round-trips it, which is what Play actually requires; the dry run also reports Play's own `blocked` flag, the best machine-readable "can this be sent?" in this capture. A FAILED_PRECONDITION here is NOT reliably a setup-task problem — that was wrong for a whole session. Read the dry run's `publishing_page` block and Play Console's Publishing overview before blaming the app's state.
Changes things 27Claude Code: ask
attach_artifact_to_releaseAttach an already-uploaded artifact (version code) to a release — the required step between upload_bundle and start_rollout.No findings
Why it is in this group
- The name "attach_artifact_to_release" says "attach": a word for a change.
Description, as the server wrote it Attach an already-uploaded artifact (version code) to a release — the required step between upload_bundle and start_rollout. Uploading a bundle does NOT attach it, so without this the release has no artifact and start_rollout refuses. Identify the artifact by artifact_id, or give version_code and it is looked up among the app's processed artifacts. Carries the release's existing name and notes forward untouched. Reads the release back afterwards and returns attach_verified plus the attached version codes rather than assuming success. This does NOT publish — call start_rollout for that, and confirm with the user first.
check_package_name_availabilityCheck whether a package name is available before creating a new app.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.
Description, as the server wrote it Check whether a package name is available before creating a new app. Derived from web decompile recon, not the official API — uses the Play Console web session, not the service account.
create_appCreate a brand-new Android app on Google Play — the one thing the official Android Publisher API cannot do.No findings
Why it is in this group
- The name "create_app" says "create": a word for a change.
Description, as the server wrote it Create a brand-new Android app on Google Play — the one thing the official Android Publisher API cannot do. Derived from web decompile recon of Play Console's own client, not yet verified against a real call; uses the Play Console web session (browser_auth_profile.json), not the service account. Check package_name availability first.
create_releaseCreate a new draft release on a track.No findings
Why it is in this group
- The name "create_release" says "create": a word for a change.
Description, as the server wrote it Create a new draft release on a track. Play Console allows only one draft release per track at a time — fails clearly if one already exists rather than guessing its id. Optionally sets a release_name (cosmetic label only).
declare_asset_ai_stateDeclare whether the store listing's images were created or edited using AI.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.
Description, as the server wrote it Declare whether the store listing's images were created or edited using AI. Play Console's listing editor has a second step ("Review") carrying this REQUIRED regulatory declaration, and until it is answered the listing stays Draft, the dashboard's store_listings task stays incomplete, and send_app_for_review refuses with a bare FAILED_PRECONDITION — however complete the listing content is. DRY-RUN BY DEFAULT. This is a statement to a regulator about who made the images: ask the user, never infer it.
grant_app_permissionGrant a principal (teammate or service account) access to ONE app, as an APPEND that preserves every existing app grant and all account-level permissions.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.
Description, as the server wrote it Grant a principal (teammate or service account) access to ONE app, as an APPEND that preserves every existing app grant and all account-level permissions. Use it to give a CI service account release access to a newly-created app — the step the androidpublisher API cannot do for a release-scoped service account (it 403s, it cannot grant itself access); this runs on the owner's Play Console session. DRY-RUN BY DEFAULT: with commit omitted/not "true" it pre-reads and returns the exact before/after WITHOUT writing — show that to the user and get their explicit agreement to this specific account-permissions change, then re-run with commit="true". A relayed approval is not the user's approval. The write is append-only (refuses to drop or shrink any existing grant), scoped so account-level permissions are untouched, and re-reads afterwards to prove the append. For the permission set, prefer copy_permissions_from_app_id (copies an existing grant's values verbatim — matches the account's pattern and names no enum value).
promote_releasePromote an existing release to another track WITHOUT re-uploading the bundle.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.
Description, as the server wrote it Promote an existing release to another track WITHOUT re-uploading the bundle. WARNING, measured 2026-10-28: it creates an EMPTY draft release — it does NOT carry the artifact across, despite what this description used to claim. ALWAYS follow it with attach_artifact_to_release and check attach_verified, or start_rollout will refuse because the release has no artifact. Its new_release_id also echoes the SOURCE release id, so read the destination with get_track rather than trusting the echo. It does NOT publish; call start_rollout afterwards and confirm with the user first.
refresh_browser_sessionRefresh the saved Play Console session in place, with no new browser sign-in.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.
Description, as the server wrote it Refresh the saved Play Console session in place, with no new browser sign-in. Google rotates the __Secure-1PSIDTS/__Secure-3PSIDTS session cookies about every 10 minutes; the captured copy goes stale and every tool then returns 401 UNAUTHENTICATED — or list_accounts returns an empty list — even though the user never signed out. Every tool already retries this automatically on a 401, so call it deliberately before a long sequence, or to tell a stale cookie apart from a session that has genuinely ended (if this succeeds and no account is signed in, only start_browser_auth will help).
setup_closed_testingSet up a track's testers: creates or updates a tester email list and attaches it to the track as an audience group.No findings
Why it is in this group
- The description's first verb is "set": a word for a change.
Description, as the server wrote it Set up a track's testers: creates or updates a tester email list and attaches it to the track as an audience group. Google requires a personal developer account to run a closed test with a minimum tester count for a minimum number of days before it can even APPLY for production access — this starts that clock, and reports the live required-vs-current tester and day counts so the gap is a number. DRY-RUN BY DEFAULT.
start_browser_authOpen App Store Connect sign-in only when needed.No findings
Why it is in this group
- The name "start_browser_auth" says "start": a word for a change.
Description, as the server wrote it Open App Store Connect sign-in only when needed. If the saved session is still valid, this tool returns success immediately and does not open the viewer. Call session_status first. Use force_reconnect only when the user explicitly wants to wipe the saved cookie and sign in again (destructive).
start_rolloutRoll out a release — this IS Android's publish action for the release.No findings
Why it is in this group
- The name "start_rollout" says "start": a word for a change.
Description, as the server wrote it Roll out a release — this IS Android's publish action for the release. Not simply reversible; always confirm with the user, especially on production. Preconditions it cannot satisfy itself: the release needs an artifact attached (attach_artifact_to_release — promote_release does NOT attach one), and the track needs at least one EXPLICITLY selected country (target_rest_of_world alone is not a selection — see update_track_countries). A bare FAILED_PRECONDITION here names nothing: open the Console's release review page (.../tracks/{track}/releases/{release}/review) and expand its errors, which is read-only and states the cause in one sentence. Production additionally requires the app to have passed review once.
submit_prod_access_applicationSubmit the production-access application questionnaire for a personal developer account.No findings
Why it is in this group
- The name "submit_prod_access_application" says "submit": a word for a change.
Description, as the server wrote it Submit the production-access application questionnaire for a personal developer account. Only possible once the closed-testing tester/day requirement is met (see setup_closed_testing and get_setup_state). All ten answers are the developer's own words about their testing — never invent them. DRY-RUN BY DEFAULT.
update_ads_declarationDeclare whether the app contains ads, using Play Console's own web session.No findings
Why it is in this group
- The name "update_ads_declaration" says "update": a word for a change.
Description, as the server wrote it Declare whether the app contains ads, using Play Console's own web session. Mandatory App content declaration required before a new app is eligible for production submission/review.
update_content_ratingSubmit and apply the mandatory IARC content rating questionnaire, using Play Console's own web session.No findings
Why it is in this group
- The name "update_content_rating" says "update": a word for a change.
Description, as the server wrote it Submit and apply the mandatory IARC content rating questionnaire, using Play Console's own web session. Only content_rating_category="all_other_app_types" (every question answered No, producing the lowest possible rating) is currently supported — the correct choice for a brand-new app with no mature content.
update_data_safetySubmit the Data safety declaration.No findings
Why it is in this group
- The name "update_data_safety" says "update": a word for a change.
Description, as the server wrote it Submit the Data safety declaration. data_collection="none" declares the app collects and shares NO user data; data_collection="collects" files the per-data-type questionnaire from data_types. REQUIRES update_privacy_policy to have been called first. This is a public, legally-meaningful statement about the app: "none" is a FALSE declaration for any app that collects anything at all, including a push notification token, so confirm what the app actually collects with the user rather than assuming. Nothing is defaulted on your behalf — an unknown data type or a missing purpose is refused, not approximated. An app where users can sign up must also answer the account section (questions 92-96); pass the real account_creation_methods plus the deletion URLs rather than defaulting to "none", which publicly declares the app has no sign-up.
update_none_option_declarationDeclare 'none of the above' for a multi-select feature-checklist App content declaration, using Play Console's own web session.No findings
Why it is in this group
- The name "update_none_option_declaration" says "update": a word for a change.
Description, as the server wrote it Declare 'none of the above' for a multi-select feature-checklist App content declaration, using Play Console's own web session. Mandatory declarations. Currently supports none_option_declaration="financial_features" (does the app provide any financial features?) or "health" (does the app use any health features?). Only the 'none apply' answer is supported.
update_policy_declarationSet a simple Yes/No App content policy declaration, using Play Console's own web session.No findings
Why it is in this group
- The name "update_policy_declaration" says "update": a word for a change.
Description, as the server wrote it Set a simple Yes/No App content policy declaration, using Play Console's own web session. Mandatory declaration gating production submission eligibility. Currently supports policy_declaration="advertising_id" (does the app use advertising ID?) or "government_app" (is this app developed by or on behalf of a government?).
update_privacy_policySet the app's privacy policy URL, using Play Console's own web session.No findings
Why it is in this group
- The name "update_privacy_policy" says "update": a word for a change.
Description, as the server wrote it Set the app's privacy policy URL, using Play Console's own web session. Mandatory App content declaration, and a prerequisite for submitting the Data safety declaration.
update_sign_in_detailsDeclare whether any part of the app is restricted (requires account sign-in, payment, referral/QR codes, OTP, biometrics, or actions on another device).3 findings
Why it is in this group
- The name "update_sign_in_details" says "update": a word for a change.
Findings
- Info
The description mentions "credentials".
What this check looks forMatched text
description: "...live-verified; "true" attaches reviewer credentials and its wire shape is derived from Play..."
- Info
The input schema at properties.is_restricted.description mentions "credentials".
What this check looks forMatched text
inputSchema.properties.is_restricted.description: "...or an action on another device — then `credentials` is required so Play's reviewer can get..."
- Info
The input schema at properties.credentials.description mentions "credentials".
What this check looks forMatched text
inputSchema.properties.credentials.description: "...EAL working test account — never invent credentials, and never reuse a personal login. Pass..."
Description, as the server wrote it Declare whether any part of the app is restricted (requires account sign-in, payment, referral/QR codes, OTP, biometrics, or actions on another device). Formerly 'App access'. Mandatory App content declaration and one of the app-dashboard setup tasks that gate send_app_for_review. Both answers are supported: "false" is live-verified; "true" attaches reviewer credentials and its wire shape is derived from Play Console's own bundle but not yet live-verified — check the App access page after filing one.
update_store_listingUpdate an app's main store listing (title, short/full description) for one language using Play Console's own web session.No findings
Why it is in this group
- The name "update_store_listing" says "update": a word for a change.
Description, as the server wrote it Update an app's main store listing (title, short/full description) for one language using Play Console's own web session. Does NOT need create_edit/commit_edit — it patches the listing directly. On an app whose language has no listing entry yet this CREATES the entry (verified live), so it is the first call before attaching any graphic. Note the PATCH replaces the whole entry for that language, so title, short_description and full_description must all be supplied together.
update_store_listing_screenshotsReorder or remove an app's existing store-listing screenshots for one language.No findings
Why it is in this group
- The name "update_store_listing_screenshots" says "update": a word for a change.
Description, as the server wrote it Reorder or remove an app's existing store-listing screenshots for one language. Preserves the listing's title/descriptions untouched. Can ONLY reorder/remove already-uploaded screenshots (matched by URL) — cannot add a brand-new screenshot image.
update_store_settingsSet the app's store category and public contact details — one of the app dashboard setup tasks that gates send_app_for_review.No findings
Why it is in this group
- The name "update_store_settings" says "update": a word for a change.
Description, as the server wrote it Set the app's store category and public contact details — one of the app dashboard setup tasks that gates send_app_for_review. Until it is done Play refuses the review submission with a bare FAILED_PRECONDITION and Play Console's own Send-for-review button stays greyed out. The contact details are PUBLIC on the store listing. Derived from Play Console's own bundle; not yet live-verified.
update_target_audience_contentDeclare the app's target audience & content, using Play Console's own web session.No findings
Why it is in this group
- The name "update_target_audience_content" says "update": a word for a change.
Description, as the server wrote it Declare the app's target audience & content, using Play Console's own web session. Mandatory App content declaration. Only target_audience="adults" (18 and over only, not aimed at children) is currently supported — the correct, simplest answer for an app with no child-directed content.
update_track_countriesSet which countries/regions a release track serves — the precondition for a track's first rollout.No findings
Why it is in this group
- The name "update_track_countries" says "update": a word for a change.
Description, as the server wrote it Set which countries/regions a release track serves — the precondition for a track's first rollout. CRITICAL, measured 2026-10-28: pass at least one explicit targeted_countries value. target_rest_of_world="true" ALONE writes the rest-of-world flag and leaves the country list empty, and Play's release validator then refuses every rollout with "No countries or regions have been selected for this track" — surfacing from start_rollout as a bare FAILED_PRECONDITION with no detail, while get_setup_state still reports closed_countries/prod_countries as complete. For a worldwide launch pass one real market in targeted_countries AND target_rest_of_world="true". Does not publish anything. Ask the user which countries; never pick for them.
upload_bundleUpload a signed .aab.No findings
Why it is in this group
- The name "upload_bundle" says "upload": a word for a change.
Description, as the server wrote it Upload a signed .aab. IMPORTANT: uploading does NOT attach the artifact to the release — it only becomes an app-level artifact (visible with its own version code) while the release's addedArtifacts stays empty, so start_rollout would have nothing to roll out. Call attach_artifact_to_release next, then get_release to check signing/content validation, then start_rollout. This call only confirms the bytes arrived and that Play accepted the bundle for processing.
upload_screenshot_assetUpload an image into the app's Asset Library.No findings
Why it is in this group
- The name "upload_screenshot_asset" says "upload": a word for a change.
Description, as the server wrote it Upload an image into the app's Asset Library. NOTE: for store listing graphics use upload_store_listing_graphic instead — the Asset Library's image cannot be attached to a listing slot (it lacks the blobKey the listing requires, confirmed live). This tool is only for getting an image into the Asset Library itself.
upload_store_listing_graphicUpload an image AND attach it to a store-listing slot in one call — phone screenshot, feature graphic or app icon.No findings
Why it is in this group
- The name "upload_store_listing_graphic" says "upload": a word for a change.
Description, as the server wrote it Upload an image AND attach it to a store-listing slot in one call — phone screenshot, feature graphic or app icon. This is what makes a store listing completable from here; upload_screenshot_asset only gets an image into the Asset Library and CANNOT attach it. Play requires at least 2 phone screenshots plus a feature graphic and an icon for a complete listing, so call this once per image. Preserves the listing's existing text and other graphics, and refuses rather than risking a partial overwrite. Give the image ONE of three ways: image_base64 (inline bytes, no hosting needed, 64 KiB cap), image_url (https, any size) or image_path (replay host only).
Only reads 10Show 10 read-only tools
enroll_play_app_signingRead, or set, an app's Play App Signing enrolment.No findings
Why it is in this group
- The description's first verb is "read": a word for reading.
Description, as the server wrote it Read, or set, an app's Play App Signing enrolment. An app that is NOT enrolled CANNOT accept an .aab: upload_bundle returns 200 and Play then rejects the bundle during processing (error 3008), leaving a pending upload reference, no artifact, and an unexplained 400 from start_rollout. Call with action="status" first — that is read-only. Enrolment is PERMANENT, sets the app's signing identity for the life of the app and gives Google custody of the app signing key: get the user's explicit agreement to this specific action before enrolling, and ask whether Google should generate a fresh key or reuse another app's deployment key. There is no way to ship an .aab without it.
get_app_submission_stateHas this app ever been sent for Google Play review?Reads text others writeNo findings
Why it is in this group
- The name "get_app_submission_state" says "get": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "review": it reads comments, which other people can write.
Description, as the server wrote it Has this app ever been sent for Google Play review? ANSWERS WHAT get_pre_submit_status CANNOT: that tool reported review_eligible: true for an unreviewed draft app that could not publish by any route. An app that has never been reviewed cannot be rolled out to production at all. `ever_submitted_for_review` is the trustworthy field. The status codes are RAW AND UNMAPPED on purpose — a previous guess reported a live in-review submission as REJECTED — so do not read a verdict into them; Play Console's Publishing overview is the authority on the real state. If the submission history cannot be read, this returns submission_state_known: false rather than guessing 'never submitted'.
get_pre_submit_statusRead-only: what Google Play still requires before this app is review-eligible.Reads text others writeNo findings
Why it is in this group
- The name "get_pre_submit_status" says "get": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "read" and "review": it reads comments, which other people can write.
Description, as the server wrote it Read-only: what Google Play still requires before this app is review-eligible. Reports each App Content declaration's state, the hub's blocking validation errors, the store listing's validation warnings, and whether the Publishing page considers the app blocked. review_eligible is conservative — if any source could not be read it is false and the unread source is listed in errors, so never report an app as clear on a partial answer.
get_releaseGet a release's current state, including currently-attached artifacts and validation status — check this before start_rollout.No findings
Why it is in this group
- The name "get_release" says "get": a word for reading.
Description, as the server wrote it Get a release's current state, including currently-attached artifacts and validation status — check this before start_rollout.
get_setup_stateRead the app dashboard's setup checklist.No findings
Why it is in this group
- The name "get_setup_state" says "get": a word for reading.
Description, as the server wrote it Read the app dashboard's setup checklist. Returns which tasks are complete and which are still open (privacy_policy, app_access, ads, content_rating, target_audience, store_settings, store_listings, prod_countries, prod_release, ...). WARNING: the `incomplete` list is NOT a list of blockers — measured live, it listed 10 open tasks while Play Console's own Submit button was enabled and the app then submitted fine. It mixes real setup items with the action you are trying to take (*_sent_for_review), paths the app does not use (open_*, prereg_*) and consequences that only become true after review and rollout (prod_rollout, serving_in_prod). Still far better than get_pre_submit_status, which reads declarations and listing warnings only. For whether a submission can actually go through, use send_app_for_review's dry run (Play's `blocked` flag) or the Publishing overview. Read-only.
get_trackGet one release track's current state by track_id, including every release on that track with its release_id, name, status and lifecycle state.No findings
Why it is in this group
- The name "get_track" says "get": a word for reading.
Description, as the server wrote it Get one release track's current state by track_id, including every release on that track with its release_id, name, status and lifecycle state. This is how you find an existing draft release's id after create_release refuses a second draft.
get_user_permissionsRead one principal's current Play Console permissions by email — read-only, nothing changes.Reads private dataReads text others writeNo findings
Why it is in this group
- The name "get_user_permissions" says "get": a word for reading.
What it can reach
- private-dataThe description's first sentence says "read" and "email": it reads mail.
- untrusted-inputThe description's first sentence says "read" and "email": it reads inbound email, which other people can write.
Description, as the server wrote it Read one principal's current Play Console permissions by email — read-only, nothing changes. Works for a human teammate or a service account (…@….iam.gserviceaccount.com); both are the same user row keyed by email. Returns account-level permissions and, per app, the exact permission values already held. This is the prerequisite before grant_app_permission: an append has to preserve every app the principal already reaches, so read the current grants first and confirm them with the user.
list_accountsList which Google accounts are signed in to this browser session, with their X-Goog-AuthUser slot index.Reads text others writeNo findings
Why it is in this group
- The name "list_accounts" says "list": a word for reading.
What it can reach
- untrusted-inputThe description's first sentence says "list" and "browser": it reads web pages, which anyone can write.
Description, as the server wrote it List which Google accounts are signed in to this browser session, with their X-Goog-AuthUser slot index. For visibility/debugging only.
list_appsList apps on this Play Console developer account.No findings
Why it is in this group
- The name "list_apps" says "list": a word for reading.
Description, as the server wrote it List apps on this Play Console developer account. Derived from web decompile recon, not the official API.
list_tracksList an app's release tracks and their track_id — call this first to find the track_id other release tools need.No findings
Why it is in this group
- The name "list_tracks" says "list": a word for reading.
Description, as the server wrote it List an app's release tracks and their track_id — call this first to find the track_id other release tools need.
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.
4 paths in this server alone from private data, through text someone else wrote, to a way out. Denying 1 outbound tool breaks every one.
- Reads private data1
- Reads files, mail, messages, databases, secrets, calendars or repositories.
- Reads text others write4
- Brings in text someone else can write: web pages, inbound email, messages, issues and comments.
- Can send data out1
- Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL.
{
"permissions": {
"deny": [
"mcp__android_developer__send_app_for_review"
]
}
}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.
The description mentions "credentials".
What this check looks forMatched text
description: "...live-verified; "true" attaches reviewer credentials and its wire shape is derived from Play..."
The input schema at properties.is_restricted.description mentions "credentials".
What this check looks forMatched text
inputSchema.properties.is_restricted.description: "...or an action on another device — then `credentials` is required so Play's reviewer can get..."
The input schema at properties.credentials.description mentions "credentials".
What this check looks forMatched text
inputSchema.properties.credentials.description: "...EAL working test account — never invent credentials, and never reuse a personal login. Pass..."
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 android_developer https://nova.civai.co/mcp/agents/mcp-android_developerclaude mcp add --transport http android_developer https://nova.civai.co/mcp/agents/mcp-android_developerRun 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.
{
"permissions": {
"allow": [
"mcp__android_developer__list_tracks",
"mcp__android_developer__get_track",
"mcp__android_developer__list_apps",
"mcp__android_developer__list_accounts",
"mcp__android_developer__get_release",
"mcp__android_developer__get_pre_submit_status",
"mcp__android_developer__enroll_play_app_signing",
"mcp__android_developer__get_user_permissions",
"mcp__android_developer__get_app_submission_state",
"mcp__android_developer__get_setup_state"
],
"ask": [
"mcp__android_developer__create_release",
"mcp__android_developer__upload_bundle",
"mcp__android_developer__check_package_name_availability",
"mcp__android_developer__create_app",
"mcp__android_developer__update_store_listing",
"mcp__android_developer__update_store_listing_screenshots",
"mcp__android_developer__start_rollout",
"mcp__android_developer__update_ads_declaration",
"mcp__android_developer__update_sign_in_details",
"mcp__android_developer__update_target_audience_content",
"mcp__android_developer__update_policy_declaration",
"mcp__android_developer__update_content_rating",
"mcp__android_developer__update_privacy_policy",
"mcp__android_developer__update_data_safety",
"mcp__android_developer__update_none_option_declaration",
"mcp__android_developer__upload_screenshot_asset",
"mcp__android_developer__promote_release",
"mcp__android_developer__upload_store_listing_graphic",
"mcp__android_developer__grant_app_permission",
"mcp__android_developer__attach_artifact_to_release",
"mcp__android_developer__refresh_browser_session",
"mcp__android_developer__update_track_countries",
"mcp__android_developer__send_app_for_review",
"mcp__android_developer__update_store_settings",
"mcp__android_developer__declare_asset_ai_state",
"mcp__android_developer__setup_closed_testing",
"mcp__android_developer__submit_prod_access_application",
"mcp__android_developer__start_browser_auth"
],
"deny": []
}
}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 android_developer. Review it before you use it.
Capability tags behind 5 rules
- mcp__android_developer__list_accounts untrusted-input
- mcp__android_developer__get_pre_submit_status untrusted-input
- mcp__android_developer__get_user_permissions private-data, untrusted-input
- mcp__android_developer__get_app_submission_state untrusted-input
- mcp__android_developer__send_app_for_review outbound
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/co.civai.nova/mcp-android_developer/verify?hash=2c9ae7f5ae3e2971916da4f0e078f953f8f61b20dc7df56e2627bae7176939d8" | jq -e '.changed == false'Pinned hash 2c9ae7f5ae3e, from Nov 2, 2026, 09:18 UTC.
Watch
Get told when its tools change: a new tool, a new description, a new class.
https://anlyon.dev/servers/co.civai.nova/mcp-android_developer/changes.xmlAn Atom feed. Works in any feed reader or Slack's RSS app.
Badge
[](https://anlyon.dev/servers/co.civai.nova/mcp-android_developer)Source: MCP Registry. Synced Nov 2, 2026, 09:17 UTC.