seo 0.12.0 → 0.13.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 +57 -3
- package/README.md +1 -1
- package/dist/cli.js +85 -85
- package/dist/cli.js.map +1 -1
- package/dist/{dist-B1bivk1S.js → dist-CLV_HXUd.js} +1 -1
- package/dist/dist-wzZsD_Fi.js +420 -0
- package/dist/dist-wzZsD_Fi.js.map +1 -0
- package/dist/{esm-CQJgJ8TD.js → esm-BfNQ2FiC.js} +140 -176
- package/dist/esm-BfNQ2FiC.js.map +1 -0
- package/dist/index.d.ts +931 -746
- package/dist/index.js +4529 -244
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +11 -11
- package/dist/mcp.js +892 -338
- package/dist/mcp.js.map +1 -1
- package/dist/provider-sdk.d.ts +26 -27
- package/package.json +19 -19
- package/skills/seo/SKILL.md +4 -3
- package/dist/dist-Ban8uP1U.js +0 -377
- package/dist/dist-Ban8uP1U.js.map +0 -1
- package/dist/esm-CQJgJ8TD.js.map +0 -1
package/dist/provider-sdk.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
|
|
2
2
|
//#region packages/core/src/provider-extensions/sdk.d.ts
|
|
3
|
-
declare const SEO_PROVIDER_API_VERSION: 1;
|
|
4
|
-
type SeoProviderApiVersion = typeof SEO_PROVIDER_API_VERSION;
|
|
5
|
-
type SeoProviderKind = 'traffic-analytics' | 'search-results' | 'keyword-data' | 'domain-data' | 'link-data' | 'local-search' | 'ai-data' | 'other';
|
|
6
|
-
type SeoProviderCapabilityId = 'landing-page-visits' | 'keyword-metrics' | 'keyword-discovery' | 'serp-snapshot' | 'domain-overview' | 'ranked-keywords' | 'relevant-pages' | 'serp-competitors' | 'link-summary' | 'referring-domains' | 'backlinks' | 'domain-rating' | 'local-search' | 'ai-mentions' | 'ai-prompt-observation';
|
|
7
|
-
type SeoProviderConnectionField = {
|
|
3
|
+
export declare const SEO_PROVIDER_API_VERSION: 1;
|
|
4
|
+
export type SeoProviderApiVersion = typeof SEO_PROVIDER_API_VERSION;
|
|
5
|
+
export type SeoProviderKind = 'traffic-analytics' | 'search-results' | 'keyword-data' | 'domain-data' | 'link-data' | 'local-search' | 'ai-data' | 'other';
|
|
6
|
+
export type SeoProviderCapabilityId = 'landing-page-visits' | 'keyword-metrics' | 'keyword-discovery' | 'serp-snapshot' | 'domain-overview' | 'ranked-keywords' | 'relevant-pages' | 'serp-competitors' | 'link-summary' | 'referring-domains' | 'backlinks' | 'domain-rating' | 'local-search' | 'ai-mentions' | 'ai-prompt-observation';
|
|
7
|
+
export type SeoProviderConnectionField = {
|
|
8
8
|
id: string;
|
|
9
9
|
label: string;
|
|
10
10
|
description?: string;
|
|
@@ -12,32 +12,32 @@ type SeoProviderConnectionField = {
|
|
|
12
12
|
required?: boolean;
|
|
13
13
|
envVar?: string;
|
|
14
14
|
};
|
|
15
|
-
type SeoProviderRequest = {
|
|
15
|
+
export type SeoProviderRequest = {
|
|
16
16
|
operation: string;
|
|
17
17
|
url: string;
|
|
18
18
|
method?: 'GET' | 'POST';
|
|
19
19
|
headers?: Readonly<Record<string, string>>;
|
|
20
20
|
body?: string;
|
|
21
21
|
};
|
|
22
|
-
interface SeoProviderRuntime {
|
|
22
|
+
export interface SeoProviderRuntime {
|
|
23
23
|
requestJson(input: SeoProviderRequest): Promise<unknown>;
|
|
24
24
|
now(): string;
|
|
25
25
|
}
|
|
26
|
-
type SeoProviderConnection = {
|
|
26
|
+
export type SeoProviderConnection = {
|
|
27
27
|
account: Readonly<Record<string, string>>;
|
|
28
28
|
credentials: Readonly<Record<string, string>>;
|
|
29
29
|
};
|
|
30
|
-
type SeoProviderConnectionAdapter = {
|
|
30
|
+
export type SeoProviderConnectionAdapter = {
|
|
31
31
|
fields: readonly SeoProviderConnectionField[];
|
|
32
32
|
normalizeAccount?(account: Readonly<Record<string, string>>): Record<string, string>;
|
|
33
33
|
verify(connection: SeoProviderConnection, runtime: SeoProviderRuntime): Promise<void>;
|
|
34
34
|
verificationNotice?: string;
|
|
35
35
|
};
|
|
36
|
-
type SeoLandingPageVisitRow = {
|
|
36
|
+
export type SeoLandingPageVisitRow = {
|
|
37
37
|
path: string;
|
|
38
38
|
visits: number;
|
|
39
39
|
};
|
|
40
|
-
type SeoLandingPageVisitsResult = {
|
|
40
|
+
export type SeoLandingPageVisitsResult = {
|
|
41
41
|
metric: 'landing-page-visits';
|
|
42
42
|
rows: readonly SeoLandingPageVisitRow[];
|
|
43
43
|
returnedRows: number;
|
|
@@ -47,7 +47,7 @@ type SeoLandingPageVisitsResult = {
|
|
|
47
47
|
dataStatus: 'complete' | 'partial';
|
|
48
48
|
qualityWarnings: readonly string[];
|
|
49
49
|
};
|
|
50
|
-
type SeoLandingPageVisitsCapability = {
|
|
50
|
+
export type SeoLandingPageVisitsCapability = {
|
|
51
51
|
id: 'landing-page-visits';
|
|
52
52
|
run(input: SeoProviderConnection & {
|
|
53
53
|
startDate: string;
|
|
@@ -55,7 +55,7 @@ type SeoLandingPageVisitsCapability = {
|
|
|
55
55
|
limit: number;
|
|
56
56
|
}, runtime: SeoProviderRuntime): Promise<SeoLandingPageVisitsResult>;
|
|
57
57
|
};
|
|
58
|
-
type SeoSearchMarket = {
|
|
58
|
+
export type SeoSearchMarket = {
|
|
59
59
|
searchEngine: 'google' | 'bing';
|
|
60
60
|
countryCode: string;
|
|
61
61
|
languageCode: string;
|
|
@@ -65,7 +65,7 @@ type SeoSearchMarket = {
|
|
|
65
65
|
name?: string;
|
|
66
66
|
};
|
|
67
67
|
};
|
|
68
|
-
type SeoSerpOrganicResult = {
|
|
68
|
+
export type SeoSerpOrganicResult = {
|
|
69
69
|
rankGroup: number;
|
|
70
70
|
rankAbsolute: number;
|
|
71
71
|
page: number;
|
|
@@ -75,7 +75,7 @@ type SeoSerpOrganicResult = {
|
|
|
75
75
|
description: string | null;
|
|
76
76
|
isFeaturedSnippet: boolean | null;
|
|
77
77
|
};
|
|
78
|
-
type SeoSerpLocalPackResult = {
|
|
78
|
+
export type SeoSerpLocalPackResult = {
|
|
79
79
|
rankGroup: number;
|
|
80
80
|
rankAbsolute: number;
|
|
81
81
|
page: number | null;
|
|
@@ -93,7 +93,7 @@ type SeoSerpLocalPackResult = {
|
|
|
93
93
|
maximum: number | null;
|
|
94
94
|
} | null;
|
|
95
95
|
};
|
|
96
|
-
type SeoSerpSnapshotResult = {
|
|
96
|
+
export type SeoSerpSnapshotResult = {
|
|
97
97
|
observedAt: string;
|
|
98
98
|
effectiveKeyword: string;
|
|
99
99
|
searchEngineDomain: string | null;
|
|
@@ -140,7 +140,7 @@ type SeoSerpSnapshotResult = {
|
|
|
140
140
|
row?: number;
|
|
141
141
|
}[];
|
|
142
142
|
};
|
|
143
|
-
type SeoSerpSnapshotCapability = {
|
|
143
|
+
export type SeoSerpSnapshotCapability = {
|
|
144
144
|
id: 'serp-snapshot';
|
|
145
145
|
defaultDepth: number;
|
|
146
146
|
maxDepth: number;
|
|
@@ -168,12 +168,12 @@ type SeoSerpSnapshotCapability = {
|
|
|
168
168
|
depth: number;
|
|
169
169
|
}, runtime: SeoProviderRuntime): Promise<SeoSerpSnapshotResult>;
|
|
170
170
|
};
|
|
171
|
-
type SeoProviderCapabilityAdapter = SeoLandingPageVisitsCapability | SeoSerpSnapshotCapability;
|
|
172
|
-
type SeoProviderJson = string | number | boolean | null | readonly SeoProviderJson[] | {
|
|
171
|
+
export type SeoProviderCapabilityAdapter = SeoLandingPageVisitsCapability | SeoSerpSnapshotCapability;
|
|
172
|
+
export type SeoProviderJson = string | number | boolean | null | readonly SeoProviderJson[] | {
|
|
173
173
|
readonly [key: string]: SeoProviderJson;
|
|
174
174
|
};
|
|
175
|
-
type SeoProviderJsonSchema = Readonly<Record<string, SeoProviderJson>>;
|
|
176
|
-
type SeoProviderActionAdapter = {
|
|
175
|
+
export type SeoProviderJsonSchema = Readonly<Record<string, SeoProviderJson>>;
|
|
176
|
+
export type SeoProviderActionAdapter = {
|
|
177
177
|
id: string;
|
|
178
178
|
description: string;
|
|
179
179
|
inputSchema: SeoProviderJsonSchema;
|
|
@@ -183,7 +183,7 @@ type SeoProviderActionAdapter = {
|
|
|
183
183
|
params: Readonly<Record<string, SeoProviderJson>>;
|
|
184
184
|
}, runtime: SeoProviderRuntime): Promise<unknown>;
|
|
185
185
|
};
|
|
186
|
-
type SeoProviderRegistration = {
|
|
186
|
+
export type SeoProviderRegistration = {
|
|
187
187
|
id: string;
|
|
188
188
|
displayName: string;
|
|
189
189
|
description: string;
|
|
@@ -192,13 +192,12 @@ type SeoProviderRegistration = {
|
|
|
192
192
|
capabilities: readonly SeoProviderCapabilityAdapter[];
|
|
193
193
|
actions?: readonly SeoProviderActionAdapter[];
|
|
194
194
|
};
|
|
195
|
-
interface SeoProviderHost {
|
|
195
|
+
export interface SeoProviderHost {
|
|
196
196
|
readonly apiVersion: SeoProviderApiVersion;
|
|
197
197
|
registerProvider(provider: SeoProviderRegistration): void;
|
|
198
198
|
}
|
|
199
|
-
type SeoProviderActivate = (host: SeoProviderHost) => void | Promise<void>;
|
|
200
|
-
type SeoAnalyticsConnection = SeoProviderConnection;
|
|
201
|
-
type SeoAnalyticsLandingPageResult = SeoLandingPageVisitsResult;
|
|
199
|
+
export type SeoProviderActivate = (host: SeoProviderHost) => void | Promise<void>;
|
|
200
|
+
export type SeoAnalyticsConnection = SeoProviderConnection;
|
|
201
|
+
export type SeoAnalyticsLandingPageResult = SeoLandingPageVisitsResult;
|
|
202
202
|
//#endregion
|
|
203
|
-
export { SEO_PROVIDER_API_VERSION, SeoAnalyticsConnection, SeoAnalyticsLandingPageResult, SeoLandingPageVisitRow, SeoLandingPageVisitsCapability, SeoLandingPageVisitsResult, SeoProviderActionAdapter, SeoProviderActivate, SeoProviderApiVersion, SeoProviderCapabilityAdapter, SeoProviderCapabilityId, SeoProviderConnection, SeoProviderConnectionAdapter, SeoProviderConnectionField, SeoProviderHost, SeoProviderJson, SeoProviderJsonSchema, SeoProviderKind, SeoProviderRegistration, SeoProviderRequest, SeoProviderRuntime, SeoSearchMarket, SeoSerpLocalPackResult, SeoSerpOrganicResult, SeoSerpSnapshotCapability, SeoSerpSnapshotResult };
|
|
204
203
|
//# sourceMappingURL=provider-sdk.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "seo",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.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",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
},
|
|
70
70
|
"packageManager": "pnpm@11.11.0",
|
|
71
71
|
"engines": {
|
|
72
|
-
"node": "
|
|
72
|
+
"node": "^22.23.4 || ^24.22.1 || >=26.12.1"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|
|
75
75
|
"auth:inject-shared-client": "node scripts/inject-shared-oauth-client.mjs",
|
|
@@ -106,38 +106,38 @@
|
|
|
106
106
|
"typecheck": "turbo run typecheck"
|
|
107
107
|
},
|
|
108
108
|
"dependencies": {
|
|
109
|
-
"@clack/prompts": "^1.
|
|
109
|
+
"@clack/prompts": "^1.8.1",
|
|
110
110
|
"@mozilla/readability": "^0.6.0",
|
|
111
111
|
"@napi-rs/keyring": "^1.3.0",
|
|
112
|
-
"@types/node": "^22.20.
|
|
112
|
+
"@types/node": "^22.20.5",
|
|
113
113
|
"citty": "^0.2.2",
|
|
114
114
|
"cli-table3": "^0.6.5",
|
|
115
|
-
"defuddle": "^0.19.
|
|
115
|
+
"defuddle": "^0.19.5",
|
|
116
116
|
"htmlparser2": "10.1.0",
|
|
117
117
|
"jsonc-parser": "^3.3.1",
|
|
118
118
|
"libsql": "^0.5.29",
|
|
119
|
-
"lighthouse": "13.
|
|
119
|
+
"lighthouse": "13.5.0",
|
|
120
120
|
"linkedom": "^0.18.13",
|
|
121
|
-
"open": "^11.0.
|
|
122
|
-
"p-queue": "^9.3.
|
|
123
|
-
"p-retry": "^8.0.
|
|
121
|
+
"open": "^11.0.4",
|
|
122
|
+
"p-queue": "^9.3.5",
|
|
123
|
+
"p-retry": "^8.0.1",
|
|
124
124
|
"picocolors": "^1.1.1",
|
|
125
|
-
"pino": "^10.
|
|
126
|
-
"pino-pretty": "^13.
|
|
127
|
-
"playwright-core": "1.
|
|
125
|
+
"pino": "^10.4.0",
|
|
126
|
+
"pino-pretty": "^13.2.0",
|
|
127
|
+
"playwright-core": "1.64.1",
|
|
128
128
|
"proper-lockfile": "^4.1.2",
|
|
129
129
|
"robots-parser": "^3.0.1",
|
|
130
|
-
"string-width": "^8.
|
|
130
|
+
"string-width": "^8.3.0",
|
|
131
131
|
"turndown": "^7.2.4",
|
|
132
|
-
"undici": "^8.
|
|
132
|
+
"undici": "^8.12.2",
|
|
133
133
|
"update-notifier": "^7.3.1",
|
|
134
|
-
"zod": "^4.
|
|
134
|
+
"zod": "^4.6.7"
|
|
135
135
|
},
|
|
136
136
|
"devDependencies": {
|
|
137
|
-
"@biomejs/biome": "^2.5.
|
|
138
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
139
|
-
"tsdown": "^0.
|
|
140
|
-
"turbo": "^2.
|
|
137
|
+
"@biomejs/biome": "^2.5.15",
|
|
138
|
+
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
139
|
+
"tsdown": "^0.23.1",
|
|
140
|
+
"turbo": "^2.11.8",
|
|
141
141
|
"typescript": "^6.0.3"
|
|
142
142
|
}
|
|
143
143
|
}
|
package/skills/seo/SKILL.md
CHANGED
|
@@ -19,7 +19,7 @@ link for them to approve, then run it again.
|
|
|
19
19
|
|
|
20
20
|
| CLI | MCP tool | Returns |
|
|
21
21
|
|---|---|---|
|
|
22
|
-
| `seo report --site <site>` | `seo_report` | Search Console overview and sections |
|
|
22
|
+
| `seo report --site <site>` | `seo_report` | Search Console overview and sections; with no site, last week across the sites in the weekly site audit beta |
|
|
23
23
|
| `seo page --url <url>` | `seo_page` | One URL: live page, index status, queries |
|
|
24
24
|
| `seo compare --site <site> --date <date>` | `seo_compare` | Before and after a date, with Google updates |
|
|
25
25
|
| `seo index --site <site>` | `seo_index` | Google's indexing reasons, labelled, and pages that lost their clicks |
|
|
@@ -29,8 +29,9 @@ link for them to approve, then run it again.
|
|
|
29
29
|
| `seo internal-links --site <site>` or `--url <url>` | `seo_internal_links` | Links to add across a site, or to one page |
|
|
30
30
|
| `seo sites` | `seo_sites` | The properties the person can read |
|
|
31
31
|
|
|
32
|
-
Each result ends with the command to run next.
|
|
33
|
-
|
|
32
|
+
Each result ends with the command to run next. Start small and ask for more:
|
|
33
|
+
a site, then a `--section` (`section`), then `--detail rows` or `full`.
|
|
34
|
+
`seo <command> --help` shows the options.
|
|
34
35
|
|
|
35
36
|
## Indexing reasons each week
|
|
36
37
|
|