seo 0.0.15 → 0.2.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 +431 -35
- package/SECURITY.md +55 -0
- package/TERMS.md +94 -0
- package/TRADEMARKS.md +31 -0
- package/dist/cli.js +141 -0
- package/dist/cli.js.map +1 -0
- package/dist/dist-6bK_8r5M.js +713 -0
- package/dist/dist-6bK_8r5M.js.map +1 -0
- package/dist/dist-vRmqfhR4.js +3 -0
- package/dist/index.d.ts +18013 -0
- package/dist/index.js +27197 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp.d.ts +74 -0
- package/dist/mcp.js +28611 -0
- package/dist/mcp.js.map +1 -0
- package/dist/package-7aT8_Xp0.js +23818 -0
- package/dist/package-7aT8_Xp0.js.map +1 -0
- package/evals/README.md +117 -0
- package/evals/affected-urls.json +57 -0
- package/evals/ai-readiness.json +84 -0
- package/evals/ai-referrals.json +71 -0
- package/evals/ai-search-scorecard.json +70 -0
- package/evals/audit-page.json +57 -0
- package/evals/audit-urls.json +58 -0
- package/evals/cannibalisation.json +57 -0
- package/evals/community-intent.json +57 -0
- package/evals/compare-crawls.json +56 -0
- package/evals/content-optimization.json +57 -0
- package/evals/crawl-diff.json +58 -0
- package/evals/crawl-history.json +44 -0
- package/evals/crawl-report.json +44 -0
- package/evals/crawler-rules.json +44 -0
- package/evals/ctr-underperformers.json +57 -0
- package/evals/decaying-pages.json +57 -0
- package/evals/entity-readiness.json +57 -0
- package/evals/explain-crawl-issue.json +44 -0
- package/evals/generate-llms-txt.json +44 -0
- package/evals/geo-gaps.json +57 -0
- package/evals/index-coverage-plan.json +58 -0
- package/evals/index-coverage.json +70 -0
- package/evals/index-monitor.json +58 -0
- package/evals/index-watch.json +68 -0
- package/evals/internal-links.json +57 -0
- package/evals/link-recovery.json +58 -0
- package/evals/llms-txt-audit.json +44 -0
- package/evals/measure-change.json +58 -0
- package/evals/monthly-action-plan.json +56 -0
- package/evals/monthly-report.json +58 -0
- package/evals/narrative-report.json +58 -0
- package/evals/okf-build.json +44 -0
- package/evals/okf-validate.json +44 -0
- package/evals/page-opportunities.json +57 -0
- package/evals/performance-audit.json +57 -0
- package/evals/pseo-audit.json +84 -0
- package/evals/query-clusters.json +57 -0
- package/evals/quick-wins.json +86 -0
- package/evals/redirect-trace.json +57 -0
- package/evals/refresh-priorities.json +57 -0
- package/evals/search-performance-overview.json +86 -0
- package/evals/second-page.json +58 -0
- package/evals/segment-impact.json +57 -0
- package/evals/seo-fix-queue.json +85 -0
- package/evals/seo-geo-readiness.json +84 -0
- package/evals/seo-site-audit.json +85 -0
- package/evals/seo-to-ai-query.json +57 -0
- package/evals/seo.json +87 -0
- package/evals/setup-check.json +56 -0
- package/evals/site-crawl.json +44 -0
- package/evals/striking-distance.json +85 -0
- package/evals/technical-watch.json +57 -0
- package/evals/top-fixes.json +44 -0
- package/evals/traffic-anomaly.json +57 -0
- package/evals/update-correlation.json +57 -0
- package/evals/update-postmortem.json +57 -0
- package/package.json +103 -23
- package/skills/README.md +68 -0
- package/skills/seo/SKILL.md +99 -0
- package/skills/seo/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
package/README.md
CHANGED
|
@@ -1,51 +1,447 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="apps/web/public/favicon.svg" alt="SEO Skill" width="72" height="72">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
4
|
-
snapshots of single page web apps for search bots. Uses [PhantomJS](http://phantomjs.org/)
|
|
5
|
-
for generating snapshots.
|
|
5
|
+
<h1 align="center">SEO Skill</h1>
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
<p align="center">
|
|
8
|
+
The only SEO skill your agent needs. 50+ SEO audit tools through a local CLI and MCP server, using your own crawl, Search Console, and GA4 data.
|
|
9
|
+
</p>
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="#quick-start">Get started</a>
|
|
13
|
+
·
|
|
14
|
+
<a href="https://seoskill.dev/docs">Documentation</a>
|
|
15
|
+
·
|
|
16
|
+
<a href="https://www.npmjs.com/package/seo">npm</a>
|
|
17
|
+
·
|
|
18
|
+
<a href="https://github.com/iannuttall/seo/issues">Questions</a>
|
|
19
|
+
·
|
|
20
|
+
<a href="https://seoskill.dev/privacy">Privacy</a>
|
|
21
|
+
·
|
|
22
|
+
<a href="SECURITY.md">Security</a>
|
|
23
|
+
·
|
|
24
|
+
<a href="LICENSE">License</a>
|
|
25
|
+
·
|
|
26
|
+
<a href="AGENTS.md">Agent notes</a>
|
|
27
|
+
</p>
|
|
10
28
|
|
|
11
|
-
|
|
12
|
-
|
|
29
|
+
<p align="center">
|
|
30
|
+
<a href="https://github.com/iannuttall/seo/actions/workflows/ci.yml"><img alt="Checks" src="https://img.shields.io/github/actions/workflow/status/iannuttall/seo/ci.yml?branch=main&label=checks&style=flat-square"></a>
|
|
31
|
+
<a href="https://www.npmjs.com/package/seo"><img alt="npm version" src="https://img.shields.io/npm/v/seo?style=flat-square"></a>
|
|
32
|
+
<a href="https://www.npmjs.com/package/seo"><img alt="npm downloads" src="https://img.shields.io/npm/dm/seo?style=flat-square"></a>
|
|
33
|
+
<img alt="Node 22 or newer" src="https://img.shields.io/badge/Node-22%2B-339933?style=flat-square">
|
|
34
|
+
<img alt="TypeScript" src="https://img.shields.io/badge/TypeScript-ready-3178c6?style=flat-square">
|
|
35
|
+
<a href="LICENSE"><img alt="Apache 2.0 license" src="https://img.shields.io/badge/license-Apache--2.0-lightgrey?style=flat-square"></a>
|
|
36
|
+
</p>
|
|
37
|
+
|
|
38
|
+
The `seo` command runs a full SEO audit from your terminal, turning a local
|
|
39
|
+
crawl and your own search data into work you can inspect and ship. Find
|
|
40
|
+
technical blockers, recover search demand, improve pages already close to more
|
|
41
|
+
clicks, and catch regressions after a release.
|
|
42
|
+
|
|
43
|
+
## Who this is for
|
|
44
|
+
|
|
45
|
+
- People running their own sites who want a clear audit and a ranked list of
|
|
46
|
+
fixes, without learning a heavy dashboard.
|
|
47
|
+
- AI agents that need real crawl, Search Console, and GA4 evidence through MCP
|
|
48
|
+
and one packaged SEO skill instead of screenshots or guesses.
|
|
49
|
+
- Developers who want to embed the same report engine in a script, a CI job, or
|
|
50
|
+
a TypeScript app.
|
|
51
|
+
|
|
52
|
+
## Quick start
|
|
53
|
+
|
|
54
|
+
Requires Node 22 or newer.
|
|
55
|
+
|
|
56
|
+
```sh
|
|
57
|
+
npm i -g seo
|
|
58
|
+
seo start
|
|
59
|
+
seo report
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
The setup walks you through Google sign-in, your Search Console property, an
|
|
63
|
+
optional GA4 property, and a local project profile. Public releases can include
|
|
64
|
+
the shared Google app. If it is unavailable in your build, setup guides you
|
|
65
|
+
through adding your own desktop OAuth client.
|
|
66
|
+
|
|
67
|
+
That is the normal path. The `seo` command is then available in every terminal,
|
|
68
|
+
script, CI job, and local MCP client on the machine.
|
|
69
|
+
|
|
70
|
+
The main report uses the evidence you have, explains what it could not check,
|
|
71
|
+
and recommends a short list of follow-up commands. You can start with a local
|
|
72
|
+
technical report before connecting Google.
|
|
73
|
+
|
|
74
|
+
Running `seo help` shows the shape of the tool:
|
|
75
|
+
|
|
76
|
+
```txt
|
|
77
|
+
seo v0.2.0
|
|
78
|
+
|
|
79
|
+
Human-friendly SEO reports first, power tools when you need them.
|
|
80
|
+
|
|
81
|
+
Start here
|
|
82
|
+
seo start Connect Google and save a project profile
|
|
83
|
+
seo report Run the main SEO report for the default project
|
|
84
|
+
seo report --site sc-domain:example.com Run without a profile
|
|
85
|
+
seo report --url https://example.com Start with a local technical report
|
|
86
|
+
|
|
87
|
+
Projects
|
|
88
|
+
seo projects list List saved project profiles
|
|
89
|
+
seo projects add Create or update a project profile
|
|
90
|
+
seo sites List Search Console properties
|
|
91
|
+
seo doctor Check local auth and config
|
|
92
|
+
|
|
93
|
+
Act on a report
|
|
94
|
+
seo refresh-priorities Rank the next best SEO actions
|
|
95
|
+
seo quick-wins Find ranking 4-10 low-CTR wins
|
|
96
|
+
seo second-page Investigate URLs averaging positions 10-20
|
|
97
|
+
seo technical-watch Crawl and index-monitor a site
|
|
98
|
+
|
|
99
|
+
Agent and power tools
|
|
100
|
+
seo report --json Run the main report as structured JSON
|
|
101
|
+
seo export diagnose Export report data to CSV
|
|
102
|
+
seo mcp install Install SEO tools into MCP clients
|
|
103
|
+
seo skill list Show the packaged SEO skill
|
|
104
|
+
seo reports list Discover every structured report
|
|
105
|
+
|
|
106
|
+
Use `seo help <command>` or `seo <command> --help` for command help.
|
|
107
|
+
Use `seo help all` for the longer command list.
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## What you get
|
|
111
|
+
|
|
112
|
+
- Find technical blockers across metadata, links, indexability, canonicals,
|
|
113
|
+
structured data, performance, security, mobile, international SEO, and
|
|
114
|
+
social previews.
|
|
115
|
+
- Rank the work using affected URLs, rule severity, search visibility, and
|
|
116
|
+
analytics value instead of treating every warning equally.
|
|
117
|
+
- See why a finding matters, what evidence supports it, how to fix it, and how
|
|
118
|
+
to verify the change.
|
|
119
|
+
- Save and compare crawl reports without running the same crawl again.
|
|
120
|
+
- Measure SEO changes with matched before and after Search Console windows.
|
|
121
|
+
- Give scripts and agents deterministic JSON, Markdown, stable rule IDs, and a
|
|
122
|
+
compact local MCP surface.
|
|
123
|
+
|
|
124
|
+
## How the reports stay honest
|
|
125
|
+
|
|
126
|
+
The point of a report is to be defensible, so the design keeps a few rules:
|
|
127
|
+
|
|
128
|
+
- Observed evidence stays separate from derived findings and recommended
|
|
129
|
+
actions. You can always see the crawl row or provider row behind a claim.
|
|
130
|
+
- Partial data is never reported as a zero. A capped, filtered, or sampled
|
|
131
|
+
source says so, and it cannot support a definitive all-clear.
|
|
132
|
+
- Heuristics are labeled as heuristics. A convention or threshold is not
|
|
133
|
+
presented as a search-engine rule.
|
|
134
|
+
- Each recommendation comes with a way to check that the fix worked, rather than
|
|
135
|
+
a promise about rankings or traffic.
|
|
136
|
+
|
|
137
|
+
## Everyday use
|
|
138
|
+
|
|
139
|
+
`seo start` can save a project profile, which is a local shortcut for a site,
|
|
140
|
+
Search Console property, GA4 property, and brand terms. If you have one default
|
|
141
|
+
project, most commands need no flags.
|
|
142
|
+
|
|
143
|
+
```sh
|
|
144
|
+
seo report
|
|
145
|
+
seo refresh-priorities
|
|
146
|
+
seo quick-wins
|
|
147
|
+
seo second-page
|
|
148
|
+
seo technical-watch
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Use `--project` when you have more than one:
|
|
152
|
+
|
|
153
|
+
```sh
|
|
154
|
+
seo report --project example
|
|
155
|
+
seo projects list
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
You can also work without a saved profile:
|
|
159
|
+
|
|
160
|
+
```sh
|
|
161
|
+
seo report --site sc-domain:example.com
|
|
162
|
+
seo report --url https://example.com
|
|
163
|
+
seo crawl https://example.com
|
|
164
|
+
seo audit-page --url https://example.com/pricing
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
`seo report --url` crawls the site and saves technical evidence. It does not
|
|
168
|
+
pretend to know traffic, queries, or rankings until you add a Search Console
|
|
169
|
+
property with `seo start`.
|
|
170
|
+
|
|
171
|
+
Run `seo help` for the short path or `seo help all` for the full command list.
|
|
172
|
+
|
|
173
|
+
## Crawl a site
|
|
174
|
+
|
|
175
|
+
Run a readable technical crawl, the base of any technical SEO audit:
|
|
176
|
+
|
|
177
|
+
```sh
|
|
178
|
+
seo crawl https://example.com --format pretty
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
Save it, export it, or compare it with an earlier crawl:
|
|
182
|
+
|
|
183
|
+
```sh
|
|
184
|
+
seo crawl https://example.com --save
|
|
185
|
+
seo crawl https://example.com --format html --output report.html
|
|
186
|
+
seo crawl-reports
|
|
187
|
+
seo crawl-reports --compare latest --against previous
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
Useful crawl controls include `--max-pages`, `--max-depth`, `--include`,
|
|
191
|
+
`--exclude`, `--no-sitemap`, `--no-external`, and `--fail-on` for CI.
|
|
192
|
+
|
|
193
|
+
## Use it in CI and scripts
|
|
194
|
+
|
|
195
|
+
JSON mode never prompts. Pass the site or project explicitly in unattended
|
|
196
|
+
runs.
|
|
197
|
+
|
|
198
|
+
```sh
|
|
199
|
+
seo report --project example --json
|
|
200
|
+
seo crawl https://example.com --json --output crawl.json
|
|
201
|
+
seo crawl https://example.com --fail-on high --json
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Reports keep observed data, derived findings, skipped sections, limits, and
|
|
205
|
+
provider errors separate so automation can make decisions without parsing
|
|
206
|
+
terminal prose.
|
|
207
|
+
|
|
208
|
+
`seo report --json` returns a compact summary, action queue, and bounded crawl
|
|
209
|
+
evidence so an agent can choose its next call without loading every raw report.
|
|
210
|
+
Use `--full` only when a script needs the complete report object.
|
|
211
|
+
|
|
212
|
+
When a CI job needs Search Console or GA4 data, give it a Google service
|
|
213
|
+
account JSON key through its secret store. The service account needs access to
|
|
214
|
+
the exact properties it will query. This GitHub Actions step runs without a
|
|
215
|
+
browser or a copied local token:
|
|
216
|
+
|
|
217
|
+
```yaml
|
|
218
|
+
- name: Run the SEO report
|
|
219
|
+
run: |
|
|
220
|
+
npm i -g seo
|
|
221
|
+
seo report --site sc-domain:example.com --json > seo-report.json
|
|
222
|
+
env:
|
|
223
|
+
SEO_GOOGLE_SERVICE_ACCOUNT_JSON: ${{ secrets.SEO_GOOGLE_SERVICE_ACCOUNT_JSON }}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
The [Google data guide](https://seoskill.dev/docs/google) covers Search
|
|
227
|
+
Console and GA4 permissions, mounted secret files, and how to check the active
|
|
228
|
+
identity safely.
|
|
229
|
+
|
|
230
|
+
Agents can discover and run the same report catalog as MCP without starting a
|
|
231
|
+
server:
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
seo reports list --category crawl --json
|
|
235
|
+
seo reports describe audit-page --json
|
|
236
|
+
seo reports run audit-page --params '{"url":"https://example.com"}' --json
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
Always describe a report before constructing its parameters. The CLI and MCP
|
|
240
|
+
surfaces read from the same registry, so their ids and JSON Schemas cannot
|
|
241
|
+
drift.
|
|
242
|
+
|
|
243
|
+
## Use it with AI agents
|
|
244
|
+
|
|
245
|
+
Your agent carries one short SEO skill, and the CLI and MCP server do the
|
|
246
|
+
heavy lifting. The skill teaches an agent how to discover the 50+ audit and
|
|
247
|
+
report tools at runtime, and the agent asks the CLI for the detail on each
|
|
248
|
+
tool only when it is about to run it. You get the whole toolkit without fifty
|
|
249
|
+
skill files sitting in the context window on every session.
|
|
250
|
+
|
|
251
|
+
`seo start` offers to install the SEO skill during setup. In an agent-managed
|
|
252
|
+
environment, add it yourself with the standard installer:
|
|
253
|
+
|
|
254
|
+
```sh
|
|
255
|
+
npm i -g seo
|
|
256
|
+
npx skills add iannuttall/seo
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
Then install the local stdio MCP server into a supported client:
|
|
260
|
+
|
|
261
|
+
```sh
|
|
262
|
+
seo mcp install
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
The prompt detects installed clients. Scripts can choose one or more explicitly:
|
|
266
|
+
|
|
267
|
+
```sh
|
|
268
|
+
seo mcp install --codex
|
|
269
|
+
seo mcp install --claude-code
|
|
270
|
+
seo mcp install --cursor
|
|
271
|
+
seo mcp install --claude-desktop
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Your client starts the server when it needs it. Run it directly only for manual
|
|
275
|
+
configuration or testing:
|
|
276
|
+
|
|
277
|
+
```sh
|
|
278
|
+
seo mcp serve
|
|
13
279
|
```
|
|
14
280
|
|
|
15
|
-
|
|
281
|
+
The repository ships one skill under `skills/seo`. It is a router: it teaches an
|
|
282
|
+
agent to discover reports, describe one to load its depth at runtime, inspect
|
|
283
|
+
the evidence, and request a smaller follow-up instead of loading a giant result
|
|
284
|
+
into context. Per-report guidance lives in the registry and is fetched with
|
|
285
|
+
`seo reports describe <id> --json`, so it never drifts from the skill.
|
|
286
|
+
|
|
287
|
+
The npm package includes the same file for local inspection:
|
|
288
|
+
|
|
289
|
+
```sh
|
|
290
|
+
seo skill list
|
|
291
|
+
seo skill path seo
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
Agents can also discover the canonical skill from
|
|
295
|
+
`https://seoskill.dev/.well-known/agent-skills/index.json`. The entry links to
|
|
296
|
+
the canonical skill instructions and includes a content digest for verification.
|
|
297
|
+
|
|
298
|
+
See [MCP and agents](https://seoskill.dev/docs/agents) for setup and tool
|
|
299
|
+
details.
|
|
16
300
|
|
|
17
|
-
|
|
301
|
+
## Use it as a library
|
|
18
302
|
|
|
19
|
-
|
|
20
|
-
var express = require('express');
|
|
21
|
-
var seo = require('seo');
|
|
22
|
-
var app = express();
|
|
303
|
+
Install the same unscoped package in any Node 22 or newer project:
|
|
23
304
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
305
|
+
```sh
|
|
306
|
+
npm install seo
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Run any public report by id with the same definition, input schema, and
|
|
310
|
+
evidence used by the CLI and MCP server:
|
|
311
|
+
|
|
312
|
+
```ts
|
|
313
|
+
import { describeReport, executeReport } from 'seo/mcp'
|
|
314
|
+
|
|
315
|
+
const description = describeReport('quick-wins')
|
|
316
|
+
const result = await executeReport('quick-wins', {
|
|
317
|
+
site: 'sc-domain:example.com',
|
|
318
|
+
days: 90,
|
|
319
|
+
})
|
|
34
320
|
|
|
35
|
-
|
|
321
|
+
console.log(description.inputSchema)
|
|
322
|
+
console.log(result)
|
|
36
323
|
```
|
|
37
324
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
325
|
+
Or call typed analysis functions directly when your app already knows the job
|
|
326
|
+
it needs to run:
|
|
327
|
+
|
|
328
|
+
```ts
|
|
329
|
+
import { auditPage, crawlSite } from 'seo'
|
|
330
|
+
|
|
331
|
+
const page = await auditPage({
|
|
332
|
+
url: 'https://example.com/pricing',
|
|
333
|
+
})
|
|
334
|
+
|
|
335
|
+
const crawl = await crawlSite({
|
|
336
|
+
url: 'https://example.com',
|
|
337
|
+
maxPages: 100,
|
|
338
|
+
maxDepth: 4,
|
|
339
|
+
})
|
|
41
340
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (request.path === '/') return true;
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
341
|
+
console.log(page.issues)
|
|
342
|
+
console.log(crawl.summary, crawl.issueGroups)
|
|
47
343
|
```
|
|
48
344
|
|
|
49
|
-
|
|
345
|
+
The main `seo` export contains the report, provider, crawler, storage, and
|
|
346
|
+
rendering APIs. `seo/mcp` exposes report discovery, report execution, and the
|
|
347
|
+
embeddable MCP server. See the [TypeScript library
|
|
348
|
+
guide](https://seoskill.dev/docs/library) for structured error handling,
|
|
349
|
+
local Google access, and more examples.
|
|
350
|
+
|
|
351
|
+
## Local data and Google access
|
|
352
|
+
|
|
353
|
+
Google OAuth tokens use your system keychain when it is available. On a
|
|
354
|
+
headless machine or a locked keychain, the CLI falls back to a private
|
|
355
|
+
`0600` file in your user config directory. Project profiles, crawl reports, and
|
|
356
|
+
provider caches are also local. Use these commands to inspect or remove them:
|
|
357
|
+
|
|
358
|
+
```sh
|
|
359
|
+
seo privacy
|
|
360
|
+
seo doctor
|
|
361
|
+
seo auth logout
|
|
362
|
+
seo reset
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
`seo auth status` shows the active storage mode. Power users can choose it with
|
|
366
|
+
`seo auth storage --keychain` or `seo auth storage --file`.
|
|
367
|
+
|
|
368
|
+
Power users can bring their own Google OAuth client. See
|
|
369
|
+
[getting started](https://seoskill.dev/docs/getting-started) for the available
|
|
370
|
+
auth paths.
|
|
371
|
+
|
|
372
|
+
## Common questions
|
|
373
|
+
|
|
374
|
+
### Does my site data stay on my machine?
|
|
375
|
+
|
|
376
|
+
Yes. Reports, project profiles, Google tokens, crawls, and caches stay in your
|
|
377
|
+
local config directory. The CLI only makes the network requests needed to fetch
|
|
378
|
+
your site and call the Google APIs you connect. There is no hosted backend,
|
|
379
|
+
account, or telemetry service.
|
|
380
|
+
|
|
381
|
+
### Do I need a Google API key?
|
|
382
|
+
|
|
383
|
+
No. `seo start` uses a normal Google sign-in for read-only Search Console and
|
|
384
|
+
GA4 access. Public releases can include a shared desktop OAuth client, and if
|
|
385
|
+
your build does not have one, setup helps you add your own. You can also run a
|
|
386
|
+
local technical crawl with no Google connection at all.
|
|
387
|
+
|
|
388
|
+
### What does it cost?
|
|
389
|
+
|
|
390
|
+
The `seo` package is free and open source under Apache-2.0. It calls Google APIs
|
|
391
|
+
you already have access to, so there is no separate subscription. Your own API
|
|
392
|
+
quotas still apply.
|
|
393
|
+
|
|
394
|
+
### How is this different from a paid SEO tool?
|
|
395
|
+
|
|
396
|
+
A hosted SEO tool keeps your data on its servers and shows you a dashboard. This
|
|
397
|
+
runs on your machine, works from your own crawl and Google data, and returns
|
|
398
|
+
structured evidence your agent can read and act on. Every finding shows the
|
|
399
|
+
evidence behind it and a way to verify a fix, so you are not trusting a score
|
|
400
|
+
you cannot inspect.
|
|
401
|
+
|
|
402
|
+
## Documentation
|
|
403
|
+
|
|
404
|
+
Questions, bug reports, and feature requests go through
|
|
405
|
+
[GitHub Issues](https://github.com/iannuttall/seo/issues). Report suspected
|
|
406
|
+
vulnerabilities privately through the process in [SECURITY.md](SECURITY.md).
|
|
407
|
+
|
|
408
|
+
- [Getting started](https://seoskill.dev/docs/getting-started)
|
|
409
|
+
- [CLI commands](https://seoskill.dev/docs/cli)
|
|
410
|
+
- [Crawler](https://seoskill.dev/docs/crawler)
|
|
411
|
+
- [Reports and data](https://seoskill.dev/docs/reports)
|
|
412
|
+
- [MCP and agents](https://seoskill.dev/docs/agents)
|
|
413
|
+
- [AI-search evidence](https://seoskill.dev/docs/ai-search)
|
|
414
|
+
- [Privacy policy](https://seoskill.dev/privacy)
|
|
415
|
+
- [Terms of use](https://seoskill.dev/terms)
|
|
416
|
+
- [Security policy](https://seoskill.dev/security)
|
|
417
|
+
- [Contributing](CONTRIBUTING.md)
|
|
418
|
+
- [Trademark and brand policy](TRADEMARKS.md)
|
|
419
|
+
|
|
420
|
+
## Develop locally
|
|
421
|
+
|
|
422
|
+
Most users do not need the source checkout. If you want to contribute:
|
|
423
|
+
|
|
424
|
+
```sh
|
|
425
|
+
git clone https://github.com/iannuttall/seo.git
|
|
426
|
+
cd seo
|
|
427
|
+
pnpm install
|
|
428
|
+
pnpm build
|
|
429
|
+
node dist/cli.js start --dry-run
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
Run the full quality gate before opening a pull request:
|
|
433
|
+
|
|
434
|
+
```sh
|
|
435
|
+
pnpm build
|
|
436
|
+
pnpm typecheck
|
|
437
|
+
pnpm test
|
|
438
|
+
pnpm lint
|
|
439
|
+
pnpm pack --dry-run
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
Contributor architecture and report-quality rules live in [AGENTS.md](AGENTS.md).
|
|
443
|
+
|
|
444
|
+
## License
|
|
50
445
|
|
|
51
|
-
|
|
446
|
+
The code is available under [Apache-2.0](LICENSE). Project names and artwork are
|
|
447
|
+
covered separately by the [trademark and brand policy](TRADEMARKS.md).
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
## Report a vulnerability
|
|
4
|
+
|
|
5
|
+
Do not open a public issue for a suspected vulnerability.
|
|
6
|
+
|
|
7
|
+
Use GitHub's private vulnerability reporting flow:
|
|
8
|
+
|
|
9
|
+
```txt
|
|
10
|
+
https://github.com/iannuttall/seo/security/advisories/new
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Include the affected command, package, or workflow, clear reproduction steps,
|
|
14
|
+
and the practical impact. Remove Google tokens, API keys, account identifiers,
|
|
15
|
+
analytics data, private URLs, and client data from every example.
|
|
16
|
+
|
|
17
|
+
Use [GitHub Issues](https://github.com/iannuttall/seo/issues) for ordinary
|
|
18
|
+
questions and non-sensitive bugs.
|
|
19
|
+
|
|
20
|
+
## Local data and credentials
|
|
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
|
|
24
|
+
use the operating-system keychain when enabled; fallback token files and local
|
|
25
|
+
credential files use private file permissions.
|
|
26
|
+
|
|
27
|
+
Desktop OAuth client credentials are not confidential secrets. User tokens,
|
|
28
|
+
provider API keys, and analytics data are confidential and must never be
|
|
29
|
+
committed, pasted into issues, or included in fixtures.
|
|
30
|
+
|
|
31
|
+
Use `seo privacy` to inspect local storage and `seo reset --yes` to remove it.
|
|
32
|
+
Google grants can also be revoked at
|
|
33
|
+
<https://myaccount.google.com/connections>.
|
|
34
|
+
|
|
35
|
+
## Maintainer checks
|
|
36
|
+
|
|
37
|
+
Before a public release or a change to auth, storage, crawling, or provider
|
|
38
|
+
boundaries, run:
|
|
39
|
+
|
|
40
|
+
```sh
|
|
41
|
+
pnpm build
|
|
42
|
+
pnpm typecheck
|
|
43
|
+
pnpm test
|
|
44
|
+
pnpm lint
|
|
45
|
+
pnpm security:check
|
|
46
|
+
pnpm pack --dry-run
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
The shared desktop OAuth client values are release build inputs. Store them as
|
|
50
|
+
GitHub Actions secrets so they are injected only into the release build.
|
|
51
|
+
Checked-in generated OAuth files must contain placeholders only.
|
|
52
|
+
|
|
53
|
+
`pnpm security:check` runs the dependency audit and gitleaks. On macOS the
|
|
54
|
+
helper installs gitleaks with Homebrew when it is missing. Other platforms must
|
|
55
|
+
install gitleaks first.
|
package/TERMS.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Terms of use
|
|
2
|
+
|
|
3
|
+
Last updated: 10 July 2026
|
|
4
|
+
|
|
5
|
+
These terms cover the official `seo` command-line tool, library, MCP server,
|
|
6
|
+
documentation, and seoskill.dev website.
|
|
7
|
+
|
|
8
|
+
## Open source licence
|
|
9
|
+
|
|
10
|
+
The software is licensed under the [Apache License
|
|
11
|
+
2.0](https://github.com/iannuttall/seo/blob/main/LICENSE). That licence controls
|
|
12
|
+
your right to use, copy, modify, and distribute the code. Third-party packages
|
|
13
|
+
keep their own licences.
|
|
14
|
+
|
|
15
|
+
These terms do not take away rights granted by an applicable open source
|
|
16
|
+
licence. They cover use of the official website, documentation, name, Google
|
|
17
|
+
integration, and distributed project services that sit outside the source-code
|
|
18
|
+
licence.
|
|
19
|
+
|
|
20
|
+
## Use the tool responsibly
|
|
21
|
+
|
|
22
|
+
You are responsible for the commands you run and the sites, accounts, and data
|
|
23
|
+
you use with them. Only crawl, inspect, or analyse a site when you are allowed
|
|
24
|
+
to do so. Follow applicable laws, access controls, robots policies, provider
|
|
25
|
+
terms, and reasonable rate limits.
|
|
26
|
+
|
|
27
|
+
Do not use the project to gain unauthorised access, disrupt a service, evade a
|
|
28
|
+
technical restriction, expose another person's data, or carry out unlawful
|
|
29
|
+
activity.
|
|
30
|
+
|
|
31
|
+
## Google and other third-party services
|
|
32
|
+
|
|
33
|
+
Google Search Console and Google Analytics access is optional and read-only.
|
|
34
|
+
Your use of Google APIs is also subject to Google's terms and policies. Google
|
|
35
|
+
can change API behaviour, quotas, scopes, or availability without notice to
|
|
36
|
+
this project.
|
|
37
|
+
|
|
38
|
+
The software can request public websites, run browser tooling, and use package
|
|
39
|
+
registries or operating system services. Those products are controlled by
|
|
40
|
+
their respective operators. The project is not responsible for their content,
|
|
41
|
+
availability, security, or data practices.
|
|
42
|
+
|
|
43
|
+
## Reports are evidence, not a guarantee
|
|
44
|
+
|
|
45
|
+
SEO reports can be incomplete because websites change, providers retain or cap
|
|
46
|
+
data, crawls stop, and search systems do not publish every ranking signal. The
|
|
47
|
+
software is designed to show those limits, but bugs and incorrect findings are
|
|
48
|
+
still possible.
|
|
49
|
+
|
|
50
|
+
Reports are general technical information. They do not promise rankings,
|
|
51
|
+
traffic, revenue, indexing, rich results, AI citations, or any other outcome.
|
|
52
|
+
Check important findings against the live site and the relevant provider before
|
|
53
|
+
making a consequential change.
|
|
54
|
+
|
|
55
|
+
## Your local data
|
|
56
|
+
|
|
57
|
+
You are responsible for protecting local tokens, configuration, caches,
|
|
58
|
+
reports, exports, backups, and environment variables. Keep secrets out of
|
|
59
|
+
public issues, logs, screenshots, repositories, and shared report files.
|
|
60
|
+
|
|
61
|
+
The [privacy policy](https://seoskill.dev/privacy) explains what the software
|
|
62
|
+
stores and how to remove it.
|
|
63
|
+
|
|
64
|
+
## Availability and changes
|
|
65
|
+
|
|
66
|
+
The project may change commands, reports, integrations, or documentation in a
|
|
67
|
+
future release. A feature can be fixed, replaced, or removed when needed for
|
|
68
|
+
security, correctness, provider policy, or maintainability.
|
|
69
|
+
|
|
70
|
+
There is no promise that the website, package registry, Google integration, or
|
|
71
|
+
project support will always be available.
|
|
72
|
+
|
|
73
|
+
## Warranty and liability
|
|
74
|
+
|
|
75
|
+
The software and website are provided without warranties or guarantees. The
|
|
76
|
+
Apache License 2.0 contains the warranty and liability terms for the licensed
|
|
77
|
+
software.
|
|
78
|
+
|
|
79
|
+
To the fullest extent allowed by applicable law, the project maintainer is not
|
|
80
|
+
liable for indirect, incidental, special, consequential, or business losses
|
|
81
|
+
arising from use of the software, website, reports, or third-party services.
|
|
82
|
+
Nothing in these terms excludes liability that cannot legally be excluded.
|
|
83
|
+
|
|
84
|
+
## Changes to these terms
|
|
85
|
+
|
|
86
|
+
The date at the top will be updated when these terms change. Earlier versions
|
|
87
|
+
remain available in the public Git history. Continued use after a change means
|
|
88
|
+
the new terms apply to later use.
|
|
89
|
+
|
|
90
|
+
## Questions about these terms
|
|
91
|
+
|
|
92
|
+
Open an issue in the [public GitHub repository](https://github.com/iannuttall/seo/issues).
|
|
93
|
+
Do not include OAuth tokens, private reports, personal data, or other secrets in
|
|
94
|
+
a public issue.
|
package/TRADEMARKS.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Trademark and brand policy
|
|
2
|
+
|
|
3
|
+
The source code is available under Apache-2.0. That license does not grant a
|
|
4
|
+
right to present another product or service as the official `seo` project.
|
|
5
|
+
|
|
6
|
+
This policy covers this project's identity: the name `seo` when it refers to
|
|
7
|
+
this specific package and project, the tagline "The SEO command for AI agents",
|
|
8
|
+
the logo and project artwork, and seoskill.dev.
|
|
9
|
+
|
|
10
|
+
"seo" is a generic term for search engine optimization. This policy claims no
|
|
11
|
+
rights over that generic use. It covers only the project's name in context, its
|
|
12
|
+
logo, its branding, and its tagline.
|
|
13
|
+
|
|
14
|
+
## Uses that are fine
|
|
15
|
+
|
|
16
|
+
- Truthfully saying that software uses, supports, or is based on `seo`.
|
|
17
|
+
- Linking to the official repository or seoskill.dev.
|
|
18
|
+
- Keeping required attribution and notices in copies or forks.
|
|
19
|
+
- Describing a fork as an unofficial fork, provided the distinction is clear.
|
|
20
|
+
|
|
21
|
+
## Ask first
|
|
22
|
+
|
|
23
|
+
Open a [GitHub Issue](https://github.com/iannuttall/seo/issues) before using the
|
|
24
|
+
project name or artwork as the main identity of a product, company, hosted
|
|
25
|
+
service, domain, package, event, or merchandise.
|
|
26
|
+
|
|
27
|
+
Do not imply endorsement, partnership, or official status. Forks and hosted
|
|
28
|
+
versions must use a distinct name and visual identity, and must not create
|
|
29
|
+
confusion with the npm package, repository, or seoskill.dev.
|
|
30
|
+
|
|
31
|
+
Nominative and other uses allowed by applicable law remain allowed.
|