<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: krish pavuluri</title>
    <description>The latest articles on DEV Community by krish pavuluri (@krish_pavuluri).</description>
    <link>https://dev.to/krish_pavuluri</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3817490%2F05f4f8f8-0d38-4318-983f-f58bc03ff8ad.png</url>
      <title>DEV Community: krish pavuluri</title>
      <link>https://dev.to/krish_pavuluri</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/krish_pavuluri"/>
    <language>en</language>
    <item>
      <title>How to Give an AI Agent Full Control of a Real iOS or Android Device (over MCP)</title>
      <dc:creator>krish pavuluri</dc:creator>
      <pubDate>Wed, 05 Aug 2026 17:44:07 +0000</pubDate>
      <link>https://dev.to/krish_pavuluri/how-to-give-an-ai-agent-full-control-of-a-real-ios-or-android-device-over-mcp-42gc</link>
      <guid>https://dev.to/krish_pavuluri/how-to-give-an-ai-agent-full-control-of-a-real-ios-or-android-device-over-mcp-42gc</guid>
      <description>&lt;p&gt;AI agents are getting good at writing code, browsing the web, and calling APIs. But there's one surface most of them still can't touch: a &lt;strong&gt;real phone&lt;/strong&gt;. Not a simulator, not a screenshot fed back to the model — an actual iOS or Android device, driven with the fidelity of a human's fingers.&lt;/p&gt;

&lt;p&gt;This guide shows you how to give an agent exactly that, over the &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt;. By the end, your MCP client — Claude Desktop, Cursor, Cline, or your own — will be able to open a real device, tap and type on it, see what the app is doing, capture and mock network traffic, spoof GPS, and even explore an app and generate test scripts. All of it as MCP tools the agent can call directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll be able to do
&lt;/h2&gt;

&lt;p&gt;Once connected, the agent has the same reach a human tester has on a real device:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Control&lt;/strong&gt; — real taps, press-and-hold, swipes, drag, and typing (native, hardware-level input, not a laggy screen-share overlay)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;See&lt;/strong&gt; — live screenshots, on-device web inspection, the UI element tree / DOM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inspect the network&lt;/strong&gt; — capture every request the app makes, and &lt;strong&gt;mock any request or response&lt;/strong&gt; to force error states and edge cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulate&lt;/strong&gt; — set GPS location anywhere on earth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automate&lt;/strong&gt; — explore an app, find issues, and generate runnable test scripts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;An MCP-capable client (Claude Desktop, Cursor, Cline, or any client that speaks MCP)&lt;/li&gt;
&lt;li&gt;A free RobotActions account (that's what exposes the real devices as MCP tools)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 — Create a free account
&lt;/h2&gt;

&lt;p&gt;Sign up at &lt;strong&gt;&lt;a href="https://robotactions.com" rel="noopener noreferrer"&gt;robotactions.com&lt;/a&gt;&lt;/strong&gt; — one click with Google or GitHub.&lt;/p&gt;

&lt;p&gt;That's all the setup you need: you'll authorize your MCP client in the next step and it fetches your access automatically, so there's no token to create, copy, or paste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Connect your MCP client
&lt;/h2&gt;

&lt;p&gt;You have two paths. Pick the one that matches your client.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A — Claude.ai / Claude Desktop (remote connector)
&lt;/h3&gt;

&lt;p&gt;Add RobotActions as a remote MCP connector pointing at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp.robotactions.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00uzij4kr7306cg5rzjt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F00uzij4kr7306cg5rzjt.png" alt="Add RobotActions as a custom MCP connector in Claude — paste the endpoint URL and click Add." width="543" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click &lt;strong&gt;Connect&lt;/strong&gt; and authorize. Signing in fetches your access automatically — no manual token entry.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcodxdks3izrs51sptdzz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fcodxdks3izrs51sptdzz.png" alt="Approve the connection when prompted, and Claude finishes linking to RobotActions." width="753" height="648"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B — Cursor, Cline, or a local MCP config
&lt;/h3&gt;

&lt;p&gt;Use the connector package to wire it into your MCP config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx @robotactions/mcp init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or point your client's MCP config at the same endpoint &lt;code&gt;https://mcp.robotactions.com/mcp&lt;/code&gt;, then authorize the same way when prompted. (RobotActions is also listed on the official MCP registry, Smithery, and glama if your client installs from there.)&lt;/p&gt;

&lt;p&gt;Reload your client and you should see the RobotActions tools appear.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjnml02j3vgloq4kevyil.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjnml02j3vgloq4kevyil.png" alt="RobotActions connected in Claude — the full set of device tools is now available to the agent." width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Your first commands on a real device
&lt;/h2&gt;

&lt;p&gt;Now just talk to your agent. Try:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"List the available devices, open an Android one, and take a screenshot."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent will call the device-list and screenshot tools and hand you back a real frame from a real phone. From there:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Open the Settings app, go to Wi-Fi, and turn it off."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent taps and swipes on the actual device — real touches, not a simulated overlay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — The part agents couldn't do before
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. Because the agent has &lt;em&gt;full&lt;/em&gt; access — visual and programmatic — you can ask it to do things a screen-share bot never could:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inspect and mock the network:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Capture the network calls this app makes on launch, then mock the /profile response to return an empty state, and show me how the app renders it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Force a location:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Set the device's GPS to Tokyo and check that the store locator updates."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Explore and test:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Walk through the checkout flow, flag anything that looks broken, and generate a test script that reproduces it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent sees the screen, reads the network and the UI elements, and drives the input — so "test this app" becomes a single instruction instead of a week of setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Mobile test infrastructure was built for humans staring at a remote screen. As agents start doing real work, they need to &lt;em&gt;operate&lt;/em&gt; real devices with human-level fidelity — and reach everything programmatically, not just the pixels. Exposing real-device control as first-class MCP tools is what turns "an agent that can see a phone" into "an agent that can actually use one."&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;You can do everything above right now on a live demo device — no cables, no local setup, no simulators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://robotactions.com" rel="noopener noreferrer"&gt;Sign in with Google or GitHub and try it free →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>testing</category>
      <category>mobile</category>
    </item>
    <item>
      <title>How We Built a Chat AI Agent Into Live Device Testing Sessions</title>
      <dc:creator>krish pavuluri</dc:creator>
      <pubDate>Tue, 10 Mar 2026 20:40:36 +0000</pubDate>
      <link>https://dev.to/krish_pavuluri/how-we-built-a-chat-ai-agent-into-live-device-testing-sessions-eg2</link>
      <guid>https://dev.to/krish_pavuluri/how-we-built-a-chat-ai-agent-into-live-device-testing-sessions-eg2</guid>
      <description>&lt;p&gt;We ship a cloud device farm — real Android and iOS devices you can control from a browser. Our users are mostly SDETs and QA engineers running Appium tests.&lt;/p&gt;

&lt;p&gt;The problem we kept hearing: &lt;strong&gt;finding the right locator wastes too much time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The typical workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open a device session&lt;/li&gt;
&lt;li&gt;Notice an element on screen&lt;/li&gt;
&lt;li&gt;Switch to Appium Inspector&lt;/li&gt;
&lt;li&gt;Inspect the element tree&lt;/li&gt;
&lt;li&gt;Copy the locator&lt;/li&gt;
&lt;li&gt;Paste it into your test&lt;/li&gt;
&lt;li&gt;Run the test, fail, go back to step 3&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We wanted to collapse that loop. So we built a Chat AI Agent that lives inside the device session.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Does
&lt;/h2&gt;

&lt;p&gt;The agent can see the live device screen. You can ask it in plain English:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"What's the XPath for the equals button?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Give me a UIAutomator2 selector for the digit 7"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What's the Accessibility ID of the login button?"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And it responds instantly with working locators — in whatever language you're using (Java, Python, Swift, Kotlin, WebDriverIO).&lt;/p&gt;

&lt;p&gt;No switching tools. No Appium Inspector. Just ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Screen visibility
&lt;/h3&gt;

&lt;p&gt;Our sessions already stream device screens via WebRTC. We grab frames from the stream at the point of the user's question — a single screenshot at query time. This keeps latency low and avoids sending a continuous video feed to the model.&lt;/p&gt;

&lt;h3&gt;
  
  
  The model
&lt;/h3&gt;

&lt;p&gt;We send the screenshot + user message to a vision-capable LLM. The prompt is structured to return locators in a specific format — we parse the response and render it with syntax highlighting in the UI.&lt;/p&gt;

&lt;h3&gt;
  
  
  Locator formats
&lt;/h3&gt;

&lt;p&gt;We support:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XPath&lt;/li&gt;
&lt;li&gt;CSS Selector&lt;/li&gt;
&lt;li&gt;UIAutomator2 (Android)&lt;/li&gt;
&lt;li&gt;XCUITest (iOS)&lt;/li&gt;
&lt;li&gt;Accessibility ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The model is instructed to return all applicable formats for the visible element, not just one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code output
&lt;/h3&gt;

&lt;p&gt;Users pick their language from a dropdown (Java, Python, Swift, Kotlin, WebDriverIO). We wrap the locator in idiomatic framework code for each:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Python / Appium
&lt;/span&gt;&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_element&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppiumBy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;XPATH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;//android.widget.Button[@content-desc=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;equals&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Java / Appium&lt;/span&gt;
&lt;span class="n"&gt;driver&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;findElement&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;By&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;xpath&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"//android.widget.Button[@content-desc='equals']"&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  UI integration
&lt;/h3&gt;

&lt;p&gt;The panel sits alongside the device stream — it doesn't overlay the screen. Users can keep testing while asking questions. The conversation history stays within the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Learned
&lt;/h2&gt;

&lt;p&gt;The hardest part wasn't the AI integration — it was the prompt engineering. Getting the model to return clean, parseable locator output (not prose with embedded code) required iteration.&lt;/p&gt;

&lt;p&gt;We also found that grounding the model on the &lt;em&gt;visible&lt;/em&gt; screen state (not a DOM or accessibility tree) made responses feel more natural. Users think in terms of what they &lt;em&gt;see&lt;/em&gt;, not what's in the XML hierarchy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The Chat AI Agent is live now in the &lt;a href="https://robotactions.com" rel="noopener noreferrer"&gt;RobotActions portal&lt;/a&gt;. Free trial available.&lt;/p&gt;

&lt;p&gt;We'd love feedback from anyone doing Appium or mobile automation — especially if you've built similar tooling. Drop a comment or reach out directly.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>ai</category>
      <category>automation</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
