<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Chrome DevTools MCP on HoangYell</title>
        <link>https://hoangyell.com/tags/chrome-devtools-mcp/</link>
        <description>Recent content in Chrome DevTools MCP on HoangYell</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Sat, 25 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://hoangyell.com/tags/chrome-devtools-mcp/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Production Google OAuth In One Prompt: I Let Cursor Drive Chrome DevTools MCP</title>
        <link>https://hoangyell.com/production-google-oauth-in-one-prompt-cursor-chrome-devtools-mcp/</link>
        <pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate>
        
        <guid>https://hoangyell.com/production-google-oauth-in-one-prompt-cursor-chrome-devtools-mcp/</guid>
        <description>&lt;img src="https://raw.githubusercontent.com/HoangGeek/store/refs/heads/main/webp/photo-1697577418970-95d99b5a55cf.webp" alt="Featured image of post Production Google OAuth In One Prompt: I Let Cursor Drive Chrome DevTools MCP" /&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;The boring half of building Google OAuth used to be a half-day chore. This weekend an AI agent did it in one prompt while I drank coffee.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I had been putting off Google OAuth on &lt;a class=&#34;link&#34; href=&#34;https://yellorn.com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;yellorn.com&lt;/a&gt; for weeks. (By the way, yellorn.com is a personal project I built for my own workflows. It started as a &amp;ldquo;just for fun&amp;rdquo; thing, but fortunately it&amp;rsquo;s gained quite a bit of traction and users lately. I wrote a blog post about it &lt;a class=&#34;link&#34; href=&#34;https://hoangyell.com/yellorn-com&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;here&lt;/a&gt; if you want to learn more). Not because the code is hard — the code is, frankly, the easy part. It was the &lt;strong&gt;clicking&lt;/strong&gt;. The trip through Google Cloud Console, naming the project, ticking the consent screen, picking scopes, copy‑pasting the redirect URI, sweating the publishing status, generating the client secret, then shuttling that secret into Cloudflare via &lt;code&gt;wrangler&lt;/code&gt; without leaking it to my terminal history. That part. The unfun part.&lt;/p&gt;
&lt;p&gt;Last Saturday I just gave up and let an agent do it.&lt;/p&gt;
&lt;p&gt;One prompt. One coffee. Done.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-prompt&#34;&gt;The Prompt&lt;/h2&gt;
&lt;p&gt;Literally what I typed into Cursor:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&amp;ldquo;let&amp;rsquo;s do it for me, use chrome-devtools MCP with my google account&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;That was it. No checklist, no spec, no architecture doc. A throwaway sentence at the end of a thread where I had been describing the OAuth flow I wanted in &lt;code&gt;yellorn.com&lt;/code&gt;. The agent had already drafted the worker code, the route handlers, the PKCE state cookie, the silent-link logic for existing email/password users, the React drawer with the &amp;ldquo;Continue with Google&amp;rdquo; button — but it stopped at &amp;ldquo;you&amp;rsquo;ll need to wire up Google Cloud Console and Cloudflare secrets.&amp;rdquo; Classic AI cop-out. I told it: no, you do it.&lt;/p&gt;
&lt;p&gt;It did.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-the-agent-actually-did-without-me&#34;&gt;What The Agent Actually Did (Without Me)&lt;/h2&gt;
&lt;p&gt;Here is the boring half a workday it autonomously knocked out, step by step, while narrating in chat:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Opened a real Chrome window via the &lt;strong&gt;Chrome DevTools MCP&lt;/strong&gt; server.&lt;/li&gt;
&lt;li&gt;Logged into &lt;a class=&#34;link&#34; href=&#34;https://console.cloud.google.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Cloud Console&lt;/a&gt; with my Google account (I was already signed in — it just navigated).&lt;/li&gt;
&lt;li&gt;Created a brand-new project called &lt;code&gt;yellorn-prod&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Walked through the OAuth consent screen wizard: app name &lt;code&gt;yellorn&lt;/code&gt;, support email &lt;code&gt;hoangyell@gmail.com&lt;/code&gt;, audience &lt;code&gt;External&lt;/code&gt;, accepted Google&amp;rsquo;s User Data Policy.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Published the app to &amp;ldquo;In production&amp;rdquo;&lt;/strong&gt; — yes, the actual destructive button. It clicked it.&lt;/li&gt;
&lt;li&gt;Created an &lt;code&gt;OAuth 2.0 Web application&lt;/code&gt; client named &lt;code&gt;yellorn.com web client&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Pasted &lt;code&gt;https://yellorn.com&lt;/code&gt; as the authorized JavaScript origin.&lt;/li&gt;
&lt;li&gt;Pasted &lt;code&gt;https://yellorn.com/api/auth/google/callback&lt;/code&gt; as the authorized redirect URI.&lt;/li&gt;
&lt;li&gt;Read the generated &lt;strong&gt;Client ID&lt;/strong&gt; and &lt;strong&gt;Client Secret&lt;/strong&gt; straight from Google&amp;rsquo;s modal.&lt;/li&gt;
&lt;li&gt;Dropped to a terminal and ran &lt;code&gt;npx wrangler secret put GOOGLE_OAUTH_CLIENT_ID&lt;/code&gt; and &lt;code&gt;GOOGLE_OAUTH_CLIENT_SECRET&lt;/code&gt; against my Cloudflare worker, piping in the values it had just read.&lt;/li&gt;
&lt;li&gt;Ran &lt;code&gt;npm run typecheck&lt;/code&gt;, &lt;code&gt;npm test&lt;/code&gt;, then &lt;code&gt;npm run deploy&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Smoke-tested production with &lt;code&gt;curl -i https://yellorn.com/api/auth/google/start?returnTo=/&lt;/code&gt;, parsed the &lt;code&gt;302&lt;/code&gt; response, confirmed the &lt;code&gt;code_challenge&lt;/code&gt;, &lt;code&gt;state&lt;/code&gt;, and signed &lt;code&gt;yl_oauth_g&lt;/code&gt; cookie all looked right.&lt;/li&gt;
&lt;li&gt;Opened a fresh browser tab to &lt;code&gt;https://yellorn.com/&lt;/code&gt;, clicked &lt;strong&gt;Sign in&lt;/strong&gt;, took a screenshot of the new &amp;ldquo;Continue with Google&amp;rdquo; CTA, and pasted it back into the chat to prove the work.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I watched the cursor (the OS one, not the IDE one) move on its own. It was uncanny in the way the first time you saw your phone autocomplete a sentence was uncanny. You know it&amp;rsquo;s a tool. It still hits different when the tool clicks &amp;ldquo;Publish&amp;rdquo; for you.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-magic-trick-chrome-devtools--the-mcp-plot-twist&#34;&gt;The Magic Trick: Chrome DevTools &amp;amp; The MCP Plot Twist&lt;/h2&gt;
&lt;p&gt;What made this possible isn&amp;rsquo;t a smarter model—it&amp;rsquo;s a better &lt;strong&gt;pipeline&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Google quietly released &lt;a class=&#34;link&#34; href=&#34;https://developer.chrome.com/docs/devtools/agents&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Chrome DevTools for agents&lt;/a&gt;, giving AI agents the same primitives as a senior QA engineer. While it supports Anthropic&amp;rsquo;s &lt;a class=&#34;link&#34; href=&#34;https://modelcontextprotocol.io/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;MCP&lt;/a&gt; standard, here’s the plot twist: MCP is just a JSON-RPC fancy dress. At its core, this is a standalone CLI (&lt;code&gt;chrome-devtools&lt;/code&gt;) that works 100% independently.&lt;/p&gt;
&lt;p&gt;I had my agent fire off &lt;code&gt;npx chrome-devtools new_page&lt;/code&gt; directly in the terminal. No protocol handshake, no server middleman—just pure CLI commands driving a real Chrome instance with my real cookies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Old AI:&lt;/strong&gt; &lt;em&gt;&amp;ldquo;Here are the steps to configure Google Cloud&amp;hellip;&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New AI:&lt;/strong&gt; &lt;em&gt;&amp;ldquo;Done. Here is the screenshot.&amp;rdquo;&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s the difference between a recipe and a chef.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-receipts&#34;&gt;The Receipts&lt;/h2&gt;
&lt;p&gt;The smoke test the agent ran on production, after deploy:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ curl -sSI &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://yellorn.com/api/auth/google/start?returnTo=/&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HTTP/2 &lt;span class=&#34;m&#34;&gt;302&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;location: https://accounts.google.com/o/oauth2/v2/auth?client_id&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;...&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;response_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;code&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;scope&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;openid+email+profile&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;redirect_uri&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;https%3A%2F%2Fyellorn.com%2Fapi%2Fauth%2Fgoogle%2Fcallback&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;state&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;...&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;code_challenge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;...&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;code_challenge_method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;S256&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;access_type&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;online&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;prompt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;select_account
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;set-cookie: &lt;span class=&#34;nv&#34;&gt;yl_oauth_g&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;...&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;/api/auth/google/&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; Secure&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; HttpOnly&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;SameSite&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;Lax&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; Max-Age&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;600&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cache-control: no-store
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Every box ticked: PKCE (&lt;code&gt;S256&lt;/code&gt;), CSRF state, signed HttpOnly cookie scoped to the OAuth path, short TTL, &lt;code&gt;no-store&lt;/code&gt;. This is the kind of thing I would normally re-read &lt;a class=&#34;link&#34; href=&#34;https://datatracker.ietf.org/doc/html/rfc6749&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RFC 6749&lt;/a&gt; and &lt;a class=&#34;link&#34; href=&#34;https://datatracker.ietf.org/doc/html/rfc7636&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;RFC 7636&lt;/a&gt; for at 11pm to make sure I didn&amp;rsquo;t miss anything. The agent had already internalized those RFCs from training; what it needed from me was just the permission to act.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;the-one-thing-it-couldnt-do&#34;&gt;The One Thing It Couldn&amp;rsquo;t Do&lt;/h2&gt;
&lt;p&gt;It hit exactly one wall: Google&amp;rsquo;s security flow demanded I enable &lt;strong&gt;2-Step Verification&lt;/strong&gt; on my account before letting it create OAuth credentials. The agent took a screenshot, paused execution, and politely told me: &lt;em&gt;&amp;ldquo;This requires manual user interaction. Please enable 2SV at &lt;a class=&#34;link&#34; href=&#34;https://myaccount.google.com/security&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://myaccount.google.com/security&lt;/a&gt; and tell me to resume.&amp;rdquo;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I enabled it. I came back. It picked up exactly where it left off.&lt;/p&gt;
&lt;p&gt;That is the right behavior. An agent that punches through a 2FA prompt is an agent you should fire, no matter how well it wrote your worker code.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;what-this-actually-changes&#34;&gt;What This Actually Changes&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t think this is &amp;ldquo;the end of DevOps.&amp;rdquo; It is, however, the end of a very specific kind of toil: &lt;strong&gt;the toil of reading a vendor&amp;rsquo;s setup wizard, clicking through it, and copy-pasting opaque IDs between tabs&lt;/strong&gt;. That toil is now negotiable. You can pay it yourself, or you can delegate it to the agent.&lt;/p&gt;
&lt;p&gt;A few honest reflections after watching it happen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Speed is not the headline. Continuity is.&lt;/strong&gt; I never had to leave the chat. The mental cost of context-switching from &amp;ldquo;thinking about the auth flow&amp;rdquo; to &amp;ldquo;fighting Google Cloud Console UI&amp;rdquo; is gone. That&amp;rsquo;s worth more than the saved minutes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reading the agent&amp;rsquo;s plan is the new reading the docs.&lt;/strong&gt; I didn&amp;rsquo;t memorize Google&amp;rsquo;s OAuth wizard. I read the agent&amp;rsquo;s narration. Same end state, lower cognitive load.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The bottleneck moved up.&lt;/strong&gt; The hard part is no longer &amp;ldquo;do I know how to click through GCP?&amp;rdquo; It&amp;rsquo;s &amp;ldquo;do I know what I&amp;rsquo;m asking for, and do I trust this agent to act as me?&amp;rdquo; That&amp;rsquo;s a healthier question.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You still review the diff.&lt;/strong&gt; Before approving the deploy I read every file the agent had touched. The agent is a junior with infinite typing speed; you are still the staff engineer.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;a-word-on-security-because-of-course&#34;&gt;A Word On Security (Because Of Course)&lt;/h2&gt;
&lt;p&gt;A few things I would &lt;em&gt;not&lt;/em&gt; do, even now:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Never paste a long-lived secret into the chat.&lt;/strong&gt; I let the agent shell out and pipe the secret straight into &lt;code&gt;wrangler secret put&lt;/code&gt;; the secret never appeared in the chat transcript. If your agent ever echoes a production secret back at you in plaintext, treat it as compromised and rotate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rotate after first publish.&lt;/strong&gt; Once the OAuth client exists, rotate the client secret and re-&lt;code&gt;wrangler secret put&lt;/code&gt; it from your own machine. The threat model is &amp;ldquo;what if the model&amp;rsquo;s hosting environment was logging?&amp;rdquo; — paranoia is free.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lock the redirect URI to prod only.&lt;/strong&gt; I deliberately did not add &lt;code&gt;http://localhost&lt;/code&gt; as an authorized redirect on the production OAuth client. Local dev gets its own client. One leaked secret on a teammate&amp;rsquo;s laptop should not unlock production.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Audit the consent screen.&lt;/strong&gt; Read it as a user would. If your agent ticked a scope you didn&amp;rsquo;t ask for (it didn&amp;rsquo;t, but it could), un-tick it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The fact that an AI can drive Google Cloud Console for you doesn&amp;rsquo;t mean it should drive without supervision. It means &lt;strong&gt;the supervision is the actual job&lt;/strong&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;pro-tips-for-power-users-the-real-value&#34;&gt;Pro-Tips for Power Users (The Real Value)&lt;/h2&gt;
&lt;p&gt;To get the most out of your Agent’s new &amp;ldquo;hands,&amp;rdquo; keep these technical nuances in mind:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Snapshot -&amp;gt; UID Logic&lt;/strong&gt;: When the Agent runs &lt;code&gt;take_snapshot&lt;/code&gt;, it’s reading the page&amp;rsquo;s &lt;strong&gt;Accessibility Tree&lt;/strong&gt;. It assigns a unique UID to every interactable element. This is why it clicks with 100% precision—it’s not guessing based on text; it’s identifying specific nodes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Piping Secrets Securely&lt;/strong&gt;: Never let an Agent type a cleartext secret into a command (e.g., &lt;code&gt;put KEY VALUE&lt;/code&gt;). Instruct it to use pipes: &lt;code&gt;echo -n $SECRET | npx wrangler secret put...&lt;/code&gt;. This ensures your production secrets never leak into your terminal history.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero-Config via &lt;code&gt;npx&lt;/code&gt;&lt;/strong&gt;: As long as you have Node.js, the Agent can invoke &lt;code&gt;npx chrome-devtools...&lt;/code&gt; without any prior installation. It’s a &amp;ldquo;portable&amp;rdquo; Senior QA suite.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Beyond Automation&lt;/strong&gt;: You can ask it to perform auditing tasks too: &lt;em&gt;&amp;ldquo;Now that the page is live, run a &lt;code&gt;lighthouse_audit&lt;/code&gt; to check SEO and Accessibility scores.&amp;rdquo;&lt;/em&gt; It will parse the results right back into the chat.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;the-agent-prompt-template&#34;&gt;The Agent Prompt Template&lt;/h3&gt;
&lt;p&gt;Copy and paste this to guide your Agent:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Use the &lt;code&gt;chrome-devtools&lt;/code&gt; CLI (via &lt;code&gt;chrome-devtools-mcp&lt;/code&gt; package) to visit [URL], run &lt;code&gt;list_pages&lt;/code&gt;, take a &lt;code&gt;take_snapshot&lt;/code&gt; to identify UIDs, then perform [Action] and finish by saving a &lt;code&gt;take_screenshot&lt;/code&gt; to &lt;code&gt;static/proof.png&lt;/code&gt; as proof of work.&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;try-it&#34;&gt;Try It&lt;/h2&gt;
&lt;p&gt;If you have Cursor (or any IDE with MCP support), Chrome DevTools MCP is a &lt;code&gt;cursor.json&lt;/code&gt; config away. Hand it the keys, give it one sentence, and watch the cursor move.&lt;/p&gt;
&lt;p&gt;Then go drink your coffee.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Read this in &lt;a class=&#34;link&#34; href=&#34;https://hoangyell.com/vi/production-google-oauth-in-one-prompt-cursor-chrome-devtools-mcp/&#34; &gt;Tiếng Việt&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
