Single tool 'idb' with a monolithic design that violates core agentic tool patterns. The tool is a thin wrapper around a CLI with a single 'command' string parameter, which forces the LLM to construct complex command-line syntax rather than using structured parameters. Description is extremely verbose (1000+ chars) but lacks clarity on WHEN to use this tool vs alternatives. Schema is present but overly generic. No error guidance, no pagination, no idempotency guarantees. The tool attempts to be a catch-all for any IDB command, which is anti-pattern for agent-driven interfaces.
Generic tool to execute any IDB command with arguments. The IDB command to execute (e.g., list-apps, screenshot, etc.). For a full list of commands, run 'idb help'. For help with a specific command, run 'idb <command> --help'. To interact with the device (simulator): IMPORTANT: Always try using the 'idb ui describe-all' command to identify buttons before dispatching UI actions. If that doesn't work, try using the following commands: - **Tap** - **Command:** 'idb ui tap X Y [--duration DURATION]' - **Description:** Simulates a tap at the given screen coordinates. Optionally, you can set the tap's duration. - **Swipe** - **Command:** 'idb ui swipe X_START Y_START X_END Y_END [--delta STEP_SIZE]' - **Description:** Simulates a swipe gesture from the start point to the end point. By default, the swipe moves in steps of 10 points; use '--delta' to change the step size. - **Press a Button** - **Command:** 'idb ui button {APPLE_PAY, HOME, LOCK, SIDE_BUTTON, SIRI} [--duration DURATION]' - **Description:** Simulates pressing a specified hardware button. The press duration can be adjusted with the '--duration' flag. - **Inputting Text** - **Command:** 'idb ui text "some text"' - **Description:** Types the provided text string into the target device. - **Key Events** - **Single Key:** 'idb ui key KEYCODE [--duration DURATION]' - **Key Sequence:** 'idb ui key-sequence KEYCODE1 KEYCODE2 ...' - **Description:** Simulates key press events. Use the single key command for one key press (with an optional duration) or the key sequence command for multiple sequential key events. **Frame and Coordinates in idb ui describe-all:** The output from 'idb ui describe-all' provides detailed layout information for each UI element. Each element includes a 'frame' object with: - **x and y:** The coordinates of the element's top-left corner relative to the device screen. - **width and height:** The dimensions of the element. Additionally, an 'AXFrame' string presents this data in a human-readable format like '{{x, y}, {width, height}}'. These values allow you to determine an element's position—commonly by calculating its center (x + width/2, y + height/2) for precise interactions. For instance, in the sample output, the "More, tab, 4 of 4" button has a frame starting at x=330, y=876.33 with a width of 110 and height of 45.67. A tap command such as 'idb ui tap 375 880' (which targets near the element's center) successfully triggers the button.
Tool violates single-responsibility principle. Generic 'idb' command string parameter forces LLM to construct CLI syntax instead of using discrete, named operations. Patterns like 'idb ui tap', 'idb ui describe-all', 'idb list-apps', 'idb screenshot' should be separate tools with explicit parameters (x, y, duration) rather than a single free-form command string.
Tool name 'idb' is a noun, not a verb. Agentic tool names must start with verbs (get_, create_, update_, search_, list_, etc.). 'idb' tells the LLM nothing about the action. Should be 'execute_idb_command' at minimum, but better: split into 'describe_ios_ui', 'tap_ios_screen', 'screenshot_ios_device', 'list_ios_apps', etc.
Parameter 'command' accepts arbitrary free-form strings with no validation, enums, or constraints. Description embeds command syntax examples ('idb ui tap X Y [--duration DURATION]') inline, forcing LLM to parse unstructured docs. Should declare enum: 'describe-all', 'tap', 'swipe', 'button', 'text', 'key', 'key-sequence', 'list-apps', 'screenshot', etc., then have SEPARATE typed parameters (x, y, duration, keycode) per command.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | F | 10 | 2026-07-28+ | v2 |
| 2026-03-09 | F | 37 | - | v1 |
Description is 1000+ characters of embedded command help text, vastly exceeds the 10 - 1024 baseline (p90=392). Verbose prose documentation does not help agent selection. Lacks clear WHAT/WHEN/WHY guidance. Should be ~100 chars: 'Execute iOS device interactions via the Facebook IDB bridge. For UI exploration, call describe_ios_ui first; then use tap_ios_screen, swipe_ios_screen, or key_press tools for actions.'
Options parameter is array of strings with minimal guidance. No min/max length, no constraint on individual option values. LLM can pass arbitrary malformed flags. Should either: (a) declare specific allowable flags via enum or pattern, or (b) eliminate and use discrete parameters (duration, delta, button_type, keycode).
No output schema documented. Tool returns generic { content: [{ type: 'text', text: output }] }. LLM does not know structure of response (is it JSON? CSV? Raw text? Lines?). describe-all returns structured UI element data with frame, AXFrame, but this is buried in description, not declared in output. Breaks tool chaining, downstream tools cannot reliably parse the response.
Error handling is naive. Catches exec errors and returns raw message. No categorization (retryable vs fatal), no recovery guidance. If 'idb' binary not found, returns 'Error: ENOENT', agent has no hint to check PATH or install idb. Should return actionable errors: 'idb binary not found. Install via: brew install facebook/fb/idb or check $PATH'.
No idempotency guarantees. Tool directly executes CLI commands with side effects (tap, swipe, text input). If agent retries on timeout, action repeats. Should document: 'describe-all is safe to retry; tap/swipe/text actions are NOT idempotent, if retrying, verify the action did not occur.' No confirm/dry-run support for destructive operations.
No input validation or sanitization. Command string is passed directly to execFile. While execFile args array mitigates shell injection, the design still invites errors. Example: 'idb ui tap 9999 9999' (off-screen coords) executes without client-side validation. Should validate: tap coordinates must be within device bounds (e.g., 0 - 1242 x 0 - 2688 for typical iPhone).