mqdh-mcp
Provides tools for Meta Quest developers to list developer organizations, apps, and release channels, and to upload APK/OBB builds to channels such as ALPHA, BETA, RC, or LIVE via Meta's developer platform.
Integrates with the Oculus Graph API (graph.oculus.com) to look up organizations, apps, release channels, and test users, and to copy existing builds between channels.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mqdh-mcpUpload C:\builds\game.apk to the BETA channel of Space Game with notes 'fixes crash'."
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.
mqdh-mcp
Unofficial MCP server for Meta Quest developers. Lets an AI assistant list your developer organizations, apps and release channels, and upload builds (APK/OBB) to a channel such as ALPHA, BETA, RC or LIVE — the same way Meta Quest Developer Hub (MQDH) does.
Not affiliated with or endorsed by Meta. Uploads use Meta's official
ovr-platform-util. Org/app/channel lookups use undocumentedgraph.oculus.comoperations that may change without notice.
TL;DR for AI assistants
auth_status— confirm a Meta login is available.list_orgs→select_org { org }— pick the developer organization (saved for later calls).list_apps→ find the app;list_channels { app }— see channels and latest builds.upload_build { app, channel, apk, dry_run: true }— preview, then run withoutdry_run.upload_status { job_id }— poll untilstatusissucceededorfailed.
Rules: uploads are drafts unless publish: true. Publishing to LIVE (or copying a build into LIVE) needs confirm_live: true — only set it when the user explicitly asks to ship to the public store. app and org accept an id or a partial name.
Related MCP server: dev-publish
Tools
Tool | Purpose | Key arguments |
| Show login state, token source, selected org | — |
| List organizations you belong to | — |
| Set the default organization |
|
| List apps in an org |
|
| Channels + latest builds for an app ( |
|
| Upload a build in the background; returns |
|
| Progress/output of an upload (or list all) |
|
| Copy an existing build into another channel |
|
| Test users for an org |
|
| Raw graph.oculus.com query (advanced) |
|
| Run any bundled |
|
channel accepts ALPHA, BETA, RC, LIVE (aliases store, production), a custom channel name, or a channel id.
Example
User: Upload C:\builds\game.apk to the BETA channel of "Space Game" with notes "fixes crash".
→ list_orgs / select_org { "org": "My Studio" }
→ upload_build { "app": "Space Game", "channel": "BETA", "apk": "C:\\builds\\game.apk", "notes": "fixes crash", "dry_run": true }
→ upload_build { "app": "Space Game", "channel": "BETA", "apk": "C:\\builds\\game.apk", "notes": "fixes crash" }
← { "job_id": "a1b2c3d4", "channel": "BETA", "mode": "draft", "status": "uploading" }
→ upload_status { "job_id": "a1b2c3d4" }Install
Requirements: Node.js 20+, and Meta Quest Developer Hub installed and logged in (open it once so it downloads ovr-platform-util).
git clone https://github.com/thankyoucoinbase/mqdh-mcp.git
cd mqdh-mcp
npm installClaude Code
claude mcp add mqdh -- node /absolute/path/to/mqdh-mcp/Source/server.jsClaude Desktop / other MCP clients
{
"mcpServers": {
"mqdh": { "command": "node", "args": ["/absolute/path/to/mqdh-mcp/Source/server.js"] }
}
}Authentication
No separate login: the server reuses your existing MQDH session. Token sources, in order:
MQDH_TOKENenvironment variableMQDH's
odh/mcp-config.jsonin your app-data folderWindows Credential Manager entry
Meta Quest Developer Hub/defaultmetavr auth profile-token
If none work, log in to MQDH or run metavr auth login.
Configuration
All optional; defaults follow the standard MQDH install.
Variable | Default |
|
|
|
|
|
|
|
|
| — |
|
|
Tested on Windows. macOS paths follow MQDH's layout but are untested.
Security
Tools never return the access token; it is redacted from upload output.
ovr-platform-utilreceives the token as a command-line argument (as MQDH does), so it is visible to other local processes while an upload runs.The
graphqltool can run mutations as you. Remove it from your client's allowed tools if you don't need it.
How it works
Operation | Mechanism |
Orgs, apps, channels, test users, copy build |
|
Upload |
|
Development
npm test # offline tests, no login needed
npm run test:live # read-only tests against your account; never uploadsProject layout and conventions for contributors (human or AI): AGENTS.md.
License
Available Tools
11 toolsauth_statusA
Check which Meta account is in use and where the token came from.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden. It implies a side-effect-free read by naming the two facts returned (account in use, token source), but it says nothing about whether the token value is exposed or masked, whether the check makes a network/auth call, or what happens when no valid token is configured.
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?
A single front-loaded sentence with no filler; the two outputs (account and token origin) come in the right order. It is arguably too short rather than too long, but the structure itself is clean.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, the description must fully specify behavior and results. It names the two returned facts but leaves the return shape (field names, masking of the token, failure/empty-state behavior) undefined, which is the main remaining gap for a zero-param diagnostic tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the description correctly does not invent any, so there is nothing to document. Baseline 4 applies for a no-parameter tool.
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 ('check') and a specific resource ('which Meta account is in use and where the token came from'), so an agent knows exactly what question this tool answers. It does not explicitly differentiate itself from the org-listing siblings, but the resource domain (Meta account/token) is distinct enough from list_orgs/select_org that confusion is unlikely.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent must infer that this is a diagnostic call to run before other Meta operations when the active identity is uncertain. There is no explicit when-to-use, when-not-to-use, or named alternative among the siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_buildA
Copy an existing build (binary id from list_channels) into another release channel. Copying into LIVE requires confirm_live=true.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | App id, or app name (partial ok) within the selected/given org | |
| org | No | Organization id or name; defaults to the selected org | |
| binary_id | Yes | Build id from list_channels latest_builds | |
| to_channel | Yes | Target channel name or id | |
| confirm_live | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It usefully discloses the LIVE safety guard via confirm_live, but says nothing about overwrite semantics in the target channel, required permissions, reversibility, or failure behavior when confirm_live is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no filler, with the core action first and the safety prerequisite attached to the specific case that needs it.
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 5-parameter mutation tool with no annotations and no output schema, key details are missing: whether the copy overwrites or appends, what the response contains, and what error occurs when confirm_live is false against LIVE. The essentials for constructing the call are present, but not for predicting its effect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 80%, so binary_id, app, and org are already documented in the schema. The description only adds the confirm_live=true requirement for LIVE targets, which the schema does not convey; to_channel and org get no additional meaning from the prose.
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 (copy) and resource (build) with scope: an existing build moved into another release channel, and it names list_channels as the source of the binary id. That cleanly separates it from upload_build, which would create a new binary instead of reusing one.
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?
Tells the agent to obtain binary_id from list_channels and gives an explicit gating condition: copying into LIVE requires confirm_live=true. It stops short of stating when to prefer upload_build or what happens if the target channel already has builds, but the primary selection path is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
graphqlC
Run a raw GraphQL query against graph.oculus.com as the logged-in developer (advanced).
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| variables | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses the endpoint and that execution happens as the logged-in developer, but says nothing about whether mutations are possible, permission requirements, rate limits, error behavior, or response format for a raw query tool.
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 definition is a single front-loaded sentence with no wasted words. It is appropriately terse for a description, though the terseness contributes to gaps covered in other dimensions.
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 raw GraphQL escape hatch with nested variables, no annotations, no output schema, and 0% schema description coverage, the description is too thin. An agent lacks enough information about parameter usage, mutation safety, and expected return/error behavior to invoke it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the description does not explain the 'variables' object at all. It implies the 'query' parameter should be raw GraphQL, but provides no guidance on variables syntax, formatting, or how the two parameters interact.
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: run a raw GraphQL query against graph.oculus.com as the logged-in developer. It clearly identifies an escape-hatch tool, though it does not explicitly name when to use it instead of siblings like metavr or list_apps.
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 only usage cue is the parenthetical '(advanced)', which signals audience rather than conditions. There is no explanation of when this tool is appropriate versus the many higher-level sibling tools, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsC
List apps in an organization.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | Organization id or name; defaults to the selected org |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It never states that this is a read-only call, whether results are paginated, or what authentication/org-selection state is required, all of which matter for a list operation in this sibling set.
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?
One short, front-loaded sentence with no waste or filler. It is efficient, though the brevity contributes to the gaps noted in other dimensions rather than being an asset on its own.
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?
The tool is simple (one optional parameter, no nested objects, no output schema), so the description is minimally viable. However, with no annotations and no output schema, it should say more about return shape or pagination than a single scoping clause.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single 'org' parameter is documented in the schema as 'Organization id or name; defaults to the selected org'. The description adds nothing beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('List apps') and scopes it to an organization, so an agent knows exactly what it returns. It does not distinguish itself from the closest sibling (list_channels / list_orgs), but the resource name is unambiguous.
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?
No guidance on when to call this versus the other list_* siblings, nor on prerequisites such as needing a selected org first (select_org exists as a sibling). Usage is only implied by the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_channelsA
List an app's release channels (ALPHA/BETA/RC/LIVE/custom) and their latest builds. The store channel has is_live=true.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | App id, or app name (partial ok) within the selected/given org | |
| org | No | Organization id or name; defaults to the selected org |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry behavioral context. It adds useful return-value detail with "ALPHA/BETA/RC/LIVE/custom" and "The store channel has is_live=true", but omits permissions, ordering, pagination, and side-effect information.
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 two short sentences with no wasted text. The core purpose is front-loaded, and the additional is_live note is directly relevant to interpreting the output.
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 simple read-only listing tool with fully documented parameters, the description covers the resource and a key return-value nuance. It is nearly complete, though it could mention response ordering or whether all channels are always returned.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description does not add meaning beyond what is in the schema, and with full coverage the baseline of 3 is appropriate.
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 uses a specific verb and resource: "List an app's release channels" and adds that it returns their latest builds. It clearly describes the tool's purpose, but does not explicitly differentiate it from sibling tools such as list_apps or list_orgs.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the phrase "an app's release channels", but the description gives no explicit when-to-use guidance, prerequisites, or alternatives. It does not clarify when to choose this over other listing tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_orgsA
List the developer organizations the logged-in account belongs to.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden. It does disclose that results are filtered by the authenticated account's membership, which is meaningful context, but says nothing about ordering, pagination, or what happens if the account belongs to zero orgs.
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?
A single front-loaded sentence with no filler; every word contributes to scope and resource identity.
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 zero-parameter read-only list operation with no output schema or annotations, the description covers what is needed to select and invoke it. Only the return shape/count semantics are left implicit, a minor gap.
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 tool takes zero parameters, so the baseline is 4. There is nothing schema-level left for the description to clarify.
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 (List) and resource (developer organizations) with an explicit scope: only those the logged-in account belongs to. That scope distinguishes it from siblings like list_apps, list_channels and list_test_users, though it does not name a near-neighbor alternative explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'the logged-in account belongs to' implies when this tool applies (identity-scoped discovery) but gives no explicit when-to-use/when-not guidance or pointer to alternatives such as select_org or auth_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_test_usersB
List test users for an organization.
| Name | Required | Description | Default |
|---|---|---|---|
| org | No | Organization id or name; defaults to the selected org |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It implies a read operation via 'List' but does not disclose permissions, pagination behavior, whether only test users are returned, or any other operational traits.
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 a single, efficient sentence with the verb and scope front-loaded. There is no wasted wording.
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 simple list tool with one optional parameter and no output schema, the description is minimally adequate but lacks usage guidance and behavioral context. It does not explain what a 'test user' is or what the listing returns, though the tool's simplicity limits the gap.
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 description coverage is 100%, and the sole optional 'org' parameter is fully documented in the schema as an organization id or name defaulting to the selected org. The description adds no parameter semantics beyond what the schema already provides, so baseline 3 is appropriate.
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 ('List') and resource ('test users') scoped to an organization. It clearly distinguishes the tool from sibling list operations such as list_orgs, list_apps, and list_channels, though it does not elaborate beyond the name-level distinction.
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?
There is no guidance on when to use this tool versus alternatives, no exclusions, and no prerequisites. The only implied usage is that it lists test users, which an agent could infer from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
metavrB
Run any metavr CLI command bundled with MQDH (devices, app install, logcat, perf, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| args | Yes | e.g. ["device","list","--json"] |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It discloses that arbitrary CLI commands are executed, but says nothing about side effects, destructive potential, authentication requirements, execution environment, output format, or error behavior, despite this being a powerful command-execution tool.
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?
A single front-loaded sentence with no wasted words. The examples make the broad scope immediately understandable, and the ellipsis appropriately signals that the listed commands are not exhaustive.
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 passthrough with full schema coverage and an example, the description is adequate to start forming a call. However, for a generic command-execution tool with no annotations and no output schema, it should say more about safety, available command syntax, and return behavior.
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 100% description coverage and already provides an example argument array. The description adds useful command categories such as devices, app install, logcat, and perf, but does not explain argument syntax, options, or JSON output conventions beyond the schema example.
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: run metavr CLI commands bundled with MQDH, with concrete examples like devices, app install, logcat, and perf. It is clear what the tool does, though it does not explicitly distinguish itself from structured sibling tools such as list_apps or upload_build.
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 gives no guidance on when to use this generic CLI passthrough versus the many specific sibling tools like list_apps, upload_build, graphql, or auth_status. An agent can infer that it is for arbitrary metavr commands, but there are no explicit inclusions, exclusions, or alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
select_orgA
Select the active developer organization (by id or name). Saved across sessions.
| Name | Required | Description | Default |
|---|---|---|---|
| org | Yes | Organization id or name (partial match ok) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does carry one valuable behavioral disclosure: the selection is persisted across sessions, meaning a global state mutation. It omits what happens on an ambiguous partial match, whether the org is validated to exist, and what the call returns, which matters for a state-changing tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the core action and the persistence side effect front-loaded.
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 no output schema, the description covers the action, accepted inputs, and the cross-session persistence. Only the ambiguity/validation behavior on partial matches is left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents 'Organization id or name (partial match ok)'; the description only restates 'by id or name' and adds no tie-breaking or ambiguity behavior. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Select the active developer organization') plus the accepted identifier forms, so the agent knows this sets active state rather than listing orgs. It doesn't explicitly name list_orgs as the discovery sibling, which keeps it from a 5.
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?
'Select the active...' plus 'Saved across sessions' implies the tool is used to pin a working context before other calls, but there is no explicit when-to-use/when-not or guidance to call list_orgs first when the org id is unknown.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_buildA
Upload an APK (Quest) or build directory (PC) to an app's release channel with ovr-platform-util. Uploads as a DRAFT unless publish=true. Publishing to LIVE requires confirm_live=true. Use dry_run=true to preview the exact command. Runs in the background: poll upload_status with the returned job_id.
| Name | Required | Description | Default |
|---|---|---|---|
| apk | Yes | Absolute path to the .apk (Quest) or build directory (PC) | |
| app | Yes | App id, or app name (partial ok) within the selected/given org | |
| obb | No | Optional .obb expansion file path | |
| org | No | Organization id or name; defaults to the selected org | |
| notes | No | Release notes | |
| channel | Yes | ALPHA, BETA, RC, LIVE (store), a custom channel name, or a channel id | |
| dry_run | No | Resolve everything and return the command without uploading | |
| publish | No | Publish immediately instead of uploading as a draft | |
| extra_args | No | Extra ovr-platform-util flags, e.g. ["--age-group","TEENS_AND_ADULTS"] | |
| confirm_live | No | Required (true) to publish directly to LIVE |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the write operation, draft default, LIVE publishing guardrail, dry-run preview, background execution, and polling via returned job_id. This is the key context an agent needs before invoking a mutating async upload.
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: first the action, then draft/publish semantics, then live confirmation, then dry-run, then async polling. Every sentence provides useful operational information.
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 complex ten-parameter mutation with no output schema and no annotations, the description covers the critical async flow and safety gates. It does not mention prerequisites such as authentication or org selection, but those are partially handled by schema fields and sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all ten parameters thoroughly. The description reinforces publish, confirm_live, and dry_run behavior, but it does not add substantial meaning beyond the structured field descriptions; baseline 3 is appropriate.
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: upload an APK or PC build directory to an app's release channel using ovr-platform-util. It also distinguishes the Quest/PC artifact types, making the tool's role immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear operational conditions: draft by default, publish=true to publish, confirm_live=true for LIVE, and dry_run=true to preview. It also names upload_status as the required follow-up, though it does not compare against siblings such as copy_build.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_statusA
Get progress and output of uploads started by upload_build. Omit job_id to list all jobs.
| Name | Required | Description | Default |
|---|---|---|---|
| tail | No | Output lines to return | |
| job_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden; 'Get' implies read-only and 'progress and output' tells the agent what fields come back, which is the key behavioral fact given there is no output schema. It does not cover what happens for an unknown/expired job_id, how long job records persist, or whether output is truncated by tail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with what the tool returns and followed by the one non-obvious usage rule. Nothing redundant.
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, non-destructive polling tool with no output schema, the description covers purpose, the job_id contract, and the nature of the return value. Only edge cases (missing job, expired jobs, partial output) are left unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 50%: tail is documented inline while job_id has no schema description. The description compensates by explaining job_id semantics — its optionality and the list-all behavior when omitted — which is meaning beyond the raw schema.
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 (get) and resource (progress and output of uploads) and anchors it to the sibling that creates those uploads, upload_build. An agent can tell from the description alone that this is a polling/status tool, not a lister of builds or orgs.
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 sentence 'Omit job_id to list all jobs' gives explicit operating guidance for the two modes (single job vs. all jobs). It stops short of naming an alternative tool or exclusion conditions, but there is no obvious sibling competing for this job.
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.
11 tool updates
v0.2.0- First observed
auth_status - First observed
copy_build - First observed
graphql - First observed
list_apps - First observed
list_channels - First observed
list_orgs - First observed
list_test_users - First observed
metavr - First observed
select_org - First observed
upload_build - First observed
upload_status
TDQS
Scored across 11 tools
Core tools target distinct resources and actions (list_orgs vs select_org, upload_build vs upload_status vs copy_build), and the descriptions clearly separate read paths from write paths. The only soft spot is the pair of catch-all escape hatches (graphql, metavr), which can in principle do anything an agent might otherwise pick a dedicated tool for, though they are explicitly flagged as advanced/raw.
The majority of tools follow a clean verb_noun pattern (list_orgs, select_org, list_apps, list_channels, upload_build, upload_status, copy_build). Deviations are minor: auth_status is noun-first and graphql/metavr are bare product names, but all remain immediately readable.
Eleven tools is well within the sweet spot and each one maps to a distinct step in the org -> app -> channel -> build workflow. Nothing feels padded; even the two broad tools exist to cover long-tail needs without bloating the surface.
The surface covers auth, org/app/channel discovery, build upload with draft/publish semantics and async polling, and channel-to-channel copying. Gaps exist around build lifecycle management (deleting builds, editing release notes, app creation, broader user management), but graphql and metavr provide viable workarounds.
Maintenance
Related MCP Connectors
Manage Meta apps: creation, configuration, webhooks, permissions, compliance, and App Review.
- app-managerOAuthapp.lance
App Store Connect operator for AI agents: icons, TestFlight builds, listings, IAP, rejection fixes.
- SkilderOAuthai.skilder
One place to build, share, and govern the skills and tools your AI agents use at work.
AI-agent operations for App Store Connect and Google Play, with approval before live publishing.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to automate Android release workflows via the Google Play Android Publisher API, including deploying builds, managing listings, and replying to reviews.40MIT
- FlicenseBqualityBmaintenanceEnables AI agents to manage Google Play apps with scope-based permissions, including publishing internal releases, updating listings, replying to reviews, and promoting to production.111 npm-
- AlicenseBqualityCmaintenanceGives AI assistants hands-on control over Google Play Console and Google Cloud Console using an authorized Google identity. Exposes 95 tools for shipping app builds and release tracks, managing store listings, reviews, in-app products, GCP projects and IAM, Firebase projects and App Distribution, and Cloud Storage or Artifact Registry resources.95MIT
- AlicenseNot gradedqualityBmaintenanceEnables autonomous AI agents and developers to programmatically manage Google Play apps via the Play Developer API v3, including uploading Android App Bundles, managing release tracks, updating store listings, and replying to user reviews.3MIT