Claude SEO turns Claude Code into an SEO consultant. Give it a URL and /seo audit sends a team of specialist agents across the site at once, checking crawlability, indexing, sitemaps, redirects, Core Web Vitals, content quality and E-E-A-T, structured data, images, local and e-commerce signals and international setup. After 10 to 15 minutes you get a report with an action plan sorted by what matters most, and every item explains why it matters and how you will know the fix worked.
It also looks at AI search. /seo geo scores how likely Google AI Overviews, ChatGPT, Perplexity and Gemini are to quote your pages and whether AI crawlers can reach them, and /seo agentic checks how well AI agents can use the site. Narrower commands cover one page, schema markup, hreflang, sitemaps, topic clusters, content briefs and change tracking between audits. If you connect the free Google APIs (Search Console, PageSpeed Insights, Chrome UX Report and GA4), reports use real field data.
It is built from 26 sub-skills and 19 agents by Daniel Agrici, MIT-licensed, with about 29,000 stars and 49 contributors since February 2026. Version 2.6.0 came out on 10 November 2026. Nine optional extensions connect paid SEO data services such as DataForSEO, Ahrefs and Firecrawl, using your own accounts.
- Repository: github.com/AgriciDaniel/claude-seo
- Licence: MIT (MIT License)
- Language: Python. Stars: 28.9K. Forks: 3,693. Last push: Nov 11, 2026.
- Scan: safe, Nov 13, 2026, commit cca7e4a
Who it is for
Site owners, freelance SEO consultants and agencies who already use Claude Code and want a thorough audit on demand, plus marketers curious how their pages look to AI search. You need Claude Code and a little comfort with its slash commands.
Getting started
1. In Claude Code, add the plugin's marketplace
/plugin marketplace add AgriciDaniel/claude-seo2. Install the plugin
/plugin install claude-seo@agricidaniel-claude-seo3. Set up its own Python environment and headless browser
/seo setup4. Run your first audit
/seo audit https://example.comAudits fetch the pages you point them at, so run them on sites you own or have permission to test. The Google, DataForSEO, Ahrefs and other extensions only send data when you set them up and use their commands.
Safety scan
We cloned AgriciDaniel/claude-seo at commit cca7e4a on Nov 13, 2026 and ran the checks described on the GitHub Tools page: credential patterns, decode-and-execute code, install-time scripts, committed binaries, risky CI workflows, every host the code talks to, known vulnerabilities in pinned dependencies, and project hygiene. A person read every hit. This is what we found.
- No secret hits and no committed binaries across 505 files and about 93,000 lines, mostly Python. All 11 pattern hits are text: echo lines and comments in the installers that print or describe a curl | bash command, and one test comment. The same lines are why the scanner marks five installer scripts as fetching and running a remote script; we read them, and none actually pipes a download into a shell.
- The plugin adds one Claude Code hook. After every Edit or Write, a small Node launcher runs hooks/validate-schema.py on the file, but only if it is HTML, JSX, TSX, Vue, Svelte, PHP or EJS; it checks JSON-LD markup locally and makes no network calls. The manual installer copies skills, agents and scripts into ~/.claude and uses no sudo.
- The extra pass for skill repos found nothing worrying. The hidden characters and injection phrases sit in tests that feed hostile pages to the auditor, and in the code that strips such characters from page text. No exfiltration hosts. The credential paths are cookie-flag checks in its security audit, and the Google commands, which use your gcloud sign-in (~/.config/gcloud) as a fallback when no service account is set up.
- No telemetry, as PRIVACY.md says and the code agrees. The core skill only contacts the sites you audit. Optional extensions and scripts send the domains or URLs you analyze to the service you connect, such as DataForSEO, Firecrawl, Moz, Bing Webmaster or your own Matomo, each listed in PRIVACY.md.
- The one lockfile (uv.lock) pins one package with no known advisories. Three workflows, all first-party actions, no pull_request_target. A security policy, Dependabot, contributing guide and code of conduct are present.
- The README says this public version is free and MIT-licensed, and that members of the author's AI Marketing Hub Pro community, a paid Skool group, get a private version with early access to new features. You do not need it.
What the scanner counted
| Check | Result |
|---|---|
| Secrets | None found. |
| Suspicious code | 11 pattern hits found and read; every one is listed under the raw findings. |
| Install-time code | 32 installer scripts (one fetches and runs a remote script) |
| Committed binaries | None. |
| CI workflows | 3 workflows. None use pull_request_target. No third-party actions. |
| Network hosts | 40 distinct hosts referenced from source; most often www.example.com, e.test, a.test, analytics.example.com. 12 URLs to a bare IP address, listed under the raw findings. |
| Known vulnerabilities | 0 advisories across 1 pinned package: 0 critical, 0 high, 0 moderate, 0 low. uv.lock: 1 packages, 0 advisories. |
| Project hygiene | Has security policy, automated dependency updates, licence file, contributing guide. Missing CodeQL. |
| OpenSSF Scorecard | Not scored: the project is not in Scorecard's weekly index. |
The raw findings
Every hit the scanner wrote out, with a link to the exact line at the scanned commit. Secrets candidates are redacted.
Pattern hits (11)
| Where | Rule | Match |
|---|---|---|
| extensions/ahrefs/install.sh:30 | download-piped-to-shell | echo " Install it first: curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh | bash" |
| extensions/ahrefs/install.sh:35 | download-piped-to-shell | # `./install.sh` and `curl | bash` invocations. |
| extensions/banana/install.sh:25 | download-piped-to-shell | echo " Install it first: curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh | bash" |
| extensions/dataforseo/install.sh:22 | download-piped-to-shell | # Support both traditional (curl|bash → ~/.claude/skills/seo) and marketplace |
| extensions/dataforseo/install.sh:38 | download-piped-to-shell | echo " Install it first: curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh | bash" |
| extensions/dataforseo/install.sh:82 | download-piped-to-shell | # Determine script directory (works for both ./install.sh and curl|bash) |
| extensions/firecrawl/install.sh:25 | download-piped-to-shell | echo " Install it first: curl -fsSL https://raw.githubusercontent.com/AgriciDaniel/claude-seo/main/install.sh | bash" |
| extensions/firecrawl/install.sh:64 | download-piped-to-shell | # Determine script directory (works for both ./install.sh and curl|bash) |
| extensions/unlighthouse/install.sh:20 | download-piped-to-shell | # Support both traditional (curl|bash → ~/.claude/skills/seo) and marketplace |
| install.sh:211 | download-piped-to-shell | echo "To uninstall: curl -fsSL ${REPO_URL}/raw/main/uninstall.sh | bash" |
| tests/test_manifest_consistency.py:163 | download-piped-to-shell (test/example) | Manual-install users via curl | bash got 8 versions stale. This guard |
URLs to bare IP addresses (12)
| Where | Rule | Match |
|---|---|---|
| tests/test_matomo_report.py:772 | ip-literal-url | assert not matomo_auth.resolves_to_private_address("https://93.184.216.34") |
| tests/test_transport_check.py:280 | ip-literal-url | "https://100.100.100.200/", |
| tests/test_url_safety.py:168 | ip-literal-url | "http://1.1.1.1", |
| tests/test_url_safety.py:203 | ip-literal-url | url, ip = url_safety.validate_url_strict("https://1.1.1.1/") |
| tests/test_url_safety.py:205 | ip-literal-url | assert url == "https://1.1.1.1/" |
| tests/test_url_safety.py:215 | ip-literal-url | "http://100.100.100.200/latest/meta-data/", |
| tests/test_url_safety.py:974 | ip-literal-url | assert url_safety.validate_url("http://100.101.102.103/") is False |
| tests/test_url_safety.py:1012 | ip-literal-url | assert url_safety.validate_url("http://100.101.102.103/") is True |
| tests/test_url_safety.py:1013 | ip-literal-url | assert url_safety.validate_url("https://100.101.102.103:8443/staging") is True |
| tests/test_url_safety.py:1014 | ip-literal-url | assert url_safety.validate_url_strict("http://100.101.102.103/")[1] == ( |
| tests/test_url_safety_port_pin.py:234 | ip-literal-url | ("100.101.102.103", 80): _redirect("http://100.101.102.103:8080/"), |
| tests/test_url_safety_port_pin.py:239 | ip-literal-url | assert _get("http://100.101.102.103/", net).content == b"staging" |
Installer scripts (32)
- extensions/ahrefs/install.ps1, 62 lines
- extensions/ahrefs/install.sh, 97 lines, fetches and runs a remote script; talks to ahrefs.com, example.com, raw.githubusercontent.com
- extensions/ahrefs/uninstall.sh, 34 lines
- extensions/banana/install.sh, 195 lines, fetches and runs a remote script; talks to aistudio.google.com, nodejs.org, raw.githubusercontent.com
- extensions/banana/uninstall.sh, 44 lines
- extensions/bing-webmaster/install.ps1, 41 lines
- extensions/bing-webmaster/install.sh, 64 lines; talks to example.com, www.bing.com
- extensions/bing-webmaster/uninstall.sh, 22 lines
- extensions/dataforseo/install.ps1, 154 lines; talks to app.dataforseo.com, nodejs.org, raw.githubusercontent.com
- extensions/dataforseo/install.sh, 184 lines, fetches and runs a remote script; talks to app.dataforseo.com, nodejs.org, raw.githubusercontent.com
- extensions/dataforseo/uninstall.ps1, 59 lines
- extensions/dataforseo/uninstall.sh, 40 lines
- extensions/firecrawl/install.ps1, 109 lines; talks to example.com, raw.githubusercontent.com, www.firecrawl.dev
- extensions/firecrawl/install.sh, 151 lines, fetches and runs a remote script; talks to example.com, nodejs.org, raw.githubusercontent.com, www.firecrawl.dev
- extensions/firecrawl/uninstall.ps1, 38 lines
- extensions/firecrawl/uninstall.sh, 33 lines
- extensions/matomo/install.ps1, 67 lines; talks to analytics.example.com
- extensions/matomo/install.sh, 95 lines; talks to analytics.example.com
- extensions/matomo/uninstall.sh, 54 lines
- extensions/profound/install.ps1, 32 lines
- extensions/profound/install.sh, 46 lines
- extensions/profound/uninstall.sh, 18 lines
- extensions/seranking/install.ps1, 45 lines
- extensions/seranking/install.sh, 60 lines; talks to seranking.com
- extensions/seranking/uninstall.sh, 20 lines
- extensions/unlighthouse/install.ps1, 13 lines
- extensions/unlighthouse/install.sh, 47 lines; talks to example.com
- extensions/unlighthouse/uninstall.sh, 6 lines
- install.ps1, 385 lines; talks to example.com, github.com
- install.sh, 215 lines, fetches and runs a remote script; talks to example.com, github.com
- uninstall.ps1, 70 lines
- uninstall.sh, 65 lines
By the numbers
| Stars | 28.9K |
|---|---|
| Forks | 3,693 |
| Contributors | 49 |
| Commits | 543 |
| Open issues | 14 |
| Open pull requests | 41 |
| Releases | 32 |
| Latest release | v2.6.0 |
| Licence | MIT |
| Main language | Python |
| Project age | 9 months |
| Last push | Nov 11, 2026 |
| Tracked files | 505 |
| Lines of code | 93.2K |
| Checkout size | 8 MB |
Lines by language: Python 57.2K, Markdown 30.4K, JSON 1,509, Shell 1,490, PowerShell 1,075, YAML 878.
Questions
Is Claude SEO free?
Yes. It is MIT-licensed with no per-site pricing or usage limits. You need Claude Code, and the optional extensions connect to paid services only if you add your own accounts. A paid community gets early access to new features in a private version.
Do I need API keys?
No. Audits work out of the box. Connecting the free Google APIs adds real Search Console and field speed data, and paid tools such as DataForSEO or Ahrefs add backlink and keyword data if you have them.
Does it check AI search like ChatGPT and AI Overviews?
Yes. /seo geo scores how quotable your pages are, checks that AI crawlers can reach them and looks at your brand's presence on sites AI answers often cite. It follows Google's own advice that AI search still starts with ordinary SEO.
Will it change my website?
Not by itself. Audits read your pages and write reports. It can generate schema markup, sitemaps or hreflang tags for you to add, and any edits to your project go through Claude Code's normal permission prompts.
This post is part of GitHub Tools, where every repository is cloned and scanned before it is written up. The scan is a snapshot of one commit on one day; the repository has moved on since, so check it before you install.
