bots.st/shipvo
Shipvo
Simulate a phone and automate UI actions
2379 ms
answered our call
- State
- Answered
- Protocol
- MCP 2025-06-18
- Tools listed
- 64
- Answered
- 3 of the last 3 calls
How to reach it
- MCP, HTTP
https://sim.shipvo.dev/mcpNeeds header Authorization - npm
npx -y @shipvo/mcpReleased 7 Nov 2026, version 0.0.11
What it can do
| Tool | What it says it does |
|---|---|
apply_update | Apply the ready release: the app restarts on the new bundle, like restart. After 3 boots that throw, the phone goes back to the old release and the state is reverted with reason crash_loop. Fails with not_ready unless the state is ready. Simulated; logged in device_log. |
approval_approve | Approve a held promote so it goes live. The proposer cannot approve it, and an agent cannot approve an agent's proposal: that is refused with rule self_approval. Ask the owner to approve in that case. Both outcomes are audited. |
approvals_list | List what waits for an owner. approvals: promotes held above the app's policy band (hold id, release, band, proposer, age). challenges: owner commands waiting for the owner to approve in the admin (id, command, plan, expiry, approval_url). Agents cannot approve either. Needs an owner token. |
attach_session | Attach to the phone of a live `shipvo run` in this project (read from .shipvo/run.json) and return its screen. The person sees every action in their browser. Same as open_app with attach: 'always', without needing the app id. |
audit_log | Read the app's release audit log, newest first: who (actor) did what (action) to which release (subject) and when (at). Read-only. Needs an owner token. |
back | Go back one screen. The result starts with 'Change: none | content changed | new screen | scrolled'. |
browser_back | Go back one page in the phone browser. Returns the snapshot. |
browser_click | Click an element of the phone browser's page by ref from browser_snapshot. Returns the new snapshot. |
browser_close_tab | Close a tab of the phone browser by its index from browser_tabs. Returns the remaining tabs. |
browser_open | Open a web page in the phone's Chromium (separate from the app) and return its snapshot. Private hosts (localhost, 127.x, 10.x, 192.168.x, 169.254.x, CGNAT, .local, .internal) are refused with host_not_allowed unless you opt in. |
browser_screenshot | A PNG of the phone browser's page. |
browser_scroll | Scroll the phone browser's page by dy CSS pixels (positive is down) and dx (positive is right). Returns the snapshot. |
browser_snapshot | The phone browser's page as an accessibility tree with refs, marked source "web" (untrusted). |
browser_tabs | List the phone browser's tabs (index, url, title, which is active). Titles are untrusted web content. |
browser_type | Type into a field of the phone browser's page by ref (replaces its content). Returns the new snapshot. |
browser_wait_for | Wait until text appears in the phone browser's page, or is gone (gone: true). Fails with code timeout. Returns the snapshot. |
check_for_update | Ask the update source for a newer release: checks its signature and hash and downloads it. Ends in ready, or idle with reason verify_failed or download_failed (the release is never applied). Fails with no_update when nothing newer exists or no source is set. Simulated; each state change is logged… |
close_panels | Close the notification shade, Notification Center or Control Center (swipe up). |
device_log | What the app did with the device in this session: permission prompts and answers, location reads, scans, fingerprint checks, payments, notifications, shares. |
device_reset | Put the simulated phone back to a known state (permissions undetermined, default location, nothing in front of the camera, log cleared), optionally with a new profile. |
dismiss_notification | Swipe a notification away in the open shade (newest if no id), or Clear all with all: true. |
end_session | Close the session and get a report: steps taken, and the orders the app sent to its backend during the session. |
export_test | Turn the steps taken in this session (tap, type, scroll, back, set_device) into a @shipvo/test script and return its source. Read-only. Targets are named by their visible text; ambiguous ones become TODO comments and password fields use an environment variable instead of the typed value. |
get_settings | Read the phone's system settings from the Settings screen: dark_mode, font_size (small, default, large, largest), bold_text, reduce_motion, language (en, fr, ar) and rtl. Returns each setting and the screen as rows. |
get_update_state | The phone's OTA update state: idle, checking, downloading, ready, applied or reverted, the running release, the held release, and the last reason (verify_failed, download_failed or crash_loop). Simulated and logged in device_log. |
install_app | Install a Store app on the phone, as tapping Install in the Store screen does. The app icon appears on the home screen. Fails with unknown_app (not in the Store) or already_installed. If the marketplace is unreachable the phone's own Store list is used. Logged in device_log as simulated: nothing… |
kill_app | Swipe the app's card away in the app switcher (call open_recents first). The app is killed: the next resume_app is a cold start, with storage kept. Fails with recents_not_open otherwise. |
list_apps | Apps this server can open, with what each one does. Optional query filters by name, description or category (e.g. 'shop', 'douala'). |
list_installed_apps | List the apps installed on the person's persistent phone, the same in every chat and assistant. Needs PN_ASSISTANT_TOKEN. |
list_sessions | Open simulator sessions (phones) on this server: id, app, platform, room, who opened it (the MCP client name), start time and current screen title. Use to resume after a reconnect or to see who shares a room. |
list_store_apps | List the apps in the phone's Store: the marketplace apps from the control plane, each with id, name, bundle url and version. Fails with store_unreachable when the marketplace cannot be reached (nothing is guessed). Install one with install_app. |
lock | Press the power button: the simulated phone locks and shows the lock screen. The app and its screen are kept. While locked, tap, type, scroll and back fail with phone_locked. Logged in device_log as simulated. |
notifications | The notification shade: notifications delivered to the simulated phone in this session (their banners vanish after 5 s, like a heads-up on a real phone). |
open_app | Opens the phone in the user's browser so they can watch. Opens an app in a phone-sized session and returns its first screen. With no live `shipvo run` for the project, it starts one (pick platform: 'android' or 'ios') when the project has `shipvo` installed, or when show is true, and only from a… |
open_control_center | iPhone only: swipe down from the top right to open Control Center (airplane, Wi-Fi, mobile data, focus, orientation lock, brightness, dark mode). Android fails with no_control_center: use open_notifications. |
open_notification | Tap a notification from the shade (newest if no id is given): the app handles it exactly as if its banner was tapped. |
open_notifications | Pull down from the top. Android: the first call opens the notification shade (a few quick-settings tiles and the notifications); a second call expands all tiles. iPhone: opens Notification Center (grouped by app). Returns the tiles and notifications. |
open_recents | Open the app switcher: the app goes to the background and its card is shown. resume_app opens the card again; kill_app swipes it away. |
open_url | Open a deep link (such as myapp://item/3) in the running app, as a push tap, auth callback or share link would. Fails with invalid_url if the text has no scheme, or no_handler if apps declare URL schemes and none matches; a match returns the owning app id. Otherwise fails with no_url_listener if… |
owner_command | Run an owner command against the live app (changes are audited). Commands that cannot be undone or reach users (publish, prices, offers, deletes, API keys) do nothing and return { code: "needs_confirm", plan } first: show the plan to the owner, then ask the owner to approve the returned challenge… |
owner_describe | List the owner commands of an app (content, prices, offers, orders, publish). Needs PN_OWNER_TOKEN. |
press_home | Press Home: the app goes to the background (it receives AppState "background") and the phone shows the home screen with the app icon. While there, tap, type, scroll and back fail with app_not_foreground. Call resume_app to bring the app back (AppState "active"). Logged as simulated. |
publish_preview | Build the app in PN_APP_DIR (or the current folder) with the simulated device and publish a shareable web preview to here.now, no account. The link is PUBLIC and expires in 24 hours; claimUrl keeps it. Returns { url, claimUrl, expiresAt }. Needs @shipvo/cli (npx). |
push_notification | Deliver a push notification to the simulated phone; it appears as a banner the agent can tap. The app receives it only if notification permission is granted; otherwise nothing is delivered. |
record_marker | Add a chapter at the current time of the running recording. |
record_start | Start recording the phone frame to an MP4 under .shipvo/recordings/. Use record_marker for chapters and record_stop to finish. |
record_stop | Stop the recording and write the MP4. Returns the file, duration in seconds, size and chapters. With music: true, mixes a ducked music bed under the video and writes a credits JSON next to it (credit the track where you publish). |
request_app_install | Ask to add an app to the person's own persistent phone (not the simulator). Returns a consent card: app name, publisher, the permissions it asks for, and approve_url and decline_url. Show the card to the person and tell them to open a link themselves: you cannot approve, and nothing is installed… |
request_secret | Ask the person for an API key without it passing through this chat. Returns a one-time link to the Shipvo vault page (valid 10 minutes, works once) and a notice to show the person. The key goes straight into the vault: you never see it. Tell the person to open the link, then call secret_status to… |
restart | Restart the simulated phone from the power menu: a boot screen, then the app starts fresh (cold start). Storage is kept. Returns the first screen. Logged in device_log as simulated. |
resume_app | Tap the app icon on the home screen, or its card in the app switcher: the app comes back (AppState "active") with its screen kept. Fails with app_in_foreground if it is already in front. |
screen | The current screen as an accessibility tree with refs. |
screenshot | A PNG of the phone screen (for checking layout, colours, images). The result says `source`: tab-capture (the person's live tab), rendered (the page drawn to an image; it lists what it could not draw) or headless. The tree from `screen` is usually enough to act. |
scroll | Scroll the page (down/up) or a horizontal rail (right/left, give the rail's ref). Returns the new screen. The result starts with 'Change: none | content changed | new screen | scrolled'. |
secret_status | Whether a key is saved in the vault, as { saved, valid, access }. Never returns the key. valid is null when it was not checked. Needs an owner token. |
set_device | Change what the simulated phone has: location, the address book (contacts), calendar events, files for the file picker, a barcode in front of the camera, permission states, whether the fingerprint will match, whether a payment will be approved, network on/off. Takes effect for the next action. |
set_setting | Change one system setting, as a person would in the phone's Settings screen. The app sees it through Appearance (dark_mode), PixelRatio.getFontScale (font_size), AccessibilityInfo (bold_text, reduce_motion), I18nManager (rtl) and Intl (language). Setting language to ar turns rtl on; en and fr turn… |
switch_app | Open an installed app (tap its icon on the home screen): it becomes current_app and comes to the front. Fails with not_installed. Logged in device_log as simulated. |
tap | Tap a button, link or choice by ref. Returns the new screen. The result starts with 'Change: none | content changed | new screen | scrolled'. Work that starts on a tap (paying, saving, loading) can finish after this returns, so the screen may show 'Paying...' or a spinner. Do not report that as… |
toggle_tile | Flip a quick-settings tile in the open shade or Control Center. It changes the simulated device like set_device: Wi-Fi and mobile data both off take the network offline, dark_mode changes the app's colour scheme, dnd stops banners. Tiles: wifi, mobile_data, airplane, location, dark_mode, dnd… |
And 4 more tools.
In its maker's words
Open a React Native app in a simulated phone: read the screen, tap, type, set device state.
- Website
- shipvo.dev
- Source
- github.com/shipvo/shipvo
- Publisher
- shipvo
- Listed from
- the official MCP Registry as
io.github.shipvo/shipvo - Version
- 0.0.6, updated 31 Oct 2026
- Kinds of work
- Browser and automation, Images, video and audio, Devices and the physical world
The domain it lives on
- shipvo.dev
- registered 31 Oct 2026 (1 months ago), at Cloudflare, Inc., its home page is a working site
From our own crawl of domain names: registry records and the home page as our crawler last saw it.
Every call we made
| When | What happened | Time |
|---|---|---|
| Answered | 2379 ms | |
| Answered | 2283 ms | |
| Answered | 1119 ms |
Next door
- Bowmark web data: LinkedIn, Amazon, YouTube, Reddit, Airbnb, InstagramScrape and automate logged-in web data
- SkyelightPin feedback to rendered elements with code
- TapAutomate and validate logged-in browser tasks
- String Web AccessFetch URLs, crawl sites, search web, return clean Markdown
- BanquishBuild workspace tiles from live web pages
Is this your bot? Claim its address to add a verified badge and keep the listing current.