<?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: Mofidul Islam</title>
    <description>The latest articles on DEV Community by Mofidul Islam (@iammofidul).</description>
    <link>https://dev.to/iammofidul</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%2F3936001%2F3bc7a1b2-d440-4341-bba4-a6191c72f1b2.jpg</url>
      <title>DEV Community: Mofidul Islam</title>
      <link>https://dev.to/iammofidul</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/iammofidul"/>
    <language>en</language>
    <item>
      <title>How I Connected Google Search Console to Claude Code with MCP</title>
      <dc:creator>Mofidul Islam</dc:creator>
      <pubDate>Mon, 24 Aug 2026 08:55:39 +0000</pubDate>
      <link>https://dev.to/iammofidul/how-i-connected-google-search-console-to-claude-code-with-mcp-343i</link>
      <guid>https://dev.to/iammofidul/how-i-connected-google-search-console-to-claude-code-with-mcp-343i</guid>
      <description>&lt;p&gt;I wanted to analyze Google Search Console data without jumping between GSC, spreadsheets, and my codebase.&lt;/p&gt;

&lt;p&gt;So I connected GSC to Claude Code using &lt;a href="https://github.com/AminForou/mcp-gsc" rel="noopener noreferrer"&gt;Amin Forou's open-source mcp-gsc server&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now I can ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which high-impression queries are close to page one?&lt;/li&gt;
&lt;li&gt;Which ranking pages have low CTR?&lt;/li&gt;
&lt;li&gt;Are multiple pages competing for the same keyword?&lt;/li&gt;
&lt;li&gt;Which important URLs have indexing problems?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude retrieves the relevant data, analyzes it alongside my code, and helps me decide what to change.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude Code
    ↓ MCP over stdio
mcp-gsc running locally
    ↓ OAuth 2.0
Google Search Console API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP server converts Search Console operations into tools Claude can call. It supports performance analysis, URL inspection, sitemap management, period comparisons, and property discovery.&lt;/p&gt;

&lt;p&gt;I used OAuth so the server could access the same GSC properties as my Google account.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create the Google Cloud test app
&lt;/h2&gt;

&lt;p&gt;Open the &lt;a href="https://console.cloud.google.com/" rel="noopener noreferrer"&gt;Google Cloud Console&lt;/a&gt; and create a dedicated project.&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;APIs &amp;amp; Services → Library&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Find and enable the &lt;strong&gt;Google Search Console API&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Google Auth Platform&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Configure the app name and support email under &lt;strong&gt;Branding&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Set the audience to &lt;strong&gt;External&lt;/strong&gt; and keep the app in &lt;strong&gt;Testing&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Add your Google account under &lt;strong&gt;Test users&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The authorized Google account must already have access to the Search Console property.&lt;/p&gt;

&lt;p&gt;The server requests this scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://www.googleapis.com/auth/webmasters
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the read/write Search Console scope. Destructive mcp-gsc operations remain disabled unless &lt;code&gt;GSC_ALLOW_DESTRUCTIVE=true&lt;/code&gt; is explicitly set.&lt;/p&gt;

&lt;p&gt;Important: for an external app in Testing, Google normally expires the authorization and refresh token after seven days. If authentication suddenly stops, run the reauthentication tool and approve access again.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Download the OAuth client
&lt;/h2&gt;

&lt;p&gt;In &lt;strong&gt;Google Auth Platform → Clients&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an OAuth client.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Desktop app&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Download the JSON file.&lt;/li&gt;
&lt;li&gt;Store it in a permanent private location.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/Users/yourname/Documents/credentials/gsc-client-secrets.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never commit this file to Git.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Install mcp-gsc
&lt;/h2&gt;

&lt;p&gt;The simplest method uses &lt;code&gt;uvx&lt;/code&gt;, which runs the package in an isolated Python environment.&lt;/p&gt;

&lt;p&gt;Install &lt;code&gt;uv&lt;/code&gt; using its &lt;a href="https://docs.astral.sh/uv/getting-started/installation/" rel="noopener noreferrer"&gt;official installation guide&lt;/a&gt;, then verify it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv &lt;span class="nt"&gt;--version&lt;/span&gt;
uvx &lt;span class="nt"&gt;--version&lt;/span&gt;
which uvx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep the full path returned by &lt;code&gt;which uvx&lt;/code&gt;. Claude Code may not inherit your terminal's &lt;code&gt;PATH&lt;/code&gt;, so using only &lt;code&gt;uvx&lt;/code&gt; can cause a &lt;code&gt;spawn uvx ENOENT&lt;/code&gt; error.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Connect it to Claude Code
&lt;/h2&gt;

&lt;p&gt;Replace the example paths with absolute paths from your machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add-json &lt;span class="nt"&gt;--scope&lt;/span&gt; user gscServer &lt;span class="s1"&gt;'{
  "type": "stdio",
  "command": "/Users/yourname/.local/bin/uvx",
  "args": ["mcp-search-console"],
  "env": {
    "GSC_OAUTH_CLIENT_SECRETS_FILE": "/Users/yourname/Documents/credentials/gsc-client-secrets.json"
  }
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I used user scope so the integration was available across my local projects without committing credential paths to a repository.&lt;/p&gt;

&lt;p&gt;Verify the configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp list
claude mcp get gscServer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Authorize and test
&lt;/h2&gt;

&lt;p&gt;Start Claude Code and ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Call the GSC get_capabilities tool and report the authentication status.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first request opens Google's OAuth flow in your browser. Sign in with the test-user account and approve access.&lt;/p&gt;

&lt;p&gt;Then ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;List every Search Console property I can access and show its exact identifier.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the identifier returned by the API. Search Console has two formats:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain property:     sc-domain:example.com
URL-prefix property: https://www.example.com/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The protocol, hostname, and trailing slash must match exactly for URL-prefix properties.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful tools
&lt;/h2&gt;

&lt;p&gt;The server exposes tools including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_performance_overview&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_search_analytics&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_advanced_search_analytics&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;compare_search_periods&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_search_by_page_query&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inspect_url_enhanced&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;batch_url_inspection&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;check_indexing_issues&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;list_sitemaps_enhanced&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reauthenticate&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For recent dashboard-like data, keep the default &lt;code&gt;GSC_DATA_STATE=all&lt;/code&gt;. For stable reporting with a short delay, use &lt;code&gt;GSC_DATA_STATE=final&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompts I use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Find quick SEO opportunities
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;For sc-domain:example.com, find non-branded queries with at least 500 impressions and positions from 11 to 20 in the last 28 days. Group them by ranking page and recommend whether to update an existing page or create a new one.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Diagnose low CTR
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Find pages ranking in positions 1 to 10 with at least 1,000 impressions and CTR below 2%. Show their leading queries and suggest accurate title improvements.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Compare performance
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Compare the latest 28 complete days with the previous 28 days. Separate changes caused by impressions, CTR, and position. Show the ten biggest winning and losing pages.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Check indexing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Inspect the ten highest-click landing pages. Flag canonical mismatches, robots restrictions, crawl failures, and pages missing from Google's index.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Common problems
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Authentication fails after seven days:&lt;/strong&gt; Your external OAuth app is still in Testing. Call &lt;code&gt;reauthenticate&lt;/code&gt; and approve access again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;spawn uvx ENOENT&lt;/code&gt;:&lt;/strong&gt; Use the complete path returned by &lt;code&gt;which uvx&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credentials file not found:&lt;/strong&gt; Use an absolute path in &lt;code&gt;GSC_OAUTH_CLIENT_SECRETS_FILE&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Property returns 404:&lt;/strong&gt; Run &lt;code&gt;list_properties&lt;/code&gt; and copy the exact &lt;code&gt;sc-domain:&lt;/code&gt; or URL-prefix value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No MCP tools appear:&lt;/strong&gt; Check &lt;code&gt;claude mcp list&lt;/code&gt;. Manual repository installations also require Python 3.11 or newer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep the client JSON and cached OAuth token outside your repository.&lt;/li&gt;
&lt;li&gt;Never publish or share their contents.&lt;/li&gt;
&lt;li&gt;Leave destructive operations disabled.&lt;/li&gt;
&lt;li&gt;Review MCP tool calls before approving them.&lt;/li&gt;
&lt;li&gt;Revoke the OAuth app from your Google Account if credentials are exposed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;p&gt;My SEO workflow changed from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GSC → CSV export → spreadsheet → codebase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Search data → opportunity → page → code change → measurement
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The biggest benefit is not generating more SEO content. It is giving the coding assistant real search data so it can investigate the correct page before making a change.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/AminForou/mcp-gsc" rel="noopener noreferrer"&gt;mcp-gsc repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developers.google.com/webmaster-tools/v1/prereqs" rel="noopener noreferrer"&gt;Search Console API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://support.google.com/cloud/answer/15549945" rel="noopener noreferrer"&gt;Google OAuth test-user documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.anthropic.com/en/docs/claude-code/mcp" rel="noopener noreferrer"&gt;Claude Code MCP documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disclosure: I used AI to help edit this article. The setup is based on my own implementation and was manually verified.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>mcp</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>What 166K Clicks Taught Me About Using AI for SEO</title>
      <dc:creator>Mofidul Islam</dc:creator>
      <pubDate>Sun, 23 Aug 2026 07:11:12 +0000</pubDate>
      <link>https://dev.to/iammofidul/what-166k-clicks-taught-me-about-using-ai-for-seo-1pe6</link>
      <guid>https://dev.to/iammofidul/what-166k-clicks-taught-me-about-using-ai-for-seo-1pe6</guid>
      <description>&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%2Fpdh91z3x2qzj9rb7ma2n.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%2Fpdh91z3x2qzj9rb7ma2n.png" alt="Google Search Console performance chart for Flingo showing 166,000 clicks, 1.39 million impressions, 11.9% CTR and an average position of 7.5 over three months, with traffic rising sharply in June and declining after its July peak." width="799" height="370"&gt;&lt;/a&gt;Over three months, my static website generated &lt;strong&gt;166K Google clicks from 1.39M impressions&lt;/strong&gt;, with an &lt;strong&gt;11.9% CTR&lt;/strong&gt; and &lt;strong&gt;7.5 average position&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The graph also shows traffic declining after its peak. That is important: AI did not create automatic, permanent growth. What helped was using AI inside a measurable SEO workflow—and reverting ideas when the data disagreed.&lt;/p&gt;

&lt;p&gt;Here is the loop I now use.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Use Keyword Planner for discovery, not decisions
&lt;/h2&gt;

&lt;p&gt;I start with broad product terms in Google Keyword Planner and export the results.&lt;/p&gt;

&lt;p&gt;Search volume and competition help me find possible clusters, but a high-volume keyword is not automatically a reason to create a page.&lt;/p&gt;

&lt;p&gt;Before choosing one, I ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does it match my product?&lt;/li&gt;
&lt;li&gt;Is its intent different from pages I already have?&lt;/li&gt;
&lt;li&gt;Does an existing URL already rank for it?&lt;/li&gt;
&lt;li&gt;Can I create something genuinely useful for the searcher?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This prevents keyword research from becoming a factory for thin pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Check keyword ownership with GSC MCP
&lt;/h2&gt;

&lt;p&gt;I use a Google Search Console MCP connection to pull query-and-page data directly into my workflow.&lt;/p&gt;

&lt;p&gt;This is more useful than looking only at a keyword report. A keyword may appear to be an opportunity while an existing page already ranks in positions 1–3.&lt;/p&gt;

&lt;p&gt;Creating another page could split its signals and cause keyword cannibalization.&lt;/p&gt;

&lt;p&gt;My basic decision record contains five fields:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt; target keyword&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Current URL:&lt;/strong&gt; ranking page or none&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Evidence:&lt;/strong&gt; clicks and position from a settled GSC window&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Intent:&lt;/strong&gt; informational, local, comparison or action&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Decision:&lt;/strong&gt; improve, create or reject&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If the intent already belongs to an existing page, I improve that page instead of creating another URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Use Claude skills as reviewers, not autopilot
&lt;/h2&gt;

&lt;p&gt;I use Claude SEO-audit and keyword-research skills to inspect proposed changes.&lt;/p&gt;

&lt;p&gt;They help me check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicate keyword targets&lt;/li&gt;
&lt;li&gt;Titles, descriptions, H1s and canonicals&lt;/li&gt;
&lt;li&gt;Indexability and internal links&lt;/li&gt;
&lt;li&gt;Thin or repetitive content&lt;/li&gt;
&lt;li&gt;Unsupported product and pricing claims&lt;/li&gt;
&lt;li&gt;Possible performance regressions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI can investigate, compare and draft—but it cannot replace evidence or editorial judgment.&lt;/p&gt;

&lt;p&gt;I reject templated pages that only swap a keyword or city name.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Fix what Search Console actually flags
&lt;/h2&gt;

&lt;p&gt;When clicks fall, I do not immediately rewrite the entire site.&lt;/p&gt;

&lt;p&gt;I first separate incomplete recent Search Console data from settled data. Then I decompose the loss:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Compare equivalent date ranges.&lt;/li&gt;
&lt;li&gt;Find which page lost clicks.&lt;/li&gt;
&lt;li&gt;Pull that page’s query-level changes.&lt;/li&gt;
&lt;li&gt;Check its indexing, canonical and crawl status.&lt;/li&gt;
&lt;li&gt;Review the commits made before the decline.&lt;/li&gt;
&lt;li&gt;Revert only when the evidence supports it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This has saved me from treating every ranking fluctuation as a technical emergency.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Audit before and after deployment
&lt;/h2&gt;

&lt;p&gt;Before every SEO commit and deployment, I run the repository SEO audit.&lt;/p&gt;

&lt;p&gt;After deployment, I inspect the live HTML—not just the local source file—to verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Title&lt;/li&gt;
&lt;li&gt;Meta description&lt;/li&gt;
&lt;li&gt;Canonical&lt;/li&gt;
&lt;li&gt;Robots directive&lt;/li&gt;
&lt;li&gt;H1&lt;/li&gt;
&lt;li&gt;Sitemap entry&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only after the production page passes those checks do I submit it through Search Console and begin its validation window.&lt;/p&gt;

&lt;h2&gt;
  
  
  The main lesson
&lt;/h2&gt;

&lt;p&gt;My best results did not come from asking AI to “write SEO content.”&lt;/p&gt;

&lt;p&gt;They came from giving AI access to structured evidence and enforcing a release process:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Keyword Planner → GSC ownership check → human intent decision → SEO audit → deploy → live verification → measure or revert&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the process I use on &lt;a href="https://flingodating.in/?utm_source=devto&amp;amp;utm_medium=referral&amp;amp;utm_campaign=ai_assisted_seo_loop_aug26" rel="noopener noreferrer"&gt;Flingo&lt;/a&gt;, a product website with hundreds of static pages.&lt;/p&gt;

&lt;p&gt;AI makes research and diagnosis faster.&lt;/p&gt;

&lt;p&gt;Search data decides whether an idea deserves to ship.&lt;/p&gt;

&lt;p&gt;How are you using AI in SEO without handing it the steering wheel?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>webdev</category>
      <category>indiedev</category>
    </item>
  </channel>
</rss>
