seo 0.1.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PRIVACY.md +2 -2
- package/README.md +138 -42
- package/TERMS.md +2 -2
- package/TRADEMARKS.md +9 -5
- package/dist/cli.js +69 -52
- package/dist/cli.js.map +1 -1
- package/dist/{dist-CSY2_p-j.js → dist-CTBhWxn6.js} +49 -49
- package/dist/dist-CTBhWxn6.js.map +1 -0
- package/dist/{dist-FeAUNn9A.js → dist-eiewVfiS.js} +1 -1
- package/dist/index.d.ts +186 -94
- package/dist/index.js +843 -415
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +18 -1
- package/dist/mcp.js +6532 -4665
- package/dist/mcp.js.map +1 -1
- package/dist/{package-uzXzqDW6.js → package-BTOI9tde.js} +2 -2
- package/dist/{package-uzXzqDW6.js.map → package-BTOI9tde.js.map} +1 -1
- package/evals/README.md +117 -0
- package/evals/affected-urls.json +57 -0
- package/evals/ai-readiness.json +84 -0
- package/evals/ai-referrals.json +71 -0
- package/evals/ai-search-scorecard.json +70 -0
- package/evals/audit-page.json +57 -0
- package/evals/audit-urls.json +58 -0
- package/evals/cannibalisation.json +57 -0
- package/evals/community-intent.json +57 -0
- package/evals/compare-crawls.json +56 -0
- package/evals/content-optimization.json +57 -0
- package/evals/crawl-diff.json +58 -0
- package/evals/crawl-history.json +44 -0
- package/evals/crawl-report.json +44 -0
- package/evals/crawler-rules.json +44 -0
- package/evals/ctr-underperformers.json +57 -0
- package/evals/decaying-pages.json +57 -0
- package/evals/entity-readiness.json +57 -0
- package/evals/explain-crawl-issue.json +44 -0
- package/evals/generate-llms-txt.json +44 -0
- package/evals/geo-gaps.json +57 -0
- package/evals/index-coverage-plan.json +58 -0
- package/evals/index-coverage.json +70 -0
- package/evals/index-monitor.json +58 -0
- package/evals/index-watch.json +68 -0
- package/evals/internal-links.json +57 -0
- package/evals/link-recovery.json +58 -0
- package/evals/llms-txt-audit.json +44 -0
- package/evals/measure-change.json +58 -0
- package/evals/monthly-action-plan.json +56 -0
- package/evals/monthly-report.json +58 -0
- package/evals/narrative-report.json +58 -0
- package/evals/okf-build.json +44 -0
- package/evals/okf-validate.json +44 -0
- package/evals/page-opportunities.json +57 -0
- package/evals/performance-audit.json +57 -0
- package/evals/pseo-audit.json +84 -0
- package/evals/query-clusters.json +57 -0
- package/evals/quick-wins.json +86 -0
- package/evals/redirect-trace.json +57 -0
- package/evals/refresh-priorities.json +57 -0
- package/evals/search-performance-overview.json +86 -0
- package/evals/second-page.json +58 -0
- package/evals/segment-impact.json +57 -0
- package/evals/seo-fix-queue.json +85 -0
- package/evals/seo-geo-readiness.json +84 -0
- package/evals/seo-site-audit.json +85 -0
- package/evals/seo-to-ai-query.json +57 -0
- package/evals/seo.json +87 -0
- package/evals/setup-check.json +56 -0
- package/evals/site-crawl.json +44 -0
- package/evals/striking-distance.json +85 -0
- package/evals/technical-watch.json +57 -0
- package/evals/top-fixes.json +44 -0
- package/evals/traffic-anomaly.json +57 -0
- package/evals/update-correlation.json +57 -0
- package/evals/update-postmortem.json +57 -0
- package/package.json +5 -3
- package/skills/README.md +50 -61
- package/skills/seo/SKILL.md +88 -63
- package/skills/seo/agents/openai.yaml +2 -2
- package/dist/dist-CSY2_p-j.js.map +0 -1
- package/skills/affected-urls/SKILL.md +0 -39
- package/skills/affected-urls/agents/openai.yaml +0 -4
- package/skills/ai-readiness/SKILL.md +0 -34
- package/skills/ai-readiness/agents/openai.yaml +0 -4
- package/skills/ai-referrals/SKILL.md +0 -31
- package/skills/ai-referrals/agents/openai.yaml +0 -4
- package/skills/audit-page/SKILL.md +0 -50
- package/skills/audit-page/agents/openai.yaml +0 -4
- package/skills/audit-urls/SKILL.md +0 -39
- package/skills/audit-urls/agents/openai.yaml +0 -4
- package/skills/cannibalisation/SKILL.md +0 -31
- package/skills/cannibalisation/agents/openai.yaml +0 -4
- package/skills/community-intent/SKILL.md +0 -39
- package/skills/community-intent/agents/openai.yaml +0 -4
- package/skills/compare-crawls/SKILL.md +0 -40
- package/skills/compare-crawls/agents/openai.yaml +0 -4
- package/skills/content-optimization/SKILL.md +0 -31
- package/skills/content-optimization/agents/openai.yaml +0 -4
- package/skills/crawl-diff/SKILL.md +0 -51
- package/skills/crawl-diff/agents/openai.yaml +0 -4
- package/skills/crawl-history/SKILL.md +0 -37
- package/skills/crawl-history/agents/openai.yaml +0 -4
- package/skills/crawl-report/SKILL.md +0 -37
- package/skills/crawl-report/agents/openai.yaml +0 -4
- package/skills/crawler-rules/SKILL.md +0 -34
- package/skills/crawler-rules/agents/openai.yaml +0 -4
- package/skills/ctr-underperformers/SKILL.md +0 -31
- package/skills/ctr-underperformers/agents/openai.yaml +0 -4
- package/skills/decaying-pages/SKILL.md +0 -31
- package/skills/decaying-pages/agents/openai.yaml +0 -4
- package/skills/entity-readiness/SKILL.md +0 -34
- package/skills/entity-readiness/agents/openai.yaml +0 -4
- package/skills/explain-crawl-issue/SKILL.md +0 -32
- package/skills/explain-crawl-issue/agents/openai.yaml +0 -4
- package/skills/generate-llms-txt/SKILL.md +0 -37
- package/skills/generate-llms-txt/agents/openai.yaml +0 -4
- package/skills/geo-gaps/SKILL.md +0 -37
- package/skills/geo-gaps/agents/openai.yaml +0 -4
- package/skills/index-coverage/SKILL.md +0 -84
- package/skills/index-coverage/agents/openai.yaml +0 -4
- package/skills/index-coverage-plan/SKILL.md +0 -50
- package/skills/index-coverage-plan/agents/openai.yaml +0 -4
- package/skills/index-monitor/SKILL.md +0 -49
- package/skills/index-monitor/agents/openai.yaml +0 -4
- package/skills/index-watch/SKILL.md +0 -77
- package/skills/index-watch/agents/openai.yaml +0 -4
- package/skills/internal-links/SKILL.md +0 -31
- package/skills/internal-links/agents/openai.yaml +0 -4
- package/skills/link-recovery/SKILL.md +0 -51
- package/skills/link-recovery/agents/openai.yaml +0 -4
- package/skills/llms-txt-audit/SKILL.md +0 -34
- package/skills/llms-txt-audit/agents/openai.yaml +0 -4
- package/skills/measure-change/SKILL.md +0 -52
- package/skills/measure-change/agents/openai.yaml +0 -4
- package/skills/monthly-action-plan/SKILL.md +0 -50
- package/skills/monthly-action-plan/agents/openai.yaml +0 -4
- package/skills/monthly-report/SKILL.md +0 -50
- package/skills/monthly-report/agents/openai.yaml +0 -4
- package/skills/narrative-report/SKILL.md +0 -51
- package/skills/narrative-report/agents/openai.yaml +0 -4
- package/skills/okf-build/SKILL.md +0 -39
- package/skills/okf-build/agents/openai.yaml +0 -4
- package/skills/okf-validate/SKILL.md +0 -43
- package/skills/okf-validate/agents/openai.yaml +0 -4
- package/skills/page-opportunities/SKILL.md +0 -31
- package/skills/page-opportunities/agents/openai.yaml +0 -4
- package/skills/performance/SKILL.md +0 -50
- package/skills/performance/agents/openai.yaml +0 -4
- package/skills/performance-audit/SKILL.md +0 -31
- package/skills/performance-audit/agents/openai.yaml +0 -4
- package/skills/pseo-audit/SKILL.md +0 -103
- package/skills/pseo-audit/agents/openai.yaml +0 -4
- package/skills/query-clusters/SKILL.md +0 -31
- package/skills/query-clusters/agents/openai.yaml +0 -4
- package/skills/quick-wins/SKILL.md +0 -31
- package/skills/quick-wins/agents/openai.yaml +0 -4
- package/skills/redirect-trace/SKILL.md +0 -51
- package/skills/redirect-trace/agents/openai.yaml +0 -4
- package/skills/refresh-priorities/SKILL.md +0 -48
- package/skills/refresh-priorities/agents/openai.yaml +0 -4
- package/skills/search-performance-overview/SKILL.md +0 -48
- package/skills/search-performance-overview/agents/openai.yaml +0 -4
- package/skills/second-page/SKILL.md +0 -50
- package/skills/second-page/agents/openai.yaml +0 -4
- package/skills/segment-impact/SKILL.md +0 -50
- package/skills/segment-impact/agents/openai.yaml +0 -4
- package/skills/seo-fix-queue/SKILL.md +0 -50
- package/skills/seo-fix-queue/agents/openai.yaml +0 -4
- package/skills/seo-geo-readiness/SKILL.md +0 -60
- package/skills/seo-geo-readiness/agents/openai.yaml +0 -4
- package/skills/seo-site-audit/SKILL.md +0 -59
- package/skills/seo-site-audit/agents/openai.yaml +0 -4
- package/skills/seo-to-ai-query/SKILL.md +0 -31
- package/skills/seo-to-ai-query/agents/openai.yaml +0 -4
- package/skills/setup-check/SKILL.md +0 -49
- package/skills/setup-check/agents/openai.yaml +0 -4
- package/skills/site-crawl/SKILL.md +0 -39
- package/skills/site-crawl/agents/openai.yaml +0 -4
- package/skills/striking-distance/SKILL.md +0 -52
- package/skills/striking-distance/agents/openai.yaml +0 -4
- package/skills/technical-watch/SKILL.md +0 -49
- package/skills/technical-watch/agents/openai.yaml +0 -4
- package/skills/top-fixes/SKILL.md +0 -38
- package/skills/top-fixes/agents/openai.yaml +0 -4
- package/skills/traffic-anomaly/SKILL.md +0 -52
- package/skills/traffic-anomaly/agents/openai.yaml +0 -4
- package/skills/update-correlation/SKILL.md +0 -51
- package/skills/update-correlation/agents/openai.yaml +0 -4
- package/skills/update-postmortem/SKILL.md +0 -49
- package/skills/update-postmortem/agents/openai.yaml +0 -4
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: affected-urls
|
|
3
|
-
description: Find the exact crawl issues attached to individual URLs and preserve their joined traffic evidence. Use when turning a rule, category, or severity group into a bounded implementation list.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Find affected URLs
|
|
7
|
-
|
|
8
|
-
Use this report after a crawl has identified a technical pattern. A rule count is useful for triage, but implementation needs the exact URLs, the observed evidence, and a stable source crawl. Prefer `reportId` so every follow-up refers to the same snapshot; pass `url` only when a new crawl is intentional.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, call `seo_list_reports` with category `crawl` only when discovery is needed. Then call `seo_describe_report` with `{ "id": "affected-urls" }`. Finally call `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "affected-urls",
|
|
17
|
-
"params": {
|
|
18
|
-
"reportId": "crawl_example_20260710",
|
|
19
|
-
"ruleId": "missing_title",
|
|
20
|
-
"severity": "high",
|
|
21
|
-
"limit": 50
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Read MCP `structuredContent` as the contract and check `isError` before using it. The text result is a compact explanation, not the data source.
|
|
27
|
-
|
|
28
|
-
The CLI exposes the same report:
|
|
29
|
-
|
|
30
|
-
```sh
|
|
31
|
-
seo reports describe affected-urls --json
|
|
32
|
-
seo reports run affected-urls --params '{"reportId":"crawl_example_20260710","ruleId":"missing_title","severity":"high","limit":50}' --json
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Read and act
|
|
36
|
-
|
|
37
|
-
Each row ties a URL to a rule, category, severity, and crawler evidence. Optional clicks, impressions, and sessions help order work, but inspect `dataSources` first: unavailable provider data must not be interpreted as a real zero. Results are sorted deterministically by severity, joined demand signals, and URL. The `selection` object reports `totalMatchedRows`, `returnedRows`, `limit`, and `truncated`; preserve it whenever the URL array is passed downstream.
|
|
38
|
-
|
|
39
|
-
Check the requested filters, selection metadata, original crawl cap, warnings, and caveats before calling the set complete. `truncated: true` means more matching issue rows exist in this report than were returned. A capped or partial crawl only supports "affected among evaluated pages." Create fixes from the observed evidence, sample several URL templates, and use `explain-crawl-issue` for rule guidance. Re-run the same bounded crawl after deployment to verify that the rule no longer triggers; disappearance from a differently scoped crawl is not verification.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ai-readiness
|
|
3
|
-
description: Assess technical AI-search readiness without inventing a visibility score or citation forecast. Use when checking access, indexability, snippets, page structure, and optional agent resources from crawl evidence.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Assess AI readiness
|
|
7
|
-
|
|
8
|
-
AI-search systems can only use content they can retrieve and interpret, but technical eligibility is not selection. This report keeps access, indexability, snippet controls, content observations, bot policy, and agent resources separate. It deliberately returns an evidence-only assessment instead of an aggregate score.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, call `seo_list_reports` with category `crawl` if the report id is not already known. Call `seo_describe_report` with `{ "id": "ai-readiness" }`, then `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "ai-readiness",
|
|
17
|
-
"params": { "reportId": "crawl_example_20260710" }
|
|
18
|
-
}
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Use `structuredContent` after confirming `isError` is false. The equivalent CLI flow is:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe ai-readiness --json
|
|
25
|
-
seo reports run ai-readiness --params '{"reportId":"crawl_example_20260710"}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Supplying `url` instead of `reportId` starts a fresh crawl. Reusing a saved report makes this assessment comparable with other follow-ups.
|
|
29
|
-
|
|
30
|
-
## Interpret the assessment
|
|
31
|
-
|
|
32
|
-
Start with `dataStatus`, the crawl caveats, and each check's `evaluated` flag. `unknown` means the necessary evidence was unavailable; it is not a failure or a pass. Bot access describes the observed policy for the crawl entry point, not proven access to every URL. Valid JSON-LD is syntax evidence, not proof of entity recognition or rich-result eligibility. An optional protocol file can aid machine discovery but its absence is not a search defect.
|
|
33
|
-
|
|
34
|
-
Prioritize hard technical conflicts first: failed responses, blocked crawling, explicit non-indexing, or restrictive snippet directives where those settings contradict publisher intent. Then review semantic structure and answerable content as observations, not requirements. Verify changes with a fresh crawl using the same scope. Never translate a clean report into claims about indexing, rankings, AI visibility, selection, citations, or traffic; those outcomes require separate evidence.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ai-referrals
|
|
3
|
-
description: Measure sessions and landing pages attributed to known AI referral sources in GA4; use when an agent needs bounded analytics evidence without equating missing referrers with zero AI visibility.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# AI referrals
|
|
7
|
-
|
|
8
|
-
Use this report to see which known AI referral domains appeared as GA4 session sources, which landing pages received those sessions, and how activity changed by day. It is useful for observed referral analysis, not for measuring every mention or citation. Referrers can be stripped, reclassified, or recorded as direct or unassigned traffic, so an empty result is not proof that no AI system sent or cited the site.
|
|
9
|
-
|
|
10
|
-
## Run the report
|
|
11
|
-
|
|
12
|
-
Use the compact MCP flow:
|
|
13
|
-
|
|
14
|
-
1. Call `seo_list_reports` with `{"category":"ai-search"}`.
|
|
15
|
-
2. Call `seo_describe_report` with `{"id":"ai-referrals"}` and inspect the current schema.
|
|
16
|
-
3. Call `seo_run_report` with `{"id":"ai-referrals","params":{"property":"123456789","startDate":"28daysAgo","endDate":"yesterday","limit":25}}`.
|
|
17
|
-
|
|
18
|
-
The CLI uses the same registry and handler:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
seo reports describe ai-referrals --json
|
|
22
|
-
seo reports run ai-referrals --params '{"property":"123456789","startDate":"28daysAgo","endDate":"yesterday","resultLimit":25}' --json
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`property` is required. Dates accept `YYYY-MM-DD` or GA4 relative dates such as `28daysAgo`. `maxRows` bounds retained provider rows. `resultLimit` controls how many of the highest-session landing pages are returned (25 by default); use it to ask for a smaller or larger ranked review set. `limit` is a legacy alias for `maxRows`, so do not use it in new commands.
|
|
26
|
-
|
|
27
|
-
## Interpret and act
|
|
28
|
-
|
|
29
|
-
Start with `dataStatus`, `range`, `methodology`, and `dataSource.partialReasons`. Check `possiblyTruncated`, query-level statuses, warnings, returned rows, and the GA4 time zone before comparing totals. `summary.sessions` and `summary.eventCount` are additive; `summary.totalUsers` can be unavailable and must not be reconstructed by adding per-source or per-page values. Check `selection.landingPages` before treating `landingPages` as the whole retained breakdown: it states the output limit and any lower-ranked rows omitted from the response. Use `sources[].observedSessionSources` to preserve the exact attribution evidence, `shareOfAiSessions` only within detected AI sessions, and the returned `landingPages` to choose pages for a qualitative review.
|
|
30
|
-
|
|
31
|
-
Safe actions include checking whether high-volume landing pages answer the referring context, comparing complete like-for-like periods, and annotating material changes. Do not claim that referral sessions caused conversions, represent all AI traffic, or reveal the prompt, answer, citation, or user intent that produced the visit.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: audit-page
|
|
3
|
-
description: Audit one fetched URL for technical and on-page evidence. Use it to inspect a specific page without turning page-level observations into sitewide claims.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Audit page
|
|
7
|
-
|
|
8
|
-
Use this report when a URL needs direct inspection: after a release, while
|
|
9
|
-
investigating a search result, or before recommending a page edit. It combines
|
|
10
|
-
the fetched document with metadata, headings, links, structured data, and
|
|
11
|
-
optional GSC evidence. It does not prove how every crawler rendered the page,
|
|
12
|
-
that Google indexed the fetched version, or that an observed convention affects
|
|
13
|
-
rankings.
|
|
14
|
-
|
|
15
|
-
## Run it
|
|
16
|
-
|
|
17
|
-
Use the exact MCP discovery flow:
|
|
18
|
-
|
|
19
|
-
1. Call `seo_list_reports` with `category: "reporting"` and select `audit-page`.
|
|
20
|
-
2. Call `seo_describe_report` with `id: "audit-page"`; do not guess fields.
|
|
21
|
-
3. Call `seo_run_report` with `id: "audit-page"` and parameters matching that schema.
|
|
22
|
-
|
|
23
|
-
The CLI has the same contract:
|
|
24
|
-
|
|
25
|
-
```sh
|
|
26
|
-
seo reports describe audit-page --json
|
|
27
|
-
seo reports run audit-page --params '{"url":"https://example.com/product","site":"sc-domain:example.com","refresh":true}' --json
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
`url` is required. `site` adds Search Console context when access exists.
|
|
31
|
-
Enable `js` only when client rendering is necessary; omitted rendering behavior
|
|
32
|
-
is selected by the report. `refresh` bypasses reusable cached evidence.
|
|
33
|
-
|
|
34
|
-
## Interpret and act
|
|
35
|
-
|
|
36
|
-
Start with `fetchDiagnostics`, warnings, and the final fetched URL. A redirect,
|
|
37
|
-
blocked response, rendering failure, or non-HTML response limits every later
|
|
38
|
-
observation. Then inspect the observed page fields, structured-data findings,
|
|
39
|
-
issues, and recommendations. Title pixel width is an estimator for review, not
|
|
40
|
-
a Google limit. Heading counts describe document structure; more or fewer than
|
|
41
|
-
one H1 is not automatically a defect. Content length is evidence, not a quality
|
|
42
|
-
score. If GSC metrics are present, keep their window and property semantics
|
|
43
|
-
attached.
|
|
44
|
-
|
|
45
|
-
Safe actions are concrete and reversible: repair a broken canonical, make
|
|
46
|
-
important content available in the fetched HTML, correct invalid structured
|
|
47
|
-
data, or investigate a failed response. Verify intent before changing
|
|
48
|
-
`noindex`, canonicals, robots controls, headings, or snippet directives. One
|
|
49
|
-
page cannot support a sitewide conclusion. Read MCP `structuredContent` as the
|
|
50
|
-
machine contract and use Markdown only for the human explanation.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: audit-urls
|
|
3
|
-
description: Audit a known URL set without implying sitewide coverage and optionally save the snapshot for follow-ups. Use for release checks, templates, migrations, or a bounded remediation list.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Audit an explicit URL list
|
|
7
|
-
|
|
8
|
-
Use this report when the URLs are already known. It avoids sitemap discovery and link traversal, so the result answers "what was observed on these pages?" rather than "what is wrong across the site?" This makes it useful for pre-release checks, representative templates, and verifying a fix list.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, discover with `seo_list_reports` category `crawl` only if needed. Describe the contract with `seo_describe_report` and `{ "id": "audit-urls" }`. Then call `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "audit-urls",
|
|
17
|
-
"params": {
|
|
18
|
-
"urls": [
|
|
19
|
-
"https://example.com/",
|
|
20
|
-
"https://example.com/pricing"
|
|
21
|
-
],
|
|
22
|
-
"includeIssues": true,
|
|
23
|
-
"saveReport": true
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Check `isError`, then consume `structuredContent`. CLI parity is exact:
|
|
29
|
-
|
|
30
|
-
```sh
|
|
31
|
-
seo reports describe audit-urls --json
|
|
32
|
-
seo reports run audit-urls --params '{"urls":["https://example.com/","https://example.com/pricing"],"includeIssues":true,"saveReport":true}' --json
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Read and verify
|
|
36
|
-
|
|
37
|
-
Compare requested URLs with attempted, fetched, failed, retained, and omitted counts. Review response evidence, issue summaries, `requestEvidenceStatus`, warnings, and caveats before acting. `includeIssues` returns the rule inventory; `includePages` adds larger page and request records and should only be enabled when the decision needs them. Saving the report gives later commands a stable `reportId`.
|
|
38
|
-
|
|
39
|
-
A successful sample does not prove the same template works everywhere, and a failed request may reflect a transient network condition rather than a persistent SEO defect. Group findings by shared implementation, confirm intentional canonicals, robots directives, and `noindex` settings with the publisher, then fix the template rather than individual URLs where appropriate. Re-run the identical URL list after deployment. A URL omitted from the next request is not a verified fix, and this bounded audit must never be described as complete site coverage.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: cannibalisation
|
|
3
|
-
description: Find retained GSC queries with material exposure across multiple URLs; use when an agent needs an intent and technical review queue rather than an automatic consolidation verdict.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Multi-URL query exposure
|
|
7
|
-
|
|
8
|
-
Use this report to find exact normalized queries whose retained GSC impressions are materially distributed across more than one URL. It combines query/page exposure with property-level query demand, suppresses low-actionability cases, and ranks review candidates using demand and secondary exposure. Multiple ranking URLs can be correct for mixed intent, local/entity results, or distinct page purposes, so the report deliberately calls them URL-overlap candidates rather than proven harmful cannibalisation.
|
|
9
|
-
|
|
10
|
-
## Run the report
|
|
11
|
-
|
|
12
|
-
Use the compact MCP flow:
|
|
13
|
-
|
|
14
|
-
1. Call `seo_list_reports` with `{"category":"opportunities"}`.
|
|
15
|
-
2. Call `seo_describe_report` with `{"id":"cannibalisation"}`.
|
|
16
|
-
3. Call `seo_run_report` with `{"id":"cannibalisation","params":{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"includeBrand":false}}`.
|
|
17
|
-
|
|
18
|
-
The CLI runs the identical definition:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
seo reports describe cannibalisation --json
|
|
22
|
-
seo reports run cannibalisation --params '{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"includeBrand":false}' --json
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`site` is required. `brandTerms` accepts up to 20 explicit terms; use `includeBrand:true` only when navigational brand overlap is part of the investigation.
|
|
26
|
-
|
|
27
|
-
## Interpret and act
|
|
28
|
-
|
|
29
|
-
Start with `dataStatus`, both `source.pageExposure` and `source.propertyDemand`, their validation counts, caps, and `source.completeness`. A partial or possibly truncated source cannot support an all-clear. Use `selection` to see why groups were excluded or suppressed. Within each item, inspect every page's clicks, impressions, position, impression share, template, `reviewContext`, HHI, and secondary exposure. `suggestedOwnerUrl` is chosen mechanically by clicks, then impressions, then position; its confidence is low and `requiresIntentReview` is true. `priority.score` is a heuristic, not estimated click lift.
|
|
30
|
-
|
|
31
|
-
Safe actions include comparing intent and live SERPs, checking canonicals and redirects, clarifying internal-link ownership, or differentiating genuinely distinct pages. Consolidate only when intent, content, technical signals, and business purpose agree. Never redirect or canonicalize a secondary URL solely because it appears in this report.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: community-intent
|
|
3
|
-
description: Find explicit forum, comparison, review, experience, and recommendation language in retained Google Search Console queries. Use when an agent needs to review community-style search intent, rank query hypotheses, or decide which ranking pages need manual intent and SERP inspection.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Community intent
|
|
7
|
-
|
|
8
|
-
Call `seo_list_reports` with category `ai-search` when discovery is needed.
|
|
9
|
-
Call `seo_describe_report` with id `community-intent`, then call
|
|
10
|
-
`seo_run_report` with that id and only the described parameters. Read
|
|
11
|
-
`structuredContent` as the machine contract. Use the CLI when MCP is
|
|
12
|
-
unavailable:
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
seo reports describe community-intent --json
|
|
16
|
-
seo reports run community-intent --params '{"site":"sc-domain:example.com","days":90,"minImpressions":20,"limit":25}' --json
|
|
17
|
-
seo community-intent --project <project> --json
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
The generic runner validates the exact MCP schema before any provider call.
|
|
21
|
-
Use the focused command when a human needs named flags and project-profile
|
|
22
|
-
selection. Both paths execute the same report.
|
|
23
|
-
|
|
24
|
-
For a reproducible report pass `startDate` and `endDate` to MCP or use `--start-date` and `--end-date` in the CLI. Keep the range inside `source.availableDateWindow`. Do not combine an exact range with `days`.
|
|
25
|
-
|
|
26
|
-
## Read the evidence first
|
|
27
|
-
|
|
28
|
-
1. Check `dataStatus`, `source.completeness`, `warnings`, and `caveats`.
|
|
29
|
-
2. Use `selection.classifiedRows` for every retained match. Use `selection.returnedRows` for the limited result set.
|
|
30
|
-
3. Treat a capped or partial zero as inconclusive. GSC may omit lower-click queries.
|
|
31
|
-
4. Report `intent`, `signals`, and `matchedTerms` as low-confidence language heuristics.
|
|
32
|
-
|
|
33
|
-
The classifier uses English patterns. It does not inspect the live SERP, identify the ranking URL, or verify page content. Never state that a page has a content gap from this report alone.
|
|
34
|
-
|
|
35
|
-
## Turn a result into an action
|
|
36
|
-
|
|
37
|
-
Use each item as a review queue. Retrieve GSC query/page rows to identify every associated URL, inspect the current search results, then check each relevant page against the observed query language. Recommend a content change only when page or SERP evidence supports it.
|
|
38
|
-
|
|
39
|
-
Use explicit `brandTerms` when the brand cannot be derived reliably from the property. Keep `includeBrand` false unless branded demand is part of the question.
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: compare-crawls
|
|
3
|
-
description: Compare two saved crawl snapshots with explicit provenance and completeness. Use it to separate observed page changes from crawl-scope, cap, configuration, or source noise.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Compare crawl snapshots
|
|
7
|
-
|
|
8
|
-
A crawl diff is useful only when its inputs are comparable. This report surfaces page, issue, response, indexability, title, content, and summary changes between two saved snapshots. By default, `after` means the latest report and `before` means the previous report, optionally within one `site` filter.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, use `seo_list_reports` with category `crawl` only for discovery. Call `seo_describe_report` with `{ "id": "compare-crawls" }`, then call `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "compare-crawls",
|
|
17
|
-
"params": {
|
|
18
|
-
"after": "latest",
|
|
19
|
-
"before": "previous",
|
|
20
|
-
"site": "sc-domain:example.com"
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
Read `structuredContent` after checking `isError`. The CLI uses the same parameters:
|
|
26
|
-
|
|
27
|
-
```sh
|
|
28
|
-
seo reports describe compare-crawls --json
|
|
29
|
-
seo reports run compare-crawls --params '{"after":"latest","before":"previous","site":"sc-domain:example.com"}' --json
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
Use explicit report ids for a release decision so "latest" cannot move between runs.
|
|
33
|
-
|
|
34
|
-
## Establish comparability first
|
|
35
|
-
|
|
36
|
-
Read `comparability.status` before interpreting any delta. The accompanying flags show whether the definition ids, config hashes, sites, start URLs, modes, request scopes, and caps match. `before` and `after` preserve each report id, status, normalized `config`, explicit `requestScope`, `caps`, request-evidence status, joined data-source status, warnings, caveats, and completeness. This is enough to assess the inputs without loading two separate reports.
|
|
37
|
-
|
|
38
|
-
Next inspect top-level `completeness`. If `truncated` is true, or either input is partial or failed, read its stable reason codes and the report-level `caveats`. An absent page from a capped, skipped, failed, or differently scoped crawl is not proven removed. Source row caps also limit joined GSC or GA4 evidence even when the document crawl completed.
|
|
39
|
-
|
|
40
|
-
Only then inspect `summary`, `pageChanges`, and `issueChanges`. These fields describe retained observations between the named snapshots. Prioritize newly observed response failures, unintended indexability flips, and issue groups that affect more URLs, then verify titles and content on the affected URLs. Confirm fixes with the same definition and request scope after deployment. When comparability requires review, describe the change as observed between snapshots and name the differing scope, cap, configuration, or incomplete source instead of attributing it to the release.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: content-optimization
|
|
3
|
-
description: Build a content brief for one URL from retained GSC queries and live page observations; use when an agent needs evidence-led edit ideas without treating query wording as a content mandate.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Content optimization
|
|
7
|
-
|
|
8
|
-
Use this report when an existing page has first-party search visibility and needs a focused review. It joins exact-URL GSC query/page rows to a fetched page, classifies query wording into broad intent heuristics, and turns verified opportunity types into title, H1, meta, section, and internal-link angles. It does not prove searcher intent, diagnose why a page ranks where it does, or guarantee that adding the suggested wording will improve traffic.
|
|
9
|
-
|
|
10
|
-
## Run the report
|
|
11
|
-
|
|
12
|
-
Use the compact MCP flow:
|
|
13
|
-
|
|
14
|
-
1. Call `seo_list_reports` with `{"category":"ai-search"}`.
|
|
15
|
-
2. Call `seo_describe_report` with `{"id":"content-optimization"}`.
|
|
16
|
-
3. Call `seo_run_report` with `{"id":"content-optimization","params":{"site":"sc-domain:example.com","url":"https://example.com/guides/seo","days":90,"limit":20,"minImpressions":50,"verifyContent":true}}`.
|
|
17
|
-
|
|
18
|
-
The CLI runs the same definition:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
seo reports describe content-optimization --json
|
|
22
|
-
seo reports run content-optimization --params '{"site":"sc-domain:example.com","url":"https://example.com/guides/seo","days":90,"limit":20,"minImpressions":50,"verifyContent":true}' --json
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`site` and an HTTP(S) `url` are required. The URL must belong to the selected GSC property. Set `js:true` only when the useful content requires rendering; use `refresh:true` when stale cache evidence would change the decision.
|
|
26
|
-
|
|
27
|
-
## Interpret and act
|
|
28
|
-
|
|
29
|
-
Read `sourceReport` before the derived brief. Check its `dataStatus`, `selection`, `benchmark.possiblyTruncated`, `verification.status`, warnings, and caveats. Treat `summary.score`, `primaryIntent`, and `estimatedClickLift` as prioritisation heuristics, not quality grades or forecasts. In `topActions`, separate `technical-check` and `unverified` items from verified `content-gap`, `serp-framing`, `ctr`, or `ranking` observations. Review `intentMix` and the source query metrics so a high-impression theme does not get mistaken for a universal user need.
|
|
30
|
-
|
|
31
|
-
Safe actions are to fix contradictory technical evidence first, improve a clearly missing answer block, test clearer SERP framing when the body already covers the topic, or leave a well-covered page alone. Do not create one thin section per query, force exact-match wording, change the canonical target, or expand content solely to raise the report score.
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: crawl-diff
|
|
3
|
-
description: Compare a bounded same-origin crawl with its previous saved snapshot; use it to review technical changes after a release without claiming complete site coverage.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Compare crawl snapshots
|
|
7
|
-
|
|
8
|
-
Use `crawl-diff` after a deploy, migration, or planned technical change. It
|
|
9
|
-
crawls a bounded same-origin set, saves the result, and compares it with the
|
|
10
|
-
previous saved run for the same surface. This turns status, indexability,
|
|
11
|
-
canonical, metadata, content, and inventory movement into a review queue. It
|
|
12
|
-
does not prove that a changed page affected search performance.
|
|
13
|
-
|
|
14
|
-
## Run the report
|
|
15
|
-
|
|
16
|
-
With MCP, call `seo_list_reports` with `{"category":"monitoring"}`, then call
|
|
17
|
-
`seo_describe_report` with `{"id":"crawl-diff"}`. Run the exact schema with
|
|
18
|
-
`seo_run_report`, for example
|
|
19
|
-
`{"id":"crawl-diff","params":{"startUrl":"https://example.com/","site":"sc-domain:example.com","limit":250,"js":false,"refresh":true}}`.
|
|
20
|
-
|
|
21
|
-
CLI parity uses the same definition:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe crawl-diff --json
|
|
25
|
-
seo reports run crawl-diff --params '{"startUrl":"https://example.com/","site":"sc-domain:example.com","limit":250,"refresh":true}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
The schema types `limit` as a broad number. Pass a positive whole-page bound and
|
|
29
|
-
keep it stable between comparison runs.
|
|
30
|
-
|
|
31
|
-
## Interpret the output
|
|
32
|
-
|
|
33
|
-
Compare `run` with `previousRun` before reading `summary`. A missing previous
|
|
34
|
-
run means the current crawl is a baseline, not a change result. Check the start
|
|
35
|
-
URL, limit, URL count, timestamps, rendering choice, and `warnings` for both
|
|
36
|
-
runs.
|
|
37
|
-
|
|
38
|
-
`summary` counts crawled, added, removed, changed, new errors, indexability
|
|
39
|
-
flips, and high-priority recommendations. Trace every important count into
|
|
40
|
-
`items`, where `before`, `after`, and `changes` preserve observed evidence.
|
|
41
|
-
`recommendations` rank review actions; they do not override the raw snapshots.
|
|
42
|
-
A removed URL may be outside the current discovered set or limit rather than
|
|
43
|
-
deleted. A fetch or extraction failure cannot support a resolved issue.
|
|
44
|
-
|
|
45
|
-
## Act safely
|
|
46
|
-
|
|
47
|
-
Verify high-priority status and indexability changes directly, then compare the
|
|
48
|
-
deployment intent. Restore accidental failures or controls, but leave intended
|
|
49
|
-
redirects, canonicals, and noindex directives alone. Repeat with comparable
|
|
50
|
-
scope after a fix. Never call a bounded diff an inventory-wide audit or infer
|
|
51
|
-
ranking impact from technical change alone.
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: crawl-history
|
|
3
|
-
description: Discover locally saved crawl snapshots and their compact metadata without loading full evidence. Use to select stable report ids for follow-ups, comparisons, or verification.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# List saved crawl reports
|
|
7
|
-
|
|
8
|
-
This report is the index for local crawl history. It returns metadata only, ordered newest first, so an agent can choose a snapshot without loading pages and issues or fetching the site again. It says what is stored locally, not what is currently true online.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, call `seo_list_reports` with category `crawl` if discovery is needed. Call `seo_describe_report` with `{ "id": "crawl-history" }`, then `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "crawl-history",
|
|
17
|
-
"params": {
|
|
18
|
-
"site": "sc-domain:example.com",
|
|
19
|
-
"limit": 10
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Confirm MCP `isError` is false, then consume `structuredContent`. The equivalent CLI commands are:
|
|
25
|
-
|
|
26
|
-
```sh
|
|
27
|
-
seo reports describe crawl-history --json
|
|
28
|
-
seo reports run crawl-history --params '{"site":"sc-domain:example.com","limit":10}' --json
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
The site filter prevents an unrelated recent crawl from becoming the implicit source. Increase `limit` only when older baselines are genuinely needed.
|
|
32
|
-
|
|
33
|
-
## Choose a source deliberately
|
|
34
|
-
|
|
35
|
-
Review each report's id, site, start URL, creation time, status, total pages, issue count, configuration hash, and storage version. Counts are orientation metadata, not enough to judge severity or data completeness. A smaller page count could reflect a scope change, cap, failure, or real site change.
|
|
36
|
-
|
|
37
|
-
Select an explicit id and load it with `crawl-report` before analysis. For a comparison, inspect both candidates' configuration and caveats instead of assuming adjacent timestamps are comparable. If the expected snapshot is absent, do not silently substitute another site or a fresh crawl; state that the local report was not found. Report lists can also expose old data, so include the creation time whenever presenting a saved finding as context.
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: crawl-report
|
|
3
|
-
description: Load a saved crawl snapshot without fetching the site again and opt into detailed evidence only when needed. Use for investigation, verification, or a stable source for follow-up reports.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Load a saved crawl report
|
|
7
|
-
|
|
8
|
-
Saved reports make technical analysis reproducible: several follow-ups can use the same crawl instead of observing the site at different times. Loading a report is a local storage operation, not a fresh check, so always retain its creation time and original crawl boundaries in the explanation.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, call `seo_list_reports` with category `crawl` only for report discovery. Call `seo_describe_report` with `{ "id": "crawl-report" }`, then call `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "crawl-report",
|
|
17
|
-
"params": {
|
|
18
|
-
"id": "crawl_example_20260710",
|
|
19
|
-
"includeIssues": true
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Check `isError` and use MCP `structuredContent`. CLI parity is:
|
|
25
|
-
|
|
26
|
-
```sh
|
|
27
|
-
seo reports describe crawl-report --json
|
|
28
|
-
seo reports run crawl-report --params '{"id":"crawl_example_20260710","includeIssues":true}' --json
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
Omitting `id` loads the latest saved report, optionally filtered by `site`. Use an explicit id whenever reproducibility matters. `includePages` adds request and page records; `includeIssues` adds the issue inventory.
|
|
32
|
-
|
|
33
|
-
## Read the snapshot
|
|
34
|
-
|
|
35
|
-
Confirm `id`, source URL and site, `generatedAt`, definition id, configuration hash, crawl status, and `requestEvidenceStatus`. Then inspect summary counts, `pageLimitReached`, data sources, warnings, and caveats. Provider states and crawl completeness determine which conclusions are supported.
|
|
36
|
-
|
|
37
|
-
Keep the default compact result for orientation. Request large page or issue arrays only to answer a concrete question, and filter downstream work by stable rule and URL fields rather than parsing rendered text. A report can be internally valid yet stale, capped, or partial. It cannot prove the current live state. For comparisons, load both reports and establish equivalent scope before interpreting deltas; for verification, run a new crawl with the same configuration and retain both report ids.
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: crawler-rules
|
|
3
|
-
description: Discover stable crawler rule ids with their categories and guidance metadata before querying findings. Use when an agent needs a valid filter for explanations or affected-URL reports.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Discover crawler rules
|
|
7
|
-
|
|
8
|
-
Rules are the stable vocabulary connecting crawl issues, summaries, affected URLs, and remediation guidance. Listing them answers "which checks exist?" It does not say that a site triggered those checks or that every listed convention is a search-engine requirement.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, use `seo_list_reports` with category `crawl` only if report discovery is needed. Call `seo_describe_report` with `{ "id": "crawler-rules" }`, then `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "crawler-rules",
|
|
17
|
-
"params": { "category": "metadata" }
|
|
18
|
-
}
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
Read `structuredContent` after checking `isError`. CLI parity is:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe crawler-rules --json
|
|
25
|
-
seo reports run crawler-rules --params '{"category":"metadata"}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Omit `category` to discover the full inventory. Useful categories include response, indexability, canonical, metadata, headings, content, links, images, structured-data, international, performance, mobile, security, social, and geo.
|
|
29
|
-
|
|
30
|
-
## Use ids, not prose
|
|
31
|
-
|
|
32
|
-
Read the returned id, title, category, default severity, and guidance metadata. Pass the exact id to `explain-crawl-issue` for the rule contract or to `affected-urls` for crawl evidence. Do not infer that similarly named rules have identical source semantics, and do not create implementation work from the catalog alone.
|
|
33
|
-
|
|
34
|
-
The category input is constrained to the crawler's supported category enum. Describe the report before filtering and pass one of those exact values; unknown or misspelled categories are rejected as invalid input rather than becoming a misleading empty result. A valid category can still return no rules if the registry changes, so use the unfiltered inventory for discovery. Treat default severity as general triage metadata; actual priority comes from affected pages, observed evidence, scope, intent, and available demand data.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: ctr-underperformers
|
|
3
|
-
description: Find high-impression page-one GSC rows below a site-aware CTR benchmark; use when an agent needs a bounded snippet review queue with heuristic shortfalls kept explicit.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# CTR underperformers
|
|
7
|
-
|
|
8
|
-
Use this report to prioritise retained query/page rows whose observed CTR is materially below a position-based benchmark. It aggregates duplicate rows before analysis and prefers a robust site-aware peer benchmark when enough evidence exists, otherwise it uses a built-in fallback curve. The result can identify snippets worth reviewing, but it cannot observe the live SERP layout, explain user intent, isolate title or description effects, or promise that the calculated shortfall is recoverable.
|
|
9
|
-
|
|
10
|
-
## Run the report
|
|
11
|
-
|
|
12
|
-
Use the compact MCP flow:
|
|
13
|
-
|
|
14
|
-
1. Call `seo_list_reports` with `{"category":"opportunities"}`.
|
|
15
|
-
2. Call `seo_describe_report` with `{"id":"ctr-underperformers"}`.
|
|
16
|
-
3. Call `seo_run_report` with `{"id":"ctr-underperformers","params":{"site":"sc-domain:example.com","minImpressions":250,"includeBrand":false}}`.
|
|
17
|
-
|
|
18
|
-
The CLI calls the same handler:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
seo reports describe ctr-underperformers --json
|
|
22
|
-
seo reports run ctr-underperformers --params '{"site":"sc-domain:example.com","minImpressions":250,"includeBrand":false}' --json
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`site` is required. This catalog schema exposes only `minImpressions` and `includeBrand`; the report itself uses a final-data 28-day window and reports its output limit in `summary`.
|
|
26
|
-
|
|
27
|
-
## Interpret and act
|
|
28
|
-
|
|
29
|
-
Check `dataStatus`, `range`, `source.completeness`, `possiblyTruncated`, validation counts, and `selection` before looking at the queue. Invalid rows make the report partial; duplicate rows are aggregated, not silently counted twice. For every item, keep query, URL, impressions, position, observed CTR, target CTR, benchmark source/confidence, and estimated shortfall together. The shortfall is directional prioritisation math, not a traffic forecast. Page-one average position also hides day, device, geography, and result-feature variation.
|
|
30
|
-
|
|
31
|
-
Safe actions are to inspect the current SERP and displayed title link, confirm the page matches intent, then test clearer framing where evidence supports it. Annotate the change and compare a complete later period. Do not rewrite already appropriate copy merely to chase the benchmark, infer causation from CTR alone, or call a partial empty result an all-clear.
|