seo 0.3.0-beta.2 → 0.4.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.
@@ -28,11 +28,11 @@
28
28
  {
29
29
  "id": 3,
30
30
  "prompt": "I have not set up any keyword provider. Just estimate typical volumes for these keywords yourself.",
31
- "expected_output": "Should not invent search volumes. Should explain that research needs the person's own DataForSEO or Ahrefs key. For the CLI, should point to `seo providers dataforseo connect` or `seo providers ahrefs connect`. For the hosted server, should point to the sign-in page or client headers, and should not ask the person to paste a key into the chat.",
31
+ "expected_output": "Should not invent search volumes. Should explain that research needs the person's own DataForSEO or Ahrefs key. For the CLI, should point to `seo providers dataforseo connect` or `seo providers ahrefs connect`. For the hosted server, should point to the account page at https://seoskill.dev/account or client headers, and should not ask the person to paste a key into the chat.",
32
32
  "assertions": [
33
33
  "Does not invent search volumes",
34
34
  "Explains that a DataForSEO or Ahrefs key is needed",
35
- "Points to `seo providers` connect or the hosted sign-in page",
35
+ "Points to `seo providers` connect or the hosted account page",
36
36
  "Does not ask for the key to be pasted into the chat"
37
37
  ],
38
38
  "files": []
package/evals/seo.json CHANGED
@@ -18,11 +18,11 @@
18
18
  {
19
19
  "id": 2,
20
20
  "prompt": "No MCP tools are connected in this session. Get me the main SEO report for example.com as JSON.",
21
- "expected_output": "Should use the CLI. Should check `command -v seo` first, and if it is missing, install it with `npm i -g seo` and tell the person to run `seo start` to sign in with Google. Should then run `seo report --site example.com --json` (or with `--project` when a saved project exists). Should note that JSON mode never prompts. Should read the result before summarizing and should not fabricate output if sign-in is missing.",
21
+ "expected_output": "Should use the CLI. Should check `command -v seo` first, and if it is missing, install it with `npm i -g seo` and tell the person to run `seo start` to sign in with Google. Should then run `seo report --site example.com --json`, and run `seo sites` first if the site is unknown. Should note that JSON mode never prompts. Should read the result before summarizing and should not fabricate output if sign-in is missing.",
22
22
  "assertions": [
23
23
  "Checks whether the seo command is installed before the first call",
24
24
  "Uses `npm i -g seo` and `seo start` when the command or sign-in is missing",
25
- "Runs `seo report` with --json and a site or project",
25
+ "Runs `seo report` with --json and --site",
26
26
  "Does not fabricate report output when the command cannot run"
27
27
  ],
28
28
  "files": []
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "seo",
3
- "version": "0.3.0-beta.2",
4
- "description": "The SEO command for AI agents. Audit sites and research search opportunities with local, evidence-backed reports.",
3
+ "version": "0.4.0",
4
+ "mcpName": "io.github.iannuttall/seo",
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.",
5
6
  "type": "module",
6
7
  "license": "Apache-2.0",
7
8
  "author": "Ian Nuttall",
@@ -16,6 +17,14 @@
16
17
  "funding": "https://github.com/iannuttall/seo",
17
18
  "keywords": [
18
19
  "seo",
20
+ "google-search-console",
21
+ "search-console-mcp",
22
+ "seo-mcp",
23
+ "mcp-server",
24
+ "bing-webmaster-tools",
25
+ "dataforseo",
26
+ "ahrefs",
27
+ "agent-skills",
19
28
  "search-console",
20
29
  "google-analytics",
21
30
  "keyword-research",
@@ -72,7 +81,7 @@
72
81
  "deploy:web": "pnpm --filter @seo/web secrets:check && pnpm --filter @seo/web exec wrangler d1 migrations apply seo-telemetry --remote && pnpm --filter @seo/web exec wrangler deploy",
73
82
  "deploy:web:dry-run": "pnpm --filter @seo/web exec wrangler deploy --dry-run",
74
83
  "hooks:install": "node scripts/install-git-hooks.mjs",
75
- "lint": "biome check . && node scripts/check-emdashes.mjs && node scripts/check-report-parity.mjs && pnpm run skills:validate && turbo run lint",
84
+ "lint": "biome check . && node scripts/check-emdashes.mjs && node scripts/check-report-parity.mjs && pnpm run skills:validate",
76
85
  "lint:static": "biome check . && node scripts/check-emdashes.mjs && node scripts/check-report-parity.mjs && pnpm run skills:validate",
77
86
  "lint:fix": "biome check . --write",
78
87
  "loc:audit": "node scripts/loc-audit.mjs",
@@ -85,9 +94,9 @@
85
94
  "secrets:web:check-local": "pnpm --filter @seo/web secrets:check-local",
86
95
  "secrets:web:publish": "pnpm --filter @seo/web secrets:publish",
87
96
  "skills:validate": "node scripts/validate-skills.mjs",
88
- "test": "turbo run test && pnpm run build:package && pnpm run test:contracts:built",
97
+ "test": "turbo run test && pnpm run test:contracts:built",
89
98
  "test:built": "turbo run test && pnpm run test:contracts:built",
90
- "test:contracts:built": "node --test scripts/package.test.mjs scripts/provider-packages.test.mjs && pnpm run skills:validate",
99
+ "test:contracts:built": "node --test scripts/package.test.mjs scripts/provider-packages.test.mjs",
91
100
  "test:resources": "pnpm run build:package && pnpm run test:resources:built",
92
101
  "test:resources:built": "node scripts/resource-harness.mjs && node scripts/provider-resource-harness.mjs && node scripts/provider-extension-resource-harness.mjs",
93
102
  "test:package-install": "pnpm --filter @seo/core build && pnpm --filter @seo/mcp build && pnpm run build:package && node --test scripts/installed-package.test.mjs",
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: seo
3
- description: Use and read this skill immediately if the user request is in any way related to SEO or a site's organic search. That includes clicks or traffic changes, quick wins, CTR, rankings, content decay, cannibalization, Google update impact, indexing problems, one page's performance, keyword research, competitors, backlinks, crawling, redirects, metadata, internal links, Search Console, Google Analytics or Clicky questions, and client SEO reporting. Routes to first-party search data through the seo CLI and MCP tools.
3
+ description: Free Google Search Console MCP server and CLI for AI agents. Reads your real Search Console, Google Analytics and Bing Webmaster Tools data, plus DataForSEO and Ahrefs keyword research. Use it for any SEO question - why Google traffic or clicks dropped, organic traffic decline, quick wins, low CTR, striking distance keywords, content decay and declining pages, keyword cannibalization, indexing and URL inspection, one page's queries, Google update impact, competitor keywords, backlinks, technical SEO crawls, redirects, internal links and client SEO reports. Returns facts from your own data, never guesses.
4
4
  ---
5
5
 
6
6
  # seo
7
7
 
8
- SEO Skill returns facts from the person's own Search Console and analytics,
9
- with Google update dates, plus keyword and competitor data from their own
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
10
  DataForSEO or Ahrefs key. It gives no advice. You read the facts, show the
11
11
  person what matters, and decide with them what to change.
12
12
 
@@ -18,8 +18,8 @@ There are two ways to reach the same commands:
18
18
  run `npm i -g seo`, then `seo start` to sign in with Google. Add `--json`
19
19
  for machine-readable output; JSON mode never prompts.
20
20
 
21
- Crawls and internal links run only on the person's machine, through the CLI
22
- or the local MCP server.
21
+ Crawls, internal links and Bing run only on the person's machine, through
22
+ the CLI or the local MCP server.
23
23
 
24
24
  ## The commands
25
25
 
@@ -30,30 +30,30 @@ or the local MCP server.
30
30
  | `seo compare --date <date>` | `seo_compare` | Equal periods before and after a date, with Google updates |
31
31
  | `seo index` | `seo_index` | Pages that lost most of their clicks, checked live and with URL Inspection |
32
32
  | `seo research <action>` | `seo_research` | Keyword metrics, ranked keywords, SERP, competitors, backlinks |
33
- | `seo data` | `seo_data` | Raw Search Console rows; the MCP tool also reads analytics landing pages |
33
+ | `seo data` | `seo_data` | Raw Search Console or Bing rows (source `bing`); the MCP tool also reads analytics landing pages |
34
34
  | `seo crawl` | `seo_crawl` | A site crawl with technical issues and the URLs they affect |
35
35
  | `seo internal-links --url <url>` | `seo_internal_links` | Pages that could link to a target page |
36
36
 
37
- Start with `seo_sites` (or `seo sites`) when you do not know the property.
38
- Sites can be given as `example.com`, a URL or `sc-domain:example.com`.
37
+ Run `seo_sites` (or `seo sites`) when you do not know the property.
38
+ CLI commands need `--site` (or `--url`): `example.com`, a URL or
39
+ `sc-domain:example.com`. Nothing is saved between runs; keep your own notes.
39
40
 
40
41
  ## How to run them
41
42
 
42
- 1. Run `seo report` (or `seo_report`) without a section. It shows totals
43
+ 1. Run `seo report --site <site>` (or `seo_report`) without a section. It shows totals
43
44
  against the previous period, the pages and queries that moved, and a short
44
45
  count with top rows for each section.
45
46
  2. Pick the one section that matters and run it with `--section <id>` (or
46
47
  `section`). Sections: overview, quick-wins, low-ctr, striking-distance,
47
- second-page, content-decay, cannibalization, traffic-drop. Page sections
48
- check their top 20 URLs live and merge same-site redirects.
48
+ second-page, content-decay, cannibalization, traffic-drop, bing. Page
49
+ sections check their top 20 URLs live and merge same-site redirects.
49
50
  3. Use `detail` `rows` with `offset` for the next page of rows, or `full` for
50
51
  every field. Start with the summary; ask for more only when you need it.
51
52
  4. Each result ends with the command to run next. Follow it when it fits the
52
53
  question.
53
54
 
54
- Each command takes its target and optional dates, nothing more. Brand terms,
55
- minimum impressions and the comparison period are set automatically and shown
56
- in the output.
55
+ Each command takes a target and optional dates. Everything else is automatic
56
+ and shown in the output.
57
57
 
58
58
  ## Common jobs
59
59
 
@@ -71,11 +71,22 @@ in the output.
71
71
  | Internal links to a page | `internal-links` |
72
72
  | A question the report does not answer | `data` |
73
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 it once
80
+ with `seo providers bing connect` (or `SEO_BING_API_KEY`). The hosted server
81
+ has no Bing yet, so its totals are Google only: no Bing data there is not
82
+ "no Bing traffic". Run `npx -y seo report --site <site> --section bing --json`.
83
+
74
84
  ## Research keys
75
85
 
76
- Research costs the person's own provider credits. On the hosted server, keys
77
- come from the sign-in page or from client headers. In the CLI and the local
78
- server, keys come from `seo providers <name> connect`. Domain Rating appears
86
+ Research costs the person's own provider credits. On the hosted server, add
87
+ keys and missing Google accounts at `https://seoskill.dev/account`, or send
88
+ keys as client headers. In the CLI and local server, run
89
+ `seo providers <name> connect`. Domain Rating appears
79
90
  as a free column next to domains; credit it as "Domain Rating by Ahrefs".
80
91
 
81
92
  ## Evidence rules
@@ -89,8 +100,6 @@ as a free column next to domains; credit it as "Domain Rating by Ahrefs".
89
100
  - A Google update in the same window is timing, not cause.
90
101
  - Intentional `noindex`, canonicals and redirects are observations until the
91
102
  person says they are wrong.
92
- - Never promise clicks, rankings, indexing or traffic.
93
- - Show the facts, for example in a table, and ask before you edit any page.
103
+ - Show the facts in a table and ask before you edit any page.
94
104
 
95
- Old report names from version 0.2, such as `seo quick-wins`, still run in
96
- 0.3 and print their new command. Use the new commands.
105
+ Old 0.2 report names, such as `seo quick-wins`, print their new command.