Skip to main content
Glama
649,985 tools. Updated 2026-10-12 01:22

"iOS" matching MCP tools:

  • Public (no auth): informational pricing reference. Returns monthly SaaS subscriptions (Basic $15 / Professional $30 / Enterprise $70 per month, which INCLUDE 300 / 1,000 / 3,500 trips per month; trips above that quota are billed at $0.05 / $0.03 / $0.02 each — the monthly price is a floor, never quote it alone to an operator who has volume) and one-time app-build packages (Starter $399 Android-only, Pro $699 Android+iOS, Full $999 Android+iOS+source code). All plans include unlimited drivers / users / admins; Cabgo never takes a commission on the fare (the per-trip overage above is a quota charge, not a commission). **Informational only.** Do not generate or return a payment URL from this tool. When the operator wants to purchase, direct them to visit https://www.cabgo.app/empezar in their browser — all checkout happens on cabgo.app externally via Stripe, not inside this conversation.
    ConnectorNo auth
  • Set the files on a file-upload input (<input type="file">) in Safari on an iOS device, WITHOUT opening the device's file picker. This is the only way to test an upload flow end to end on iOS: tapping an upload control opens a native sheet that automation cannot drive. Provide file content inline, or name a file already on the device (see ios_file_push / ios_upload_targets) to have it read from there. Fires the input and change events afterwards so framework bindings and validation run, then reads the input back and reports the file names and sizes the PAGE actually sees — so a silent no-op can't pass as success. Total content limit 2 MB.
    ConnectorOAuth
  • Fill SEVERAL fields of a form in one call on the device browser — the batch form of webpage_type, and the counterpart to Playwright MCP's browser_fill_form. Works on BOTH iOS Safari and Android Chrome. Fields are filled IN ORDER inside a single browser session, which is what makes this different from calling webpage_type N times: order-dependent forms (a country select that repopulates the state list, an autocomplete that rewrites the next field) behave the way they do for a real person, and you pay one round trip instead of N. Each field takes the same target shape as webpage_type — a CSS `selector` or a `ref` from webpage_snapshot — plus `text`, and an optional per-field `clear`. On iOS each field is typed on the DEVICE keyboard so the page receives real trusted keystrokes; where that is unavailable it falls back to setting .value via the native setter and dispatching bubbling input/change (isTrusted:false), reporting `via` and `fallbackReason` PER FIELD so a degraded field is never hidden by its neighbours succeeding. `exact:false` on a field means the keystrokes landed but the component rewrote the value as you typed (masks, autocompletes) — that is a success, not a failure. Stops at the first failure by default, because a form is usually order-dependent and filling past a field that did not take produces a state no one asked for; pass continueOnError:true to attempt every field anyway, which is what you want when diagnosing WHICH selectors are stale. This does NOT submit the form — follow it with webpage_press_key("Enter") or webpage_click on the submit control. ONE CROSS-PLATFORM TRAP, measured on device: `change` fires differently. Android dispatches `change` on every field. iOS fires it only on a real BLUR, and the LAST field still holds focus when this returns — so its `change` has NOT fired, and a form that validates on `change` will not have seen the final field. Follow with webpage_press_key("Tab") or a click elsewhere if that matters. Also on iOS, a field filled with `clear:true` emits one isTrusted:false `input` carrying the empty value (the wipe) before the trusted keystrokes.
    ConnectorOAuth
  • Send a raw DevTools-protocol command to the browser page on a device and return its reply — the escape hatch for capabilities no dedicated tool wraps yet (Emulation, Performance, CSS, Animation, DOM mutation, …). Works on BOTH iOS Safari and Android Chrome, auto-detected from the udid. `method` is "Domain.command" (e.g. "Emulation.setGeolocationOverride"); `params` is that command's parameter object. Scope is the BROWSER — this reaches web content only, never the device or native apps. Prefer a dedicated tool when one exists: they handle setup ordering, lifecycle and teardown that a bare command does not. IMPORTANT, iOS: the two engines do NOT implement the same protocol — Android is full CDP, iOS is WebKit's dialect. Chrome-only domains fail with -32601 "domain was not found" (Accessibility, Emulation, and Page.captureScreenshot are all absent on iOS), and a `*.enable` on iOS reports success without proving the domain exists, so never treat it as a capability probe — probe with a real method.
    Connector
    Destructive
    OAuth
  • Change the iOS device's system language and / or locale (persistent, affects every app). iOS may relaunch SpringBoard to apply the change — expect a 5-10s flicker, and the value can take a few seconds to read back. Pass a BASE language code ("fr", not "fr-CA"): iOS reports a region-qualified language but refuses to set one, so a regional code is split into its base language plus a locale automatically. For per-app testing without changing the whole device, prefer ios_launch_app_in_language.
    ConnectorOAuth
  • Update project settings (current values appear at the top of list_files). Keys: title (2-100 chars), description, iconUrl (the app's icon/logo: favicon, home-screen icon and native app icon — a /_cdn/static/… path from upload_asset, generate_image or request_user_upload, or an absolute https URL; null resets), splashUrl (native splash screen, same value forms), mobileAppId, enableSSR (boolean), flootAiDisallowed (boolean — true opts the project out of @floot/ai), and iOS Info.plist purpose strings (NS…UsageDescription — set to a string, or null to remove) plus boolean Info.plist keys (UIViewControllerBasedStatusBarAppearance — set to a boolean, or null to restore the template default). Invalid keys/values are reported and skipped. NOTE: these take effect on the published app only after the next publish (publish_app, or the user's Publish button). The iosInfoPlist keys only affect builds made before the first iOS publish; after the iOS app is published, edit the project file `static/__dev/native/ios-info.plist` directly with write_file/edit_file (see get_guides('ios-info-plist')). Likewise, after the first Android publish, edit `static/__dev/native/android-manifest.xml` directly for manifest changes (see get_guides('android-manifest')). `shareTarget` makes the native app appear in the iOS and Android share sheets (other apps can share photos/videos/files/text into it): pass { enabled: true, mimeTypes?, allowMultiple? } to register, { enabled: false } to remove; receiving the shared items still needs the handler in app code — read get_guides('share-target') first and ship both together. `nativeSystemBars` controls how the native app treats the status bar / Android navigation bar: mode 'inset' (default) keeps the app below the bars and paints the exposed strips `color` (default black — set it to the app's header color for a seamless look); mode 'edge-to-edge' runs the app under the bars, which REQUIRES the app to pad by var(--safe-area-inset-top/bottom) itself — read get_guides('native-system-bars') first and ship both changes together. Not superseded by the __dev/native files. `serverMemoryMb` sets the memory (MB) of the project's server Lambda, which runs every endpoint, queued task, scheduled job and SSR render (default 1024 MB; 2048 for the published app when SSR is on — the dev backend never bumps). EXPERT SETTING — NEVER change it on your own initiative or as a side effect of another request, only when the user explicitly asks to change the server memory AND understands the trade-off: too low and the backend stops working entirely (killed out-of-memory); Lambda CPU scales with memory, so a lower value also makes every request slower and — because compute is billed per GB-second of billed duration — can cost MORE, not less; a higher value costs more per millisecond. Allowed range 512–4096 MB, whole MB (if a size turns out not to be available for the app's server, the deploy fails and the error names this setting). It applies to the dev backend at the next backend deploy and to the published app at the next publish. Pass null to restore the default. Read get_guides('server-memory') before changing it. `analyticsMode` controls the built-in visitor analytics tracker every published app includes (the project's Analytics tab): 'storage' (default) keeps a 30-minute session id in the visitor's localStorage, which is device storage that needs consent under EU ePrivacy / UK PECR — an app with EU/UK visitors pairs it with a consent banner that calls window.flootAnalytics.setMode(); 'memory' keeps the id in memory only (nothing stored on the device, no consent needed, but a reload or new tab counts as a new session); 'off' sends no analytics at all. Only change it when the user asks about analytics, cookies, consent or privacy for their published app; it takes effect at the next publish. Read get_guides('analytics') for the consent-banner API before changing it. `iosDeviceFamily` picks the devices the native iOS app is built for: 'iphone-and-ipad' (default, universal) or 'iphone' (iPhone only — the app still installs on iPads but runs there in iPhone compatibility mode, and App Store Connect no longer asks for iPad screenshots). This is the ONLY way to make the app iPhone-only: it is an Xcode build setting, so a UIDeviceFamily key in static/__dev/native/ios-info.plist is overwritten at build and does nothing. One-way door: App Store Connect rejects an update that drops iPad once a version supporting iPad has been released on the App Store, and the build then fails at upload. Before setting 'iphone', ask the user whether the app is already live on the App Store; if it is, tell them it cannot be made iPhone-only and do not set it. Takes effect at the next iOS publish. `securityHeaders` sets the published app's own page headers: `embedding` (who may show the app in an iframe: 'anyone' (default), 'self', 'none', or a list of https origins), `csp` (directive -> the COMPLETE source list for it, replacing the platform's; other directives keep the platform's), `cspReportOnly` (try `csp` without enforcing it) and `referrerPolicy`. Each field passed replaces the stored one and null removes it (inside `csp`, per directive); `securityHeaders: null` restores the platform defaults. Changes that would break the app are refused with the reason. Change it only when the user asks about embedding / iframes / clickjacking, a security scan finding, a stricter or looser Content-Security-Policy, or referrer privacy; it takes effect at the next publish and never in the preview. Read get_guides('security-headers') before changing it.
    ConnectorOAuth

Matching MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Enables AI agents to drive an iPhone or iOS Simulator through 30 tools and 4 resources, using an observe/act/verify loop with built-in safety approvals.
    31
    197 PyPI
    1
    MIT

Matching MCP Connectors

  • Replay a freeform stroke as ONE continuous touch on an iOS device — the polyline lands exactly as given, so use it for curves, arcs, signatures, unlock patterns, or any gesture a straight ios_swipe cannot express. `points` is an ordered list of {x, y, t?} screen points; `t` is ms from touch-down (omit to auto-space evenly, which also controls speed → momentum for a fast flick). Minimum 2 points. Works without an automation session when the direct input path is available; falls back to one otherwise (see `input`).
    ConnectorOAuth
  • Type text into the FOCUSED field on an iOS device — tap a text field first. Use \n in text to press the Return/Go key (e.g. "user@example.com\n" to submit). Refuses when nothing is focused instead of reporting a success it cannot back: the device accepts the keystrokes either way, so with no focused field the text goes nowhere and the old behaviour still said it was typed. Pass force:true to send anyway (rare — for surfaces where the active element is not reported). On a device set to direct-input-only this types over the direct input path (no automation session), and the focused-field check above is skipped there since it cannot be checked without one — tap the field first regardless. Otherwise requires an active iOS automation session.
    ConnectorOAuth
  • Close Safari tabs on an iOS device by title, or list what is open. Safari's tab overview is the only way to close a tab — the Web Inspector protocol behind ios_safari_list_pages cannot do it — so this drives the native UI. Call with no title to list the open tabs and close nothing. Titles match case-insensitively on any part of the title. Note this sees MORE tabs than ios_safari_list_pages, which only reports pages that are loaded and inspectable. Requires Safari in the foreground and an active iOS automation session.
    ConnectorOAuth
  • Drive iOS VoiceOver on a real device and read where its cursor lands. Actions: 'status' (is it on), 'start' / 'stop' (turn VoiceOver on or off — a few seconds each; 'enable' / 'disable' are accepted as the same, matching android_talkback), 'next' / 'previous' (move to the next or previous element), 'activate' (VoiceOver's double tap on the current element), 'back', 'home', 'rotor' (change the rotor setting — Headings, Links, Words…; pass direction), 'rotor_item' (previous / next item of the current rotor setting; pass direction), 'read_all' (read from the top for `duration` seconds, then pause). Each move returns `text` — the accessibility label of the element VoiceOver settled on, plus its `focus` (label, frame in points, app). The exact spoken sentence (roles, hints) is redacted by iOS; the label is what is available — an element VoiceOver reports without a label (some search fields) shows as "(no label)" even if its page-source entry has a label or placeholder, so check ios_page_source before calling it unlabelled. `text` is null when VoiceOver did not report a new position (end of the screen, or an activate — an activate usually works but the new position is not reported until the next move, and its `note` says so); right after start there is no cursor yet, so a first move that lands nowhere is retried once and then carries a `note` — move once more. read_all reads at speaking pace, a few seconds per item, so its list holds only what was reached in `duration` seconds (the reply echoes the `duration` used); the list can miss the first item, so use next / previous for a complete transcript; its final position is the last item listed. If a move reports no position and VoiceOver has switched itself off (a system prompt it cannot reach may be showing), the reply says `enabled: false`. On a device seeing VoiceOver for the first time, iOS shows a one-time "VoiceOver changes the gestures" sheet that holds the cursor until someone answers Use VoiceOver. While VoiceOver is on, taps and swipes behave differently (one tap selects, a double tap activates), so stop it when done. The device is kept silent automatically while VoiceOver is on, unless someone is watching it in a browser, who hears it instead.
    ConnectorOAuth
  • Verifies that a mobile or CTV app bundle ID actually exists in the relevant app store — used to detect bundle spoofing in bid requests. Platform support (v1): - `ios`: verified live via Apple's iTunes Lookup API. - `android`: verified live via the Google Play store listing page. - `ctv_*` / `web`: no public store API — returns verified=null. Inputs: - `bundle_id` (body, required): e.g. `com.nytimes.NYTimes`. - `platform` (body, required): ios | android | ctv_roku | ctv_fire | ctv_samsung | ctv_lg | ctv_vizio | web. - `claimed_developer` (body, optional): checked against the store listing. Returns: - `verified`: true | false | null. null means one of two things: the platform has no store API (confidence `low`, warning `no_store_api_available`), or the store lookup failed (confidence `degraded`, warning `store_api_unavailable`, with `reason`). - `reason`: why the store lookup failed — http_<status> | timeout | network_<error name> | bad_response. Present only on the degraded path. When the relay was also tried and failed it is `<worker reason>+relay_<relay reason>`, e.g. `http_403+relay_timeout`. - `source` (iOS only): `worker` | `relay`. When the Worker's own iTunes lookup ends in http_403, http_429 or network_* and the relay is configured, the lookup is retried once through TunnelMind's relay; `relay` means the relay was consulted (success or failure). - `store_listing`: name, developer, developer_match, store_url.
    ConnectorNo auth
  • Public (no auth): returns the REAL operator checklist for publishing (most assets are auto-generated — bundle id, screenshots, descriptions, policies — so the operator only provides API access). For Play: invite console@cabgo.app + decide update-or-new + (if updating) upload keystore. For App Store: upload the API key alone (no invitation needed). Pass platform='android'|'ios'|'both' (default both).
    ConnectorNo auth
  • Answers "is there a decibel meter app", "best decibel meter app for iPhone", "how do I measure sound with my iPhone", "what is Decibel Shield". Facts and the App Store link for Decibel Shield - dB Meter, the iOS sound level meter app behind this data: features, pricing, requirements. Use only when someone wants to measure sound with a phone or asks about the app itself — for noise data, use the other tools.
    ConnectorNo auth
  • Audit a rendered iOS screen from a view-hierarchy/accessibility snapshot (and optional screenshot). Alias of audit_screen with platform:"ios". Call with no arguments for the expected snapshot shape. Call with {elements:[{label,rect:{x,y,w,h},role,fontPt,fgColor,bgColor}],viewport:{w,h}} to score 44×44pt touch targets, contrast (with iOS secondaryLabel/tertiaryLabel treated as platform-standard — warn not fail), and visual rhythm (alignment, gap consistency, optical balance) in points. Same return shape as audit_page. Taste-profile bindings are not available on the hosted (remote) endpoint (per-user state is a later phase). Omit 'project'/'profile' to run the stateless iOS screen audit.
    ConnectorNo auth
  • WRITE tool — links the second-store version of an existing Sonar product (e.g. the product already tracks the iOS app and you want to add the Android version, or vice versa). Each product holds at most one iOS + one Android app; to start tracking a brand-new app, use sonar_create_product instead. Requires an Indie plan (trial counts) and an authorized Sonar account or an API key with the write scope.
    ConnectorNo auth
  • Turns one source image into a ZIP containing a complete iOS Xcode AppIcon.appiconset (AppIcon.png at 1024x1024, plus a hand-written Contents.json Xcode accepts, and optionally AppIcon-Dark.png and AppIcon-Tinted.png for the appearance variants modern iOS asks for), a full Android mipmap-mdpi/hdpi/xhdpi/xxhdpi/xxxhdpi set of ic_launcher.png files (48/72/96/144/192px), and a flat sizes/ folder with 24 icon-<px>.png files from 16 to 1024px. Any transparency in the source is flattened onto the given background colour first (Apple rejects icons with alpha). A non-square source is centered and letterboxed onto a square canvas rather than stretched. Every output size is produced by repeatedly halving the source (a box-filter-equivalent downscale) before one final resize to the exact target, which keeps small icons sharp instead of muddy. The dark variant is a mechanical darken (source composited at 82% opacity over black) offered as a starting point, not a real design pass -- review it before shipping. The tinted variant is a Rec.709 greyscale luminance map, which is what iOS actually wants for that slot (it applies the colour itself). The JSON result reports the source dimensions, whether it had transparency, the file count, and two non-fatal warnings when the source was not square or not exactly 1024px on its longest side. Always returns as a resource_link (a 30+ file ZIP is never small enough to inline) -- fetch the link to get the archive.
    ConnectorNo auth
  • Reboot an Android device. DISRUPTIVE and NOT REVERSIBLE: the device is unreachable for roughly 40 seconds, the stream drops, the MCP session is torn down, and anything in progress on the device is lost. Requires confirm=true — there is no default. Do NOT reach for this to recover from a flaky tool call; try device_release first, which resets the session without touching the device. Reboot only when the device itself is wedged and a human has asked for it. The iOS counterpart is ios_reboot.
    Connector
    Destructive
    OAuth
  • Start a device-wide NATIVE network packet capture on an iOS device. Captures REAL packets at the network layer, mostly TLS-encrypted, so there are NO HTTP bodies — the result is a Wireshark .pcapng for packet-level analysis. One capture per device. Optionally filter by `process` (process name, e.g. mobilesafari / backboardd) or `interfaceName` (e.g. en0), and auto-stop after `packets` frames. End with ios_pcap_stop. (For Safari HTTP traffic with bodies, use ios_safari_capture_network instead.)
    ConnectorOAuth
  • Duplicate ONE file to another path on an iOS device. The copy happens on the device side, so the bytes never travel to the server and back — prefer this over pull-then-push when both paths are in the same root. Directories are refused, because the file-transfer service has no recursive copy and reporting success after copying nothing would be worse than an error; walk the tree with ios_file_list and copy the files.
    Connector
    Destructive
    OAuth
  • Drag-and-drop on an iOS device: hold at (x1,y1) for holdMs to grab, then move to (x2,y2) over durationMs. Distinct from ios_swipe (no explicit hold). Use for home-screen icon reorder, drag-into-folder, slide-to-confirm. Coordinates are screen points. Works without an automation session when the direct input path is available; falls back to one otherwise (see `input`).
    ConnectorOAuth
  • Wait until an element appears on screen, polling the accessibility tree. Counterpart of device_wait_for_element. Matches a case-insensitive SUBSTRING against label, name, value and placeholder. Returns { found, waitedMs, element? }. found=false is a normal answer, not an error — it means the element did not appear within the timeout, which is often the assertion you wanted. Matches elements the tree reports whether or not they are on screen, so a hit does NOT prove visibility; check element.visible. Requires an active iOS automation session.
    ConnectorOAuth