seo
is a local CLI, MCP server, and report engine using crawl, Search Console,
Google Analytics or Clicky, optional Bing evidence, and optional research providers.
Reports keep observations, estimates, findings, caveats, costs, and provenance
separate. Storage stays local; requested crawls and provider operations still
make direct network requests. Discover reports at runtime instead of
memorising them.
Discover, describe, run
With the MCP server (preferred):
- returns report ids and purposes, optionally by category.
- returns one report's usage, schema, reading order,
limits, verification, and related ids.
- runs bounded . Read , not display
text.
The same catalog exists without MCP:
bash
seo reports list --json
seo reports describe <report-id> --json
seo reports run <report-id> --params '<json>' --json
Describe a report before its first run. Follow
,
, and
; reuse its schema and do not guess parameters. When
exists, fetch guidance only for failed or warning ids in
with
using
and
(CLI:
seo reports describe <report-id> --check <check-id>
).
Setup and selection
Use
or
when auth is unknown. Select profiles with
and list them with
. Without one,
pass
--site sc-domain:example.com
or
--url https://example.com
. Crawl audits
need no Google connection. Agent commands use
, which never prompts.
Common jobs
Run the first report, read it, then decide. Do not run a whole chain blindly.
| Job | Reports |
|---|
| Page not indexed or missing from Google | , (URL Inspection), , |
| Traffic or clicks dropped | search-performance-overview
, , , , , |
| Audit a whole site | with , command (main report), full only if needed, , |
| More clicks from existing pages | , , , , |
| AI agent readiness for a content site | , , , |
| AI search visibility and eligibility | , , , , , |
| Plan content from real demand | , , , |
| Research keywords and current results | , , , |
| Turn a topic into a keyword and competitor shortlist | competitive-opportunities
, then inspect the decision-critical pages or links |
| Research local demand and page patterns | , then or for a fixed market when needed |
| Find search competitors and plausible gaps | , , , , |
| Research programmatic SEO patterns | for observed queries and declared term, pair, or matrix sets; , , or for deeper research; then for existing templates |
| Catch regressions over time | , , , after a fix ships |
| Track exact keyword positions | for a saved set and fixed market/device; for one current query |
| Review Bing traffic, crawl, query, and page insights | , then when live page evidence is needed |
| Review backlink context and linked targets | , , then verify selected results, referring URLs, and flagged targets directly |
| Review real crawler requests in a server log | , then verify important errors against the original log and server configuration |
| Client-ready reporting | , , |
| Turn crawl findings into tickets | , , |
Without provider API access, describe
,
,
, or
and pass one to four local
ranked-keyword exports through
. Read
before
using the rows. If headings are unfamiliar, use the report schema's explicit
map rather than guessing. File dates, hashes, included fields, column
mappings, filtered historical rows, rejected rows, and caps define the evidence
boundary.
Use
first for a broad performance question with a known project.
For a large or unfamiliar URL, run sitemap health before a full crawl.
Create a client HTML report
For a polished or branded report, create one standalone HTML file from
structured data. Built-in
is a predictable fallback. Start with
compact JSON and request
only when deeper evidence is needed. Follow
supplied brand direction and design for the findings. Use responsive,
accessible, print-friendly HTML, embedded CSS,
, and no remote
scripts or assets.
Show site, period, generated date, provider labels, data status, priorities,
limitations, and verification. Preserve partial, capped, sampled, missing, and
skipped states. Keep observations separate from interpretation and providers
separate from each other. Never invent scores, forecasts, causes, or missing
values. Omit secrets and unnecessary raw rows. Save locally and report the path.
For a large site, run
with
and an explicit
when known. Read
,
, failures, limits, and
sitemap completeness. Full crawl second only for page content, metadata,
canonicals, links, structured data, or rendered HTML.
Requests use
SEO-Skill/<version> (+https://seoskill.dev)
. For
, show provider evidence and the identity. Ask for a
temporary exception scoped by audit IP, host or paths, and blocking rule. Never
recommend a User-Agent-only bypass.
Evidence rules
- Check , selection counts, , and before
summarising any report. Name skipped or incomplete evidence first.
- Partial, capped, filtered, or sampled sources never support a zero or an
all-clear. Grouped Search Console totals undercount because anonymised query
rows are withheld.
- Values marked heuristic are prioritisation aids, not forecasts. Never
promise clicks, rankings, indexing, or AI citations from any report.
- Quote and when explaining a recommendation, and
give the user the report's verification step alongside any suggested change.
- If a report returns no rows, say so plainly.
- Intentional controls such as , canonicals, and robots rules are
observations until the user confirms they are unintended.
- Provider traffic, volume, difficulty, visibility, intent, authority, and
ranking history are estimates. Keep them separate from Search Console,
connected analytics, crawl, and live result evidence.
Beyond the report catalog
Use
for direct provider and administration commands. Bing setup
uses
; link evidence uses
seo links --project <id> --json
,
seo links --provider ahrefs --target <domain> --json
,
seo links --provider dataforseo --target <domain> --json
, or a local file.
IndexNow writes externally: validate with
seo indexnow submit --dry-run --json
and remove dry run only when authorised.
Receipt does not prove crawling or indexing. Prefer registered reports.
Use
or
only when fresh data is requested. Sitemap
health always bypasses page-body cache and never writes page responses.