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.
Files changed (189) hide show
  1. package/PRIVACY.md +2 -2
  2. package/README.md +138 -42
  3. package/TERMS.md +2 -2
  4. package/TRADEMARKS.md +9 -5
  5. package/dist/cli.js +69 -52
  6. package/dist/cli.js.map +1 -1
  7. package/dist/{dist-CSY2_p-j.js → dist-CTBhWxn6.js} +49 -49
  8. package/dist/dist-CTBhWxn6.js.map +1 -0
  9. package/dist/{dist-FeAUNn9A.js → dist-eiewVfiS.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-BTOI9tde.js} +2 -2
  17. package/dist/{package-uzXzqDW6.js.map → package-BTOI9tde.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 +50 -61
  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,52 +0,0 @@
1
- ---
2
- name: measure-change
3
- description: Measure the before-and-after impact of a saved or ad hoc SEO change with equal finalized Google Search Console windows, optional GA4 landing-page evidence, and an optional control. Use when an agent needs to evaluate a release, page edit, migration, template change, or SEO test without mistaking an incomplete after-period for a decline.
4
- ---
5
-
6
- # Measure SEO change
7
-
8
- Call `seo_list_reports` with category `experiments` when discovery is needed.
9
- Call `seo_describe_report` with id `measure-change`, then call `seo_run_report`
10
- with that id and only the described parameters. Read `structuredContent` as the
11
- machine contract. Use the CLI for CI, saved JSON, or environments without MCP.
12
-
13
- ```bash
14
- seo reports describe measure-change --json
15
- seo reports run measure-change --params '{"site":"sc-domain:example.com","scope":"page","target":"https://example.com/page","title":"Updated page","changedAt":"2025-10-01","beforeDays":28,"afterDays":28}' --json
16
-
17
- seo tests report \
18
- --project <project> \
19
- --scope page \
20
- --target https://example.com/page \
21
- --date 2026-06-01 \
22
- --before 28 \
23
- --after 28 \
24
- --json
25
- ```
26
-
27
- Describe the report before building ad hoc parameters because the schema keeps
28
- saved-test and inline-test inputs in one contract. The catalog runner and the
29
- focused command execute the same measurement logic.
30
-
31
- For a saved test, pass its `id` instead of the ad hoc site, scope, target, and date fields.
32
-
33
- ## Workflow
34
-
35
- 1. Use the same whole-number duration for `beforeDays` and `afterDays`. Raw totals from unequal calendar windows are not comparable.
36
- 2. Read `dataStatus`, `window`, `source`, `warnings`, and `caveats` before interpreting metrics.
37
- 3. Confirm `window.effectiveDays` equals `window.requestedDays`. If `afterWindowTruncated` is true, the tool uses an equal shortened baseline, returns `partial`, and withholds a directional verdict.
38
- 4. Require at least 7 finalized days in each window for a directional verdict. Shorter complete windows remain useful observations but return `not-enough-data`.
39
- 5. Treat GSC clicks, impressions, CTR, and impression-weighted average position as observed before/after evidence. Timing does not prove that the recorded change caused the movement.
40
- 6. For query-scoped tests, treat `retained-query-date-aggregates` as partial. A missing retained window returns null metrics and is not a zero or a loss.
41
- 7. If GA4 is present, check its property timezone and `source.analytics.status`. GA4 day boundaries can differ from GSC Pacific dates; sampling, thresholding, or `(other)` grouping makes GA4 evidence partial.
42
- 8. Use a control only when it represents a credible unaffected comparison. Adjusted deltas use a control-ratio counterfactual, not raw subtraction across differently sized groups.
43
- 9. Investigate query mix, devices, countries, indexability, SERP changes, seasonality, and other releases before recommending a rollout or reversal.
44
-
45
- ## Interpretation rules
46
-
47
- - Never call `not-enough-data` positive, negative, or flat.
48
- - Never annualize or forecast the observed delta.
49
- - Do not compare this run with another run that used different effective window lengths.
50
- - `clickPct: null` means the before value was zero; it is not an infinite percentage gain.
51
- - A partial GA4 source does not invalidate complete GSC evidence, but it does limit analytics conclusions.
52
- - Provider, auth, property, and invalid-date errors are failures, not zero movement.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Measure SEO Change"
3
- short_description: "Measure equal-window GSC and GA4 change evidence"
4
- default_prompt: "Use $measure-change to measure this SEO change with equal finalized before and after evidence."
@@ -1,50 +0,0 @@
1
- ---
2
- name: monthly-action-plan
3
- description: Run a calendar-month reporting workflow with a narrative and explicit actions. Use it for a repeatable review whose caveats remain attached to each measurement.
4
- ---
5
-
6
- # Monthly workflow
7
-
8
- This workflow packages the monthly narrative into a sequenced, agent-friendly
9
- result with explicit steps and actions. It helps keep recurring reviews
10
- consistent. It can report measured movement, but it cannot establish a cause,
11
- promise recovery, or turn incomplete provider evidence into a full-property
12
- conclusion.
13
-
14
- ## Run it
15
-
16
- Use the exact MCP discovery flow:
17
-
18
- 1. Call `seo_list_reports` with `category: "workflows"` and select `monthly-action-plan`.
19
- 2. Call `seo_describe_report` with `id: "monthly-action-plan"`; confirm its current parameters.
20
- 3. Call `seo_run_report` with that id and only schema-valid parameters.
21
-
22
- CLI parity:
23
-
24
- ```sh
25
- seo reports describe monthly-action-plan --json
26
- seo reports run monthly-action-plan --params '{"site":"sc-domain:example.com","month":"2026-05","limit":10,"includeBrand":false}' --json
27
- ```
28
-
29
- Supply `month` as `YYYY-MM`. `limit` controls retained output, not the provider's
30
- underlying completeness. Keep `includeBrand` explicit when comparisons must be
31
- reproducible across months.
32
-
33
- ## Interpret and act
34
-
35
- Inspect the workflow envelope: `summary`, each entry in `steps`, `actions`, and
36
- the nested `output`. Confirm the requested month, final-data window, provider
37
- status, skipped sections, warnings, caveats, and retained caps. Follow narrative
38
- claims back into their structured diagnosis or measurement. A skipped section
39
- is not a zero, and a top-level successful workflow does not make every nested
40
- source complete.
41
-
42
- Use actions as a review queue, not automatic edit instructions. Verify affected
43
- URLs and intentional controls, reproduce technical defects, and record any
44
- approved changes for future measurement. Keep month-over-month movement
45
- separate from explanations. Do not invent click, traffic, ranking, or revenue
46
- forecasts, and do not attribute movement to an algorithm update or deployment
47
- from timing alone.
48
-
49
- Read MCP `structuredContent` as the machine contract. The rendered Markdown is
50
- the human brief, not an alternative data source for agents.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Monthly workflow"
3
- short_description: "Run the monthly reporting workflow"
4
- default_prompt: "Use $monthly-action-plan to run the monthly-action-plan report and explain its evidence and limits."
@@ -1,50 +0,0 @@
1
- ---
2
- name: monthly-report
3
- description: Generate a calendar-month SEO narrative from finalized first-party evidence. Use it to brief humans while preserving source status, caveats, and measured next actions.
4
- ---
5
-
6
- # Monthly report
7
-
8
- Monthly reporting matters because it fixes the analysis to a named calendar
9
- period and turns several measurements into one reviewable brief. The report can
10
- show observed movement and prioritized investigations. It cannot establish why
11
- traffic changed, guarantee that a recommended edit will help, or forecast
12
- clicks, rankings, revenue, or future 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 `monthly-report`.
19
- 2. Call `seo_describe_report` with `id: "monthly-report"` and inspect the current schema.
20
- 3. Call `seo_run_report` with `id: "monthly-report"` and only described parameters.
21
-
22
- The CLI exposes the same report:
23
-
24
- ```sh
25
- seo reports describe monthly-report --json
26
- seo reports run monthly-report --params '{"site":"sc-domain:example.com","month":"2026-05","limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}' --json
27
- ```
28
-
29
- Use `YYYY-MM` for `month`. `limit` bounds retained findings, not provider row
30
- retrieval. `verifyContent` fetches a bounded subset, so `verifyLimit` must not
31
- be interpreted as full-site validation.
32
-
33
- ## Interpret and act
34
-
35
- Confirm `month`, the underlying date windows, `dataStatus`, source completeness,
36
- skipped sections, warnings, and caveats before reading the headline. Treat the
37
- narrative as a rendering of structured evidence. Follow its references into
38
- the diagnosis, measured changes, priorities, and monitoring results when a
39
- claim needs verification. A zero from a complete source differs from an
40
- unavailable, partial, filtered, or capped section.
41
-
42
- Safe actions start with the highest-evidence priorities: validate affected URLs,
43
- compare relevant templates, inspect confirmed technical regressions, and assign
44
- owners to bounded tests. Keep brand filtering and content-verification status
45
- visible. Record what changed so the next month can measure it. Do not rewrite a
46
- page merely because it appears in a heuristic opportunity list, and do not
47
- present update overlap or timing as causation.
48
-
49
- Read MCP `structuredContent` as the machine contract. Use returned Markdown for
50
- the human brief, but never parse it to recover data already present in JSON.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Monthly report"
3
- short_description: "Generate one monthly SEO narrative"
4
- default_prompt: "Use $monthly-report to run the monthly-report report and explain its evidence and limits."
@@ -1,51 +0,0 @@
1
- ---
2
- name: narrative-report
3
- description: Assemble diagnosis, change measurement, and monitoring evidence into a readable SEO narrative. Use it for an evidence-linked briefing rather than a new source of truth.
4
- ---
5
-
6
- # Report narrative
7
-
8
- This report turns several structured analyses into a coherent explanation. It
9
- is useful when a person needs the important findings, caveats, and next actions
10
- without reading every raw section. The narrative summarizes evidence; it does
11
- not strengthen weak evidence, prove causation, or make missing and partial data
12
- complete.
13
-
14
- ## Run it
15
-
16
- Use the exact MCP discovery flow:
17
-
18
- 1. Call `seo_list_reports` with `category: "reporting"` and select `narrative-report`.
19
- 2. Call `seo_describe_report` with `id: "narrative-report"` before constructing parameters.
20
- 3. Call `seo_run_report` with `id: "narrative-report"` and schema-valid parameters.
21
-
22
- CLI parity:
23
-
24
- ```sh
25
- seo reports describe narrative-report --json
26
- seo reports run narrative-report --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"limit":10,"includeBrand":false,"changeLimit":5}' --json
27
- ```
28
-
29
- Use explicit date bounds only when the described schema supports the intended
30
- window; otherwise `days` and `recentDays` keep comparisons consistent.
31
- `changeLimit` bounds attempted change measurements, while `limit` bounds
32
- retained report items.
33
-
34
- ## Interpret and act
35
-
36
- Read `headline` only after checking top-level caveats. Then inspect `sections`,
37
- `priorities`, `diagnosis`, `changeMeasurements`,
38
- `changeMeasurementAttempts`, and `monitoring`. A failed or skipped measurement
39
- must stay visible; it is not a zero. Preserve each section's dates,
40
- completeness, thresholds, limits, and evidence references. Treat update timing,
41
- template groupings, and opportunity scores as investigation context, not
42
- ranking causes.
43
-
44
- Safe actions should trace back to observed evidence: reproduce a technical
45
- failure, inspect the affected URLs, validate an intentional control, or run a
46
- bounded content change with a recorded date. Keep recommended verification
47
- steps separate from asserted defects. Do not invent traffic lift, rank gains,
48
- revenue impact, or certainty that the source does not provide.
49
-
50
- MCP `structuredContent` is the machine contract. Returned Markdown is for human
51
- communication and should not replace the underlying JSON evidence.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Report narrative"
3
- short_description: "Generate a readable SEO narrative from diagnosis, changes, and monitoring evi..."
4
- default_prompt: "Use $narrative-report to run the narrative-report report and explain its evidence and limits."
@@ -1,39 +0,0 @@
1
- ---
2
- name: okf-build
3
- description: Build a deterministic OKF Markdown knowledge bundle from a bounded crawl and validate its file contract. Use when an agent needs portable site evidence with explicit source selection and caveats.
4
- ---
5
-
6
- # Build an OKF bundle
7
-
8
- An OKF bundle packages crawl-derived concepts, page inventory, link relationships, provenance, and caveats as portable Markdown. The builder ranks eligible pages deterministically and limits the selected concepts. This makes the artifact reproducible, but it does not make extracted claims true or current.
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": "okf-build" }`, then `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "okf-build",
17
- "params": {
18
- "reportId": "crawl_example_20260710",
19
- "maxConcepts": 25,
20
- "includeFiles": true,
21
- "title": "Example site knowledge"
22
- }
23
- }
24
- ```
25
-
26
- Check `isError`, then use `structuredContent`. CLI parity is:
27
-
28
- ```sh
29
- seo reports describe okf-build --json
30
- seo reports run okf-build --params '{"reportId":"crawl_example_20260710","maxConcepts":25,"includeFiles":true,"title":"Example site knowledge"}' --json
31
- ```
32
-
33
- `includeFiles` is opt-in because file bodies can be large. Request only the manifest when discovering scope.
34
-
35
- ## Inspect the bundle
36
-
37
- Read the manifest's schema version, report id, source URL, generation time, crawl status, title, concept count, file paths, warnings, and caveats. The `selection` block distinguishes source, eligible, duplicate-final, selected, and limited page counts and records the deterministic ordering. If selected pages equal the limit, treat the bundle as bounded rather than exhaustive.
38
-
39
- Review the returned validation before using files. Then inspect citations, canonical URLs, titles, summaries, and relationships against source pages, especially for sensitive or time-dependent claims. The generated log and caveat files should travel with the bundle. A successful structural validation does not establish ownership, freshness, factual accuracy, completeness, or safe downstream use. Rebuild from a comparable fresh crawl when the site changes; do not silently merge snapshots with different scope.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Build OKF"
3
- short_description: "Build a compact OKF site knowledge bundle"
4
- default_prompt: "Use $okf-build to run the okf-build report and explain its evidence and limits."
@@ -1,43 +0,0 @@
1
- ---
2
- name: okf-validate
3
- description: Validate OKF paths, frontmatter, required files, concept links, and citation structure deterministically. Use before consuming or distributing a bundle, while checking factual quality separately.
4
- ---
5
-
6
- # Validate an OKF bundle
7
-
8
- Validation protects the file contract an agent depends on: required paths, unique files, root metadata, Markdown content, concept frontmatter, links, and citation sections. It does not browse cited sources or determine whether the knowledge is true, current, owned, complete, or safe.
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": "okf-validate" }`, then call `seo_run_report` with:
13
-
14
- ```json
15
- {
16
- "id": "okf-validate",
17
- "params": {
18
- "files": [
19
- { "path": "index.md", "content": "---\nokf: \"0.1\"\ntype: \"index\"\n---\n# Example" },
20
- { "path": "log.md", "content": "# Log" },
21
- { "path": "concepts/index.md", "content": "# Concepts" },
22
- { "path": "inventory/pages.md", "content": "---\ntype: \"inventory\"\n---\n# Pages\n\n# Citations" },
23
- { "path": "graph/links.md", "content": "---\ntype: \"graph\"\n---\n# Links\n\n# Citations" },
24
- { "path": "caveats.md", "content": "---\ntype: \"caveats\"\n---\n# Caveats\n\n# Citations" }
25
- ]
26
- }
27
- }
28
- ```
29
-
30
- Check `isError`, then consume `structuredContent`.
31
-
32
- The CLI uses the same strict schema. This minimal six-file bundle is structurally valid:
33
-
34
- ```sh
35
- seo reports describe okf-validate --json
36
- seo reports run okf-validate --params '{"files":[{"path":"index.md","content":"---\nokf: \"0.1\"\ntype: \"index\"\n---\n# Example"},{"path":"log.md","content":"# Log"},{"path":"concepts/index.md","content":"# Concepts"},{"path":"inventory/pages.md","content":"---\ntype: \"inventory\"\n---\n# Pages\n\n# Citations"},{"path":"graph/links.md","content":"---\ntype: \"graph\"\n---\n# Links\n\n# Citations"},{"path":"caveats.md","content":"---\ntype: \"caveats\"\n---\n# Caveats\n\n# Citations"}]}' --json
37
- ```
38
-
39
- ## Resolve findings
40
-
41
- Read `validation.valid`, file and concept counts, then every issue's level, path, and message. Errors invalidate the supported contract and should be fixed file by file. Warnings identify weaker portability or provenance, such as missing citation sections, and still require review even when `valid` is true. Use `explanation.nextActions` as ordering guidance, not as evidence that automated edits are safe.
42
-
43
- Preserve the original bundle while correcting a copy, rerun validation, and compare issue sets deterministically. After structural success, separately verify cited URLs, claims, dates, access restrictions, publisher intent, and the crawl snapshot recorded by the bundle. Never report `valid: true` as "fact checked."
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Validate OKF"
3
- short_description: "Validate supplied OKF Markdown files"
4
- default_prompt: "Use $okf-validate to run the okf-validate report and explain its evidence and limits."
@@ -1,31 +0,0 @@
1
- ---
2
- name: page-opportunities
3
- description: Review one URL against retained GSC demand, peer CTR evidence, and live page content; use when an agent needs query-level opportunities with verification and source limits intact.
4
- ---
5
-
6
- # Page opportunities
7
-
8
- Use this report to investigate how one page performs for the query/page rows retained by Search Console. It compares the target rows with a bounded site-wide peer sample and can fetch the live page to distinguish covered, unverified, technical, framing, ranking, and possible content-gap observations. It does not expose anonymized queries, explain ranking causes, or prove that a benchmark shortfall is recoverable 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":"page-opportunities"}`.
16
- 3. Call `seo_run_report` with `{"id":"page-opportunities","params":{"site":"sc-domain:example.com","url":"https://example.com/pricing","days":90,"limit":15,"minImpressions":40,"verifyContent":true}}`.
17
-
18
- The CLI shares that schema and implementation:
19
-
20
- ```sh
21
- seo reports describe page-opportunities --json
22
- seo reports run page-opportunities --params '{"site":"sc-domain:example.com","url":"https://example.com/pricing","days":90,"limit":15,"minImpressions":40,"verifyContent":true}' --json
23
- ```
24
-
25
- `site` and `url` are required. Use `includeBrand:true` only when branded demand belongs in the decision. `verifyContent:false` saves a fetch but makes content-specific conclusions unavailable.
26
-
27
- ## Interpret and act
28
-
29
- Check `dataStatus`, `range`, `source.targetRowsFetched`, `selection`, and `benchmark` first. A `benchmark.possiblyTruncated` value of true means the peer sample reached its cap. Read `verification.status` and `reason`; only `verified` results support live-page coverage observations. For each `item`, retain the query metrics, opportunity type, benchmark evidence, verification evidence, and recommendation together. `estimatedCtrClickShortfall` is a directional calculation, not a click forecast, and `summary.opportunities` is a review queue rather than a defect count.
30
-
31
- Safe actions include inspecting the live SERP, resolving status/indexability contradictions, testing title or description framing when the page already answers the query, strengthening a relevant answer, and adding a contextual internal link. Do not rewrite a page from query wording alone, infer an all-clear from partial data, or merge and delete pages without separate intent, canonical, and internal-link evidence.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Page opportunities"
3
- short_description: "Find first-party opportunities for one URL"
4
- default_prompt: "Use $page-opportunities to run the page-opportunities report and explain its evidence and limits."
@@ -1,50 +0,0 @@
1
- ---
2
- name: performance
3
- description: Audit and interpret one URL's Lighthouse lab performance and device-specific CrUX field Core Web Vitals with the local seo CLI or MCP server. Use when an agent needs to investigate LCP, INP, CLS, TBT, page-speed diagnostics, mobile-versus-desktop evidence, or performance remediation without confusing lab, field, and fallback measurements.
4
- ---
5
-
6
- # Performance
7
-
8
- Run report id `performance-audit` through `seo_run_report` for structured agent
9
- output. Call `seo_describe_report` first when its parameters are not already
10
- known. Pass `url`, choose `strategy` as `mobile` or `desktop`, and use
11
- `refresh: true` only when a fresh measurement is required.
12
-
13
- CLI equivalents:
14
-
15
- ```bash
16
- seo perf audit --url https://example.com/page --json
17
- seo perf audit --url https://example.com/page --strategy desktop --refresh --json
18
- ```
19
-
20
- Set `SEO_CRUX_API_KEY` to request Chrome UX Report field data. The packaged
21
- Lighthouse runtime needs a compatible local Chrome installation.
22
-
23
- ## Interpret the report
24
-
25
- 1. Check `dataStatus`, `labDataStatus`, `fieldDataStatus`, and `caveats` first.
26
- 2. Treat CrUX as rolling, device-specific field evidence. Check whether its
27
- `scope` is the exact URL or the origin and quote the `collectionPeriod`.
28
- 3. Treat Lighthouse as one controlled navigation lab run. Use its compact
29
- `labInsights` and metric evidence for diagnosis, not as field experience.
30
- 4. Treat Lighthouse TBT as a lab responsiveness diagnostic. Never rename it
31
- INP. Field INP comes from CrUX.
32
- 5. Use the field p75 thresholds encoded by the report: LCP good at 2,500ms or
33
- less, INP good at 200ms or less, and CLS good at 0.1 or less. All three must
34
- be available and good for the field assessment to be good.
35
- 6. Prefer field findings when field and lab disagree. Explain that their
36
- populations and measurement conditions differ.
37
- 7. Keep recommendations tied to returned metrics or insights. Do not infer
38
- sitewide performance from one URL, device, or run.
39
-
40
- ## Guardrails
41
-
42
- - `source: fetch-fallback` is unscored transport evidence. Its duration is the
43
- complete local fetch workflow, not TTFB, Lighthouse, or Core Web Vitals.
44
- - Stop performance conclusions when fallback evidence is blocked or non-2xx.
45
- - `unavailable_no_coverage` means CrUX lacks enough data; it does not mean the
46
- page passed or failed Core Web Vitals.
47
- - `request_failed` is an operational provider problem, not a page finding.
48
- - Missing field metrics make the Core Web Vitals assessment incomplete.
49
- - Do not request or paste raw Lighthouse output unless a human explicitly
50
- needs the underlying artifact; compact output is the stable agent contract.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "SEO Performance"
3
- short_description: "Interpret lab and field performance evidence"
4
- default_prompt: "Use $performance to audit this URL and explain the lab and field performance evidence."
@@ -1,31 +0,0 @@
1
- ---
2
- name: performance-audit
3
- description: Audit one URL with local Lighthouse lab data and optional CrUX field Core Web Vitals; use when an agent must separate reproducible diagnostics, real-user evidence, and fallback transport checks.
4
- ---
5
-
6
- # Performance audit
7
-
8
- Use this report to diagnose page performance with three deliberately separate evidence classes. Lighthouse provides one local lab run and actionable diagnostics. CrUX, when `SEO_CRUX_API_KEY` is configured and coverage exists, provides p75 field Core Web Vitals for a device and URL or origin scope. If Lighthouse cannot run, the report falls back to unscored HTTP transport evidence so the failure remains useful without pretending it measured page experience.
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":"performance-audit"}`.
16
- 3. Call `seo_run_report` with `{"id":"performance-audit","params":{"url":"https://example.com/","strategy":"mobile","refresh":true}}`.
17
-
18
- The CLI invokes the same report:
19
-
20
- ```sh
21
- seo reports describe performance-audit --json
22
- seo reports run performance-audit --params '{"url":"https://example.com/","strategy":"mobile","refresh":true}' --json
23
- ```
24
-
25
- `url` is required; `strategy` is `mobile` or `desktop`. Omit `refresh` to allow the 24-hour local cache.
26
-
27
- ## Interpret and act
28
-
29
- Start with `dataStatus`, `source`, `labDataStatus`, and `fieldDataStatus`. A Lighthouse `score`, `grade`, lab metrics, and `labInsights` describe that test environment and run. CrUX `fieldData.metrics` describes aggregated real-user p75 values; preserve `scope`, `formFactor`, `collectionPeriod`, missing metrics, and assessment. Origin-level data is not page-level evidence. If `source` is `fetch-fallback`, `fallbackFetchDuration` is the complete local fetch workflow, not TTFB, Lighthouse, LCP, CLS, TBT, or INP, and it never earns a score.
30
-
31
- Use `topActions` as hypotheses tied to its evidence, then reproduce the relevant lab issue and verify after a change. Prioritise field failures with adequate coverage, recurring lab bottlenecks, and explicit savings evidence. Do not combine lab and field values into a new score, compare mobile with desktop as equivalent populations, or claim a ranking outcome from a passing or failing audit.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Performance audit"
3
- short_description: "Audit one URL with Lighthouse and optional CrUX"
4
- default_prompt: "Use $performance-audit to run the performance-audit report and explain its evidence and limits."
@@ -1,103 +0,0 @@
1
- ---
2
- name: pseo-audit
3
- description: Audit programmatic SEO template families with retained Google Search Console data, sitemap discovery, bounded page crawls, and exact URL Inspection evidence. Use when an agent needs to find repeated URL templates, compare their search visibility, check sampled index or crawl problems, or review whether generated pages have distinct intent and utility.
4
- ---
5
-
6
- # pSEO audit
7
-
8
- Call `seo_list_reports` with category `reporting` when discovery is needed.
9
- Call `seo_describe_report` with id `pseo-audit`, then call `seo_run_report` with
10
- that id and only the described parameters. Read `structuredContent` as the
11
- machine contract. Use the CLI for CI, saved JSON, or environments without MCP.
12
-
13
- ```bash
14
- seo reports describe pseo-audit --json
15
- seo reports run pseo-audit --params '{"site":"sc-domain:example.com","detail":"summary"}' --json
16
-
17
- seo pseo audit --project <project> --json
18
- ```
19
-
20
- The catalog command is the portable agent path and rejects parameters outside
21
- the MCP schema. The focused pSEO command adds human-readable flags and project
22
- selection while calling the same implementation.
23
-
24
- Pass `--site sc-domain:example.com` instead of `--project` when no project profile exists.
25
-
26
- ## Run the audit in two passes
27
-
28
- Start with discovery and retained Search Console evidence. Keep MCP output compact.
29
-
30
- ```json
31
- {
32
- "site": "sc-domain:example.com",
33
- "detail": "summary"
34
- }
35
- ```
36
-
37
- Add sitemap URLs when Search Console may not expose the full template population.
38
-
39
- ```bash
40
- seo pseo audit \
41
- --project example \
42
- --sitemap https://example.com/sitemap.xml \
43
- --json
44
- ```
45
-
46
- Rerun important templates with bounded technical samples. Three crawl and three URL Inspection samples are a sensible starting point. The maximum is 10 per template.
47
-
48
- ```json
49
- {
50
- "site": "sc-domain:example.com",
51
- "crawlSamples": 3,
52
- "inspectSamples": 3,
53
- "detail": "full"
54
- }
55
- ```
56
-
57
- URL Inspection uses property quota. Only request it when index evidence changes the decision.
58
-
59
- ## Read the evidence in this order
60
-
61
- 1. Check `dataStatus`, `source`, `selection`, `warnings`, and `caveats`.
62
- 2. Use `population` to separate discovered, GSC-visible, sampled, and untested URLs.
63
- 3. Read the template `verdict`, then confirm it against `crawl`, `inspection`, and `evidence`.
64
- 4. Use `metrics.topQueries`, `queryPatterns`, and sample-level fields for the proposed action.
65
-
66
- The report applies the output limit after ranking eligible templates by retained page impressions, clicks, URL count, and a stable signature tie-break.
67
-
68
- ## Keep claims inside the contract
69
-
70
- - `PASS` is the only indexed URL Inspection verdict. `NEUTRAL` means excluded, `FAIL` means invalid, and every other value is unknown.
71
- - `coverageState` is diagnostic text. Never parse it to decide whether a URL is indexed.
72
- - URL Inspection describes Google's indexed snapshot for one URL. It does not prove that every URL in the template is healthy or currently appearing in search.
73
- - Clicks, impressions, CTR, and position come from retained page-dimension Search Analytics rows. They are not guaranteed property totals.
74
- - Query patterns and examples come from retained query/page rows. Anonymized and lower-ranked rows may be absent.
75
- - Word count is descriptive. Do not recommend a minimum word count or call a page thin because it is short.
76
- - Literal query-term coverage and path entity fit are review heuristics. They are not Google ranking factors or spam-policy verdicts.
77
- - A sitemap URL with no GSC row does not prove zero demand. Performance may be omitted or credited to a canonical URL.
78
-
79
- ## Explain verdicts precisely
80
-
81
- - `index-risk` means one or more sampled URLs returned exact excluded or invalid verdicts. State the sample count.
82
- - `crawl-risk` means sampled URLs showed HTTP, robots, noindex, canonical, or fetch failures.
83
- - `content-review` means at least three usable samples showed repeated metadata or weak literal term coverage. Ask for human review of originality, accuracy, and page-specific utility.
84
- - `opportunity` means retained page rows triggered position, CTR, or entity-fit heuristics. Verify the query intent before changing templates.
85
- - `healthy` requires at least two conclusive indexed samples and two usable crawl samples. It remains a sample finding.
86
- - `inconclusive` means search evidence exists but technical sampling is too weak for a health verdict.
87
- - `no-data` means no retained page evidence was found for the detected template. Do not turn that into a quality judgment.
88
-
89
- ## Useful controls
90
-
91
- - `templateLimit`: 1 to 100 templates.
92
- - `minimumTemplateUrls`: 2 to 100 repeated URLs. The default is 3.
93
- - `minimumTemplateShare`: 0 to 1. The default is 0, so count controls discovery.
94
- - `minimumTemplateImpressions`: retained page-impression threshold. The default is 0.
95
- - `crawlSamples` and `inspectSamples`: 0 to 10 per template.
96
- - `brandTerms`: explicit terms to exclude. Domain-derived terms are used when none are supplied.
97
- - `refresh`: bypass supported local provider and HTTP caches.
98
-
99
- For CSV files run:
100
-
101
- ```bash
102
- seo export pseo --project <project> --out ./seo-exports/pseo
103
- ```
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "pSEO Audit"
3
- short_description: "Audit programmatic SEO templates with evidence"
4
- default_prompt: "Use $pseo-audit to audit this site's programmatic SEO templates and explain the evidence."
@@ -1,31 +0,0 @@
1
- ---
2
- name: query-clusters
3
- description: Group retained GSC queries by deterministic token overlap and page evidence; use when an agent needs reproducible demand themes without embeddings or assumed search intent.
4
- ---
5
-
6
- # Query clusters
7
-
8
- Use this report to organise retained GSC query/page rows into stable lexical themes. It normalizes queries, removes low-actionability and optionally branded rows, aggregates page evidence, then groups related wording by shared tokens. This is useful for navigation, information architecture, and review queues because the same input produces the same grouping. Token overlap does not prove shared intent, justify a new page, or establish that current URLs compete with each other.
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":"query-clusters"}`.
16
- 3. Call `seo_run_report` with `{"id":"query-clusters","params":{"site":"sc-domain:example.com","scope":"/guides/","minImpressions":50,"limit":20,"includeBrand":false}}`.
17
-
18
- The CLI uses the same registry and report handler:
19
-
20
- ```sh
21
- seo reports describe query-clusters --json
22
- seo reports run query-clusters --params '{"site":"sc-domain:example.com","scope":"/guides/","minImpressions":50,"limit":20,"includeBrand":false}' --json
23
- ```
24
-
25
- `site` is required. `scope` filters to pages containing the supplied string. The catalog schema exposes a fixed final-data 28-day report window; inspect `range` rather than assuming another period.
26
-
27
- ## Interpret and act
28
-
29
- Start with `summary`: retain cluster count, query count, clicks, impressions, threshold, limit, brand filtering, and high-opportunity count. Read each cluster's member queries, pages, demand, performance, and recommendation together. Expected CTR and opportunity labels are heuristic, using a leave-cluster-out site benchmark when enough peer evidence exists and otherwise a fallback curve. Page-two clusters do not claim a CTR-only click lift. Queries omitted below the threshold or outside the output cap remain outside the conclusion.
30
-
31
- Safe actions include reviewing whether a cluster maps to one intent, improving section structure on an existing page, clarifying navigation, or investigating URL overlap with a dedicated report. Do not create one page per cluster, merge pages based on tokens alone, infer semantic equivalence, or describe a low-volume omitted theme as absent demand.
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: "Query cluster"
3
- short_description: "Cluster retained GSC queries by token overlap"
4
- default_prompt: "Use $query-clusters to run the query-clusters report and explain its evidence and limits."