Schemas
ErrorCode
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = string |
ErrorDetails
fieldINVALID_ARGUMENT: the field at fault, as a path (actions[0].y).
INVALID_ARGUMENT, URL_NOT_ALLOWED: what is wrong.
UNAUTHENTICATED: why the credential failed.
neededread: see screens, screenshots and history. control: act on the GUI. exec: run commands, read, write and list files. power: create, start, stop, restart (and, for API keys, delete). Same names as OAuth scopes.
hasacted_sinceSTALE_OBSERVATION: input actions run since your screenshot.
restartedSTALE_OBSERVATION: the screen restarted since your screenshot.
action_indexxyspacescreenshot_sizelimit_bytesscreensQUOTA_EXCEEDED: screens the organization has, running or stopped.
screen_capQUOTA_EXCEEDED: the most screens the organization may have.
snapshotsQUOTA_EXCEEDED on createSnapshot: the screen's snapshots.
snapshot_capQUOTA_EXCEEDED on createSnapshot: the most a screen may keep.
min_usdINVALID_ARGUMENT on a top-up: the smallest allowed now.
max_usdINVALID_ARGUMENT on a top-up: the largest allowed now.
billing_urlpay_urlstops_atbalance_usdErrorBody
Stable machine code. The list can grow: treat an unknown code by its HTTP status.
INVALID_ARGUMENT(400): A field is missing, malformed or out of range (details.field, details.problem). Fix that field and resend.COORDINATE_OUT_OF_RANGE(400): A point lies outside the coordinate space; it is rejected, never clamped. Use a point inside details.space.BATCH_TOO_LONG(400): The batch would run past 28 s, inside the 30 s call limit. Split it into smaller batches.UNAUTHENTICATED(401): The credential is missing, malformed, unknown, revoked or expired (details.reason). Send a valid key or token.QUOTA_EXCEEDED(402): The organization is at its screen cap (details.screen_cap). Delete a screen, or a person asks support for a higher cap.PAYMENT_REQUIRED(402): Payment failed. A person pays at details.pay_url.CREDIT_EXHAUSTED(402): The usage credit that pays for disposable screens is used up (details.balance_usd). A person tops up at details.billing_url, or create a persistent screen.SUBSCRIPTION_REQUIRED(402): Buying usage credit needs a paid persistent screen first. A person subscribes at details.billing_url.PERMISSION_DENIED(403): The credential lacks details.needed, or is not bound to this screen. Use a credential that has it.HUMAN_ONLY(403): Only a signed-in person (dashboard cookie) may call this. Ask a person to do it in the dashboard.CSRF_REJECTED(403): A cookie request changed state without the dashboard's Origin. Send it from the dashboard, or use an API key.ORGANIZATION_SUSPENDED(403): The organization is suspended. Stop and tell the user.ACCOUNT_PENDING(403): The account is waiting for approval. Stop and tell the user.SCREEN_NOT_FOUND(404): No such screen in your organization (the same answer for another organization's id). List screens for a valid id.NOT_FOUND(404): No such operation, exec, key, app, export, template, snapshot or saved screenshot (saved ones go after 30 days). Check the id.FILE_NOT_FOUND(404): Nothing at that path on the screen. List the folder with listFiles.NO_CAPACITY(409): No free machine for a new screen right now; nothing was charged. Retry after retry_after.STALE_OBSERVATION(409): Input ran (anyone's, a person's in the live view included) or the screen restarted since your screenshot (details.acted_since, details.restarted). Take a new screenshot first.CONTROL_HELD(409): A person has control of this screen, so nothing ran. Control ends when they release it, or after 5 minutes with no input from them. Wait retry_after seconds, then take a new screenshot before acting.SCREEN_NOT_RUNNING(409): The screen is stopped, starting or stopping. Start it, or wait on its operation.OPERATION_IN_PROGRESS(409): Another power operation runs on this screen. Wait on it, then retry.IDEMPOTENCY_KEY_IN_USE(409): A request with this key is still running. Retry the same request.UNSUPPORTED_CAPABILITY(409): This screen cannot do that (for example a screenless box). Use a screen that can.PAYLOAD_TOO_LARGE(413): The body or file is over details.limit_bytes. Send less, or move big files through exec.UNSUPPORTED_MEDIA_TYPE(415): Wrong Content-Type. Send application/json (application/octet-stream for file uploads).IDEMPOTENCY_KEY_REUSED(422): This key was used with a different body. Use a new key.SECRET_BLOCKED(422): The input contains one of our API keys; nothing was typed or run. Remove the key and resend.URL_NOT_ALLOWED(422): The URL is not public HTTPS: it resolves to a private or reserved address, or redirects. Use a public HTTPS URL.RATE_LIMITED(429): Too many requests. Wait retry_after seconds.INTERNAL(500): Our bug. Retry with the same Idempotency-Key.SCREEN_UNAVAILABLE(503): The screen's host or desktop is not answering. Retry after retry_after.OUTCOME_UNKNOWN(504): The work may or may not have happened. Look before acting; never resend blindly.
messageOne sentence for people and agents, ending with the fix. Do not parse it.
request_id^req_[0-9a-z]{20}$ · requiredQuote it in support requests.
retryableTrue when the same request may succeed later. The SDK retries only these, never 504.
not_applied: nothing changed, so the reply is never stored for the Idempotency-Key. unknown: look before acting.
docs_urlCode-specific facts. Every key is optional and new keys may appear (U6).
Error
The same shape for every error on every route.
Permission
read: see screens, screenshots and history. control: act on the GUI. exec: run commands, read, write and list files. power: create, start, stop, restart (and, for API keys, delete). Same names as OAuth scopes.
Coordinate
Pixels in the request's coordinate space, origin top left.
Point
[x, y] in the coordinate space.
Space
[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
Region
[x0, y0, x1, y1], top-left and bottom-right corners, in the coordinate space.
Size
widthheightImageFormat
png by default (lossless, sharp text, no ICC chunk). webp at quality 80 is what the hosted MCP server sends, because it is smaller. jpeg is not recommended for UI text.
ShotSize
^([0-9]{2,4}x[0-9]{2…WIDTHxHEIGHT with the desktop's aspect ratio, or full (desktop size).
MaxBytes
Cap on the encoded image. webp and jpeg step quality 80, 70, 60, 50, then shrink; png only shrinks. The reply says the quality and size used. The hosted MCP sends 105000.
MaxUpscale
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = number |
ScreenState
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = string |
Health
Resources
vcpumemory_mbdisk_gbControlState
heldA person has control. Calls that look at or act on the screen get 409 CONTROL_HELD.
StateReason
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = string |
ScreenColor
The colour of the screen's cube, shown beside its name in the dashboard. Only for people telling screens apart; nothing else reads it. A new screen is green unless its create says otherwise.
ScreenKind
persistent: on the monthly subscription, one price per screen, running or stopped; kept until deleted, and a delete can be undone for 7 days. disposable: paid from usage credit for the time it runs, charged per billing step as each step starts; it can carry an end time, is deleted 7 days after it stops unless started again, and a delete is final.
ScreenSpend
running_sSeconds it has run as a disposable screen.
charged_usdCredit charged for it so far, the step now running included.
sinceWhen it became disposable (created or switched).
Screen
id^scr_[0-9a-z]{20}$ · requiredname^[a-z0-9][a-z0-9-]{0… · requiredkindpersistent: on the monthly subscription, one price per screen, running or stopped; kept until deleted, and a delete can be undone for 7 days. disposable: paid from usage credit for the time it runs, charged per billing step as each step starts; it can carry an end time, is deleted 7 days after it stops unless started again, and a delete is final.
The cube's colour (ScreenColor). New colours may appear: show an unknown one as green.
Your own key-value tags. Filter lists with label=key:value.
Power state. failed carries a state_reason. New values may appear.
imageThe image it was created from. One desktop image at launch.
sizeThe size it was sold as (standard, the one size at launch); resources says what it has.
One size at launch. Resize comes later.
regionEach capability on its own: a running VM can have a broken display. Host unreachable means unknown.
Whether a person has control of the screen.
incarnationGoes up when the machine restarts. Old screenshots and exec ids stop applying.
created_atupdated_atviewersLive views open on the screen right now, at most 3.
ScreenCreate
name^[a-z0-9][a-z0-9-]{0…Unique in the organization. Default: generated.
colorThe colour of the screen's cube, shown beside its name in the dashboard. Only for people telling screens apart; nothing else reads it. A new screen is green unless its create says otherwise.
Your own key-value tags. Filter lists with label=key:value.
kindpersistent: on the monthly subscription, one price per screen, running or stopped; kept until deleted, and a delete can be undone for 7 days. disposable: paid from usage credit for the time it runs, charged per billing step as each step starts; it can carry an end time, is deleted 7 days after it stops unless started again, and a delete is final.
template_id^tpl_[0-9a-z]{20}$Start from this template. Default: blank.
size^[a-z0-9-]{1,20}$Default: standard, the one size at launch. A size not sold in the screen's kind: INVALID_ARGUMENT.
ends_in_sDisposable only: delete it this many seconds after it is created. Default: no end time.
ScreenUpdate
name^[a-z0-9][a-z0-9-]{0…colorThe colour of the screen's cube, shown beside its name in the dashboard. Only for people telling screens apart; nothing else reads it. A new screen is green unless its create says otherwise.
Your own key-value tags. Filter lists with label=key:value.
ScreenList
OperationKind
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = string | |
| type = string |
ScreenConvert
kindpersistent: on the monthly subscription, one price per screen, running or stopped; kept until deleted, and a delete can be undone for 7 days. disposable: paid from usage credit for the time it runs, charged per billing step as each step starts; it can carry an end time, is deleted 7 days after it stops unless started again, and a delete is final.
Template
id^tpl_[0-9a-z]{20}$ · requiredname^[a-z0-9][a-z0-9-]{0… · requiredsaving: being made from its screen.
One size at launch. Resize comes later.
with_memorytrue: a screen started from it comes back with the open windows it was saved with. false: it boots from the saved disk.
screens_startedScreens started from it so far.
created_atTemplateList
TemplateCreate
screen_id^scr_[0-9a-z]{20}$ · requiredname^[a-z0-9][a-z0-9-]{0… · requiredUnique among the organization's templates.
Snapshot
id^snap_[0-9a-z]{20}$ · requiredscreen_id^scr_[0-9a-z]{20}$ · requiredcreating: being taken.
created_atSnapshotList
Operation
id^op_[0-9a-z]{20}$ · requiredreconciling: the outcome is uncertain and we are checking the host. Not a failure; do not retry.
screen_id^scr_[0-9a-z]{20}$ · requiredcreated_atupdated_atOperationList
Screenshot
screenshot_id^shot_[0-9a-z]{20}$ · requiredNames one capture. Pass it to runActions (and to getScreenshot with region) so coordinates use its size and stale views are refused.
widthheightscreen_widthscreen_heightcaptured_atinput_seqInput actions run on this screen before the capture. runActions with this screenshot_id refuses to run if it has moved on.
size_bytesEncoded image size before base64.
dataThe image, base64. A copy is saved in the screen's history unless detailed history is off.
With windows=true: the open windows, topmost first, in this screenshot's pixels (a region's: the full screenshot's). Normal windows and dialogs only; at most 50.
WindowRef
titleThe window's title, clipped to 200 characters. Read off the screen: history keeps the screenshot, never this text.
appThe app, from the window's class (for example chromium, org.gnome.TextEditor).
WindowInfo
titleThe window's title, clipped to 200 characters. Read off the screen: history keeps the screenshot, never this text.
appThe app, from the window's class (for example chromium, org.gnome.TextEditor).
xywidthheightactivetrue for the window with the keyboard focus.
ScreenshotOptions
size^([0-9]{2,4}x[0-9]{2…WIDTHxHEIGHT with the desktop's aspect ratio, or full (desktop size).
formatpng by default (lossless, sharp text, no ICC chunk). webp at quality 80 is what the hosted MCP server sends, because it is smaller. jpeg is not recommended for UI text.
qualitywebp and jpeg only.
max_bytesCap on the encoded image. webp and jpeg step quality 80, 70, 60, 50, then shrink; png only shrinks. The reply says the quality and size used. The hosted MCP sends 105000.
cursorDraw the pointer.
settle_quiet_msWait until nothing changed for this long (pointer and caret-sized changes ignored).
settle_max_msThen capture anyway.
ActionClick
typexPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
buttoncountmodifiersKeys held during the action.
ActionMove
typexPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
ActionMouseDown
typexPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
buttonActionMouseUp
typexPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
buttonActionDrag
typepathbuttonmodifiersKeys held during the action.
ActionScroll
typexPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
dxdyunitmodifiersKeys held during the action.
ActionType
typetextenterdelay_msviakeys: keystrokes, up to 1,000 characters. paste: put the text on the clipboard and paste it (ctrl+v, or ctrl+shift+v in a terminal), up to 100,000 characters, for long text and characters the keyboard lacks. It leaves the text on the clipboard.
ActionKey
typekeys^[A-Za-z0-9_+ -]{1,1… · requiredA key or +-joined chord: enter, ctrl+s, alt+tab. xdotool names (Return), OpenAI's upper-case names and Playwright names are accepted as aliases.
repeathold_msActionKeyDown
typekeys^[A-Za-z0-9_+ -]{1,1… · requiredA key or +-joined chord: enter, ctrl+s, alt+tab. xdotool names (Return), OpenAI's upper-case names and Playwright names are accepted as aliases.
ActionKeyUp
typekeys^[A-Za-z0-9_+ -]{1,1… · requiredA key or +-joined chord: enter, ctrl+s, alt+tab. xdotool names (Return), OpenAI's upper-case names and Playwright names are accepted as aliases.
ActionWait
typemsActionSettle
typequiet_msmax_msActionCursorPosition
typeActionScreenshot
typesize^([0-9]{2,4}x[0-9]{2…WIDTHxHEIGHT with the desktop's aspect ratio, or full (desktop size).
formatpng by default (lossless, sharp text, no ICC chunk). webp at quality 80 is what the hosted MCP server sends, because it is smaller. jpeg is not recommended for UI text.
qualitymax_bytesCap on the encoded image. webp and jpeg step quality 80, 70, 60, 50, then shrink; png only shrinks. The reply says the quality and size used. The hosted MCP sends 105000.
cursorActionZoom
typeregion[x0, y0, x1, y1], top-left and bottom-right corners, in the coordinate space.
formatpng by default (lossless, sharp text, no ICC chunk). webp at quality 80 is what the hosted MCP server sends, because it is smaller. jpeg is not recommended for UI text.
qualitymax_bytesCap on the encoded image. webp and jpeg step quality 80, 70, 60, 50, then shrink; png only shrinks. The reply says the quality and size used. The hosted MCP sends 105000.
Zoom only. fit (default): scale the region to the usual shot size, as Anthropic does. A number caps the upscale (2 = at most twice the desktop pixels), which costs fewer image tokens.
Action
Decision Table
| Variant | Matching Criteria |
|---|---|
| type = object · type="click" | |
| type = object · type="move" · requires: x, y | |
| type = object · type="mouse_down" | |
| type = object · type="mouse_up" | |
| type = object · type="drag" · requires: path | |
| type = object · type="scroll" | |
| type = object · type="type" · requires: text | |
| type = object · type="key" · requires: keys | |
| type = object · type="key_down" · requires: keys | |
| type = object · type="key_up" · requires: keys | |
| type = object · type="wait" · requires: ms | |
| type = object · type="settle" | |
| type = object · type="cursor_position" | |
| type = object · type="screenshot" | |
| type = object · type="zoom" · requires: region |
typexPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
buttoncountmodifiersKeys held during the action.
ActionsRequest
Run in order, 100 ms apart. Stops at the first failure; the rest are not_executed. The whole batch must fit in 28 s.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
screenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
ActionResult
indextypeduration_msThe same shape for every error on every route.
cursor[x, y] in the coordinate space.
typed_charsscreen_changedInput actions only: whether anything visible changed after it (pointer and caret-sized changes ignored), watched until the next action, or up to 500 ms after the last one. false means no visible change, not failure: look again before repeating it.
Input actions only: the topmost window under the point for a pointer action, else the active window that got the keys.
ActionsResponse
partial: an action failed; see results. The after-screenshot is still attached.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
screenshot_unchangedif_changed found no visible change.
The window with the keyboard focus after the batch. Left out when there is none.
Windows that opened during the batch, newest first. Left out when none did.
ExecCreate
commandShell command, run with bash -lc as the desktop user. Send this or argv.
argvProgram and arguments, no shell. Send this or command.
cwdstdinWritten to stdin, then closed.
timeout_s0: no limit (dev servers, bots). At the limit we send TERM, then KILL after 10 s; status timed_out. Runs on after the call returns.
wait_sAnswer inline if done within this; else 202 and an id to poll.
max_bytesBytes of output per stream in this reply.
tailtrue: the last max_bytes after the offset (errors and exit lines). false: the first.
Exec
id^ex_[0-9a-z]{20}$ · requiredscreen_id^scr_[0-9a-z]{20}$ · requiredlost: the screen restarted mid-run; the exit status is unknown. Never rerun blindly.
started_atstdoutOutput from stdout_from, up to max_bytes (head or tail). UTF-8, invalid bytes replaced.
stderrstdout_bytesTotal bytes written so far. Use as the next stdout_from.
stderr_bytesincarnationoutput_droppedOlder output fell out of the 1 MiB per-stream buffer.
FileWritten
pathsize_bytessha256^[0-9a-f]{64}$ · requiredFileEntry
namesize_bytesmodified_atClipboard
textThe clipboard's text; empty when it holds none or holds no text.
truncatedtrue when the clipboard held more than 100,000 characters and only the first came back.
ClipboardSet
textText to put on the clipboard; empty clears it.
FileList
ViewerCreate
modeinteractive needs a person (cookie). Agents get view links.
Viewer
urlOpen within 60 s. Single use. The ticket rides in the URL fragment.
expires_atsession_expires_atActor
HistoryEntry
id^evt_[0-9a-z]{20}$ · requiredatkindcall for a call on the screen; otherwise an event such as screen.created, screen.deleted, key.created, key.revoked, app.connected, secret.set, proxy.set, control.taken or control.released. New kinds may appear.
Who made the call: an API key, a connected app, a signed-in person, or Kubi itself.
summaryFor example click (450, 280); type 15 chars; key enter.
resultok or an error code.
screenshot_savedtrue when getSavedScreenshot returns the image. false when detailed history is off or the upload failed.
HistoryList
Me
Secret
nameupdated_atSecretList
ClickRequest
xPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
buttoncountmodifiersKeys held during the action.
screenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
TypeRequest
textenterdelay_msviakeys: keystrokes, up to 1,000 characters. paste: put the text on the clipboard and paste it (ctrl+v, or ctrl+shift+v in a terminal), up to 100,000 characters, for long text and characters the keyboard lacks. It leaves the text on the clipboard.
screenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
PressRequest
keys^[A-Za-z0-9_+ -]{1,1… · requiredA key or +-joined chord: enter, ctrl+s, alt+tab. xdotool names (Return), OpenAI's upper-case names and Playwright names are accepted as aliases.
repeathold_msscreenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
ScrollRequest
xPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
dxdyunitmodifiersKeys held during the action.
screenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
DragRequest
pathbuttonmodifiersKeys held during the action.
screenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.
MoveRequest
xPixels in the request's coordinate space, origin top left.
yPixels in the request's coordinate space, origin top left.
screenshot_id^shot_[0-9a-z]{20}$Optional precondition and coordinate default: the screenshot you acted on. If any input ran after it (a person's in the live view included) or the screen restarted, nothing runs: 409 STALE_OBSERVATION. The hosted MCP always sends it.
screenshotafter: attach the screen after the last action that ran, once it settles. if_changed: only if it changed visibly since screenshot_id (else screenshot_unchanged: true). none: no image. The hosted MCP sends after.
How the after-shot is taken.
space[width, height] that coordinates are expressed in. Default: the size of the screenshot named by screenshot_id, else [1280, 720] (the default screenshot). Both sent and different: 400 INVALID_ARGUMENT with both sizes in details. Gemini sends [1000, 1000]. Each axis is scaled to the desktop separately.