seo 0.0.15 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/PRIVACY.md +95 -0
- package/README.md +338 -35
- package/SECURITY.md +55 -0
- package/TERMS.md +94 -0
- package/TRADEMARKS.md +27 -0
- package/dist/cli.js +125 -0
- package/dist/cli.js.map +1 -0
- package/dist/dist-CSY2_p-j.js +713 -0
- package/dist/dist-CSY2_p-j.js.map +1 -0
- package/dist/dist-FeAUNn9A.js +3 -0
- package/dist/index.d.ts +17921 -0
- package/dist/index.js +26769 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +57 -0
- package/dist/mcp.js +26744 -0
- package/dist/mcp.js.map +1 -0
- package/dist/package-uzXzqDW6.js +23818 -0
- package/dist/package-uzXzqDW6.js.map +1 -0
- package/package.json +101 -23
- package/skills/README.md +81 -0
- package/skills/affected-urls/SKILL.md +39 -0
- package/skills/affected-urls/agents/openai.yaml +4 -0
- package/skills/ai-readiness/SKILL.md +34 -0
- package/skills/ai-readiness/agents/openai.yaml +4 -0
- package/skills/ai-referrals/SKILL.md +31 -0
- package/skills/ai-referrals/agents/openai.yaml +4 -0
- package/skills/audit-page/SKILL.md +50 -0
- package/skills/audit-page/agents/openai.yaml +4 -0
- package/skills/audit-urls/SKILL.md +39 -0
- package/skills/audit-urls/agents/openai.yaml +4 -0
- package/skills/cannibalisation/SKILL.md +31 -0
- package/skills/cannibalisation/agents/openai.yaml +4 -0
- package/skills/community-intent/SKILL.md +39 -0
- package/skills/community-intent/agents/openai.yaml +4 -0
- package/skills/compare-crawls/SKILL.md +40 -0
- package/skills/compare-crawls/agents/openai.yaml +4 -0
- package/skills/content-optimization/SKILL.md +31 -0
- package/skills/content-optimization/agents/openai.yaml +4 -0
- package/skills/crawl-diff/SKILL.md +51 -0
- package/skills/crawl-diff/agents/openai.yaml +4 -0
- package/skills/crawl-history/SKILL.md +37 -0
- package/skills/crawl-history/agents/openai.yaml +4 -0
- package/skills/crawl-report/SKILL.md +37 -0
- package/skills/crawl-report/agents/openai.yaml +4 -0
- package/skills/crawler-rules/SKILL.md +34 -0
- package/skills/crawler-rules/agents/openai.yaml +4 -0
- package/skills/ctr-underperformers/SKILL.md +31 -0
- package/skills/ctr-underperformers/agents/openai.yaml +4 -0
- package/skills/decaying-pages/SKILL.md +31 -0
- package/skills/decaying-pages/agents/openai.yaml +4 -0
- package/skills/entity-readiness/SKILL.md +34 -0
- package/skills/entity-readiness/agents/openai.yaml +4 -0
- package/skills/explain-crawl-issue/SKILL.md +32 -0
- package/skills/explain-crawl-issue/agents/openai.yaml +4 -0
- package/skills/generate-llms-txt/SKILL.md +37 -0
- package/skills/generate-llms-txt/agents/openai.yaml +4 -0
- package/skills/geo-gaps/SKILL.md +37 -0
- package/skills/geo-gaps/agents/openai.yaml +4 -0
- package/skills/index-coverage/SKILL.md +84 -0
- package/skills/index-coverage/agents/openai.yaml +4 -0
- package/skills/index-coverage-plan/SKILL.md +50 -0
- package/skills/index-coverage-plan/agents/openai.yaml +4 -0
- package/skills/index-monitor/SKILL.md +49 -0
- package/skills/index-monitor/agents/openai.yaml +4 -0
- package/skills/index-watch/SKILL.md +77 -0
- package/skills/index-watch/agents/openai.yaml +4 -0
- package/skills/internal-links/SKILL.md +31 -0
- package/skills/internal-links/agents/openai.yaml +4 -0
- package/skills/link-recovery/SKILL.md +51 -0
- package/skills/link-recovery/agents/openai.yaml +4 -0
- package/skills/llms-txt-audit/SKILL.md +34 -0
- package/skills/llms-txt-audit/agents/openai.yaml +4 -0
- package/skills/measure-change/SKILL.md +52 -0
- package/skills/measure-change/agents/openai.yaml +4 -0
- package/skills/monthly-action-plan/SKILL.md +50 -0
- package/skills/monthly-action-plan/agents/openai.yaml +4 -0
- package/skills/monthly-report/SKILL.md +50 -0
- package/skills/monthly-report/agents/openai.yaml +4 -0
- package/skills/narrative-report/SKILL.md +51 -0
- package/skills/narrative-report/agents/openai.yaml +4 -0
- package/skills/okf-build/SKILL.md +39 -0
- package/skills/okf-build/agents/openai.yaml +4 -0
- package/skills/okf-validate/SKILL.md +43 -0
- package/skills/okf-validate/agents/openai.yaml +4 -0
- package/skills/page-opportunities/SKILL.md +31 -0
- package/skills/page-opportunities/agents/openai.yaml +4 -0
- package/skills/performance/SKILL.md +50 -0
- package/skills/performance/agents/openai.yaml +4 -0
- package/skills/performance-audit/SKILL.md +31 -0
- package/skills/performance-audit/agents/openai.yaml +4 -0
- package/skills/pseo-audit/SKILL.md +103 -0
- package/skills/pseo-audit/agents/openai.yaml +4 -0
- package/skills/query-clusters/SKILL.md +31 -0
- package/skills/query-clusters/agents/openai.yaml +4 -0
- package/skills/quick-wins/SKILL.md +31 -0
- package/skills/quick-wins/agents/openai.yaml +4 -0
- package/skills/redirect-trace/SKILL.md +51 -0
- package/skills/redirect-trace/agents/openai.yaml +4 -0
- package/skills/refresh-priorities/SKILL.md +48 -0
- package/skills/refresh-priorities/agents/openai.yaml +4 -0
- package/skills/search-performance-overview/SKILL.md +48 -0
- package/skills/search-performance-overview/agents/openai.yaml +4 -0
- package/skills/second-page/SKILL.md +50 -0
- package/skills/second-page/agents/openai.yaml +4 -0
- package/skills/segment-impact/SKILL.md +50 -0
- package/skills/segment-impact/agents/openai.yaml +4 -0
- package/skills/seo/SKILL.md +74 -0
- package/skills/seo/agents/openai.yaml +4 -0
- package/skills/seo-fix-queue/SKILL.md +50 -0
- package/skills/seo-fix-queue/agents/openai.yaml +4 -0
- package/skills/seo-geo-readiness/SKILL.md +60 -0
- package/skills/seo-geo-readiness/agents/openai.yaml +4 -0
- package/skills/seo-site-audit/SKILL.md +59 -0
- package/skills/seo-site-audit/agents/openai.yaml +4 -0
- package/skills/seo-to-ai-query/SKILL.md +31 -0
- package/skills/seo-to-ai-query/agents/openai.yaml +4 -0
- package/skills/setup-check/SKILL.md +49 -0
- package/skills/setup-check/agents/openai.yaml +4 -0
- package/skills/site-crawl/SKILL.md +39 -0
- package/skills/site-crawl/agents/openai.yaml +4 -0
- package/skills/striking-distance/SKILL.md +52 -0
- package/skills/striking-distance/agents/openai.yaml +4 -0
- package/skills/technical-watch/SKILL.md +49 -0
- package/skills/technical-watch/agents/openai.yaml +4 -0
- package/skills/top-fixes/SKILL.md +38 -0
- package/skills/top-fixes/agents/openai.yaml +4 -0
- package/skills/traffic-anomaly/SKILL.md +52 -0
- package/skills/traffic-anomaly/agents/openai.yaml +4 -0
- package/skills/update-correlation/SKILL.md +51 -0
- package/skills/update-correlation/agents/openai.yaml +4 -0
- package/skills/update-postmortem/SKILL.md +49 -0
- package/skills/update-postmortem/agents/openai.yaml +4 -0
- package/.jshintrc +0 -18
- package/.npmignore +0 -3
- package/.travis.yml +0 -3
- package/Makefile +0 -10
- package/index.js +0 -2
- package/lib/middleware.js +0 -159
- package/lib/seo.js +0 -32
- package/test/init.js +0 -43
- package/test/middleware.test.js +0 -111
- package/test/seo-page-result.html +0 -9
- package/test/seo-page.html +0 -9
- package/test/seo-routes.js +0 -5
- package/test/vendor/jquery-1.11.1.min.js +0 -4
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-geo-readiness
|
|
3
|
+
description: Audit local technical eligibility evidence and supporting website observations for AI search with seo. Use when the user asks about ChatGPT, Claude, Perplexity, Gemini, Google AI Overviews, LLM citations, llms.txt, structured data, authorship, or AI-search visibility.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# GEO readiness
|
|
7
|
+
|
|
8
|
+
This workflow measures technical readiness and referral evidence. It does not
|
|
9
|
+
prove that an AI product cites the site.
|
|
10
|
+
|
|
11
|
+
## Run the readiness report
|
|
12
|
+
|
|
13
|
+
Create a saved crawl, then analyze the same report:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
seo crawl --project <project> --max-pages 500 --save --json
|
|
17
|
+
seo ai-readiness --project <project> --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Through MCP, use `seo_run_report` with report id `ai-readiness`. Use report id
|
|
21
|
+
`geo-gaps` when exact affected URLs for crawl and indexability rules are
|
|
22
|
+
needed. Call `seo_describe_report` before a report when its parameters are not
|
|
23
|
+
already known.
|
|
24
|
+
|
|
25
|
+
1. Check `dataStatus`, `summary.pageLimitReached`, warnings, and caveats.
|
|
26
|
+
2. Separate failed technical checks from contextual observations.
|
|
27
|
+
3. Treat local crawl indexability as local evidence. It does not prove that
|
|
28
|
+
Google indexed the URL.
|
|
29
|
+
4. Use bounded URL Inspection evidence when Google's indexed snapshot changes
|
|
30
|
+
the decision. It is not a live crawl or a sitewide sample.
|
|
31
|
+
|
|
32
|
+
## Explain the evidence
|
|
33
|
+
|
|
34
|
+
- Blocked crawling, publisher `noindex`, snippet restrictions, and non-success
|
|
35
|
+
HTML responses can prevent or limit technical eligibility.
|
|
36
|
+
- Structured data, semantic HTML, authorship, and dates are contextual
|
|
37
|
+
observations. Recommend them only for a documented user or Search feature
|
|
38
|
+
need.
|
|
39
|
+
- Paragraph shape, lists, tables, and question headings do not prove quality or
|
|
40
|
+
citation likelihood.
|
|
41
|
+
- Do not recommend content chunking or a minimum word count solely for AI
|
|
42
|
+
Search.
|
|
43
|
+
- `/llms.txt` is optional metadata for agents that support it. The report does
|
|
44
|
+
not treat it as a Google Search ranking signal.
|
|
45
|
+
|
|
46
|
+
Useful follow-up reports remain structured for agents:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
seo seo-to-ai-query --project <project> --json
|
|
50
|
+
seo ai-referrals --project <project> --json
|
|
51
|
+
seo llms audit --project <project> --json
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
`seo-to-ai-query` creates deterministic monitoring-prompt suggestions from
|
|
55
|
+
retained GSC wording. These are not observed AI queries. `ai-referrals` reports
|
|
56
|
+
known GA4 referral evidence and cannot measure citations without a referral.
|
|
57
|
+
|
|
58
|
+
Report `nosnippet`, `max-snippet:0`, positive `max-snippet` limits, and
|
|
59
|
+
unrestricted `max-snippet:-1` exactly. No detected page-level restriction does
|
|
60
|
+
not guarantee that Google will select or show the page.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-site-audit
|
|
3
|
+
description: Run an evidence-backed site audit with the seo main report, crawler, and focused follow-up reports. Use when the user asks to audit or diagnose a website across Search Console performance, technical SEO, indexability, metadata, schema, internal linking, security, performance, or AI-search readiness.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# SEO site audit
|
|
7
|
+
|
|
8
|
+
Start with the main report. It joins the available first-party evidence and
|
|
9
|
+
returns a small set of follow-up commands.
|
|
10
|
+
|
|
11
|
+
Through MCP, call `seo_run_report` with report id
|
|
12
|
+
`search-performance-overview`. Call `seo_describe_report` first when its
|
|
13
|
+
parameters are not already known. Use the CLI when MCP is not available:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
seo report --project <project> --json
|
|
17
|
+
seo report --site sc-domain:example.com --json
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Read the main report
|
|
21
|
+
|
|
22
|
+
1. Check `dataStatus`, source completeness, skipped sections, warnings, and
|
|
23
|
+
caveats before interpreting findings.
|
|
24
|
+
2. Read the narrative and priority queue against their evidence references.
|
|
25
|
+
3. Use `nextCommands` to choose a small number of follow-ups. Do not run every
|
|
26
|
+
report by default.
|
|
27
|
+
4. Keep missing, unavailable, filtered, partial, capped, and complete evidence
|
|
28
|
+
separate. A partial source cannot support an all-clear.
|
|
29
|
+
|
|
30
|
+
## Add technical crawl evidence
|
|
31
|
+
|
|
32
|
+
Run a crawl when the user asks for technical coverage or the main report
|
|
33
|
+
identifies a technical evidence gap:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
seo crawl --project <project> --max-pages 500 --save --json
|
|
37
|
+
seo crawl https://example.com --max-pages 500 --save --json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Read `summary`, `topFixes`, `warnings`, and `caveats` first. Check
|
|
41
|
+
`summary.pageLimitReached` before making sitewide claims. Reuse the saved report
|
|
42
|
+
for detail instead of crawling again:
|
|
43
|
+
|
|
44
|
+
- Report id `top-fixes` returns a bounded queue.
|
|
45
|
+
- Report id `affected-urls` returns URLs for one rule.
|
|
46
|
+
- Report id `explain-crawl-issue` explains an unfamiliar rule.
|
|
47
|
+
- Report id `crawl-report` returns requested report detail.
|
|
48
|
+
|
|
49
|
+
Use report id `performance-audit` for a selected URL when performance evidence
|
|
50
|
+
is needed. A crawl does not replace Lighthouse lab data or CrUX field data.
|
|
51
|
+
|
|
52
|
+
## Present the result
|
|
53
|
+
|
|
54
|
+
Give the user the top three to five evidence-backed actions, affected areas,
|
|
55
|
+
and a verification command for each action. Name every material gap or cap.
|
|
56
|
+
|
|
57
|
+
Never invent clicks, sessions, rankings, issue counts, indexing state, or
|
|
58
|
+
sitewide health. Keep advice structural and diagnostic unless the user asks
|
|
59
|
+
for copy.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: seo-to-ai-query
|
|
3
|
+
description: Convert retained GSC query wording into deterministic AI monitoring prompts; use when an agent needs a reproducible prompt seed set without claiming observed AI demand or visibility.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Queries to AI prompts
|
|
7
|
+
|
|
8
|
+
Use this report to turn first-party GSC query wording into a bounded set of prompts for later manual or automated monitoring. Each source query keeps its clicks, impressions, CTR, and average position, while deterministic templates produce stable prompt suggestions. The output is useful for designing a monitoring corpus. It is not evidence that anyone entered those prompts into an AI product, that an answer mentioned the site, or that the source query has equivalent AI demand.
|
|
9
|
+
|
|
10
|
+
## Run the report
|
|
11
|
+
|
|
12
|
+
Use the compact MCP flow:
|
|
13
|
+
|
|
14
|
+
1. Call `seo_list_reports` with `{"category":"ai-search"}`.
|
|
15
|
+
2. Call `seo_describe_report` with `{"id":"seo-to-ai-query"}`.
|
|
16
|
+
3. Call `seo_run_report` with `{"id":"seo-to-ai-query","params":{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"maxRows":10000}}`.
|
|
17
|
+
|
|
18
|
+
The CLI uses the same registry entry:
|
|
19
|
+
|
|
20
|
+
```sh
|
|
21
|
+
seo reports describe seo-to-ai-query --json
|
|
22
|
+
seo reports run seo-to-ai-query --params '{"site":"sc-domain:example.com","days":90,"limit":20,"minImpressions":100,"maxRows":10000}' --json
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`site` is required. Use either `days` or an explicit `startDate` and `endDate` pair. `maxRows` bounds source retrieval and `limit` bounds returned queries. Supply `brandTerms` or `includeBrand:true` only when brand handling is intentional.
|
|
26
|
+
|
|
27
|
+
## Interpret and act
|
|
28
|
+
|
|
29
|
+
Check `dataStatus` before reading `items`: `empty`, `filtered`, `partial`, and `available` mean different things. Preserve `dateRange`, `source.possiblyTruncated`, filters, `selection.invalidRows`, `selection.conflictingRows`, limited rows, warnings, and caveats. `methodology.observedAiPromptData` and `estimatedTrafficLift` are explicitly false. Each item has `evidenceScope: retained-gsc-query`; its prompts inherit that narrow scope.
|
|
30
|
+
|
|
31
|
+
Safe actions are to select representative prompt variants, store the source query and date range beside later observations, and refresh the corpus on a controlled schedule. Do not report generated prompt count as AI demand, fill missing prompts with guessed traffic, or interpret no returned rows as an all-clear when the source is partial or filtering removed candidates.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-check
|
|
3
|
+
description: Check whether local SEO Skills CLI authentication and defaults are usable; use it before reports when login, scopes, or saved configuration may be incomplete.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Check local setup
|
|
7
|
+
|
|
8
|
+
Run `setup-check` before blaming a report for an authentication or configuration
|
|
9
|
+
failure. It reads local setup state and separates missing credentials, missing
|
|
10
|
+
Google scopes, and absent defaults from actual SEO evidence. A passing result
|
|
11
|
+
means the local prerequisites look present. It does not prove that a token is
|
|
12
|
+
still accepted by Google or that the account can access a particular property.
|
|
13
|
+
|
|
14
|
+
## Run the report
|
|
15
|
+
|
|
16
|
+
With MCP, call `seo_list_reports` with `{"category":"setup"}`. Then call
|
|
17
|
+
`seo_describe_report` with `{"id":"setup-check"}` and use the returned schema.
|
|
18
|
+
Finally call `seo_run_report` with `{"id":"setup-check","params":{}}`. The report
|
|
19
|
+
accepts no parameters, so do not invent a site, project, or refresh field.
|
|
20
|
+
|
|
21
|
+
The CLI exposes the same registry and schema:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
seo reports describe setup-check --json
|
|
25
|
+
seo reports run setup-check --params '{}' --json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Read MCP `structuredContent` or the CLI JSON as the machine contract. Use the
|
|
29
|
+
text response only as a short presentation layer.
|
|
30
|
+
|
|
31
|
+
## Interpret the checks
|
|
32
|
+
|
|
33
|
+
Start with `ok`, then inspect every entry in `checks`. `status` distinguishes a
|
|
34
|
+
blocking `fail` from a non-blocking `warn`; `detail` records what was observed;
|
|
35
|
+
`fix` gives the matching local remedy when one exists. `generatedAt` tells you
|
|
36
|
+
when the filesystem and token metadata were checked. Missing saved GSC or GA4
|
|
37
|
+
defaults are normally warnings because explicit report parameters can replace
|
|
38
|
+
them.
|
|
39
|
+
|
|
40
|
+
Never copy account emails, token contents, OAuth client values, private keys,
|
|
41
|
+
or local credential files into an answer. Summarise the check id, status, and a
|
|
42
|
+
safe fix instead.
|
|
43
|
+
|
|
44
|
+
## Act safely
|
|
45
|
+
|
|
46
|
+
Apply the narrow fix attached to a failed check, such as logging in again or
|
|
47
|
+
restoring the same OAuth client used by stored tokens. Re-run `setup-check`, then run
|
|
48
|
+
a small read-only report for the intended property. Do not treat a setup pass
|
|
49
|
+
as evidence about rankings, indexing, analytics accuracy, or site health.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: site-crawl
|
|
3
|
+
description: Build a bounded technical SEO inventory with explicit request, page, issue, and completeness evidence. Use for a site baseline or to save a stable crawl for focused follow-up reports.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Crawl a site
|
|
7
|
+
|
|
8
|
+
A crawl observes what the configured fetcher could discover and retrieve during one run. It is the foundation for most technical reports, but it is not an index, traffic source, or guarantee of complete site coverage. Set a deliberate page and depth budget, then save the snapshot when later analysis must share the same evidence.
|
|
9
|
+
|
|
10
|
+
## Run it
|
|
11
|
+
|
|
12
|
+
For MCP, call `seo_list_reports` with category `crawl` when discovery is needed. Call `seo_describe_report` with `{ "id": "site-crawl" }`, then `seo_run_report` with:
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"id": "site-crawl",
|
|
17
|
+
"params": {
|
|
18
|
+
"url": "https://example.com/",
|
|
19
|
+
"maxPages": 100,
|
|
20
|
+
"maxDepth": 3,
|
|
21
|
+
"saveReport": true
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Check `isError` and consume MCP `structuredContent`. The same run is available from the CLI:
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
seo reports describe site-crawl --json
|
|
30
|
+
seo reports run site-crawl --params '{"url":"https://example.com/","maxPages":100,"maxDepth":3,"saveReport":true}' --json
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Describe the schema before adding `include`, `exclude`, sitemap, robots, JavaScript, or fetch-rate controls; their interaction changes the evidence collected.
|
|
34
|
+
|
|
35
|
+
## Judge the crawl before the site
|
|
36
|
+
|
|
37
|
+
Start with status, `requestEvidenceStatus`, attempted and fetched counts, failures, retained pages, `pageLimitReached`, data-source states, warnings, and caveats. A partial or capped crawl cannot support an all-clear or a definitive zero. Raw `pages`, `requests`, and full `issues` are opt-in because they can be large; request only what the next decision needs.
|
|
38
|
+
|
|
39
|
+
Separate observations from defects. Response failures and contradictory indexability signals deserve investigation, while canonicals, robots rules, `noindex`, and snippet limits may be intentional. Use the compact top fixes for triage, then run `affected-urls` and `explain-crawl-issue` before creating work. Preserve the report id and crawl settings for verification. If JavaScript rendering was disabled or discovery depended on the sitemap or internal links, state that boundary when summarizing results.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: striking-distance
|
|
3
|
+
description: Find retained GSC query-page rows with average positions from 11 through 20; use it to build a bounded review queue near page-one visibility.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Review striking-distance rows
|
|
7
|
+
|
|
8
|
+
Use `striking-distance` to find query-page combinations whose retained GSC
|
|
9
|
+
average position falls from 11 through 20. This range can surface useful review
|
|
10
|
+
candidates, but it is a heuristic boundary. Average position varies by search,
|
|
11
|
+
device, country, and day, so the report does not prove that a URL consistently
|
|
12
|
+
ranks on a literal second results page or predict how many clicks a change will
|
|
13
|
+
produce.
|
|
14
|
+
|
|
15
|
+
## Run the report
|
|
16
|
+
|
|
17
|
+
With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`, call
|
|
18
|
+
`seo_describe_report` with `{"id":"striking-distance"}`, then call
|
|
19
|
+
`seo_run_report` with only described parameters. Example:
|
|
20
|
+
`{"id":"striking-distance","params":{"site":"sc-domain:example.com","days":28,"minImpressions":50,"limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}}`.
|
|
21
|
+
|
|
22
|
+
The CLI has exact registry parity:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
seo reports describe striking-distance --json
|
|
26
|
+
seo reports run striking-distance --params '{"site":"sc-domain:example.com","days":28,"minImpressions":50,"limit":10,"includeBrand":false,"verifyContent":true,"verifyLimit":5}' --json
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Add `brandTerms`, JavaScript rendering, or bounded fetch-rate controls only
|
|
30
|
+
after inspecting the schema and when the investigation needs them.
|
|
31
|
+
|
|
32
|
+
## Interpret the output
|
|
33
|
+
|
|
34
|
+
Check `range`, `rangeDays`, `dataStatus`, and `source` before the item list.
|
|
35
|
+
`source.possiblyTruncated` and retained-row completeness limit any all-clear.
|
|
36
|
+
Use `selection` to see what was invalid, outside the position range, branded,
|
|
37
|
+
below thresholds, eligible, returned, or limited. `methodology` explains the
|
|
38
|
+
priority heuristic.
|
|
39
|
+
|
|
40
|
+
For each item, read the observed query, URL, clicks, impressions, CTR, average
|
|
41
|
+
position, recommendation evidence, and optional `contentVerification`.
|
|
42
|
+
`verification` reports requested, attempted, verified, technical, and failed
|
|
43
|
+
counts; unverified or failed pages must keep lower confidence. Groups and
|
|
44
|
+
templates show repeated patterns only within retained candidates.
|
|
45
|
+
|
|
46
|
+
## Act safely
|
|
47
|
+
|
|
48
|
+
Audit a small number of high-impression candidates. Fix verified technical
|
|
49
|
+
problems first; otherwise compare intent, title framing, page coverage, and
|
|
50
|
+
internal links against observed query evidence. Do not rewrite a page solely
|
|
51
|
+
because it sits inside the position band, and do not present the priority score
|
|
52
|
+
as expected traffic or ranking lift.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: technical-watch
|
|
3
|
+
description: Coordinate crawl comparison, URL Inspection monitoring, and optional link recovery. Use it for a bounded recurring watch without claiming inventory-wide coverage.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Technical watch workflow
|
|
7
|
+
|
|
8
|
+
This workflow watches several technical surfaces together: crawl change,
|
|
9
|
+
sitemap-derived URL inspection, and optional recovery of historically valuable
|
|
10
|
+
links. It is useful after releases and on a schedule. Its components have
|
|
11
|
+
different coverage and freshness, so a successful run does not prove every URL
|
|
12
|
+
is crawlable, indexed, unchanged, or free of issues.
|
|
13
|
+
|
|
14
|
+
## Run it
|
|
15
|
+
|
|
16
|
+
Use the exact MCP discovery flow:
|
|
17
|
+
|
|
18
|
+
1. Call `seo_list_reports` with `category: "workflows"` and select `technical-watch`.
|
|
19
|
+
2. Call `seo_describe_report` with `id: "technical-watch"`; choose the components required.
|
|
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 technical-watch --json
|
|
26
|
+
seo reports run technical-watch --params '{"site":"sc-domain:example.com","startUrl":"https://example.com/","sitemaps":["https://example.com/sitemap.xml"],"limit":250,"dailyLimit":200,"inspectLimit":25,"recoverLinks":true}' --json
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Provide `startUrl` for crawl comparison and `sitemaps` for index monitoring.
|
|
30
|
+
`dailyLimit`, `inspectLimit`, `maxUrls`, and crawl `limit` are real coverage
|
|
31
|
+
bounds. Enable `js` only when rendering is required.
|
|
32
|
+
|
|
33
|
+
## Interpret and act
|
|
34
|
+
|
|
35
|
+
Inspect every workflow step and nested `crawl`, `index`, and `recovery` output
|
|
36
|
+
independently. For crawls, compare run ids, limits, failures, warnings, and
|
|
37
|
+
changed items. For inspection, distinguish selected, unselected-due, attempted,
|
|
38
|
+
failed, quota-blocked, deferred, current issue, and regression states. URL
|
|
39
|
+
Inspection is a provider snapshot; sitemap discovery is not proof of indexing.
|
|
40
|
+
For recovery, historical clicks-at-risk are observed history, not forecast loss.
|
|
41
|
+
|
|
42
|
+
Reproduce new failures, verify redirect chains and intentional controls, then
|
|
43
|
+
fix confirmed regressions with a rollback path. Schedule another bounded run to
|
|
44
|
+
confirm recovery. Never remove `noindex`, canonicals, robots rules, or redirects
|
|
45
|
+
without checking intent. Partial crawls, capped sitemap inventories, quotas,
|
|
46
|
+
and failed subqueries must stay visible in any all-clear statement.
|
|
47
|
+
|
|
48
|
+
Use MCP `structuredContent` for automation and Markdown only for the human watch
|
|
49
|
+
summary.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: top-fixes
|
|
3
|
+
description: Rank recurring technical crawl findings into a bounded implementation queue with visible scoring factors. Use for triage before inspecting affected URLs and rule-level evidence.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Prioritize technical fixes
|
|
7
|
+
|
|
8
|
+
Large crawls need triage, but priority must remain explainable. This report groups issues by rule and ranks them using severity, affected-page count, estimated effort, and any available Search Console or analytics evidence. It is a deterministic queue from retained evidence, not a forecast of rankings, traffic, conversions, or revenue.
|
|
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": "top-fixes" }`, then call `seo_run_report` with:
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"id": "top-fixes",
|
|
17
|
+
"params": {
|
|
18
|
+
"reportId": "crawl_example_20260710",
|
|
19
|
+
"category": "metadata",
|
|
20
|
+
"limit": 5
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Confirm `isError` is false and read `structuredContent`. CLI parity is:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
seo reports describe top-fixes --json
|
|
29
|
+
seo reports run top-fixes --params '{"reportId":"crawl_example_20260710","category":"metadata","limit":5}' --json
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Use `url` only for an intentional fresh crawl. Reusing a saved report keeps the queue tied to the same issue inventory.
|
|
33
|
+
|
|
34
|
+
## Turn priority into work
|
|
35
|
+
|
|
36
|
+
Read `dataSources`, summary, warnings, and caveats before the ranked fixes. For each item inspect the rule id, affected count, sample URLs, `scoreFactors`, `whyThisRanks`, effort, fix guidance, and verification steps. Missing provider joins must stay unavailable; numeric zeros are meaningful only when the corresponding source is complete and valid.
|
|
37
|
+
|
|
38
|
+
The category and result limits narrow the queue, while the original crawl may also be capped or partial. Therefore rank means "highest among retained eligible findings," not globally highest. Run `affected-urls` for the same rule and report id, inspect representative templates, and use `explain-crawl-issue` before assigning work. Confirm intentional indexability and canonical controls with the publisher. After implementation, repeat the same crawl configuration and verify the observed rule evidence rather than relying on a score change alone.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: traffic-anomaly
|
|
3
|
+
description: Test whether recent finalized GSC clicks or impressions differ unusually from an observed baseline; use it to confirm movement before investigating possible causes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Detect unusual traffic movement
|
|
7
|
+
|
|
8
|
+
Use `traffic-anomaly` when a dashboard looks different and you need a
|
|
9
|
+
repeatable check against recent history. It compares a recent finalized GSC
|
|
10
|
+
window with an observed baseline for clicks and impressions. Statistical
|
|
11
|
+
unusualness helps decide whether deeper investigation is warranted. It does not
|
|
12
|
+
identify a cause, diagnose a site defect, or prove that an external event
|
|
13
|
+
affected the property.
|
|
14
|
+
|
|
15
|
+
## Run the report
|
|
16
|
+
|
|
17
|
+
With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`. Call
|
|
18
|
+
`seo_describe_report` with `{"id":"traffic-anomaly"}` before choosing windows.
|
|
19
|
+
Then call `seo_run_report`, for example
|
|
20
|
+
`{"id":"traffic-anomaly","params":{"site":"sc-domain:example.com","days":90,"recentDays":7,"refresh":false}}`.
|
|
21
|
+
|
|
22
|
+
CLI parity uses the same report definition:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
seo reports describe traffic-anomaly --json
|
|
26
|
+
seo reports run traffic-anomaly --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"refresh":false}' --json
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The discovery schema currently exposes broad numeric types for these window
|
|
30
|
+
fields. Use sensible positive whole-day values even though all bounds are not
|
|
31
|
+
expressed in JSON Schema.
|
|
32
|
+
|
|
33
|
+
## Interpret the output
|
|
34
|
+
|
|
35
|
+
Read `coverage` first. Confirm the requested dates, expected and observed days,
|
|
36
|
+
missing days, invalid rows, duplicate rows, and `status`. Partial coverage can
|
|
37
|
+
change the baseline and must stay in the conclusion. `rows` is not a quality
|
|
38
|
+
verdict.
|
|
39
|
+
|
|
40
|
+
Each entry in `anomalies` names the metric, baseline and comparison dates,
|
|
41
|
+
means and totals, `percentChange`, `zScore`, `significanceMethod`, `direction`,
|
|
42
|
+
and `significant`. A null percentage from a zero baseline is different from
|
|
43
|
+
zero change. `outside-flat-baseline` handles movement where an observed
|
|
44
|
+
baseline has no variance; it still describes only the supplied data.
|
|
45
|
+
|
|
46
|
+
## Act safely
|
|
47
|
+
|
|
48
|
+
If movement is significant and coverage is adequate, run `segment-impact` for
|
|
49
|
+
pages and queries, then check site changes, seasonality, indexing, and tracking.
|
|
50
|
+
If it is normal, keep monitoring rather than forcing a story. Never label the
|
|
51
|
+
result a penalty, algorithm update, recovery, or causal diagnosis without
|
|
52
|
+
independent evidence.
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-correlation
|
|
3
|
+
description: Overlay finalized GSC anomaly windows with official Google ranking-update dates; use it for timing context while keeping attribution explicitly unestablished.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Add update timing context
|
|
7
|
+
|
|
8
|
+
Use `update-correlation` only after defining the traffic window you want to
|
|
9
|
+
examine. It combines the anomaly analysis with official ranking incident dates
|
|
10
|
+
and known local changes. Overlap can make an update a reasonable investigation
|
|
11
|
+
context. It cannot show that the update caused a gain or loss, even when the
|
|
12
|
+
movement is large and no other change has been recorded.
|
|
13
|
+
|
|
14
|
+
## Run the report
|
|
15
|
+
|
|
16
|
+
With MCP, call `seo_list_reports` with `{"category":"diagnosis"}`. Call
|
|
17
|
+
`seo_describe_report` with `{"id":"update-correlation"}`, then use
|
|
18
|
+
`seo_run_report`, for example
|
|
19
|
+
`{"id":"update-correlation","params":{"site":"sc-domain:example.com","days":90,"recentDays":7,"paddingDays":2,"refresh":false}}`.
|
|
20
|
+
|
|
21
|
+
The same definition is available through the CLI:
|
|
22
|
+
|
|
23
|
+
```sh
|
|
24
|
+
seo reports describe update-correlation --json
|
|
25
|
+
seo reports run update-correlation --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"paddingDays":2,"refresh":false}' --json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The schema currently types window and padding values as general numbers. Pass
|
|
29
|
+
positive whole-day values and avoid excessive padding that makes overlap almost
|
|
30
|
+
inevitable.
|
|
31
|
+
|
|
32
|
+
## Interpret the output
|
|
33
|
+
|
|
34
|
+
Start with `classification`, but always keep `attribution` and `confidence` in
|
|
35
|
+
view. The report intentionally returns attribution as `not-established` and
|
|
36
|
+
confidence as `none`. Inspect the underlying `anomalies`, exact
|
|
37
|
+
`overlappingUpdates`, and `confounders` before repeating the summary.
|
|
38
|
+
|
|
39
|
+
Use `evidence` for observed movement and date overlap, `caveats` for window,
|
|
40
|
+
padding, freshness, and source limits, and `source` to identify the official
|
|
41
|
+
feed. `significant-movement-with-update-overlap` means both facts occurred in
|
|
42
|
+
the configured window. `update-overlap-without-significant-movement` is not an
|
|
43
|
+
impact result. `no-update-overlap` does not explain any movement that remains.
|
|
44
|
+
|
|
45
|
+
## Act safely
|
|
46
|
+
|
|
47
|
+
Test saved deploys, redirects, pruning, blocking, tracking, and content changes
|
|
48
|
+
first when they overlap. Use `segment-impact` or the postmortem workflow to map
|
|
49
|
+
affected templates and queries. Preserve winning patterns and investigate
|
|
50
|
+
losers with page-level evidence. Never describe temporal overlap as a penalty,
|
|
51
|
+
reward, recovery, or confirmed algorithm effect.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: update-postmortem
|
|
3
|
+
description: Compare retained winners and losers around a Google ranking update window. Use it to structure a postmortem while explicitly keeping causation unestablished.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Update postmortem workflow
|
|
7
|
+
|
|
8
|
+
This workflow organizes performance movement around a known Google update,
|
|
9
|
+
including template and segment evidence plus optional local change-log context.
|
|
10
|
+
It helps identify where to investigate. Temporal overlap and exposure do not
|
|
11
|
+
prove that the update caused any change, and retained winners and losers are not
|
|
12
|
+
a complete property inventory when sources are capped or filtered.
|
|
13
|
+
|
|
14
|
+
## Run it
|
|
15
|
+
|
|
16
|
+
Use the exact MCP discovery flow:
|
|
17
|
+
|
|
18
|
+
1. Call `seo_list_reports` with `category: "workflows"` and select `update-postmortem`.
|
|
19
|
+
2. Call `seo_describe_report` with `id: "update-postmortem"`; inspect the current schema.
|
|
20
|
+
3. Call `seo_run_report` with that id and only described parameters.
|
|
21
|
+
|
|
22
|
+
CLI parity:
|
|
23
|
+
|
|
24
|
+
```sh
|
|
25
|
+
seo reports describe update-postmortem --json
|
|
26
|
+
seo reports run update-postmortem --params '{"site":"sc-domain:example.com","days":90,"recentDays":7,"limit":10,"includeBrand":false,"knownConfounders":["Site migration on 2026-05-12"],"includeChangeLog":true}' --json
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Record specific known confounders rather than vague suspicions. The change log
|
|
30
|
+
is supporting context, not automatic attribution.
|
|
31
|
+
|
|
32
|
+
## Interpret and act
|
|
33
|
+
|
|
34
|
+
Start with workflow step statuses, finalized date windows, source completeness,
|
|
35
|
+
failed measurements, retained limits, and caveats. Then inspect `update`,
|
|
36
|
+
`insights`, `templateMovement`, and `segments`. Keep positive and negative
|
|
37
|
+
movement visible. The report's cause remains not established even when dates
|
|
38
|
+
overlap. Compare like-for-like metrics and note brand filtering, invalid rows,
|
|
39
|
+
duplicate aggregation, and partial provider results.
|
|
40
|
+
|
|
41
|
+
Safe next steps are falsifiable: inspect representative URLs from affected
|
|
42
|
+
segments, reproduce technical changes, compare deployed templates, validate the
|
|
43
|
+
local change log, and measure a bounded intervention. Preserve known
|
|
44
|
+
confounders in the handoff. Do not roll back, rewrite, merge, or delete content
|
|
45
|
+
solely because it appears among losers. Never claim update causation, recovery
|
|
46
|
+
probability, future traffic, or ranking impact from this workflow.
|
|
47
|
+
|
|
48
|
+
Use MCP `structuredContent` as the machine contract and Markdown only for the
|
|
49
|
+
human-readable postmortem.
|
package/.jshintrc
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"globals" : {
|
|
3
|
-
/* MOCHA */
|
|
4
|
-
"describe" : false,
|
|
5
|
-
"it" : false,
|
|
6
|
-
"before" : false,
|
|
7
|
-
"beforeEach" : false,
|
|
8
|
-
"after" : false,
|
|
9
|
-
"afterEach" : false,
|
|
10
|
-
|
|
11
|
-
/* COMMONJS / NODE */
|
|
12
|
-
"module" : false,
|
|
13
|
-
"require" : false,
|
|
14
|
-
"console" : false,
|
|
15
|
-
"process" : false,
|
|
16
|
-
"global" : false
|
|
17
|
-
}
|
|
18
|
-
}
|
package/.npmignore
DELETED
package/.travis.yml
DELETED
package/Makefile
DELETED
package/index.js
DELETED