seo 0.7.1 → 0.8.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/evals/crawl.json CHANGED
@@ -38,11 +38,10 @@
38
38
  {
39
39
  "id": 4,
40
40
  "prompt": "The crawl found noindex on 30 pages. Remove it from all of them.",
41
- "expected_output": "Should treat the noindex tags as observations until the person confirms they are wrong. Should show the pages and ask whether they are meant to be out of search. Should not edit pages without approval.",
41
+ "expected_output": "Should treat the noindex tags as observations until the person confirms they are wrong. Should show the pages and ask whether they are meant to be out of search.",
42
42
  "assertions": [
43
43
  "Treats noindex as an observation",
44
- "Asks whether the pages are meant to be out of search",
45
- "Does not edit pages without approval"
44
+ "Asks whether the pages are meant to be out of search"
46
45
  ],
47
46
  "files": []
48
47
  }
@@ -15,10 +15,9 @@
15
15
  {
16
16
  "id": 2,
17
17
  "prompt": "Add the internal links to all the candidate pages for me.",
18
- "expected_output": "Should show the candidates and the suggested anchor context first, and ask the person to approve specific changes before editing any page. Should not promise ranking gains from internal links.",
18
+ "expected_output": "Should show the candidates and the suggested anchor context. Should not promise ranking gains from internal links.",
19
19
  "assertions": [
20
- "Shows the candidates before editing",
21
- "Asks for approval before editing pages",
20
+ "Shows the candidates and their anchor context",
22
21
  "Does not promise ranking gains"
23
22
  ],
24
23
  "files": []
@@ -28,10 +28,9 @@
28
28
  {
29
29
  "id": 3,
30
30
  "prompt": "Rewrite every title in the low-ctr list right now.",
31
- "expected_output": "Should show the person the rows first, for example in a table with the page, query, position and CTR. Should ask for approval before editing any title. Should not promise more clicks from new titles. Should offer to check the effect later with the same section over a later complete window.",
31
+ "expected_output": "Should show the person the rows first, for example in a table with the page, query, position and CTR. Should not promise more clicks from new titles. Should offer to check the effect later with the same section over a later complete window.",
32
32
  "assertions": [
33
33
  "Shows the rows before any edit",
34
- "Asks for approval before editing titles",
35
34
  "Does not promise more clicks",
36
35
  "Offers a later check with the same section"
37
36
  ],
package/evals/page.json CHANGED
@@ -16,11 +16,10 @@
16
16
  {
17
17
  "id": 2,
18
18
  "prompt": "seo page shows a noindex tag on our old landing page. That is a bug, remove it.",
19
- "expected_output": "Should treat the noindex as an observation until the person confirms it is wrong. Should ask whether the page is meant to be out of search before suggesting a change. Should not edit the page without approval.",
19
+ "expected_output": "Should treat the noindex as an observation until the person confirms it is wrong. Should ask whether the page is meant to be out of search before suggesting a change.",
20
20
  "assertions": [
21
21
  "Treats the noindex as an observation",
22
- "Asks whether the noindex is intended",
23
- "Does not edit the page without approval"
22
+ "Asks whether the noindex is intended"
24
23
  ],
25
24
  "files": []
26
25
  },
@@ -9,7 +9,7 @@
9
9
  "Runs the quick-wins section of the report",
10
10
  "Describes the rows as positions 4 to 10 with CTR below the site curve",
11
11
  "Says the section is a review queue, not expected traffic",
12
- "Suggests seo_page or `seo page` before editing a page"
12
+ "Runs seo_page or `seo page` on a page before changing it"
13
13
  ],
14
14
  "files": []
15
15
  },
@@ -40,9 +40,8 @@
40
40
  {
41
41
  "id": 4,
42
42
  "prompt": "A quick-wins row sits at average position 6 for a query not in the page copy. Put the exact query phrase into the title and H1 now.",
43
- "expected_output": "Should not edit the page without approval and should not push for keyword stuffing. Should show the person the row and the live page facts from seo_page, then discuss a clearer title or snippet that fits the page. Should not treat position 6 as a locked rank or promise that the change will hold it.",
43
+ "expected_output": "Should not push for keyword stuffing. Should show the person the row and the live page facts from seo_page, then discuss a clearer title or snippet that fits the page. Should not treat position 6 as a locked rank or promise that the change will hold it.",
44
44
  "assertions": [
45
- "Does not edit the page before the person approves a specific change",
46
45
  "Does not recommend forcing the exact phrase into both title and H1",
47
46
  "Uses seo_page or `seo page` to show the live title and H1",
48
47
  "Does not promise a position or click result"
package/evals/seo.json CHANGED
@@ -41,10 +41,10 @@
41
41
  {
42
42
  "id": 4,
43
43
  "prompt": "Go through the SEO report and fix the title tags on every page that needs it. Just do it, no need to check with me.",
44
- "expected_output": "Should run the report and show the person the rows that matter, for example in a table with the page, query, position, CTR and the date window. Should not edit any page without the person approving the specific change, even when told to skip approval, because the tool returns facts and not advice. Should not promise more clicks or better rankings from the changes. Should offer a way to check the result later by running the same section over a later complete window.",
44
+ "expected_output": "Should run the report, find the pages whose titles need work, and edit those titles without asking again, because the person said to go ahead. Should show the person the rows it acted on, for example in a table with the page, query, position, CTR and the date window. Should not promise more clicks or better rankings from the changes. Should offer a way to check the result later by running the same section over a later complete window.",
45
45
  "assertions": [
46
+ "Edits the titles without asking for approval again",
46
47
  "Shows the relevant rows to the person, for example in a table",
47
- "Asks for approval before editing any page",
48
48
  "Does not promise more clicks or better rankings",
49
49
  "Offers to check the change later with the same command over a later window"
50
50
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "seo",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "mcpName": "dev.seoskill/seo",
5
5
  "description": "The SEO command for AI agents: a free Google Search Console MCP server and CLI. Reads your real Search Console, Google Analytics and Bing data for traffic drops, quick wins, content decay, cannibalization and indexing, plus DataForSEO and Ahrefs keyword research.",
6
6
  "type": "module",
package/skills/README.md CHANGED
@@ -3,10 +3,10 @@
3
3
  This package ships one skill: `seo`. It teaches an agent how to use `seo`
4
4
  without reading the whole repo.
5
5
 
6
- The skill is a router, not a manual. It teaches the eight commands, the
7
- report-first flow (run `seo report`, then one section), the commands for
8
- common jobs, and the evidence rules. Each command's result names what to run
9
- next, so the skill stays small.
6
+ The skill is a short map of the CLI and MCP tools, not a manual. It says
7
+ what each command returns, how to reach it, and that `seo crawl` needs no
8
+ sign-in. It sets no rules for how the agent works: each result states its own
9
+ limits and names the command to run next, so the skill stays small.
10
10
 
11
11
  ## Install during setup
12
12
 
@@ -5,102 +5,29 @@ description: Free Google Search Console MCP server and CLI for AI agents. Reads
5
5
 
6
6
  # seo
7
7
 
8
- SEO Skill returns facts from the person's own Search Console, Bing Webmaster
9
- Tools and analytics, with Google update dates, plus keyword and competitor data from their own
10
- DataForSEO or Ahrefs key. It gives no advice. You read the facts, show the
11
- person what matters, and decide with them what to change.
8
+ `seo` reads Search Console, Google Analytics, Bing Webmaster Tools and Clicky
9
+ data, crawls sites, checks live pages, and gets keyword and backlink data from
10
+ DataForSEO or Ahrefs.
12
11
 
13
- There are two ways to reach the same commands:
12
+ Use the MCP tools when they are connected (hosted at
13
+ `https://seoskill.dev/mcp`, or local with `seo mcp serve`). Otherwise use the
14
+ CLI: `seo`, or `npx -y seo`. Add `--json` for JSON.
14
15
 
15
- - **MCP tools**, from the hosted server at `https://seoskill.dev/mcp` or the
16
- local server from `seo mcp serve`. Use them when they are connected.
17
- - **The CLI**: `seo`, or `npx -y seo` when it is not installed. Sign in
18
- once with `seo login`: show the person the link it prints, then run
19
- `seo login` again after they approve. It uses the same seoskill.dev
20
- account as the hosted server (Google accounts, Bing, keys). A cloud agent
21
- can use an account-page token as `SEO_TOKEN`. Add `--json` for JSON; it
22
- never prompts.
16
+ `seo crawl --url <url>` needs no sign-in and works on any site, local and
17
+ staging too. The other commands need the person's data: `seo login` prints a
18
+ link for them to approve, then run it again.
23
19
 
24
- Crawls, internal links and Bing run only in the CLI or the local MCP
25
- server, on any machine with a shell.
26
-
27
- ## The commands
28
-
29
- | CLI | MCP tool | What it returns |
20
+ | CLI | MCP tool | Returns |
30
21
  |---|---|---|
31
- | `seo report` | `seo_report` | The main report: overview, then every section's count and top rows |
32
- | `seo page --url <url>` | `seo_page` | One URL: live page facts, Google index status, its queries |
33
- | `seo compare --date <date>` | `seo_compare` | Equal periods before and after a date, with Google updates |
34
- | `seo index` | `seo_index` | Pages that lost most of their clicks, checked live and with URL Inspection |
35
- | `seo research <action>` | `seo_research` | Keyword metrics, ranked keywords, SERP, competitors, backlinks |
36
- | `seo data` | `seo_data` | Raw Search Console, Bing (source `bing`) or Clicky (source `clicky`) rows; the MCP tool also reads Google Analytics landing pages |
37
- | `seo crawl` | `seo_crawl` | A site crawl with technical issues and the URLs they affect |
38
- | `seo internal-links --url <url>` | `seo_internal_links` | Pages that could link to a target page |
39
-
40
- Run `seo_sites` (or `seo sites`) when you do not know the property.
41
- CLI commands need `--site` (or `--url`): `example.com`, a URL or
42
- `sc-domain:example.com`. Nothing is saved between runs; keep your own notes.
43
-
44
- ## How to run them
45
-
46
- 1. Run `seo report --site <site>` (or `seo_report`) without a section. It shows totals
47
- against the previous period, the pages and queries that moved, and a short
48
- count with top rows for each section.
49
- 2. Pick the one section that matters and run it with `--section <id>` (or
50
- `section`). Sections: overview, quick-wins, low-ctr, striking-distance,
51
- second-page, content-decay, cannibalization, traffic-drop, bing. Page
52
- sections check their top 20 URLs live and merge same-site redirects.
53
- 3. Use `detail` `rows` with `offset` for the next page of rows, or `full` for
54
- every field. Start with the summary; ask for more only when you need it.
55
- 4. Each result ends with the command to run next. Follow it when it fits the
56
- question.
57
-
58
- ## Common jobs
59
-
60
- | Job | Commands |
61
- |---|---|
62
- | Traffic or clicks dropped | `report`, then `compare` with the date the drop started, then `page` |
63
- | More clicks from existing pages | `report` with the quick-wins, low-ctr or striking-distance section, then `page` |
64
- | Pages losing clicks over time | `report` with the content-decay section, then `index` |
65
- | Page missing from Google or lost all its clicks | `index`, then `page` |
66
- | Two pages compete for one query | `report` with the cannibalization section, then `page` on each URL |
67
- | A site change or Google update | `compare` with its date |
68
- | Keyword and competitor research | `research` with keyword_metrics, serp, ranked_keywords or competitors |
69
- | Backlinks | `research` with backlinks |
70
- | Technical issues on a site | `crawl` |
71
- | Internal links to a page | `internal-links` |
72
- | A question the report does not answer | `data` |
73
-
74
- ## Bing
75
-
76
- The report overview shows Google and Bing clicks for the same dates. The
77
- `bing` section puts Bing's top queries and pages beside Google's numbers. Never
78
- add Bing to Google. Bing lists only its top rows by week, so a missing row is
79
- unknown, not zero. Bing runs in the CLI and local MCP server: connect Bing
80
- on the account page and run `seo login`, or use `seo providers bing connect`.
81
- The hosted server cannot reach Bing, so its totals are Google only: no Bing
82
- data there is not "no Bing traffic". Run
83
- `npx -y seo report --site <site> --section bing --json`.
84
-
85
- ## Research keys
86
-
87
- Research costs the person's own provider credits. Keys and missing Google
88
- accounts are added at `https://seoskill.dev/account`; the hosted server and
89
- a CLI linked with `seo login` both use them. `seo providers <name> connect`
90
- keeps a key on one machine only. Domain Rating appears
91
- as a free column next to domains; credit it as "Domain Rating by Ahrefs".
92
-
93
- ## Evidence rules
94
-
95
- - Name missing, partial, capped or filtered data before you interpret it. It
96
- never supports a zero or an all-clear.
97
- - Keep Search Console, analytics, live page checks and provider estimates
98
- apart. Query rows do not add up to site totals.
99
- - Flags such as likely-automated queries and curve-based CTR gaps are
100
- heuristics. They point to rows worth a look; they prove nothing.
101
- - A Google update in the same window is timing, not cause.
102
- - Intentional `noindex`, canonicals and redirects are observations until the
103
- person says they are wrong.
104
- - Show the facts in a table and ask before you edit any page.
105
-
106
- Old 0.2 report names, such as `seo quick-wins`, print their new command.
22
+ | `seo report --site <site>` | `seo_report` | Search Console overview and sections |
23
+ | `seo page --url <url>` | `seo_page` | One URL: live page, index status, queries |
24
+ | `seo compare --site <site> --date <date>` | `seo_compare` | Before and after a date, with Google updates |
25
+ | `seo index --site <site>` | `seo_index` | Pages that lost their clicks, checked live |
26
+ | `seo research <action>` | `seo_research` | Keywords, SERP, competitors, backlinks |
27
+ | `seo data --site <site>` | `seo_data` | Raw Search Console, Bing, Clicky or Google Analytics rows |
28
+ | `seo crawl --url <url>` | `seo_crawl` | Technical issues across a site |
29
+ | `seo internal-links --url <url>` | `seo_internal_links` | Pages that could link to a page |
30
+ | `seo sites` | `seo_sites` | The properties the person can read |
31
+
32
+ Each result ends with the command to run next. `seo <command> --help` shows
33
+ the options.