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.
Files changed (189) hide show
  1. package/PRIVACY.md +2 -2
  2. package/README.md +133 -40
  3. package/TERMS.md +2 -2
  4. package/TRADEMARKS.md +9 -5
  5. package/dist/cli.js +68 -52
  6. package/dist/cli.js.map +1 -1
  7. package/dist/{dist-CSY2_p-j.js → dist-6bK_8r5M.js} +49 -49
  8. package/dist/dist-6bK_8r5M.js.map +1 -0
  9. package/dist/{dist-FeAUNn9A.js → dist-vRmqfhR4.js} +1 -1
  10. package/dist/index.d.ts +186 -94
  11. package/dist/index.js +843 -415
  12. package/dist/index.js.map +1 -1
  13. package/dist/mcp.d.ts +18 -1
  14. package/dist/mcp.js +6532 -4665
  15. package/dist/mcp.js.map +1 -1
  16. package/dist/{package-uzXzqDW6.js → package-7aT8_Xp0.js} +2 -2
  17. package/dist/{package-uzXzqDW6.js.map → package-7aT8_Xp0.js.map} +1 -1
  18. package/evals/README.md +117 -0
  19. package/evals/affected-urls.json +57 -0
  20. package/evals/ai-readiness.json +84 -0
  21. package/evals/ai-referrals.json +71 -0
  22. package/evals/ai-search-scorecard.json +70 -0
  23. package/evals/audit-page.json +57 -0
  24. package/evals/audit-urls.json +58 -0
  25. package/evals/cannibalisation.json +57 -0
  26. package/evals/community-intent.json +57 -0
  27. package/evals/compare-crawls.json +56 -0
  28. package/evals/content-optimization.json +57 -0
  29. package/evals/crawl-diff.json +58 -0
  30. package/evals/crawl-history.json +44 -0
  31. package/evals/crawl-report.json +44 -0
  32. package/evals/crawler-rules.json +44 -0
  33. package/evals/ctr-underperformers.json +57 -0
  34. package/evals/decaying-pages.json +57 -0
  35. package/evals/entity-readiness.json +57 -0
  36. package/evals/explain-crawl-issue.json +44 -0
  37. package/evals/generate-llms-txt.json +44 -0
  38. package/evals/geo-gaps.json +57 -0
  39. package/evals/index-coverage-plan.json +58 -0
  40. package/evals/index-coverage.json +70 -0
  41. package/evals/index-monitor.json +58 -0
  42. package/evals/index-watch.json +68 -0
  43. package/evals/internal-links.json +57 -0
  44. package/evals/link-recovery.json +58 -0
  45. package/evals/llms-txt-audit.json +44 -0
  46. package/evals/measure-change.json +58 -0
  47. package/evals/monthly-action-plan.json +56 -0
  48. package/evals/monthly-report.json +58 -0
  49. package/evals/narrative-report.json +58 -0
  50. package/evals/okf-build.json +44 -0
  51. package/evals/okf-validate.json +44 -0
  52. package/evals/page-opportunities.json +57 -0
  53. package/evals/performance-audit.json +57 -0
  54. package/evals/pseo-audit.json +84 -0
  55. package/evals/query-clusters.json +57 -0
  56. package/evals/quick-wins.json +86 -0
  57. package/evals/redirect-trace.json +57 -0
  58. package/evals/refresh-priorities.json +57 -0
  59. package/evals/search-performance-overview.json +86 -0
  60. package/evals/second-page.json +58 -0
  61. package/evals/segment-impact.json +57 -0
  62. package/evals/seo-fix-queue.json +85 -0
  63. package/evals/seo-geo-readiness.json +84 -0
  64. package/evals/seo-site-audit.json +85 -0
  65. package/evals/seo-to-ai-query.json +57 -0
  66. package/evals/seo.json +87 -0
  67. package/evals/setup-check.json +56 -0
  68. package/evals/site-crawl.json +44 -0
  69. package/evals/striking-distance.json +85 -0
  70. package/evals/technical-watch.json +57 -0
  71. package/evals/top-fixes.json +44 -0
  72. package/evals/traffic-anomaly.json +57 -0
  73. package/evals/update-correlation.json +57 -0
  74. package/evals/update-postmortem.json +57 -0
  75. package/package.json +5 -3
  76. package/skills/README.md +46 -59
  77. package/skills/seo/SKILL.md +88 -63
  78. package/skills/seo/agents/openai.yaml +2 -2
  79. package/dist/dist-CSY2_p-j.js.map +0 -1
  80. package/skills/affected-urls/SKILL.md +0 -39
  81. package/skills/affected-urls/agents/openai.yaml +0 -4
  82. package/skills/ai-readiness/SKILL.md +0 -34
  83. package/skills/ai-readiness/agents/openai.yaml +0 -4
  84. package/skills/ai-referrals/SKILL.md +0 -31
  85. package/skills/ai-referrals/agents/openai.yaml +0 -4
  86. package/skills/audit-page/SKILL.md +0 -50
  87. package/skills/audit-page/agents/openai.yaml +0 -4
  88. package/skills/audit-urls/SKILL.md +0 -39
  89. package/skills/audit-urls/agents/openai.yaml +0 -4
  90. package/skills/cannibalisation/SKILL.md +0 -31
  91. package/skills/cannibalisation/agents/openai.yaml +0 -4
  92. package/skills/community-intent/SKILL.md +0 -39
  93. package/skills/community-intent/agents/openai.yaml +0 -4
  94. package/skills/compare-crawls/SKILL.md +0 -40
  95. package/skills/compare-crawls/agents/openai.yaml +0 -4
  96. package/skills/content-optimization/SKILL.md +0 -31
  97. package/skills/content-optimization/agents/openai.yaml +0 -4
  98. package/skills/crawl-diff/SKILL.md +0 -51
  99. package/skills/crawl-diff/agents/openai.yaml +0 -4
  100. package/skills/crawl-history/SKILL.md +0 -37
  101. package/skills/crawl-history/agents/openai.yaml +0 -4
  102. package/skills/crawl-report/SKILL.md +0 -37
  103. package/skills/crawl-report/agents/openai.yaml +0 -4
  104. package/skills/crawler-rules/SKILL.md +0 -34
  105. package/skills/crawler-rules/agents/openai.yaml +0 -4
  106. package/skills/ctr-underperformers/SKILL.md +0 -31
  107. package/skills/ctr-underperformers/agents/openai.yaml +0 -4
  108. package/skills/decaying-pages/SKILL.md +0 -31
  109. package/skills/decaying-pages/agents/openai.yaml +0 -4
  110. package/skills/entity-readiness/SKILL.md +0 -34
  111. package/skills/entity-readiness/agents/openai.yaml +0 -4
  112. package/skills/explain-crawl-issue/SKILL.md +0 -32
  113. package/skills/explain-crawl-issue/agents/openai.yaml +0 -4
  114. package/skills/generate-llms-txt/SKILL.md +0 -37
  115. package/skills/generate-llms-txt/agents/openai.yaml +0 -4
  116. package/skills/geo-gaps/SKILL.md +0 -37
  117. package/skills/geo-gaps/agents/openai.yaml +0 -4
  118. package/skills/index-coverage/SKILL.md +0 -84
  119. package/skills/index-coverage/agents/openai.yaml +0 -4
  120. package/skills/index-coverage-plan/SKILL.md +0 -50
  121. package/skills/index-coverage-plan/agents/openai.yaml +0 -4
  122. package/skills/index-monitor/SKILL.md +0 -49
  123. package/skills/index-monitor/agents/openai.yaml +0 -4
  124. package/skills/index-watch/SKILL.md +0 -77
  125. package/skills/index-watch/agents/openai.yaml +0 -4
  126. package/skills/internal-links/SKILL.md +0 -31
  127. package/skills/internal-links/agents/openai.yaml +0 -4
  128. package/skills/link-recovery/SKILL.md +0 -51
  129. package/skills/link-recovery/agents/openai.yaml +0 -4
  130. package/skills/llms-txt-audit/SKILL.md +0 -34
  131. package/skills/llms-txt-audit/agents/openai.yaml +0 -4
  132. package/skills/measure-change/SKILL.md +0 -52
  133. package/skills/measure-change/agents/openai.yaml +0 -4
  134. package/skills/monthly-action-plan/SKILL.md +0 -50
  135. package/skills/monthly-action-plan/agents/openai.yaml +0 -4
  136. package/skills/monthly-report/SKILL.md +0 -50
  137. package/skills/monthly-report/agents/openai.yaml +0 -4
  138. package/skills/narrative-report/SKILL.md +0 -51
  139. package/skills/narrative-report/agents/openai.yaml +0 -4
  140. package/skills/okf-build/SKILL.md +0 -39
  141. package/skills/okf-build/agents/openai.yaml +0 -4
  142. package/skills/okf-validate/SKILL.md +0 -43
  143. package/skills/okf-validate/agents/openai.yaml +0 -4
  144. package/skills/page-opportunities/SKILL.md +0 -31
  145. package/skills/page-opportunities/agents/openai.yaml +0 -4
  146. package/skills/performance/SKILL.md +0 -50
  147. package/skills/performance/agents/openai.yaml +0 -4
  148. package/skills/performance-audit/SKILL.md +0 -31
  149. package/skills/performance-audit/agents/openai.yaml +0 -4
  150. package/skills/pseo-audit/SKILL.md +0 -103
  151. package/skills/pseo-audit/agents/openai.yaml +0 -4
  152. package/skills/query-clusters/SKILL.md +0 -31
  153. package/skills/query-clusters/agents/openai.yaml +0 -4
  154. package/skills/quick-wins/SKILL.md +0 -31
  155. package/skills/quick-wins/agents/openai.yaml +0 -4
  156. package/skills/redirect-trace/SKILL.md +0 -51
  157. package/skills/redirect-trace/agents/openai.yaml +0 -4
  158. package/skills/refresh-priorities/SKILL.md +0 -48
  159. package/skills/refresh-priorities/agents/openai.yaml +0 -4
  160. package/skills/search-performance-overview/SKILL.md +0 -48
  161. package/skills/search-performance-overview/agents/openai.yaml +0 -4
  162. package/skills/second-page/SKILL.md +0 -50
  163. package/skills/second-page/agents/openai.yaml +0 -4
  164. package/skills/segment-impact/SKILL.md +0 -50
  165. package/skills/segment-impact/agents/openai.yaml +0 -4
  166. package/skills/seo-fix-queue/SKILL.md +0 -50
  167. package/skills/seo-fix-queue/agents/openai.yaml +0 -4
  168. package/skills/seo-geo-readiness/SKILL.md +0 -60
  169. package/skills/seo-geo-readiness/agents/openai.yaml +0 -4
  170. package/skills/seo-site-audit/SKILL.md +0 -59
  171. package/skills/seo-site-audit/agents/openai.yaml +0 -4
  172. package/skills/seo-to-ai-query/SKILL.md +0 -31
  173. package/skills/seo-to-ai-query/agents/openai.yaml +0 -4
  174. package/skills/setup-check/SKILL.md +0 -49
  175. package/skills/setup-check/agents/openai.yaml +0 -4
  176. package/skills/site-crawl/SKILL.md +0 -39
  177. package/skills/site-crawl/agents/openai.yaml +0 -4
  178. package/skills/striking-distance/SKILL.md +0 -52
  179. package/skills/striking-distance/agents/openai.yaml +0 -4
  180. package/skills/technical-watch/SKILL.md +0 -49
  181. package/skills/technical-watch/agents/openai.yaml +0 -4
  182. package/skills/top-fixes/SKILL.md +0 -38
  183. package/skills/top-fixes/agents/openai.yaml +0 -4
  184. package/skills/traffic-anomaly/SKILL.md +0 -52
  185. package/skills/traffic-anomaly/agents/openai.yaml +0 -4
  186. package/skills/update-correlation/SKILL.md +0 -51
  187. package/skills/update-correlation/agents/openai.yaml +0 -4
  188. package/skills/update-postmortem/SKILL.md +0 -49
  189. package/skills/update-postmortem/agents/openai.yaml +0 -4
@@ -1,31 +0,0 @@
1
- ---
2
- name: decaying-pages
3
- description: Compare retained GSC query-page rows across equal finalized windows to find observed click declines; use when an agent needs a bounded investigation queue without invented attribution.
4
- ---
5
-
6
- # Decaying queries and pages
7
-
8
- Use this report to identify retained query/page combinations that lost clicks between adjacent equal-length periods or year-over-year windows. It requires evidence in both windows, excludes URL shifts, and groups returned rows by diagnosis signal and page template. This avoids turning a row missing from GSC's retained query data into zero traffic. The report shows observed movement, not why it happened.
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":"decaying-pages"}`.
16
- 3. Call `seo_run_report` with `{"id":"decaying-pages","params":{"site":"sc-domain:example.com","days":28,"comparison":"previous-period","limit":20,"minDropPct":20,"minPreviousClicks":10,"minClickLoss":5}}`.
17
-
18
- The CLI uses the same report definition:
19
-
20
- ```sh
21
- seo reports describe decaying-pages --json
22
- seo reports run decaying-pages --params '{"site":"sc-domain:example.com","days":28,"comparison":"previous-period","limit":20,"minDropPct":20,"minPreviousClicks":10,"minClickLoss":5}' --json
23
- ```
24
-
25
- `site` is required. Choose `year-over-year` only when the requested window fits GSC's available history. Brand terms and `includeBrand` control navigational-query filtering.
26
-
27
- ## Interpret and act
28
-
29
- Read `dataStatus`, `ranges`, and `source.completeness` first. Check current and previous fetched rows, caps, truncation, invalid rows, excluded URL shifts, and output limits in `selection`. `summary.observedRetainedQueryClickLoss` covers eligible retained rows; `returnedObservedRetainedQueryClickLoss` covers only the bounded output. Each item preserves current and previous clicks, impressions, CTR, position, `clickLoss`, `dropPct`, signals, and an evidence scope of `retained-query-page-row`. A diagnosis such as `lost_position` or `lost_ctr` labels correlated movement, not a cause.
30
-
31
- Safe actions include checking deployments and annotations, live indexability, SERP composition, demand seasonality, and page-template patterns before editing. Use groups to find repeated technical or content hypotheses, then verify individual URLs. Do not sum capped rows into a property-wide loss, treat missing retained rows as zero, or claim that a content change, ranking update, or technical issue caused the decline without separate evidence.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Decaying queries and pages"
3
- short_description: "Find observed click declines across retained GSC windows"
4
- default_prompt: "Use $decaying-pages to run the decaying-pages report and explain its evidence and limits."
@@ -1,34 +0,0 @@
1
- ---
2
- name: entity-readiness
3
- description: Inventory entity-related markup and identity signals without claiming recognition or authority. Use when reviewing schema types, names, authors, dates, sameAs links, and social references across crawlable pages.
4
- ---
5
-
6
- # Review entity readiness
7
-
8
- Consistent names, authorship, structured data, and external identity references can make a site easier to interpret. This report measures those observable signals across evaluated pages. It does not score authority, validate ownership of linked profiles, or prove that any search or AI system recognizes an entity.
9
-
10
- ## Run it
11
-
12
- For MCP, discover the report with `seo_list_reports` category `crawl` only when necessary. Call `seo_describe_report` with `{ "id": "entity-readiness" }`, then `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "entity-readiness",
17
- "params": { "reportId": "crawl_example_20260710" }
18
- }
19
- ```
20
-
21
- Use `structuredContent` after confirming `isError` is false. CLI parity is:
22
-
23
- ```sh
24
- seo reports describe entity-readiness --json
25
- seo reports run entity-readiness --params '{"reportId":"crawl_example_20260710"}' --json
26
- ```
27
-
28
- Pass `url` only when a fresh crawl is intended. A saved report keeps this inventory aligned with other technical findings.
29
-
30
- ## Read the observations
31
-
32
- Check `dataStatus`, `evaluatedPages`, `crawlPages`, and caveats before interpreting coverage. The analysis evaluates eligible, successfully fetched pages; skipped or non-indexable pages are not evidence of absence. Checks are informational observations with counts and coverage, not pass/fail requirements.
33
-
34
- Use `entities.schemaTypes` to see which types were parsed, `sameAsByType` and `sameAs` to review identity references, `socialProfiles` to inspect linked profiles, and `authors` to find observed bylines or structured authors. Sample the source pages before recommending global markup changes: a product, article, person, and organization need different semantics. Fix malformed or inconsistent markup only when the page's real subject supports it. Confirm names, URLs, authorship, and dates with the publisher, then re-crawl the same scope. Never infer Knowledge Graph inclusion, ownership, expertise, rankings, visibility, or citations from these signals alone.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Entity readiness"
3
- short_description: "Review entity-related site observations"
4
- default_prompt: "Use $entity-readiness to run the entity-readiness report and explain its evidence and limits."
@@ -1,32 +0,0 @@
1
- ---
2
- name: explain-crawl-issue
3
- description: Translate one crawler rule id into technical meaning, remediation guidance, and a verification method. Use after a crawl identifies a rule and before turning it into implementation work.
4
- ---
5
-
6
- # Explain a crawler rule
7
-
8
- Crawler findings use stable rule ids so agents can join summaries, affected URLs, and guidance without parsing prose. This report explains the rule definition; it does not inspect a site or prove that the rule triggered on any particular page.
9
-
10
- ## Run it
11
-
12
- If the id is unknown, use `crawler-rules` first. For MCP report discovery, call `seo_list_reports` with category `crawl` only when needed. Then call `seo_describe_report` with `{ "id": "explain-crawl-issue" }` and `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "explain-crawl-issue",
17
- "params": { "ruleId": "missing_title" }
18
- }
19
- ```
20
-
21
- Check MCP `isError`, then read `structuredContent`. The exact CLI equivalent is:
22
-
23
- ```sh
24
- seo reports describe explain-crawl-issue --json
25
- seo reports run explain-crawl-issue --params '{"ruleId":"missing_title"}' --json
26
- ```
27
-
28
- ## Apply the guidance carefully
29
-
30
- Read the rule's category, default severity, why it matters, fix steps, ignored impact, verification method, and agent hints. Default severity is generic prioritization metadata; actual urgency depends on affected templates, page purpose, response state, demand evidence, and publisher intent. Guidance describes the condition checked by the crawler, not a search-engine penalty or guaranteed ranking effect.
31
-
32
- Pair the definition with `affected-urls` from the same saved crawl. Inspect the per-URL evidence and sample enough page types to find the implementation boundary. For `missing_title`, for example, confirm that the final HTML truly lacks a useful title and that the crawler did not receive an error or intermediate response before changing a template. Create the smallest shared fix, preserve intentional controls, and use the stated verification method on the same bounded URLs. If no affected-URL evidence exists, present the output as reference documentation only.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Explain issue"
3
- short_description: "Explain one crawler rule"
4
- default_prompt: "Use $explain-crawl-issue to run the explain-crawl-issue report and explain its evidence and limits."
@@ -1,37 +0,0 @@
1
- ---
2
- name: generate-llms-txt
3
- description: Generate a bounded llms.txt draft from eligible crawl pages while exposing its URL and token budgets. Use when an agent needs a reviewable starting point rather than an automatically publishable file.
4
- ---
5
-
6
- # Generate an llms.txt draft
7
-
8
- This report turns crawl evidence into concise agent-facing navigation. It selects successfully fetched, indexable pages, removes common utility paths, groups suitable URLs, and stops at explicit URL and token budgets. The output is a draft: the crawler cannot determine publisher intent or guarantee factual summaries.
9
-
10
- ## Run it
11
-
12
- For MCP, call `seo_list_reports` with category `crawl` only if discovery is needed. Call `seo_describe_report` with `{ "id": "generate-llms-txt" }`, then call `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "generate-llms-txt",
17
- "params": {
18
- "reportId": "crawl_example_20260710",
19
- "maxUrls": 50,
20
- "tokenBudget": 4000,
21
- "exclude": ["/account/*", "/search"]
22
- }
23
- }
24
- ```
25
-
26
- Check `isError` and consume `structuredContent`. CLI parity is:
27
-
28
- ```sh
29
- seo reports describe generate-llms-txt --json
30
- seo reports run generate-llms-txt --params '{"reportId":"crawl_example_20260710","maxUrls":50,"tokenBudget":4000,"exclude":["/account/*","/search"]}' --json
31
- ```
32
-
33
- ## Review before publishing
34
-
35
- Inspect `content`, `includedUrls`, `estimatedTokens`, and `sections`. Confirm every URL is canonical, public, current, useful to an agent, and safe to promote. Review generated titles and descriptions against the pages themselves. Use exclusions for private, transactional, faceted, search, or low-value routes, and keep the file deliberately small.
36
-
37
- Load the source with `crawl-report` to check its date, page cap, failures, and caveats. The generator currently does not return a separate candidate count, omitted count, source metadata block, or explicit truncation flag. Reaching `maxUrls` or the token budget should therefore be treated as possible truncation, not a complete inventory. A technically valid draft does not prove search or AI benefit, selection, indexing, visibility, or citations. Publish only after human review, then fetch the final file and validate its links.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Generate llms.txt"
3
- short_description: "Generate an llms.txt draft from crawl evidence"
4
- default_prompt: "Use $generate-llms-txt to run the generate-llms-txt report and explain its evidence and limits."
@@ -1,37 +0,0 @@
1
- ---
2
- name: geo-gaps
3
- description: Find URL-level technical barriers to AI-search eligibility while keeping access and selection separate. Use when reviewing response, crawl, indexability, canonical, or snippet restrictions from a crawl.
4
- ---
5
-
6
- # Find AI-search eligibility gaps
7
-
8
- Content cannot be selected when a system cannot retrieve or use it, but technical access never guarantees selection. This report narrows crawl evidence to response failures, robots restrictions, non-indexing directives, canonicalized pages, and snippet controls. It is a diagnostic URL list, not a visibility score.
9
-
10
- ## Run it
11
-
12
- For MCP, call `seo_list_reports` with category `crawl` only if discovery is required. Call `seo_describe_report` with `{ "id": "geo-gaps" }`, then call `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "geo-gaps",
17
- "params": {
18
- "reportId": "crawl_example_20260710",
19
- "limit": 25
20
- }
21
- }
22
- ```
23
-
24
- Confirm `isError` is false and consume `structuredContent`. The CLI flow is:
25
-
26
- ```sh
27
- seo reports describe geo-gaps --json
28
- seo reports run geo-gaps --params '{"reportId":"crawl_example_20260710","limit":25}' --json
29
- ```
30
-
31
- ## Interpret each gap
32
-
33
- For every URL, separate `issues` from `searchEligibility`. Review successful HTML response, crawl permission, indexable-candidate status, declared and effective indexability, canonical evidence, and snippet eligibility. A `null` access state means unknown, not allowed. Semantic HTML, structured data, authorship, dates, question headings, and answerable blocks are observations; they do not override a hard access restriction or create eligibility by themselves.
34
-
35
- Read `dataStatus`, `source`, and `selection` before interpreting the URL list. `source.partialReasons` explains missing page or request evidence, an incomplete crawl, page-cap stops, skipped URLs, failed requests, and extraction failures. Keep `configuredMaxPages`, `pageLimitReached`, request evidence status, and the evaluated, matched, returned, and truncated page counts with any conclusion. Propagated `warnings` and `caveats` remain part of the result.
36
-
37
- Confirm intent before treating `noindex`, robots rules, canonicals, or snippet limits as defects. Fix unintended response and access conflicts first, then verify the exact URL and directive after deployment. A `complete` result describes only the pages evaluated by that crawl, while `partial` or `unavailable` evidence cannot support an all-clear. An empty or short gap list does not prove indexing, visibility, selection, citation, or complete site coverage.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "GEO gaps"
3
- short_description: "Return technical AI-search eligibility gaps from crawl evidence"
4
- default_prompt: "Use $geo-gaps to run the geo-gaps report and explain its evidence and limits."
@@ -1,84 +0,0 @@
1
- ---
2
- name: index-coverage
3
- description: Compare a saved crawl and sitemap with Google Search Console page results, then choose representative URLs for URL Inspection. Use when an agent needs to investigate index coverage or decide where limited URL Inspection checks will answer the most useful questions without treating a missing Search Analytics row as proof that a page is unindexed.
4
- ---
5
-
6
- # Investigate index coverage signals
7
-
8
- Use `index-coverage` when the question is "which pages should I inspect?" A
9
- site can expose a page through links, a crawl, or a sitemap while Search
10
- Console returns no page row for the chosen period. That mismatch deserves
11
- review. It does not prove that the page is unindexed.
12
-
13
- The report compares three different kinds of evidence:
14
-
15
- - A saved crawl shows which pages the local crawler fetched and which current
16
- controls it observed.
17
- - Sitemaps show URLs submitted as discovery hints. They do not prove crawling
18
- or indexing.
19
- - Search Analytics page rows show Google Search visibility returned during an
20
- exact finalized date range. They are not a complete index inventory.
21
-
22
- Use URL Inspection after this report when you need Google's current indexed
23
- verdict for a representative URL.
24
-
25
- ## Run the report
26
-
27
- With MCP, call `seo_list_reports` with `{"category":"monitoring"}`. Call
28
- `seo_describe_report` with `{"id":"index-coverage"}`, then call
29
- `seo_run_report`, for example:
30
-
31
- ```json
32
- {"id":"index-coverage","params":{"site":"sc-domain:example.com","sitemaps":["https://example.com/sitemap.xml"],"days":90,"rowLimit":100000}}
33
- ```
34
-
35
- The report uses the latest saved crawl for `site` unless `crawlReportId` names
36
- one explicitly. Run `site-crawl` first when no suitable local crawl exists.
37
- Pass `sitemaps` when the crawl did not capture useful robots.txt sitemap
38
- declarations or when you need a specific sitemap scope.
39
-
40
- The CLI uses the same schema and report logic:
41
-
42
- ```sh
43
- seo reports describe index-coverage --json
44
- seo reports run index-coverage --params '{"site":"sc-domain:example.com","sitemaps":["https://example.com/sitemap.xml"],"days":90,"rowLimit":100000}' --json
45
- ```
46
-
47
- ## Read the evidence before the URL lists
48
-
49
- Start with `sources`. Check `completeness`, `rowLimit`, `rowLimitReached`,
50
- invalid URLs, duplicate URLs, the Search Console date range, and invalid
51
- metric rows. A partial or truncated source makes absence comparisons less
52
- reliable.
53
-
54
- Then inspect these groups:
55
-
56
- - `retainedSearchVisibility` contains pages with Search Analytics
57
- impressions in the selected period.
58
- - `crawlableWithoutRetainedSearchVisibility` contains fetched crawlable pages
59
- with no returned Search Console row. Treat these as review candidates.
60
- - `blockedOrNonIndexable` keeps current crawl controls and historical search
61
- visibility separate. A control can be intentional.
62
- - `sitemapOnly` and `searchConsoleOnly` show mismatches in the available source
63
- inventories. Scope, redirects, URL variants, and source limits may explain
64
- them.
65
- - `templateReview` groups repeated URL shapes for sampling. A cluster is not a
66
- content-quality, duplication, or index-bloat verdict.
67
-
68
- Every detail list is limited. Use `count`, `returned`, and `omitted` together
69
- before describing the size of a group.
70
-
71
- ## Choose useful follow-up checks
72
-
73
- Pick representative URLs from important templates, high-value site sections,
74
- and unexpected sitemap-only groups. Prefer a small sample that tests different
75
- failure theories over a long random list.
76
-
77
- Run `index-watch` for those URLs to collect exact URL Inspection evidence. Use
78
- `index-coverage-plan` when the inventory is too large for the available daily
79
- quota. Fix crawl or sitemap scope problems before drawing conclusions from
80
- cross-source mismatches.
81
-
82
- Never call a URL indexed because it had Search Analytics visibility during the
83
- period. Never call it unindexed because no row appeared. Do not turn a limited
84
- or incomplete source into a whole-site index coverage percentage.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Index coverage signals"
3
- short_description: "Choose pages for URL Inspection from crawl and search evidence"
4
- default_prompt: "Use $index-coverage to compare crawl, sitemap, and Search Console evidence, then choose representative URLs for URL Inspection."
@@ -1,50 +0,0 @@
1
- ---
2
- name: index-coverage-plan
3
- description: Allocate sitemap URLs across available GSC properties under URL Inspection capacity; use it to design a monitoring cycle before spending inspection quota.
4
- ---
5
-
6
- # Plan inspection coverage
7
-
8
- Use `index-coverage-plan` when sitemap inventory is larger than the URL
9
- Inspection checks you can run each day. It fetches sitemap URLs, maps them to
10
- the most specific available Search Console properties, estimates cycle time,
11
- and can suggest URL-prefix properties for large folders. It does not call URL
12
- Inspection and does not report whether any URL is indexed.
13
-
14
- ## Run the report
15
-
16
- With MCP, call `seo_list_reports` with `{"category":"monitoring"}`. Call
17
- `seo_describe_report` with `{"id":"index-coverage-plan"}`, then call
18
- `seo_run_report`, for example
19
- `{"id":"index-coverage-plan","params":{"site":"sc-domain:example.com","sitemaps":["https://example.com/sitemap.xml"],"dailyLimit":200,"targetCycleDays":7,"maxUrls":50000}}`.
20
-
21
- The CLI uses the same report schema:
22
-
23
- ```sh
24
- seo reports describe index-coverage-plan --json
25
- seo reports run index-coverage-plan --params '{"site":"sc-domain:example.com","sitemaps":["https://example.com/sitemap.xml"],"dailyLimit":200,"targetCycleDays":7,"maxUrls":50000}' --json
26
- ```
27
-
28
- Pass `properties` only when you intentionally want to override discovered GSC
29
- properties. Every sitemap URL must belong to the root property.
30
-
31
- ## Interpret the output
32
-
33
- Read `summary.sitemapUrls`, `urlCount`, property count, daily capacity,
34
- estimated cycle days, target cycle days, and suggestion count together.
35
- `properties` shows each allocation, daily limit, estimated cycle, and sample
36
- URLs. `suggestions` identifies folders that might benefit from a separate
37
- URL-prefix property and explains the calculated reason.
38
-
39
- Inspect every `warning`. Sitemap fetch failures, invalid or out-of-property
40
- URLs, nested-sitemap boundaries, deduplication, or `maxUrls` truncation make the
41
- plan incomplete. Estimated cycle time is arithmetic based on discovered URLs
42
- and configured capacity; it is not a promise that Google will process or index
43
- those URLs.
44
-
45
- ## Act safely
46
-
47
- Use the plan to set a realistic recurring `index-monitor` limit. Add a suggested
48
- property only if you control it and the operational benefit is worth the setup.
49
- Fix sitemap discovery problems before increasing quota. Do not report an index
50
- coverage percentage, excluded count, or all-clear from this allocation plan.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Index coverage plan"
3
- short_description: "Plan URL Inspection allocation across Search Console properties"
4
- default_prompt: "Use $index-coverage-plan to run the index-coverage-plan report and explain its evidence and limits."
@@ -1,49 +0,0 @@
1
- ---
2
- name: index-monitor
3
- description: Select due sitemap URLs and store bounded Google URL Inspection snapshots; use it for recurring index-state monitoring under local quota controls.
4
- ---
5
-
6
- # Monitor sitemap URLs
7
-
8
- Use `index-monitor` for a recurring, quota-aware sample of sitemap URLs. It
9
- builds a bounded inventory, allocates URLs to the most specific GSC property,
10
- selects due checks, calls URL Inspection, and stores snapshots for later change
11
- classification. The result describes Google's indexed snapshot for selected
12
- URLs. It is not a live crawl and cannot establish the status of every sitemap
13
- URL in one run.
14
-
15
- ## Run the report
16
-
17
- With MCP, call `seo_list_reports` with `{"category":"monitoring"}`, then
18
- `seo_describe_report` with `{"id":"index-monitor"}`. Call `seo_run_report` with
19
- schema-valid parameters, for example
20
- `{"id":"index-monitor","params":{"site":"sc-domain:example.com","sitemaps":["https://example.com/sitemap.xml"],"dailyLimit":200,"inspectLimit":25,"maxUrls":50000,"languageCode":"en-GB"}}`.
21
-
22
- CLI parity uses the same registry:
23
-
24
- ```sh
25
- seo reports describe index-monitor --json
26
- seo reports run index-monitor --params '{"site":"sc-domain:example.com","sitemaps":["https://example.com/sitemap.xml"],"dailyLimit":200,"inspectLimit":25,"maxUrls":50000,"languageCode":"en-GB"}' --json
27
- ```
28
-
29
- ## Interpret the output
30
-
31
- Read `dataStatus` and `source` first. Check sitemap and inventory limits,
32
- discovered and invalid URLs, truncation flags, omitted minimum count, daily
33
- limit, inspection limit, freshness window, and retry interval.
34
-
35
- In `summary`, keep inventory states distinct: never attempted, never succeeded,
36
- retry waiting, fresh, stale, due, selected, unselected due, attempted,
37
- inspected, failed, quota blocked, deferred, and skipped. A due URL that was not
38
- selected has no new inspection result. `properties` explains allocation and
39
- execution per property. In `items`, separate `inspectionStatus`, `indexStatus`,
40
- current issue codes, regressions, recoveries, alerts, and operational errors.
41
- Read `caveats` and `warnings` before an all-clear.
42
-
43
- ## Act safely
44
-
45
- Investigate regressions and current issues with a live page audit, sitemap
46
- review, and the exact inspection evidence. Retry failed, deferred, or
47
- quota-blocked checks according to `retryAt`; do not convert them into SEO
48
- defects. Increase cycle coverage gradually. A complete selected batch still
49
- does not prove inventory-wide indexing, recrawl timing, or future inclusion.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Index monitor"
3
- short_description: "Run bounded sitemap-driven URL Inspection monitoring"
4
- default_prompt: "Use $index-monitor to run the index-monitor report and explain its evidence and limits."
@@ -1,77 +0,0 @@
1
- ---
2
- name: index-watch
3
- description: Monitor a bounded URL set with Google Search Console URL Inspection and interpret exact indexed-state evidence, current reviews, regressions, recoveries, failures, and quota-deferred checks. Use when an agent needs to check whether watched URLs changed indexing state, investigate exact robots/indexing/fetch/canonical evidence, or plan recurring sitemap monitoring without overstating URL Inspection as a live test.
4
- ---
5
-
6
- # Index watch
7
-
8
- Call `seo_list_reports` with category `monitoring` when discovery is needed.
9
- Call `seo_describe_report` with id `index-watch`, then call `seo_run_report`
10
- with that id and only the described parameters. Read `structuredContent` as the
11
- machine contract. Use report id `index-monitor` for a bounded oldest-first
12
- sitemap sample. Use report id `index-coverage-plan` before monitoring a large
13
- inventory across multiple Search Console properties.
14
-
15
- For the shared schema-backed CLI path:
16
-
17
- ```bash
18
- seo reports describe index-watch --json
19
- seo reports run index-watch --params '{"site":"sc-domain:example.com","urls":["https://example.com/a","https://example.com/b"],"dailyLimit":25}' --json
20
- ```
21
-
22
- This validates the same parameters used by MCP. The focused commands below add
23
- saved monitoring state, sitemap selection, and friendlier flags for recurring
24
- human workflows.
25
-
26
- ## Run the report
27
-
28
- 1. Pass the selected Search Console property as `site`.
29
- 2. Keep explicit `urls` at 100 or fewer. Every URL must belong to the property.
30
- 3. Use `dailyLimit` only to set a lower local safety limit. It cannot exceed
31
- Google's documented 2,000 daily inspections per property.
32
- 4. For sitemap monitoring, check `source.possiblyTruncated`, `dataStatus`,
33
- `warnings`, `neverAttempted`, `neverSucceeded`, `retryWaiting`, `fresh`,
34
- `stale`, `due`, `selected`, and `unselectedDue` before summarising coverage.
35
- 5. Read `currentIssues`, `regressions`, `recoveries`, `failed`, `quotaBlocked`,
36
- and `deferred` separately.
37
-
38
- CLI equivalents:
39
-
40
- ```bash
41
- seo index-watch --site sc-domain:example.com --urls https://example.com/a,https://example.com/b --json
42
- seo index-watch --site sc-domain:example.com --sitemaps https://example.com/sitemap.xml --inspect-limit 25 --json
43
- seo index-watch --site sc-domain:example.com --sitemaps https://example.com/sitemap.xml --plan --json
44
- ```
45
-
46
- ## Interpret evidence
47
-
48
- - `inspectionStatus: succeeded` means Google returned an indexed snapshot.
49
- - `indexStatus` maps exact verdicts: `PASS` to `indexed`, `NEUTRAL` to
50
- `excluded`, `FAIL` to `invalid`, and everything else to `unknown`.
51
- - `currentIssue` means stable enum or canonical evidence needs review against
52
- the URL's intended state. An excluded URL or alternate canonical may be
53
- intentional.
54
- - `changeKind: regression` means a prior clear successful snapshot became an
55
- issue. `recovery` means the reverse.
56
- - `baseline` means there is no previous successful snapshot. A first-run issue
57
- is still a current review and a new alert.
58
- - `failed`, `quota-blocked`, and `deferred` are operational outcomes, not SEO
59
- defects. They are not comparable with a successful indexed state.
60
- - `requestSent: false` means the local quota broker blocked the call before it
61
- reached Google. Use `retryAt` when it is present.
62
- - Use `issueCodes` and typed `changes` for machine reasoning. Keep
63
- `coverageState` as display evidence because Google localises that free text.
64
-
65
- ## Guardrails
66
-
67
- - URL Inspection is Google's indexed version for one URL. It is not a live
68
- crawl and does not guarantee current search appearance.
69
- - Do not report every `NEUTRAL` verdict or canonical difference as a defect.
70
- - Do not infer inventory-wide health from the bounded selected sample.
71
- - Sitemap failures wait 24 hours before automatic selection retries. Do not
72
- retry quota-blocked or deferred URLs before `retryAt`.
73
- - The local UTC-day quota ledger cannot observe calls made by other machines or
74
- Google clients. A provider 429 remains authoritative.
75
- - Fix authentication and property access failures instead of treating the
76
- report as sparse data.
77
- - Prefer BYO Google credentials if shared OAuth project quota becomes a limit.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Index Watch"
3
- short_description: "Monitor exact Google indexed-state changes safely"
4
- default_prompt: "Use $index-watch to inspect a bounded URL set, separate current index reviews from regressions and failures, and explain the evidence without treating Google URL Inspection as a live test."
@@ -1,31 +0,0 @@
1
- ---
2
- name: internal-links
3
- description: Find fetched source pages with query evidence relevant to one target URL and no verified contextual link; use when an agent needs bounded link candidates rather than automatic anchor insertion.
4
- ---
5
-
6
- # Internal link candidates
7
-
8
- Use this report to find source pages whose retained GSC queries overlap with demand for a target URL. It resolves target aliases, fetches bounded candidate pages, checks technical state, and inspects observed links and placement before returning a review candidate. Exact query overlap is stronger than lexical overlap, but neither proves that a link belongs in the page or that adding one will improve rankings.
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":"internal-links"}`.
16
- 3. Call `seo_run_report` with `{"id":"internal-links","params":{"site":"sc-domain:example.com","targetUrl":"https://example.com/guides/seo","days":90,"limit":15,"checkLimit":40,"minImpressions":25}}`.
17
-
18
- The CLI invokes the same handler:
19
-
20
- ```sh
21
- seo reports describe internal-links --json
22
- seo reports run internal-links --params '{"site":"sc-domain:example.com","targetUrl":"https://example.com/guides/seo","days":90,"limit":15,"checkLimit":40,"minImpressions":25}' --json
23
- ```
24
-
25
- `site` and `targetUrl` are required. `checkLimit` bounds fetched candidates; `limit` bounds returned candidates. Increase fetch concurrency or enable JavaScript only when the site and task justify the extra load.
26
-
27
- ## Interpret and act
28
-
29
- Check `dataStatus`, target verification, aliases, canonical, technical signals, and source completeness first. Review `selection.attemptedSources`, checked, failed, unchecked, technical exclusions, alias exclusions, and existing-link exclusions. A low `checkLimit` can leave plausible candidates unchecked. Each item includes exact or lexical query matches, shared terms, impressions, fetch diagnostics, technical signals, and `linkEvidence`. Distinguish `missing`, `non-contextual-only`, and `alias-contextual`; respect observed and limited link counts. Priority is a heuristic combining match evidence, not estimated impact.
30
-
31
- Safe action is to read the source passage, confirm the target is genuinely useful there, choose natural anchor wording, add one contextual link, and recrawl to verify it. Do not insert links in bulk, replace navigation links without reason, link from technically unsuitable pages, or claim ranking impact from a candidate score.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Internal link candidates"
3
- short_description: "Find verified internal-link review candidates for one target URL"
4
- default_prompt: "Use $internal-links to run the internal-links report and explain its evidence and limits."
@@ -1,51 +0,0 @@
1
- ---
2
- name: link-recovery
3
- description: Join retained GSC page value with current redirect and indexability checks; use it to prioritise previously visible URLs that may now be broken or misdirected.
4
- ---
5
-
6
- # Recover search-value URLs
7
-
8
- Use `link-recovery` to find retained GSC page rows with prior clicks or
9
- impressions whose current fetch path ends in a technical problem. This joins
10
- historical search observations with a present redirect trace, which is useful
11
- for triage after migrations or URL changes. Prior visibility helps order the
12
- queue. It does not prove that fixing a URL will restore the same traffic.
13
-
14
- ## Run the report
15
-
16
- With MCP, call `seo_list_reports` with `{"category":"monitoring"}`, call
17
- `seo_describe_report` with `{"id":"link-recovery"}`, then use `seo_run_report`.
18
- Example:
19
- `{"id":"link-recovery","params":{"site":"sc-domain:example.com","days":90,"limit":25,"minClicks":1,"minImpressions":100,"js":false,"refresh":true}}`.
20
-
21
- The CLI has the same schema:
22
-
23
- ```sh
24
- seo reports describe link-recovery --json
25
- seo reports run link-recovery --params '{"site":"sc-domain:example.com","days":90,"limit":25,"minClicks":1,"minImpressions":100,"refresh":true}' --json
26
- ```
27
-
28
- The discovery schema currently exposes broad number types. Use positive whole
29
- days and bounded non-negative thresholds.
30
-
31
- ## Interpret the output
32
-
33
- Confirm `range` and `summary.checked` before reading recoverable counts. The
34
- summary separates high, medium, and low severity and totals observed clicks and
35
- impressions for affected retained rows. Those `clicksAtRisk` and
36
- `impressionsAtRisk` values describe the checked period; they are not a forecast
37
- of future loss or recovery.
38
-
39
- Each item preserves the original URL, final URL, GSC metrics, primary and full
40
- issue lists, severity, the redirect `trace`, and a recommendation with evidence,
41
- effort, and confidence. Inspect chain status, final-page indexability,
42
- canonicals, and warnings directly. Failed checks, selection limits, or retained
43
- GSC rows outside the returned set constrain coverage.
44
-
45
- ## Act safely
46
-
47
- Restore a page only when it should still exist. Otherwise add one direct 301 to
48
- the closest equivalent destination and align its canonical after verifying
49
- intent. Fix server errors and accidental noindex controls before content work.
50
- Do not redirect unrelated URLs to a homepage, remove intentional controls, or
51
- promise traffic recovery from historical metrics.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Link recovery"
3
- short_description: "Find search-value URLs that now fail technical checks"
4
- default_prompt: "Use $link-recovery to run the link-recovery report and explain its evidence and limits."
@@ -1,34 +0,0 @@
1
- ---
2
- name: llms-txt-audit
3
- description: Inspect an optional llms.txt file and derive a bounded set of suitable page candidates from crawl evidence. Use when reviewing agent-facing site navigation without treating the file as a ranking requirement.
4
- ---
5
-
6
- # Audit llms.txt
7
-
8
- `llms.txt` is optional publisher-provided navigation for agents. Its presence is not a general search requirement or ranking signal, and its absence is not a technical SEO defect. This report checks the observed file response and suggests eligible pages that could belong in a useful inventory.
9
-
10
- ## Run it
11
-
12
- For MCP, call `seo_list_reports` with category `crawl` only when discovery is needed. Call `seo_describe_report` with `{ "id": "llms-txt-audit" }`, then `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "llms-txt-audit",
17
- "params": { "reportId": "crawl_example_20260710" }
18
- }
19
- ```
20
-
21
- Check MCP `isError`, then read `structuredContent`. The CLI exposes the same contract:
22
-
23
- ```sh
24
- seo reports describe llms-txt-audit --json
25
- seo reports run llms-txt-audit --params '{"reportId":"crawl_example_20260710"}' --json
26
- ```
27
-
28
- Using `url` instead of `reportId` starts a fresh crawl. Prefer a saved snapshot when the recommendations will be compared with other reports.
29
-
30
- ## Interpret the result
31
-
32
- Review `exists`, the resolved file URL, response status, headline, issues, and `recommendedPages`. Candidate pages are drawn from successfully fetched, indexable pages and exclude common utility or private paths; ordering uses crawl evidence such as internal authority and content depth. That selection is a heuristic inventory, not proof that every important page is present or suitable for publication.
33
-
34
- Check the source report's date, cap, partial state, failed requests, warnings, and caveats with `crawl-report`. A short recommendation list from a capped crawl is not sitewide evidence. If the file exists, verify that its URLs are current, canonical, public, and aligned with publisher intent. If it does not exist, recommend creating one only when it improves agent navigation. Keep any generated file concise and human-reviewed; never claim that adding it will improve indexing, rankings, traffic, AI selection, or citations.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Audit llms.txt"
3
- short_description: "Inspect optional llms.txt evidence from a crawl"
4
- default_prompt: "Use $llms-txt-audit to run the llms-txt-audit report and explain its evidence and limits."