Every MCP tool call blocks until the real device replies. When it returns, the AI is holding the answer — a UI tree, a screenshot, a task result — ready to reason about, with no polling and no callback wiring.
OmniDebugLink exposes your app as a set of synchronous MCP tools. When the AI calls run_task, the request travels to the device, the handler runs inside your app, and the reply comes back as the tool's return value. Text results arrive as JSON; screenshots arrive as native image blocks the AI can see. One call in, one complete answer out.
Each request carries a unique requestId, and the device's reply must echo that same ID — this is how many concurrent AI calls stay matched to their own results instead of stepping on each other. Success is an explicit ok: true with a result payload; failure comes back as a structured error with a code like DEVICE_OFFLINE, TASK_FAILED, or TASK_TIMEOUT if the device does not answer in time. Either way the call resolves — it never hangs silently.
Because the device announces its capabilities when it connects, the AI can discover them live: list_devices shows what is online under your account, list_tasks shows what a given device can do, and run_task invokes one. Registering a new task in your app makes it callable immediately — no server-side changes.
One sign-in covers your whole fleet. The AI tool authenticates with your account — no token to copy — and every device under that account is addressable by name: each tool takes a device parameter, so a single MCP connection can drive your office phone, a colleague's tablet, and a simulator in the same session.
claude mcp add --transport http odl \ "https://api.omnidebuglink.dev/mcp"
A browser sign-in pops up on first use; after that, every call is a synchronous round trip to whichever device you name.
The request-response protocol is built into every official client — Unity, Android, iOS / macOS / watchOS, Flutter, React Native, Godot, and Web (JavaScript). Free during the public beta.