seo 0.1.0 → 0.2.0
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 +133 -40
- package/TERMS.md +2 -2
- package/TRADEMARKS.md +9 -5
- package/dist/cli.js +68 -52
- package/dist/cli.js.map +1 -1
- package/dist/{dist-CSY2_p-j.js → dist-6bK_8r5M.js} +49 -49
- package/dist/dist-6bK_8r5M.js.map +1 -0
- package/dist/{dist-FeAUNn9A.js → dist-vRmqfhR4.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-7aT8_Xp0.js} +2 -2
- package/dist/{package-uzXzqDW6.js.map → package-7aT8_Xp0.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 +46 -59
- 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,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: quick-wins
|
|
3
|
-
description: Rank retained position 4-10 GSC query-page rows below a site-aware CTR target; use when an agent needs a bounded opportunity queue with optional live-content verification.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Quick wins
|
|
7
|
-
|
|
8
|
-
Use this report to prioritise retained query/page rows with meaningful impressions, average positions from 4 through 10, and CTR below a leave-target-out site benchmark or documented fallback curve. Optional page verification checks whether the live page covers the query or presents technical evidence before recommending a content action. “Quick win” describes the review queue, not effort, certainty, or expected traffic.
|
|
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":"quick-wins"}`.
|
|
16
|
-
3. Call `seo_run_report` with `{"id":"quick-wins","params":{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"verifyContent":true,"verifyLimit":5}}`.
|
|
17
|
-
|
|
18
|
-
The CLI calls the same definition:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
seo reports describe quick-wins --json
|
|
22
|
-
seo reports run quick-wins --params '{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"verifyContent":true,"verifyLimit":5}' --json
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`site` is required. `limit` bounds returned rows and `verifyLimit` bounds live page checks. Use `js:true` and higher fetch rates only when needed and permitted.
|
|
26
|
-
|
|
27
|
-
## Interpret and act
|
|
28
|
-
|
|
29
|
-
Check `dataStatus`, date range, source row cap, `possiblyTruncated`, `selection.invalidRows`, filters, and limited rows. Read `methodology` and each item's benchmark confidence before using `targetCtr`. `estimatedCtrClickShortfall` and priority score are heuristics, explicitly not estimated lift. Inspect `verification.requested`, attempted, verified, failed, and technical counts. An unverified item still has GSC evidence but cannot support a content-coverage conclusion. Review groups and template patterns for repeated hypotheses without converting their sums into forecasts.
|
|
30
|
-
|
|
31
|
-
Safe actions are to inspect the live SERP, resolve technical conflicts, test clearer snippet framing, improve a genuinely missing answer, or add a relevant internal link. Record the change and compare a later complete window. Do not promise clicks, force query wording into copy, treat average position as a stable rank, or call filtered or capped evidence an all-clear.
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: redirect-trace
|
|
3
|
-
description: Record every HTTP redirect hop and inspect the final page's indexability signals; use it to debug loops, broken chains, and destination mismatches for one URL.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Trace one redirect path
|
|
7
|
-
|
|
8
|
-
Use `redirect-trace` when a specific URL behaves unexpectedly after a move,
|
|
9
|
-
canonical change, or routing release. It follows HTTP redirects manually,
|
|
10
|
-
records each response, and audits the final destination for basic indexability
|
|
11
|
-
and canonical evidence. The trace is one observation from the machine and time
|
|
12
|
-
that ran it; CDNs, geography, cookies, user agents, and later deploys can differ.
|
|
13
|
-
|
|
14
|
-
## Run the report
|
|
15
|
-
|
|
16
|
-
With MCP, call `seo_list_reports` with `{"category":"monitoring"}`. Call
|
|
17
|
-
`seo_describe_report` with `{"id":"redirect-trace"}`, then call
|
|
18
|
-
`seo_run_report`, for example
|
|
19
|
-
`{"id":"redirect-trace","params":{"url":"https://example.com/old-page","maxHops":8,"js":false,"refresh":true}}`.
|
|
20
|
-
|
|
21
|
-
The CLI uses the same registry:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe redirect-trace --json
|
|
25
|
-
seo reports run redirect-trace --params '{"url":"https://example.com/old-page","maxHops":8,"refresh":true}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
`maxHops` is currently a broad number in discovery. Pass a small positive whole
|
|
29
|
-
number; very large chains are not a useful success condition.
|
|
30
|
-
|
|
31
|
-
## Interpret the output
|
|
32
|
-
|
|
33
|
-
Read `chain` in order. Each step contains the requested URL, status, `Location`,
|
|
34
|
-
resolved next URL, and duration. Then compare `finalUrl` with `finalPage` and
|
|
35
|
-
`summary.finalStatus`. `summary.issues` can identify a loop, hop limit,
|
|
36
|
-
redirect without location, final 4xx or 5xx, non-indexable final page, or a
|
|
37
|
-
canonical mismatch.
|
|
38
|
-
|
|
39
|
-
Inspect `metaRobots`, `xRobotsTag`, canonical, and `warnings` as observations.
|
|
40
|
-
A missing `finalPage` or fetch warning limits indexability conclusions.
|
|
41
|
-
JavaScript rendering affects final-page extraction, not the HTTP redirect chain.
|
|
42
|
-
A canonical pointing elsewhere can be intentional; a 302 can also be
|
|
43
|
-
intentional. The report does not know the desired destination.
|
|
44
|
-
|
|
45
|
-
## Act safely
|
|
46
|
-
|
|
47
|
-
Confirm the intended URL map before editing redirects. Prefer one direct
|
|
48
|
-
permanent redirect for a genuine move, remove loops, restore missing locations,
|
|
49
|
-
and align the final canonical only when the destination is correct. Re-run the
|
|
50
|
-
trace after deployment. Do not declare an SEO defect or ranking impact from a
|
|
51
|
-
chain difference without intent and search evidence.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: refresh-priorities
|
|
3
|
-
description: Combine several first-party opportunity reports into a bounded refresh queue. Use it to prioritize investigation while preserving each source's distinct meaning and limits.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Refresh priorities workflow
|
|
7
|
-
|
|
8
|
-
This workflow helps choose what to inspect next by combining decay, position,
|
|
9
|
-
CTR, exposure, diagnosis, content verification, and optional GA4 signals. It
|
|
10
|
-
does not make those signals interchangeable or predict the benefit of an edit.
|
|
11
|
-
The queue is a deterministic prioritization aid, not an autonomous content
|
|
12
|
-
brief.
|
|
13
|
-
|
|
14
|
-
## Run it
|
|
15
|
-
|
|
16
|
-
Use the exact MCP discovery flow:
|
|
17
|
-
|
|
18
|
-
1. Call `seo_list_reports` with `category: "workflows"` and select `refresh-priorities`.
|
|
19
|
-
2. Call `seo_describe_report` with `id: "refresh-priorities"`; inspect all bounds.
|
|
20
|
-
3. Call `seo_run_report` with that id and schema-valid parameters.
|
|
21
|
-
|
|
22
|
-
CLI parity:
|
|
23
|
-
|
|
24
|
-
```sh
|
|
25
|
-
seo reports describe refresh-priorities --json
|
|
26
|
-
seo reports run refresh-priorities --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}' --json
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Add `ga4PropertyId` only when that property's sessions are needed and accessible.
|
|
30
|
-
`verifyLimit` caps fetched content checks; it does not verify every queued URL.
|
|
31
|
-
|
|
32
|
-
## Interpret and act
|
|
33
|
-
|
|
34
|
-
Read the workflow's steps and skipped states before its queue. For each queued
|
|
35
|
-
item preserve `source`, `impactKind`, score breakdown, date window, completeness,
|
|
36
|
-
verification status, and rationale. A click decline, low CTR, second-page
|
|
37
|
-
average position, and GA4 session signal have different semantics. Missing GA4
|
|
38
|
-
or failed content fetches must remain unavailable, not become zero-weight proof.
|
|
39
|
-
|
|
40
|
-
Inspect the top few URLs manually. Confirm query intent, current content,
|
|
41
|
-
technical accessibility, internal links, competing pages, and whether a recent
|
|
42
|
-
change already explains the observation. Choose a bounded edit only when the
|
|
43
|
-
evidence supports it, record the change date, and measure later. Never delete,
|
|
44
|
-
merge, or rewrite content solely from the combined score. Do not present the
|
|
45
|
-
score as expected clicks, revenue, ranking lift, or causal confidence.
|
|
46
|
-
|
|
47
|
-
MCP `structuredContent` is the machine contract. Use Markdown for a concise
|
|
48
|
-
human queue while retaining the underlying evidence fields for agents.
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: search-performance-overview
|
|
3
|
-
description: Find where Google Search clicks and impressions changed, which pages or queries explain the movement, and which focused report to run next. Use when search performance moved or an agent needs a first-party baseline but does not yet know where to investigate.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Search performance overview
|
|
7
|
-
|
|
8
|
-
Use this when organic search performance changed and you do not yet know which
|
|
9
|
-
pages, queries, countries, or devices explain it. It is also the best first
|
|
10
|
-
report for a newly connected Search Console property. The report finds where
|
|
11
|
-
the movement sits, then points to the focused report that can verify the issue.
|
|
12
|
-
|
|
13
|
-
## Run it
|
|
14
|
-
|
|
15
|
-
Use the exact MCP discovery flow:
|
|
16
|
-
|
|
17
|
-
1. Call `seo_list_reports` with `category: "workflows"` and select `search-performance-overview`.
|
|
18
|
-
2. Call `seo_describe_report` with `id: "search-performance-overview"` and inspect its schema.
|
|
19
|
-
3. Call `seo_run_report` with that id and only schema-valid parameters.
|
|
20
|
-
|
|
21
|
-
CLI parity:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe search-performance-overview --json
|
|
25
|
-
seo reports run search-performance-overview --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"limit":10,"includeBrand":false}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
`days` sets the main evidence window and `recentDays` sets the recent comparison
|
|
29
|
-
period. `limit` caps the items returned; it does not increase provider coverage.
|
|
30
|
-
|
|
31
|
-
## Interpret and act
|
|
32
|
-
|
|
33
|
-
Read the workflow envelope first: `workflow`, `site`, `generatedAt`, `summary`,
|
|
34
|
-
`steps`, `actions`, and `output`. Every step has its own status and evidence.
|
|
35
|
-
Then inspect the report's `dataStatus`, skipped sections, partial reasons,
|
|
36
|
-
priorities, and nested anomaly, update, segment, decay, cannibalisation,
|
|
37
|
-
striking-distance, and quick-win results. Do not let one complete section hide a
|
|
38
|
-
failed or capped neighbour.
|
|
39
|
-
|
|
40
|
-
Start with actions that cite reproducible evidence. Confirm affected URLs,
|
|
41
|
-
provider dates, selection limits, and intentional technical controls before
|
|
42
|
-
editing anything. Run a focused report to inspect detail rather than asking this
|
|
43
|
-
broad workflow for a larger payload. Sparse data may legitimately skip a
|
|
44
|
-
section. Update overlap, opportunity scores, average position, and timing are
|
|
45
|
-
investigation signals, not causation or forecasts.
|
|
46
|
-
|
|
47
|
-
Treat MCP `structuredContent` as the machine contract. Use Markdown for the
|
|
48
|
-
human summary while preserving structured evidence references in any handoff.
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
interface:
|
|
2
|
-
display_name: "Search performance overview"
|
|
3
|
-
short_description: "Find where Google Search performance changed"
|
|
4
|
-
default_prompt: "Use $search-performance-overview to find where Google Search performance changed, explain the pages or queries behind it, and choose the next focused report."
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: second-page
|
|
3
|
-
description: Find retained GSC page-query rows with average positions from 10 through 20. Use them as bounded investigation prompts, not promised ranking wins.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Second-page opportunities
|
|
7
|
-
|
|
8
|
-
This report surfaces page-query combinations near the first-page boundary so an
|
|
9
|
-
agent can inspect whether the page satisfies the observed query. It is a triage
|
|
10
|
-
tool. Average position is aggregated across searches, locations, devices, and
|
|
11
|
-
time; it is not an exact rank, proof of intent mismatch, or evidence that an
|
|
12
|
-
edit will improve performance.
|
|
13
|
-
|
|
14
|
-
## Run it
|
|
15
|
-
|
|
16
|
-
Use the exact MCP discovery flow:
|
|
17
|
-
|
|
18
|
-
1. Call `seo_list_reports` with `category: "reporting"` and select `second-page`.
|
|
19
|
-
2. Call `seo_describe_report` with `id: "second-page"`; inspect bounds and defaults.
|
|
20
|
-
3. Call `seo_run_report` with `id: "second-page"` and matching parameters.
|
|
21
|
-
|
|
22
|
-
CLI parity:
|
|
23
|
-
|
|
24
|
-
```sh
|
|
25
|
-
seo reports describe second-page --json
|
|
26
|
-
seo reports run second-page --params '{"site":"sc-domain:example.com","range":28,"minImpressions":50,"limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}' --json
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
`range` is the analysis window. `minImpressions` removes very sparse candidates.
|
|
30
|
-
`limit` is a retained-output cap. `verifyContent` fetches only up to
|
|
31
|
-
`verifyLimit` candidates, so unverified items remain unknown rather than failed.
|
|
32
|
-
|
|
33
|
-
## Interpret and act
|
|
34
|
-
|
|
35
|
-
Check source completeness, date range, `selection`, `methodology`, provenance,
|
|
36
|
-
brand filtering, and caveats before ranking the items. Duplicate provider rows
|
|
37
|
-
should already be aggregated deterministically, but retained limits still mean
|
|
38
|
-
the output is not a complete inventory. Read impressions, clicks, CTR, and
|
|
39
|
-
average position as observed metrics. Treat the priority value as a transparent
|
|
40
|
-
heuristic, not expected click lift.
|
|
41
|
-
|
|
42
|
-
For a promising item, inspect the live page and search intent, verify that the
|
|
43
|
-
query is appropriate for the URL, review internal linking and competing pages,
|
|
44
|
-
then make one defensible change. Preserve pages already satisfying intent.
|
|
45
|
-
Never add text solely to hit a length threshold, promise a first-page result,
|
|
46
|
-
or infer cannibalisation from one row. If the source is capped, partial, or
|
|
47
|
-
filtered, say so in the recommendation.
|
|
48
|
-
|
|
49
|
-
Use MCP `structuredContent` as the machine contract and Markdown only to explain
|
|
50
|
-
the evidence and next investigation to a human.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: segment-impact
|
|
3
|
-
description: Compare matched retained GSC rows across adjacent periods for one dimension; use it to locate where observed movement is concentrated without treating missing rows as zero.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Compare segment movement
|
|
7
|
-
|
|
8
|
-
Use `segment-impact` after a property-level change is visible and you need to
|
|
9
|
-
find which pages, queries, countries, or devices moved. It compares equal-length
|
|
10
|
-
adjacent finalized GSC windows. The report deliberately limits conclusions to
|
|
11
|
-
segments retained in both windows, so its deltas are comparable without
|
|
12
|
-
inventing zeros for rows that disappeared from one retained result set.
|
|
13
|
-
|
|
14
|
-
## Run the report
|
|
15
|
-
|
|
16
|
-
With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`, then
|
|
17
|
-
`seo_describe_report` with `{"id":"segment-impact"}`. Then call
|
|
18
|
-
`seo_run_report` with the described report, for example
|
|
19
|
-
`{"id":"segment-impact","params":{"site":"sc-domain:example.com","dimension":"page","days":28,"compareDays":28,"limit":20,"maxRows":50000,"unmatchedLimit":10}}`.
|
|
20
|
-
|
|
21
|
-
The CLI uses the same schema:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe segment-impact --json
|
|
25
|
-
seo reports run segment-impact --params '{"site":"sc-domain:example.com","dimension":"page","days":28,"compareDays":28,"limit":20,"maxRows":50000,"unmatchedLimit":10}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Use either relative windows or an explicit `startDate` and `endDate` after
|
|
29
|
-
checking the current schema. Do not send undeclared fields.
|
|
30
|
-
|
|
31
|
-
## Interpret the output
|
|
32
|
-
|
|
33
|
-
Confirm `before`, `after`, and `rangeDays` before reading movement. Inspect
|
|
34
|
-
`dataStatus`, `source.before`, `source.after`, and `source.completeness` for
|
|
35
|
-
provider calls, row caps, and possible truncation. `selection` explains invalid,
|
|
36
|
-
duplicate, conflicting, matched, unmatched, returned, and limited rows.
|
|
37
|
-
|
|
38
|
-
In `items`, `clickDelta` and `impressionDelta` are after minus before. A positive
|
|
39
|
-
`positionDelta` is worse because a larger GSC average position is lower in the
|
|
40
|
-
results. `unmatchedSegments` are observations retained in one window only; they
|
|
41
|
-
are not gains from or losses to zero. Read `warnings`, `caveats`, and
|
|
42
|
-
`methodology` before describing a leading segment.
|
|
43
|
-
|
|
44
|
-
## Act safely
|
|
45
|
-
|
|
46
|
-
Use the top matched movers to define a smaller investigation: audit affected
|
|
47
|
-
pages, group repeated templates, or compare query intent. Check unmatched rows
|
|
48
|
-
separately with a wider export if they matter. Segment concentration does not
|
|
49
|
-
establish why movement happened, and a limited or possibly truncated result
|
|
50
|
-
cannot support an inventory-wide winner or loser claim.
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: seo-fix-queue
|
|
3
|
-
description: Turn seo crawl and report evidence into a prioritized implementation queue. Use when the user wants exact SEO fixes, implementation tickets, affected URLs, verification steps, or a ranked technical SEO and GEO backlog.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SEO fix queue
|
|
7
|
-
|
|
8
|
-
Run the bounded queue directly:
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
seo crawl-queue --project <project> --json
|
|
12
|
-
seo crawl-queue https://example.com --json
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Through MCP, use `seo_run_report` with report id `site-crawl` and
|
|
16
|
-
`saveReport: true`. Pass its `reportId` to report ids `top-fixes` and
|
|
17
|
-
`affected-urls`. Reuse that report instead of crawling again. Call
|
|
18
|
-
`seo_describe_report` before a report when its parameters are not already
|
|
19
|
-
known.
|
|
20
|
-
|
|
21
|
-
## Check the evidence before ranking work
|
|
22
|
-
|
|
23
|
-
1. Read `dataStatus`, source joins, selection counts, warnings, and caveats.
|
|
24
|
-
2. Check `summary.pageLimitReached`. A capped crawl cannot support an
|
|
25
|
-
inventory-wide zero or all-clear.
|
|
26
|
-
3. Preserve the returned priority order unless stronger evidence supports a
|
|
27
|
-
change.
|
|
28
|
-
4. Use GSC or GA4 evidence only when the source join is available. Do not call a
|
|
29
|
-
page search-visible or valuable from crawl evidence alone.
|
|
30
|
-
5. Keep failed fetches, missing provider data, and filtered rows separate from
|
|
31
|
-
observed zeros.
|
|
32
|
-
|
|
33
|
-
Each queue item should retain its rule id, priority, evidence, affected count,
|
|
34
|
-
bounded URL sample, fix, and verification step. Explain unfamiliar rules with
|
|
35
|
-
structured output:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
seo explain --rule <rule-id> --json
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
Use report id `explain-crawl-issue` through `seo_run_report`.
|
|
42
|
-
|
|
43
|
-
Write Markdown implementation tickets only when the user wants a handoff file:
|
|
44
|
-
|
|
45
|
-
```bash
|
|
46
|
-
seo crawl --project <project> --format markdown --output seo-fixes.md
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
Keep the final answer short. Show the top material fixes and end with the next
|
|
50
|
-
verification command. Do not dump every rule the crawler checked.
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: seo-geo-readiness
|
|
3
|
-
description: Audit local technical eligibility evidence and supporting website observations for AI search with seo. Use when the user asks about ChatGPT, Claude, Perplexity, Gemini, Google AI Overviews, LLM citations, llms.txt, structured data, authorship, or AI-search visibility.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# GEO readiness
|
|
7
|
-
|
|
8
|
-
This workflow measures technical readiness and referral evidence. It does not
|
|
9
|
-
prove that an AI product cites the site.
|
|
10
|
-
|
|
11
|
-
## Run the readiness report
|
|
12
|
-
|
|
13
|
-
Create a saved crawl, then analyze the same report:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
seo crawl --project <project> --max-pages 500 --save --json
|
|
17
|
-
seo ai-readiness --project <project> --json
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Through MCP, use `seo_run_report` with report id `ai-readiness`. Use report id
|
|
21
|
-
`geo-gaps` when exact affected URLs for crawl and indexability rules are
|
|
22
|
-
needed. Call `seo_describe_report` before a report when its parameters are not
|
|
23
|
-
already known.
|
|
24
|
-
|
|
25
|
-
1. Check `dataStatus`, `summary.pageLimitReached`, warnings, and caveats.
|
|
26
|
-
2. Separate failed technical checks from contextual observations.
|
|
27
|
-
3. Treat local crawl indexability as local evidence. It does not prove that
|
|
28
|
-
Google indexed the URL.
|
|
29
|
-
4. Use bounded URL Inspection evidence when Google's indexed snapshot changes
|
|
30
|
-
the decision. It is not a live crawl or a sitewide sample.
|
|
31
|
-
|
|
32
|
-
## Explain the evidence
|
|
33
|
-
|
|
34
|
-
- Blocked crawling, publisher `noindex`, snippet restrictions, and non-success
|
|
35
|
-
HTML responses can prevent or limit technical eligibility.
|
|
36
|
-
- Structured data, semantic HTML, authorship, and dates are contextual
|
|
37
|
-
observations. Recommend them only for a documented user or Search feature
|
|
38
|
-
need.
|
|
39
|
-
- Paragraph shape, lists, tables, and question headings do not prove quality or
|
|
40
|
-
citation likelihood.
|
|
41
|
-
- Do not recommend content chunking or a minimum word count solely for AI
|
|
42
|
-
Search.
|
|
43
|
-
- `/llms.txt` is optional metadata for agents that support it. The report does
|
|
44
|
-
not treat it as a Google Search ranking signal.
|
|
45
|
-
|
|
46
|
-
Useful follow-up reports remain structured for agents:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
seo seo-to-ai-query --project <project> --json
|
|
50
|
-
seo ai-referrals --project <project> --json
|
|
51
|
-
seo llms audit --project <project> --json
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
`seo-to-ai-query` creates deterministic monitoring-prompt suggestions from
|
|
55
|
-
retained GSC wording. These are not observed AI queries. `ai-referrals` reports
|
|
56
|
-
known GA4 referral evidence and cannot measure citations without a referral.
|
|
57
|
-
|
|
58
|
-
Report `nosnippet`, `max-snippet:0`, positive `max-snippet` limits, and
|
|
59
|
-
unrestricted `max-snippet:-1` exactly. No detected page-level restriction does
|
|
60
|
-
not guarantee that Google will select or show the page.
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: seo-site-audit
|
|
3
|
-
description: Run an evidence-backed site audit with the seo main report, crawler, and focused follow-up reports. Use when the user asks to audit or diagnose a website across Search Console performance, technical SEO, indexability, metadata, schema, internal linking, security, performance, or AI-search readiness.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# SEO site audit
|
|
7
|
-
|
|
8
|
-
Start with the main report. It joins the available first-party evidence and
|
|
9
|
-
returns a small set of follow-up commands.
|
|
10
|
-
|
|
11
|
-
Through MCP, call `seo_run_report` with report id
|
|
12
|
-
`search-performance-overview`. Call `seo_describe_report` first when its
|
|
13
|
-
parameters are not already known. Use the CLI when MCP is not available:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
seo report --project <project> --json
|
|
17
|
-
seo report --site sc-domain:example.com --json
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Read the main report
|
|
21
|
-
|
|
22
|
-
1. Check `dataStatus`, source completeness, skipped sections, warnings, and
|
|
23
|
-
caveats before interpreting findings.
|
|
24
|
-
2. Read the narrative and priority queue against their evidence references.
|
|
25
|
-
3. Use `nextCommands` to choose a small number of follow-ups. Do not run every
|
|
26
|
-
report by default.
|
|
27
|
-
4. Keep missing, unavailable, filtered, partial, capped, and complete evidence
|
|
28
|
-
separate. A partial source cannot support an all-clear.
|
|
29
|
-
|
|
30
|
-
## Add technical crawl evidence
|
|
31
|
-
|
|
32
|
-
Run a crawl when the user asks for technical coverage or the main report
|
|
33
|
-
identifies a technical evidence gap:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
seo crawl --project <project> --max-pages 500 --save --json
|
|
37
|
-
seo crawl https://example.com --max-pages 500 --save --json
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
Read `summary`, `topFixes`, `warnings`, and `caveats` first. Check
|
|
41
|
-
`summary.pageLimitReached` before making sitewide claims. Reuse the saved report
|
|
42
|
-
for detail instead of crawling again:
|
|
43
|
-
|
|
44
|
-
- Report id `top-fixes` returns a bounded queue.
|
|
45
|
-
- Report id `affected-urls` returns URLs for one rule.
|
|
46
|
-
- Report id `explain-crawl-issue` explains an unfamiliar rule.
|
|
47
|
-
- Report id `crawl-report` returns requested report detail.
|
|
48
|
-
|
|
49
|
-
Use report id `performance-audit` for a selected URL when performance evidence
|
|
50
|
-
is needed. A crawl does not replace Lighthouse lab data or CrUX field data.
|
|
51
|
-
|
|
52
|
-
## Present the result
|
|
53
|
-
|
|
54
|
-
Give the user the top three to five evidence-backed actions, affected areas,
|
|
55
|
-
and a verification command for each action. Name every material gap or cap.
|
|
56
|
-
|
|
57
|
-
Never invent clicks, sessions, rankings, issue counts, indexing state, or
|
|
58
|
-
sitewide health. Keep advice structural and diagnostic unless the user asks
|
|
59
|
-
for copy.
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: seo-to-ai-query
|
|
3
|
-
description: Convert retained GSC query wording into deterministic AI monitoring prompts; use when an agent needs a reproducible prompt seed set without claiming observed AI demand or visibility.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Queries to AI prompts
|
|
7
|
-
|
|
8
|
-
Use this report to turn first-party GSC query wording into a bounded set of prompts for later manual or automated monitoring. Each source query keeps its clicks, impressions, CTR, and average position, while deterministic templates produce stable prompt suggestions. The output is useful for designing a monitoring corpus. It is not evidence that anyone entered those prompts into an AI product, that an answer mentioned the site, or that the source query has equivalent AI demand.
|
|
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":"seo-to-ai-query"}`.
|
|
16
|
-
3. Call `seo_run_report` with `{"id":"seo-to-ai-query","params":{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"maxRows":10000}}`.
|
|
17
|
-
|
|
18
|
-
The CLI uses the same registry entry:
|
|
19
|
-
|
|
20
|
-
```sh
|
|
21
|
-
seo reports describe seo-to-ai-query --json
|
|
22
|
-
seo reports run seo-to-ai-query --params '{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"maxRows":10000}' --json
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`site` is required. Use either `days` or an explicit `startDate` and `endDate` pair. `maxRows` bounds source retrieval and `limit` bounds returned queries. Supply `brandTerms` or `includeBrand:true` only when brand handling is intentional.
|
|
26
|
-
|
|
27
|
-
## Interpret and act
|
|
28
|
-
|
|
29
|
-
Check `dataStatus` before reading `items`: `empty`, `filtered`, `partial`, and `available` mean different things. Preserve `dateRange`, `source.possiblyTruncated`, filters, `selection.invalidRows`, `selection.conflictingRows`, limited rows, warnings, and caveats. `methodology.observedAiPromptData` and `estimatedTrafficLift` are explicitly false. Each item has `evidenceScope: retained-gsc-query`; its prompts inherit that narrow scope.
|
|
30
|
-
|
|
31
|
-
Safe actions are to select representative prompt variants, store the source query and date range beside later observations, and refresh the corpus on a controlled schedule. Do not report generated prompt count as AI demand, fill missing prompts with guessed traffic, or interpret no returned rows as an all-clear when the source is partial or filtering removed candidates.
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: setup-check
|
|
3
|
-
description: Check whether local SEO Skills CLI authentication and defaults are usable; use it before reports when login, scopes, or saved configuration may be incomplete.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Check local setup
|
|
7
|
-
|
|
8
|
-
Run `setup-check` before blaming a report for an authentication or configuration
|
|
9
|
-
failure. It reads local setup state and separates missing credentials, missing
|
|
10
|
-
Google scopes, and absent defaults from actual SEO evidence. A passing result
|
|
11
|
-
means the local prerequisites look present. It does not prove that a token is
|
|
12
|
-
still accepted by Google or that the account can access a particular property.
|
|
13
|
-
|
|
14
|
-
## Run the report
|
|
15
|
-
|
|
16
|
-
With MCP, call `seo_list_reports` with `{"category":"setup"}`. Then call
|
|
17
|
-
`seo_describe_report` with `{"id":"setup-check"}` and use the returned schema.
|
|
18
|
-
Finally call `seo_run_report` with `{"id":"setup-check","params":{}}`. The report
|
|
19
|
-
accepts no parameters, so do not invent a site, project, or refresh field.
|
|
20
|
-
|
|
21
|
-
The CLI exposes the same registry and schema:
|
|
22
|
-
|
|
23
|
-
```sh
|
|
24
|
-
seo reports describe setup-check --json
|
|
25
|
-
seo reports run setup-check --params '{}' --json
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Read MCP `structuredContent` or the CLI JSON as the machine contract. Use the
|
|
29
|
-
text response only as a short presentation layer.
|
|
30
|
-
|
|
31
|
-
## Interpret the checks
|
|
32
|
-
|
|
33
|
-
Start with `ok`, then inspect every entry in `checks`. `status` distinguishes a
|
|
34
|
-
blocking `fail` from a non-blocking `warn`; `detail` records what was observed;
|
|
35
|
-
`fix` gives the matching local remedy when one exists. `generatedAt` tells you
|
|
36
|
-
when the filesystem and token metadata were checked. Missing saved GSC or GA4
|
|
37
|
-
defaults are normally warnings because explicit report parameters can replace
|
|
38
|
-
them.
|
|
39
|
-
|
|
40
|
-
Never copy account emails, token contents, OAuth client values, private keys,
|
|
41
|
-
or local credential files into an answer. Summarise the check id, status, and a
|
|
42
|
-
safe fix instead.
|
|
43
|
-
|
|
44
|
-
## Act safely
|
|
45
|
-
|
|
46
|
-
Apply the narrow fix attached to a failed check, such as logging in again or
|
|
47
|
-
restoring the same OAuth client used by stored tokens. Re-run `setup-check`, then run
|
|
48
|
-
a small read-only report for the intended property. Do not treat a setup pass
|
|
49
|
-
as evidence about rankings, indexing, analytics accuracy, or site health.
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: site-crawl
|
|
3
|
-
description: Build a bounded technical SEO inventory with explicit request, page, issue, and completeness evidence. Use for a site baseline or to save a stable crawl for focused follow-up reports.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Crawl a site
|
|
7
|
-
|
|
8
|
-
A crawl observes what the configured fetcher could discover and retrieve during one run. It is the foundation for most technical reports, but it is not an index, traffic source, or guarantee of complete site coverage. Set a deliberate page and depth budget, then save the snapshot when later analysis must share the same evidence.
|
|
9
|
-
|
|
10
|
-
## Run it
|
|
11
|
-
|
|
12
|
-
For MCP, call `seo_list_reports` with category `crawl` when discovery is needed. Call `seo_describe_report` with `{ "id": "site-crawl" }`, then `seo_run_report` with:
|
|
13
|
-
|
|
14
|
-
```json
|
|
15
|
-
{
|
|
16
|
-
"id": "site-crawl",
|
|
17
|
-
"params": {
|
|
18
|
-
"url": "https://example.com/",
|
|
19
|
-
"maxPages": 100,
|
|
20
|
-
"maxDepth": 3,
|
|
21
|
-
"saveReport": true
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Check `isError` and consume MCP `structuredContent`. The same run is available from the CLI:
|
|
27
|
-
|
|
28
|
-
```sh
|
|
29
|
-
seo reports describe site-crawl --json
|
|
30
|
-
seo reports run site-crawl --params '{"url":"https://example.com/","maxPages":100,"maxDepth":3,"saveReport":true}' --json
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Describe the schema before adding `include`, `exclude`, sitemap, robots, JavaScript, or fetch-rate controls; their interaction changes the evidence collected.
|
|
34
|
-
|
|
35
|
-
## Judge the crawl before the site
|
|
36
|
-
|
|
37
|
-
Start with status, `requestEvidenceStatus`, attempted and fetched counts, failures, retained pages, `pageLimitReached`, data-source states, warnings, and caveats. A partial or capped crawl cannot support an all-clear or a definitive zero. Raw `pages`, `requests`, and full `issues` are opt-in because they can be large; request only what the next decision needs.
|
|
38
|
-
|
|
39
|
-
Separate observations from defects. Response failures and contradictory indexability signals deserve investigation, while canonicals, robots rules, `noindex`, and snippet limits may be intentional. Use the compact top fixes for triage, then run `affected-urls` and `explain-crawl-issue` before creating work. Preserve the report id and crawl settings for verification. If JavaScript rendering was disabled or discovery depended on the sitemap or internal links, state that boundary when summarizing results.
|