Skip to content
Houtini.

How to do an SEO audit with Claude

SEO Audit Console is a free, open-source MCP server that pulls your crawl and your Search Console data into a database on your own PC, and Claude runs the audit from it. In today's guide we're taking a closer look at what an SEO audit covers and how the fixes get ranked and written, run for real on houtini.com with no Semrush or Screaming Frog.

Richard Baxter Richard Baxter AI Ops & Marketing Engineer
Published Updated 11 min read
On this page
  1. How SEO Audit Console works
  2. What an SEO audit covers
  3. Run the audit
  4. The crawl checks I run every day
  5. From finding to fix
  6. The dashboard
  7. Content opportunities from your own data
  8. DataForSEO and Majestic
  9. What it replaces, and what it costs
  10. Agency or in-house
  11. Questions people ask
  12. Where to start
SEO Audit Console dashboard for houtini.com, Opportunities tab: a quick-wins matrix plotting every query by average position and click-through rate against the expected-CTR curve, bubbles sized by impressions

This is a bit of a passion project for me. Having owned an agency, our biggest cost was data collection, and then the time it took to analyse it all. These days that shouldn't be a thing. In today's post I'm going to walk you through what's now possible with no Semrush and no Screaming Frog. It's pure, open-source software to speed up your data collection, your analysis and, hopefully, your recommendations and SEO strategy. But that bit's on you - you still have to think!

Basically, an SEO audit checks how your site is crawled, how it's indexed and how it performs in search, and then works out which fixes are worth doing first. A crawl is a program visiting every page on your site the way a search engine would, and recording what it finds. Google Search Console is Google's own free record of how your site does in its results: the queries, the impressions, the clicks and the pages it has indexed.

All of this runs on SEO Audit Console, a free, open-source MCP server (a small program that gives Claude a set of tools it can call) for Claude Desktop and Claude Code. Performing the data collection for a good SEO audit is a simple matter of installing it and telling it to sync to your Google Search Console account.

How SEO Audit Console works

SEO Audit is a Node app, wrapped in the MCP SDK so that Claude can use it as a tool to fetch data and write it into a SQLite database, for you to analyse on your own PC. SQLite is a database that lives in a single file on your machine, with no server to look after.

The data comes from four places. There's the tool's own crawl of your site, and there's Search Console, including URL Inspection, which is Google's verdict on how it indexed a given page. Then, if you add the keys, there's DataForSEO and Majestic.

Diagram: your site crawl and Search Console with URL Inspection, plus optional DataForSEO and Majestic, feed a SQLite database on your own PC; Claude writes SQL against it and returns findings, fixes and a dashboard

Where the audit data comes from, and where it lives.

The data is filtered by Claude's ability to write SQL queries, so the data played back is fact. SQL (Structured Query Language) is how you ask a database a question. Claude writes the query and the database does the counting, which means the numbers in front of you come from your own data.

In the README I wrote: "Almost every technical SEO audit I've been handed in twenty years is a crawler's opinion, and a crawler only ever sees half the picture. It tells you what your site says. It has nothing to say about what Google did about it."

The install and the Search Console sync are covered step by step in the setup guide.

What an SEO audit covers

There are 99 checks in the registry, split across eight categories: crawlability, indexation, on-page, content, schema, security, performance, and a merged set. The merged set is 23 checks that only work when Search Console and the crawl are joined together. That's where you find striking distance, a query ranking on page two, where a small push could get it onto page one. It also finds pages with a CTR below what their position should earn. CTR is click-through rate, the share of impressions that turn into a click. And it finds keyword cannibalisation, where two of your own pages compete for the same query, plus traffic decay and orphan pages that still earn impressions. An orphan page is one your own site barely links to, if at all.

Each check is one of three types. D is deterministic, read straight from the crawl or the data. G is Google's own data, from Search Console or URL Inspection. N is judgement, a heuristic. The judgement checks are off by default, on the basis that a wrong finding is worse than no finding. If you want them, ask Claude to "include the judgement findings".

CategoryChecksWhat it looks for (examples)
Crawlability14Broken internal links, redirect chains, orphan pages, sitemap orphans, deep pages
Indexation16Google choosing a different canonical, broken canonical targets, indexable pages missing from the sitemap, index bloat, soft 404s
On-page20Title and meta description length, H1s, heading order, images without dimensions or alt text, missing Open Graph tags, Discover article pages missing og:image or max-image-preview:large
Content5Thin pages, long copy with no headings, sections that never name their subject, very long unbroken sections, statistical tells of generic AI text
Schema12No JSON-LD, JSON-LD that doesn't parse, missing required fields, articles with no author or no image, rich-result issues Google reports
Security3Pages served over HTTP, mixed content on HTTPS pages, no HSTS header
Performance6Slow server response, large or uncompressed HTML, pages that earn clicks but fail lab Core Web Vitals
Merged (crawl + Search Console)23Ghost pages Google ranks but the crawl can't reach, page-1 rankings slipping, traffic still landing on dead URLs, the top query missing from the title

Run the audit

When the first refresh is done (the Search Console sync, the crawl and URL Inspection, run as one job), ask Claude to run an SEO audit of your site and it calls run_audit.

Findings are ranked by expected clicks per developer-hour: how many clicks a fix is likely to win, divided by how long it takes to do. The sum is the traffic at stake, multiplied by the expected yield of the fix and the certainty of the finding, divided by the effort in hours. Yield is set per category, with indexation at 0.8, crawlability at 0.7 and on-page down at 0.2, and then adjusted by severity.

Semrush's guide and Ahrefs' Site Audit sort issues by severity, as errors, warnings and notices, and Moz's checklist runs in checklist order. Ranking by your own Search Console clicks per developer-hour isn't something any of them does.

# SEO audit - houtini.com (run_audit, condensed)
652 findings · 0 critical · 54 high · 260 medium · 338 low
Audit computed in 0.2s.

On houtini.com the refresh pulled 82,337 rows of Search Console data, one per date, query and page. The crawl covered 208 pages in about three minutes, recording 13,297 internal links.

Top of the list was /articles/claude-code-system-requirements, with impressions rising but clicks flat, and a CTR far below what its position should earn: 9 clicks from 8,745 impressions. Its page-one ranking is slipping, too, for "claude code system requirements mac windows linux", a query with 6,887 impressions. Behind it came the LM Studio setup guide, with 58 clicks from 5,695 impressions, a CTR below what its position should earn and a slow server response.

The Issues and fixes tab listing 652 findings for houtini.com ranked by impact, each with the URL, clicks, impressions, an impact badge and the fix

The Issues & fixes tab: every finding ranked by expected clicks per developer-hour, with the fix beside it.

The crawl checks I run every day

I do quite a bit of SEO crawling to find broken links and mismatched canonicals, and recently we've used it to find non-compliant Discover Open Graph preview images. A canonical is the tag that tells Google which version of a page is the real one. Discover is the feed of articles Google shows on phones. For an article to get a large preview there, the page needs an og:image, which is its Open Graph image tag, and the max-image-preview:large setting.

I use it on the daily, to measure and monitor the performance of all of my own properties.

broken-internal-links: showing 0-0 of 0 findings
broken-canonical-target: showing 0-0 of 0 findings
discover-missing-og: showing 0-0 of 0 findings
discover-max-image-preview: showing 0-0 of 0 findings
orphan-with-impressions: showing 1-2 of 2 findings

On houtini.com the crawl found 0 broken internal links and 0 broken canonical targets. No article page was missing its og:image or max-image-preview.

Two orphans did turn up, and both still earn impressions: /yubhub and /tools/voice-analyser. They're retired tools that the site hardly links to any more, but Google is still showing them in its results, which is something only the Search Console side of the data can tell you.

The Site health tab for houtini.com: response codes, indexability, response-time bands, crawl depth, page titles and meta descriptions from the crawl, and a list of slow pages

Site health for houtini.com: response codes, indexability, response times, crawl depth, titles and metas.

From finding to fix

Ask for the fix on any finding and fix_finding writes it. For the voice-analyser orphan, it ranked the pages best placed to link to it by internal PageRank. Internal PageRank is a measure of how much link weight each page holds within your own site. /tools/ came first at 94, with 636 inlinks, then /tools/gemini-mcp/ at 47 and /tools/seo-audit/ at 46, and it suggested the anchor text "Voice Analyser MCP".

Other findings get other kinds of fix. A redirect finding gets a 301 rule for .htaccess, nginx or Next.js, using the destination the crawler recorded, and a redirect chain gets collapsed to a single hop. A schema finding gets a full JSON-LD block. JSON-LD is the format for structured data, the code that tells search engines what a page is and who wrote it.

It never writes to your site. In the README I called that a line I won't cross. It hands you the fix, and you ship it.

The dashboard

There are a myriad of functions and reports, including a dashboard with eight tabs.

Overview is a plain-language summary with the top fixes. Issues & fixes is every finding, ranked by priority or grouped by category. Site health covers status codes, indexability, response times, depth, titles and metas. Opportunities plots every query by position and CTR against the expected-CTR curve, and ranks the biggest quick wins by recoverable clicks. Search performance has clicks, impressions, CTR and position, branded against non-branded, over time. Architecture compares internal link equity with organic traffic by template, and maps the link flows from folder to folder. Links and Content research need DataForSEO.

The Architecture tab: internal link equity against organic traffic by page template, and a Sankey chart of link equity moving between site folders

Architecture for houtini.com: the articles folder holds under half the internal link equity and earns most of the organic traffic.

get_dashboard renders it in the chat. serve_dashboard runs it on a web server that only your own machine can reach, with live data and CSV downloads. export_report writes one self-contained HTML file you can email to a client.

For the 28 days to 22 September, houtini.com had 188 clicks and 42K impressions, with clicks down 52% on the previous 28 days and an average position of 11.0. The Overview counted 7 under-clicked pages, 40 queries in striking distance, 6 cannibalised queries, 54 high-severity issues and 415 clicks recoverable.

SEO Audit Console dashboard overview for houtini.com: 652 findings, 208 pages crawled, 98 quick wins, 188 clicks in 28 days down 52 percent, 0 critical issues and 415 clicks recoverable, with the highest-impact fixes listed

The Overview tab for houtini.com, 28 days to 22 September.

The Search performance tab for houtini.com: clicks, impressions, CTR and average position over 28 days, the branded versus non-branded split, and the ranking distribution over time

Search performance for houtini.com: 93% of the clicks and impressions are non-branded.

Content opportunities from your own data

content_opportunities works entirely from the data you've already stored, so it makes no paid calls, and on houtini.com it found something in all four of its groups.

Refresh now flagged the best PCs for local AI guide, at 34 clicks against 196 in the prior period, which is down 83%.

Rewrite snippets picked out "houtini", sitting at position 2.2 with a 1.6% CTR where about 15% would be expected. A snippet is the title and description Google shows for your page in its results, so that's a rewrite rather than a ranking problem.

The Opportunities tab: the quick-wins matrix and the biggest quick wins ranked by recoverable clicks, led by the query houtini with 115 clicks recoverable

Opportunities for houtini.com, led by the query "houtini" with 115 clicks recoverable.

Strengthen pointed at the "dgx spark alternative" cluster: 42 keywords, 9,359 impressions and a best position of 5.4.

Write next suggested "best local ai server", with 499 impressions at position 61.

DataForSEO and Majestic

Competitor and results-page work needs DataForSEO, a pay-as-you-go API for search data, and optionally Majestic. You pay per call rather than a monthly subscription, the results are cached locally for 7 days, and nothing runs unless you ask for it. The link tools need DataForSEO's separate Backlinks subscription on top.

It adds keyword volume, related terms and search intent. competitors_domain tells you who you really compete with and page_intersection finds the content gap, and domain_visibility and top_pages work on any domain, yours or a competitor's. ranked_keywords includes which of your keywords show an AI Overview, which is the AI-written answer Google puts above the results. market_sizing gives total demand and share of voice for you and up to four competitors, and link_intersect finds the links your competitors have that you don't.

One serp_features call on houtini.com found AI Overviews on 67% of the site's keyword volume: 37,760 of 56,360 searches, across 152 of 175 sampled keywords. People Also Ask showed on 91.6%. houtini.com ranks on page one for 2 of those AI Overview keywords.

SERP featureShare of sampled keyword volume (175 keywords)houtini.com on page 1
People Also Ask91.6%2 keywords
Video71.1%2 keywords
AI Overview67%2 keywords
Discussions and forums8.7%2 keywords

Majestic is optional too. With a key, it adds Trust Flow and Topical Trust Flow to link_intersect. Those are Majestic's scores for how trusted a site's links are, overall and by topic. It then re-sorts the list by editorial authority, which pushes the directories down.

What it replaces, and what it costs

As of September 2026, Semrush costs $139, $199, $299 or $549 a month. Ahrefs includes Site Audit from its $129 plan, with $249, $449 and $1,499 plans above it. A Screaming Frog SEO Spider licence is £199 a year ($279, or €245).

SEO Audit Console is free and open source, under the Apache-2.0 licence, and Search Console is free. DataForSEO and Majestic are the pay-as-you-go extras, and you only need them for competitor and link work. If you grew up on Screaming Frog or Sitebulb, the Site health tab will feel like home, and the DataForSEO tools are what the README calls the Semrush-replacement layer: visibility, top pages, content gap and market sizing.

There are other ways to do SEO with Claude. claude-seo is a set of Claude Code skills, Screaming Frog added its own MCP server in version 24, and Semrush has an MCP server as well. None of them joins your Search Console clicks to a stored crawl of your site and ranks the fixes by clicks per developer-hour.

Agency or in-house

If I still ran an SEO agency, this is the work I'd be doing in house to make things more efficient. If I was an in-house SEO, I'd be doing much the same, so I could challenge my agency to deliver what can't be done in house.

It works, it's powerful and it's saving me days of data collection, so I can get on with the analysis.

Refresh weekly, and run detect changes straight after. That diffs the two latest crawls, so it catches a page that's picked up a new noindex (the tag asking Google to leave a page out of its index), or a 200 that's become a 404. Run the full audit monthly, and re-run it after a fix ships.

Questions people ask

Is SEO Audit Console free?

Yes, under the Apache-2.0 licence. The only money you'd spend is on the optional DataForSEO and Majestic calls.

Does Claude make up the numbers?

No. Claude writes the SQL, and the SQLite database on your own PC does the counting.

Do I still need Screaming Frog or Semrush?

Not for anything on this page: the audit, the fixes and the dashboard above all ran without them. The competitor and market data comes from DataForSEO instead, paid per call.

How often should I run an SEO audit?

Weekly for the refresh and detect changes, and monthly for the full audit.

Can I audit a site I don't own?

Partly. The DataForSEO tools, domain_visibility and top_pages among them, work on any domain. Search Console data only comes from properties you have access to, so the full audit, with its merged checks and its ranking by clicks, needs a site you own or manage.

Where to start

Install SEO Audit Console and tell it to sync your Search Console account. Once the first refresh and crawl have finished, ask Claude to run the audit, then take whatever sits at the top of the list and ask for the fix. Get that one shipped this week, and re-run the audit after it goes live.

Continue reading.