twiddle-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| wait_forA | BLOCK until text or an element appears (or disappears with state:'gone') — use this instead of screenshot+sleep loops. Returns immediately when the condition is met, with elapsed time and a semantic diff of what changed. On timeout it returns matched:false plus the current UI tree (never throws) so you can see what IS on screen. |
| wait_for_idleA | BLOCK until the UI stops changing (animations/loads settled). Volatile elements like clocks and spinners marked noisy are ignored. Use after navigation before reading the screen. |
| get_ui_treeA | Get the current accessibility tree as structured text with [ref=eN] markers usable in tap/type_text. Much cheaper and more precise than a screenshot. |
| ui_diffA | Semantic diff of the current UI vs a previous snapshot (default: the last one this server took). Answers 'what changed?' without comparing screenshots. |
| list_devicesA | List iOS simulators and Android emulators/devices. Booted devices first; use the returned id with every other tool. |
| launch_appB | Launch an app by iOS bundle id or Android package name. |
| terminate_appC | Terminate a running app. |
| tapA | Tap an element by [ref=eN] from get_ui_tree/wait_for, by selector, or by x/y. Refs re-resolve against the live tree; if the element is gone you get the current tree instead of a blind tap. With scroll:true, a selector that isn't on screen is searched for by scrolling through the content first. Returns a mini-diff of what the tap changed. |
| type_textB | Type text into the focused field (optionally tap a field first via ref/selector). submit presses Enter/Return. |
| swipeC | Swipe in a direction (from screen center) or between explicit points. |
| press_buttonB | Press a device button (home, back [Android], volumeUp, volumeDown, enter). |
| handle_alertA | Accept or dismiss a blocking alert/dialog (system permission prompts, 'Open in …?' sheets, in-app modals). Finds the right button from the current UI tree — no coordinates needed. Use buttonText for a specific button. Returns what was tapped and what changed; if no alert is present you get the current tree. |
| screenshotA | PNG screenshot — the fallback for purely visual checks (colors, images, layout polish). For text/structure, prefer get_ui_tree or wait_for: cheaper and more precise. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/roti-c137/twiddle-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server