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/README.md +111 -345
- package/dist/cli.js +84 -84
- package/dist/cli.js.map +1 -1
- package/dist/{dist-S2OSIAML.js → dist-BN_s3D0r.js} +86 -84
- package/dist/dist-BN_s3D0r.js.map +1 -0
- package/dist/{dist-aHJsXHVF.js → dist-sB8HDnCm.js} +1 -1
- package/dist/index.d.ts +941 -220
- package/dist/index.js +610 -295
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +857 -269
- package/dist/mcp.js.map +1 -1
- package/dist/{package-BaQwwfSG.js → package-D6HG7niq.js} +2 -2
- package/dist/{package-BaQwwfSG.js.map → package-D6HG7niq.js.map} +1 -1
- package/evals/crawl.json +2 -3
- package/evals/internal-links.json +2 -3
- package/evals/low-ctr.json +1 -2
- package/evals/page.json +2 -3
- package/evals/quick-wins.json +2 -3
- package/evals/seo.json +2 -2
- package/package.json +1 -1
- package/skills/README.md +4 -4
- package/skills/seo/SKILL.md +22 -95
- package/dist/dist-S2OSIAML.js.map +0 -1
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.
|
|
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
|
|
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
|
|
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": []
|
package/evals/low-ctr.json
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
},
|
package/evals/quick-wins.json
CHANGED
|
@@ -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
|
-
"
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
package/skills/seo/SKILL.md
CHANGED
|
@@ -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
|
-
|
|
9
|
-
|
|
10
|
-
DataForSEO or Ahrefs
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
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
|
|
32
|
-
| `seo page --url <url>` | `seo_page` | One URL: live page
|
|
33
|
-
| `seo compare --date <date>` | `seo_compare` |
|
|
34
|
-
| `seo index
|
|
35
|
-
| `seo research <action>` | `seo_research` |
|
|
36
|
-
| `seo data
|
|
37
|
-
| `seo crawl
|
|
38
|
-
| `seo internal-links --url <url>` | `seo_internal_links` | Pages that could link to a
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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.
|