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.
package/PRIVACY.md CHANGED
@@ -3,11 +3,14 @@
3
3
  Last updated: 15 October 2026
4
4
 
5
5
  This policy covers the official `seo` command-line tool, library, MCP server,
6
- the hosted MCP server at seoskill.dev/mcp, and the seoskill.dev website.
6
+ the hosted MCP server at seoskill.dev/mcp with its account page, and the
7
+ seoskill.dev website.
7
8
 
8
- In short: the hosted MCP never stores your data, API keys are never stored,
9
- and the only thing kept about your use is an anonymous usage count (the event,
10
- report, agent, version and week).
9
+ In short: the hosted MCP keeps only your linked Google accounts and any API
10
+ keys you save, encrypted, so it can fetch your own data when you ask. It never
11
+ keeps your Search Console or analytics data, your reports or a log of your
12
+ requests. The only thing kept about your use is an anonymous usage
13
+ count (the event, report, agent, version and week).
11
14
 
12
15
  The command-line tool runs on your machine. It does not create an SEO
13
16
  account, upload reports to a hosted SEO service, or send reports or connected
@@ -21,30 +24,52 @@ the work you requested. The sections below explain what each request can send.
21
24
  ## The hosted MCP server
22
25
 
23
26
  The hosted MCP server at `https://seoskill.dev/mcp` runs the same reports
24
- for an MCP client you connect to it. It never stores your data or your keys.
25
- There is no database, account or log of your data. The only thing it keeps is
26
- the anonymous usage count described below.
27
-
28
- - **Google sign-in.** You sign in with Google and grant read-only access to
29
- Search Console and Google Analytics. The resulting Google tokens are sealed
30
- (encrypted) into the tokens your MCP client keeps. The server keeps no
31
- copy. Revoking the app in your
32
- [Google Account connections](https://myaccount.google.com/connections)
33
- stops them working.
34
- - **API keys.** Keys for DataForSEO and Ahrefs are optional. You can enter
35
- them on the sign-in page, where they are sealed into the same tokens, or
36
- send them as request headers. A key is used for the request it arrives with and is never stored.
27
+ for an MCP client you connect to it. To do that it keeps a small store in
28
+ Cloudflare D1 with only these things:
29
+
30
+ - **A person id.** A random id created the first time you sign in with
31
+ Google. That first Google account is your account. There is no password.
32
+ - **Your linked Google accounts.** The email address of each Google account
33
+ you link, and its refresh and access tokens. You grant read-only access to
34
+ Search Console and Google Analytics.
35
+ - **Your API keys, if you save them.** A DataForSEO login and password and an
36
+ Ahrefs key.
37
+
38
+ Every token and key is encrypted with a server key before it is written. The
39
+ tokens are used only to fetch your own data when you or your agent ask for
40
+ it. The token your MCP client keeps carries only your person id.
41
+
42
+ The server keeps nothing else. It does not keep reports, Search Console
43
+ or Google Analytics rows, lists of your sites, or the pages it checked.
44
+ Request logs are turned off.
45
+
37
46
  - **Your data.** Search Console, Google Analytics and provider responses are
38
- fetched for each request, returned to your MCP client and not kept. Pages
39
- checked live are fetched for the request and not kept.
40
- - **Outside services.** Google answers the Google requests. The provider you
41
- choose receives your research request under its own policy. Ahrefs
42
- receives the domains in research rows for the free Domain Rating column.
43
- Cloudflare runs the server and handles the network requests.
47
+ fetched for each request, returned to your MCP client and not kept. Pages checked live are fetched for the request and not kept.
48
+ - **API key headers.** You can send `X-DataForSEO-Login`,
49
+ `X-DataForSEO-Password` and `X-Ahrefs-Key` headers instead of saving keys.
50
+ A header wins over a saved key and is used for that request only.
51
+ - **The account page.** At [seoskill.dev/account](https://seoskill.dev/account)
52
+ you sign in with Google to see your linked accounts, add or remove them,
53
+ and save or remove keys. It sets one essential cookie that holds your
54
+ encrypted person id for up to 30 days.
55
+ - **Outside services.** Google answers its own requests. The provider you
56
+ choose receives your research request under its own policy.
57
+ Ahrefs receives the domains in research rows for the free Domain Rating
58
+ column. Cloudflare runs the server, stores the encrypted data and handles
59
+ the network requests.
44
60
  - **Usage counts.** Each run sends one anonymous event to the same telemetry
45
61
  endpoint the CLI uses, with the event, report, agent, version and week. It
46
62
  never contains a site, URL, query, key, account or report data.
47
63
 
64
+ ### Delete your hosted data
65
+
66
+ Sign in at [seoskill.dev/account](https://seoskill.dev/account) and choose
67
+ **Delete everything**. It deletes your person id, linked accounts and keys,
68
+ and revokes the Google sign-ins. Your agents will ask you to sign in again if
69
+ you use the hosted server later. You can also revoke SEO Skill in your
70
+ [Google Account connections](https://myaccount.google.com/connections), which
71
+ stops the stored Google tokens working.
72
+
48
73
  Your MCP client and its model provider receive the results under their own
49
74
  terms.
50
75
 
@@ -61,9 +86,9 @@ read-only access to:
61
86
  access.
62
87
 
63
88
  The software uses this data to list properties, run the report you requested,
64
- join search or analytics evidence to crawl findings, and save local report
65
- history when a command supports it. It does not use Google data for advertising
66
- or to train general-purpose AI models.
89
+ and join search or analytics evidence to crawl findings. It does not save
90
+ report history. It does not use Google data for advertising or to train
91
+ general-purpose AI models.
67
92
 
68
93
  The shared desktop OAuth client identifies the `seo` app to Google. OAuth
69
94
  tokens and API responses are returned to your machine, not to the project
@@ -80,16 +105,26 @@ site ID, sitekey, requested report type, date range, and row limit directly to
80
105
  Clicky over HTTPS. It can read the traffic data that sitekey permits. The
81
106
  project maintainer does not receive the request or response.
82
107
 
83
- The site ID is saved in the project profile. The sitekey uses the operating
108
+ The site ID is saved in the local configuration. The sitekey uses the operating
84
109
  system keychain when available, with a private local file fallback. Agents and
85
110
  CI can use `SEO_CLICKY_SITEKEY` without saving it. Clicky responses are cached
86
111
  locally for up to 24 hours, and cache keys and cached responses do not contain
87
112
  the sitekey.
88
113
 
114
+ ## Bing data the software can access
115
+
116
+ Bing access is optional. In the command-line tool and local MCP server, you
117
+ save a Bing Webmaster API key with `seo providers bing connect`, or set
118
+ `SEO_BING_API_KEY`. The key is saved in the system keychain when available,
119
+ with a private local file fallback. Requests go directly from your machine to
120
+ Bing over HTTPS and can read the sites that key can read. Run
121
+ `seo providers bing disconnect` to remove the saved key. The hosted MCP
122
+ server does not read Bing data.
123
+
89
124
  ## How Google data is protected
90
125
 
91
- The software stores project profiles, settings, OAuth tokens, cached API
92
- responses, logs, and saved reports in local user directories. It does not
126
+ The software stores settings, OAuth tokens, cached API responses, and logs in
127
+ local user directories. It does not save reports or crawls. It does not
93
128
  upload Google API responses to a hosted SEO account or project database.
94
129
  Google API requests go directly from your machine to Google over HTTPS. The
95
130
  software does not send Search Console data to a research provider. `seo
@@ -124,10 +159,10 @@ run, expired rows may remain in the local cache file until you delete them.
124
159
  Run `seo cache clear --provider google-analytics` to remove cached Google
125
160
  Analytics responses immediately. Run `seo cache clear --provider gsc` to do
126
161
  the same for Search Console. Run `seo cache clear --provider clicky` to remove
127
- cached Clicky responses. Project profiles and reports that you deliberately
128
- save remain until you delete them with the relevant command or run
129
- `seo reset --yes`. The reset command removes Google tokens, local
130
- configuration, caches, logs, histories, saved reports, and saved provider
162
+ cached Clicky responses. Settings and saved provider credentials remain until
163
+ you delete them with the relevant command or run `seo reset --yes`. The reset
164
+ command removes Google tokens, local configuration, caches, logs, any
165
+ histories or reports saved by earlier versions, and saved provider
131
166
  credentials. It removes active keychain credentials before deleting local
132
167
  files. If the keychain refuses a deletion, reset stops and tells you to unlock
133
168
  it before trying again.
@@ -300,8 +335,10 @@ copy, publish, transmit, or pass it to an agent or application yourself.
300
335
  ## Removing access and local data
301
336
 
302
337
  Use `seo auth logout` to remove local Google tokens. Use
303
- `seo providers dataforseo disconnect` or `seo providers ahrefs disconnect` to
304
- remove the corresponding saved provider credential. Environment variables are
338
+ `seo providers dataforseo disconnect`, `seo providers ahrefs disconnect` or
339
+ `seo providers bing disconnect` to remove the corresponding saved credential.
340
+ To remove what the hosted MCP keeps, use **Delete everything** on the
341
+ [account page](https://seoskill.dev/account). Environment variables are
305
342
  controlled by your shell or runtime and are not changed by these commands. Use `seo privacy` to
306
343
  inspect local paths and `seo reset --yes` to remove every saved credential and
307
344
  local file managed by the software.
package/README.md CHANGED
@@ -8,7 +8,7 @@
8
8
  <h1 align="center">SEO Skill</h1>
9
9
 
10
10
  <p align="center">
11
- The SEO command for AI agents. Give your agent your own Search Console and analytics data, with Google update dates beside it, and keyword data from your own provider key.
11
+ The SEO command for AI agents. A free Google Search Console MCP server and CLI: your agent reads your real Search Console, Google Analytics and Bing data, with Google update dates beside it, plus keyword research from your own DataForSEO or Ahrefs key.
12
12
  </p>
13
13
 
14
14
  <p align="center">
@@ -18,8 +18,6 @@
18
18
  ·
19
19
  <a href="https://seoskill.dev/docs">Documentation</a>
20
20
  ·
21
- <a href="https://seoskill.dev/docs/mcp">Hosted MCP</a>
22
- ·
23
21
  <a href="https://www.npmjs.com/package/seo">npm</a>
24
22
  ·
25
23
  <a href="https://github.com/iannuttall/seo/issues">Questions</a>
@@ -43,8 +41,8 @@
43
41
  </p>
44
42
 
45
43
  Ask your agent what is happening in search and get an answer built from your
46
- own Search Console, Google Analytics and Clicky data, with Google update dates
47
- laid over it. Add your own DataForSEO or Ahrefs key when you need keyword,
44
+ own Search Console, Bing Webmaster Tools, Google Analytics and Clicky data,
45
+ with Google update dates laid over it. Add your own DataForSEO or Ahrefs key when you need keyword,
48
46
  SERP, competitor or backlink data.
49
47
 
50
48
  The results are facts with their dates and limits. There is no advice baked
@@ -60,15 +58,16 @@ npm i -g seo
60
58
  seo start
61
59
  ```
62
60
 
63
- `seo start` signs you in with Google, lists the Search Console properties you
64
- can read, lets you pick a Google Analytics property, and saves a project
65
- profile (a local shortcut for the site and its data sources). It can also add
66
- the skill and the local MCP server to your agents.
61
+ `seo start` signs you in with Google. Then it offers to add an MCP server to
62
+ the agents it finds (the free hosted server is the first choice, or you can
63
+ run one locally) and to install the skill. That is all it asks. Nothing about
64
+ your site is saved: each command names the site it works on.
67
65
 
68
- Then run the main report:
66
+ List the properties your sign-in can read, then run the main report for one:
69
67
 
70
68
  ```sh
71
- seo report
69
+ seo sites
70
+ seo report --site example.com
72
71
  ```
73
72
 
74
73
  ## Connect the hosted MCP server
@@ -81,15 +80,22 @@ claude mcp add --transport http seoskill https://seoskill.dev/mcp
81
80
  codex mcp add seoskill --url https://seoskill.dev/mcp
82
81
  ```
83
82
 
84
- Sign in with Google when the client asks. The server stores nothing. Your
85
- sign-in and any provider keys are sealed into the token your MCP client
86
- keeps, or sent as headers on each request. The
83
+ Sign in with Google when the client asks. That first Google account is your
84
+ account, so there is no password or separate signup. The server keeps only
85
+ your linked Google accounts and any API keys you save, encrypted. It keeps no
86
+ report data, no Search Console or analytics rows and no request logs.
87
+
88
+ Your [account page](https://seoskill.dev/account) lets you add more Google
89
+ accounts, save DataForSEO or Ahrefs keys, or delete everything.
90
+ Each request uses the linked Google account that can read the site. The
87
91
  [hosted MCP guide](https://seoskill.dev/docs/mcp) covers other clients, and the
88
92
  [API keys guide](https://seoskill.dev/docs/keys) shows how to add a key
89
93
  without pasting it into a chat.
90
94
 
91
95
  A crawl fetches many pages, so `seo crawl` and `seo internal-links` run only
92
- on your machine, through the CLI or the local MCP server.
96
+ on your machine, through the CLI or the local MCP server. Bing data also runs
97
+ only there for now; when you ask the hosted server for Bing, it tells your
98
+ agent which CLI command to run.
93
99
 
94
100
  ## The eight commands
95
101
 
@@ -100,12 +106,13 @@ on your machine, through the CLI or the local MCP server.
100
106
  | `seo compare --date <date>` | `seo_compare` | Equal periods before and after a date, with the Google updates in the window |
101
107
  | `seo index` | `seo_index` | Pages that lost most of their clicks, checked live and with URL Inspection |
102
108
  | `seo research <action>` | `seo_research` | Keyword metrics, ranked keywords, SERPs, competitors and backlinks from your key |
103
- | `seo data` | `seo_data` | Raw Search Console rows; the hosted tool also reads analytics landing pages |
109
+ | `seo data` | `seo_data` | Raw Search Console rows, or Bing rows in the CLI and local server; the hosted tool also reads analytics landing pages |
104
110
  | `seo crawl <url>` | `seo_crawl` | A site crawl with technical issues and the URLs they affect (local only) |
105
111
  | `seo internal-links --url <url>` | `seo_internal_links` | Pages that could link to a target page (local only) |
106
112
 
107
113
  Each command takes its target (a site, URL or property) and an optional date
108
- window. Commands that return rows also take `--detail summary|rows|full` and
114
+ window. `--site` takes a domain, a URL or a Search Console property, and
115
+ `seo sites` lists the ones you can read. Commands that return rows also take `--detail summary|rows|full` and
109
116
  `--offset`. Brand terms, minimum impressions and the comparison period are set
110
117
  for you and shown in the output, so there is nothing else to tune.
111
118
 
@@ -117,7 +124,7 @@ The [command docs](https://seoskill.dev/docs) explain each one.
117
124
  Run the report without a section first:
118
125
 
119
126
  ```sh
120
- seo report
127
+ seo report --site example.com
121
128
  ```
122
129
 
123
130
  It shows site totals against the previous period, the pages and queries that
@@ -125,33 +132,25 @@ moved, and a short count with top rows for each section. Then ask for the one
125
132
  section that matters:
126
133
 
127
134
  ```sh
128
- seo report --section quick-wins
135
+ seo report --site example.com --section quick-wins
129
136
  ```
130
137
 
131
138
  The sections are `overview`, `quick-wins`, `low-ctr`, `striking-distance`,
132
- `second-page`, `content-decay`, `cannibalization` and `traffic-drop`. Page
133
- sections check their top 20 URLs live and merge same-site redirects.
139
+ `second-page`, `content-decay`, `cannibalization`, `traffic-drop` and `bing`.
140
+ Page sections check their top 20 URLs live and merge same-site redirects.
134
141
 
135
142
  Each result ends with the command to run next. A traffic drop usually leads to
136
143
  `seo compare` with the date it started, then `seo page` for the URLs that
137
144
  moved:
138
145
 
139
146
  ```sh
140
- seo compare --date 2026-09-15
147
+ seo compare --site example.com --date 2026-09-15
141
148
  seo page --url https://example.com/pricing
142
149
  ```
143
150
 
144
151
  Start with the summary. Ask for `--detail rows --offset 20` for the next page
145
152
  of rows, or `--detail full` for every field, only when you need them.
146
153
 
147
- Use `--project` when you have more than one saved project, or `--site` to work
148
- without one:
149
-
150
- ```sh
151
- seo report --project example
152
- seo report --site sc-domain:example.com
153
- ```
154
-
155
154
  ## Add keyword and competitor data
156
155
 
157
156
  Research uses your own provider account, so each request costs your credits
@@ -162,7 +161,9 @@ seo providers dataforseo connect
162
161
  seo providers ahrefs connect
163
162
  ```
164
163
 
165
- Then ask for one action:
164
+ On the hosted server, save the keys on your
165
+ [account page](https://seoskill.dev/account) or send them as headers. Then ask
166
+ for one action:
166
167
 
167
168
  ```sh
168
169
  seo research keyword_metrics --keywords "invoice software,invoice template"
@@ -177,18 +178,44 @@ Ahrefs". The hosted server adds it for everyone; the CLI adds it when you have
177
178
  saved an Ahrefs key. Provider numbers are estimates. Search Console stays the
178
179
  record of what your own site actually got.
179
180
 
181
+ ## Add Bing Webmaster Tools
182
+
183
+ Bing data is free. It works in the CLI and the local MCP server. Save a Bing
184
+ Webmaster API key (Bing Webmaster Tools, then Settings, then API access):
185
+
186
+ ```sh
187
+ seo providers bing connect
188
+ ```
189
+
190
+ Agents and CI can set `SEO_BING_API_KEY` instead. `seo providers bing status`
191
+ shows the connection and `seo providers bing disconnect` removes it. The
192
+ hosted server has no Bing for now. When you ask it for Bing, it tells your
193
+ agent to run the CLI instead, the same way it does for a crawl.
194
+
195
+ `seo report` then shows Google and Bing clicks and impressions for the same
196
+ dates, and each engine's share of those clicks. The `bing` section puts Bing's
197
+ top queries and pages beside Google's numbers for the same rows, and
198
+ `seo data --source bing` returns the raw Bing rows. Bing and Google numbers sit
199
+ side by side and are never added together. Bing lists only its top queries
200
+ and pages by week, so a row missing from Bing's list is unknown, not zero.
201
+
180
202
  ## Add your analytics
181
203
 
182
- Google Analytics comes with your Google sign-in. Pick the property during
183
- `seo start`.
204
+ Google Analytics comes with your Google sign-in. List your properties, then
205
+ pass the numeric property id to a Google Analytics command:
206
+
207
+ ```sh
208
+ seo analytics google properties
209
+ seo ai-referrals --property 123456789
210
+ ```
184
211
 
185
212
  Clicky is available through the
186
213
  [Clicky provider package](https://github.com/iannuttall/seoskill-clicky-provider).
187
- Install it, then attach its site ID to a project with `seo start`:
214
+ Install it, then connect a site with its Clicky site ID:
188
215
 
189
216
  ```sh
190
217
  seo providers install @seoskill/clicky-provider
191
- seo start
218
+ seo analytics clicky connect --site-id 12345
192
219
  ```
193
220
 
194
221
  The hosted server reads Google Analytics only. Clicky runs on your machine,
@@ -207,7 +234,8 @@ evidence rules. If you skipped it during `seo start`, add it now:
207
234
  seo skill install
208
235
  ```
209
236
 
210
- To add the local MCP server to Codex, Claude Code, Claude Desktop or Cursor:
237
+ `seo start` can add the hosted or the local MCP server for you. To add the
238
+ local MCP server later, to Codex, Claude Code, Claude Desktop or Cursor:
211
239
 
212
240
  ```sh
213
241
  seo mcp install
@@ -227,7 +255,7 @@ installed provider packages.
227
255
 
228
256
  - Missing, partial, capped and filtered data is named. It never becomes a zero
229
257
  or an all-clear.
230
- - Search Console, analytics, live page checks and provider estimates stay
258
+ - Search Console, Bing, analytics, live page checks and provider estimates stay
231
259
  apart. Query rows do not add up to site totals.
232
260
  - Flags such as likely automated queries and CTR gaps against the site's own
233
261
  curve are heuristics. They point at rows worth a look.
@@ -238,20 +266,31 @@ installed provider packages.
238
266
  Nothing here promises clicks, rankings or indexing. Check a change by running
239
267
  the same command again over a later, complete window.
240
268
 
269
+ ## Upgrading from 0.3
270
+
271
+ Saved project profiles are gone. Every command takes `--site` (or `--url`), and
272
+ `--project` or `--client` now stops with a note that says so. `seo projects`,
273
+ `seo client` and the commands that saved history between runs (`change-log`,
274
+ `tests`, `content-groups`, `monitoring`, `schedule`, `index-watch`,
275
+ `technical-watch`, `crawl-reports`, `crawl-diff` and `diagnose`) were removed.
276
+ Your agent keeps its own notes now. Each removed command names what to use
277
+ instead. To stay on the old version, run `npm i -g seo@0.2.41`.
278
+
241
279
  ## Upgrading from 0.2
242
280
 
243
281
  Version 0.3.0 moved most reports into the eight commands. Old names such as
244
282
  `seo quick-wins` still run in 0.3 and print the new command to use. They stop
245
283
  working in 0.4.0. Some reports and commands were removed, including rank
246
- tracking, programmatic SEO, AI search readiness, llms.txt, Bing Webmaster,
284
+ tracking, programmatic SEO, AI search readiness, llms.txt, Bing links,
247
285
  IndexNow, Semrush, local search, server logs and the monthly and narrative
248
- reports. The old research reports became `seo research`. The
249
- [changelog](CHANGELOG.md) lists every old name and where it went.
286
+ reports. Bing Webmaster search data came back in 0.3.0-beta.3. The old
287
+ research reports became `seo research`. The [changelog](CHANGELOG.md) lists
288
+ every old name and where it went.
250
289
 
251
290
  ## Use it in CI and scripts
252
291
 
253
- Add `--json` to any command. JSON mode never prompts, so pass `--project` or
254
- `--site` in unattended runs.
292
+ Add `--json` to any command. JSON mode never prompts. Pass `--site` every
293
+ time.
255
294
 
256
295
  ```sh
257
296
  seo report --site sc-domain:example.com --json
@@ -303,8 +342,9 @@ working example.
303
342
  ## Local data and Google access
304
343
 
305
344
  Google tokens use your system keychain, with a private `0600` file fallback on
306
- headless machines. Project profiles, crawls and caches stay in your local
307
- config directory. A command still reaches the network when it needs Google,
345
+ headless machines. Settings, provider keys and a short cache of Google
346
+ responses stay in your local config directory. Reports and crawls are not
347
+ saved: each run returns its results and your agent decides what to keep. A command still reaches the network when it needs Google,
308
348
  your site or a provider you connected.
309
349
 
310
350
  ```sh
@@ -314,7 +354,8 @@ seo auth logout --all
314
354
  seo reset
315
355
  ```
316
356
 
317
- The hosted server keeps no data at all. Read the
357
+ The hosted server keeps only your linked sign-ins and saved keys, encrypted,
358
+ and no report data or logs. Read the
318
359
  [privacy policy](https://seoskill.dev/privacy) for every network boundary and
319
360
  the [telemetry page](https://seoskill.dev/telemetry) for the anonymous usage
320
361
  counts and how to turn them off.
@@ -328,6 +369,7 @@ vulnerabilities privately through the process in [SECURITY.md](SECURITY.md).
328
369
  - [Getting started](https://seoskill.dev/docs/getting-started)
329
370
  - [Hosted MCP](https://seoskill.dev/docs/mcp)
330
371
  - [API keys](https://seoskill.dev/docs/keys)
372
+ - [Your hosted account](https://seoskill.dev/account)
331
373
  - [CLI](https://seoskill.dev/docs/cli)
332
374
  - [Commands](https://seoskill.dev/docs)
333
375
  - [What is stored](https://seoskill.dev/docs/privacy)
package/SECURITY.md CHANGED
@@ -19,8 +19,8 @@ questions and non-sensitive bugs.
19
19
 
20
20
  ## Local data and credentials
21
21
 
22
- `seo` is local-first. Project profiles, Google OAuth metadata, crawl reports,
23
- and caches stay on the machine running the command. Access and refresh tokens
22
+ `seo` is local-first. Settings, Google OAuth metadata, provider keys and
23
+ caches stay on the machine running the command. Access and refresh tokens
24
24
  use the operating-system keychain when enabled; fallback token files and local
25
25
  credential files use private file permissions.
26
26