@houtini/seo-audit-console 0.2.0 → 0.2.3
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 +6 -1
- package/dist/core/DataForSeoClient.d.ts +1 -1
- package/dist/core/DataForSeoClient.d.ts.map +1 -1
- package/dist/core/DataForSeoClient.js +10 -2
- package/dist/core/DataForSeoClient.js.map +1 -1
- package/dist/core/gscFreshness.d.ts.map +1 -1
- package/dist/core/gscFreshness.js +17 -7
- package/dist/core/gscFreshness.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +22 -15
- package/dist/server.js.map +1 -1
- package/dist/src/ui/dashboard.html +287 -287
- package/dist/src/ui/sync-progress.html +1 -1
- package/package.json +4 -1
- package/server.json +3 -3
package/README.md
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**A technical SEO audit you can hold a conversation with - built from your own Search Console data and a live crawl of your site, run inside Claude.**
|
|
4
4
|
|
|
5
|
+
[](https://www.npmjs.com/package/@houtini/seo-audit-console)
|
|
5
6
|
[](./LICENSE)
|
|
6
7
|
[](https://modelcontextprotocol.io)
|
|
7
8
|
[](https://nodejs.org)
|
|
@@ -10,6 +11,8 @@
|
|
|
10
11
|
|
|
11
12
|
**Built by [Houtini](https://houtini.com).** We build automation for the grunt work of digital marketing - the data collection, the crawling, the merging, the checking - so your team's time goes on the thinking, the strategy and the client work that needs a human. This plugin is that idea applied to the technical SEO audit.
|
|
12
13
|
|
|
14
|
+
> **New to MCPs, or not sure where to start?** The **[Getting started guide](manual/getting-started.md)** takes you from a completely fresh machine (no Node, no Git, never heard of a service account) to your first audit - every step screenshotted, including the one everyone misses. Ten minutes, honestly.
|
|
15
|
+
|
|
13
16
|
```console
|
|
14
17
|
you › run an SEO audit on simracingcockpit.gg
|
|
15
18
|
|
|
@@ -101,6 +104,8 @@ The crawl is where audits usually go wrong, so it's worth understanding what thi
|
|
|
101
104
|
|
|
102
105
|
After the crawl it computes a real link graph: internal PageRank with nav and footer links down-weighted, click depth from the homepage counting body links only, in-degree per page. That graph powers the orphan, equity-leak and underlinked-page checks - and the donor rankings when the tool suggests internal links.
|
|
103
106
|
|
|
107
|
+

|
|
108
|
+
|
|
104
109
|
---
|
|
105
110
|
|
|
106
111
|
## The workflows, briefly
|
|
@@ -134,7 +139,7 @@ It unlocks the Semrush-replacement layer: the organic visibility overview for an
|
|
|
134
139
|
Three steps - the full walkthrough with the gotchas is [getting-started.md](manual/getting-started.md):
|
|
135
140
|
|
|
136
141
|
1. **Get it:** the quick route is npx - point your MCP config at `npx -y @houtini/seo-audit-console` and there's nothing to build. Or clone this repo, `npm install`, `npm run build` if you want the source. Either way, Node ≥ 20.
|
|
137
|
-
2. **Connect Search Console:** create a Google Cloud service account, download its JSON key, and - the step everyone misses - **add the service account's email as a user on your property** in Search Console.
|
|
142
|
+
2. **Connect Search Console:** create a Google Cloud service account, download its JSON key, and - the step everyone misses - **add the service account's email as a user on your property** in Search Console. Prefer a walkthrough with pictures? [Setting it up from scratch](https://houtini.com/articles/better-search-console/#setting-it-up-from-scratch) covers the whole flow.
|
|
138
143
|
3. **Point your MCP client at `dist/index.js`** with `GOOGLE_APPLICATION_CREDENTIALS` set. Works in Claude Desktop and Claude Code; only the one env var is required.
|
|
139
144
|
|
|
140
145
|
Then: *"list properties"* to check it's connected, *"refresh"*, *"run an SEO audit"*.
|
|
@@ -52,7 +52,7 @@ export declare class DataForSeoClient {
|
|
|
52
52
|
* or a full URL (DataForSEO switches mode on the shape). Optional `filters` narrows
|
|
53
53
|
* to e.g. a subfolder via ranked_serp_element.serp_item.relative_url LIKE.
|
|
54
54
|
*/
|
|
55
|
-
rankedKeywords(target: string, location?: string | number, languageCode?: string, limit?: number, orderBy?: string, filters?: unknown[]
|
|
55
|
+
rankedKeywords(target: string, location?: string | number, languageCode?: string, limit?: number, orderBy?: string, filters?: unknown[]): Promise<DfsResponse>;
|
|
56
56
|
/** Backlinks — overall profile for a domain (total backlinks, referring domains, spam). Cheap. */
|
|
57
57
|
backlinksSummary(target: string): Promise<DfsResponse>;
|
|
58
58
|
/** Backlinks — per-page backlink/referring-domain counts for a domain (top pages by backlinks). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataForSeoClient.d.ts","sourceRoot":"","sources":["../../src/core/DataForSeoClient.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;IAC1C,OAAO,CAAC,KAAK,CAAuC;gBAExC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,SAAK;IAmB9E,sFAAsF;IACtF,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,MAAM;IAUd,8EAA8E;IACxE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,SAAS,SAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"DataForSeoClient.d.ts","sourceRoot":"","sources":["../../src/core/DataForSeoClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -68,6 +68,13 @@ export class DataForSeoClient {
|
|
|
68
68
|
throw new Error(`DataForSEO ${endpoint} failed: ${res.status} ${json?.status_message ?? ''}`.trim());
|
|
69
69
|
}
|
|
70
70
|
const tasks = json.tasks ?? [];
|
|
71
|
+
// Task-level failures (40xxx inside tasks[0]) must be LOUD — swallowed, they surface as a
|
|
72
|
+
// plausible-looking empty result (found live: Labs rejecting a field returned [] at $0).
|
|
73
|
+
const t0 = tasks[0];
|
|
74
|
+
if (t0 && (t0.status_code ?? 20000) >= 40000) {
|
|
75
|
+
throw new Error(`DataForSEO ${endpoint} task failed: ${t0.status_code} ${t0.status_message ?? ''}`.trim() +
|
|
76
|
+
(t0.status_code === 40204 ? ' — the Backlinks API is a separate DataForSEO subscription; activate it at app.dataforseo.com to use pull_backlinks.' : ''));
|
|
77
|
+
}
|
|
71
78
|
const cost = Number(json.cost) || 0;
|
|
72
79
|
// Only cache genuinely successful responses — a task-level failure (40xxx) or
|
|
73
80
|
// all-null results must not be cached for 20 days; let a later call retry.
|
|
@@ -155,14 +162,15 @@ export class DataForSeoClient {
|
|
|
155
162
|
* or a full URL (DataForSEO switches mode on the shape). Optional `filters` narrows
|
|
156
163
|
* to e.g. a subfolder via ranked_serp_element.serp_item.relative_url LIKE.
|
|
157
164
|
*/
|
|
158
|
-
async rankedKeywords(target, location, languageCode = 'en', limit = 50, orderBy = 'ranked_serp_element.serp_item.etv,desc', filters
|
|
165
|
+
async rankedKeywords(target, location, languageCode = 'en', limit = 50, orderBy = 'ranked_serp_element.serp_item.etv,desc', filters) {
|
|
166
|
+
// NB: item_types is NOT a valid field on Labs ranked_keywords (40501) — element-type
|
|
167
|
+
// scoping (e.g. AI Overview citations) is expressed via `filters` on serp_item.type.
|
|
159
168
|
const body = {
|
|
160
169
|
target,
|
|
161
170
|
...this.loc(location),
|
|
162
171
|
language_code: languageCode,
|
|
163
172
|
limit: Math.min(limit, 1000),
|
|
164
173
|
order_by: [orderBy],
|
|
165
|
-
item_types: itemTypes,
|
|
166
174
|
};
|
|
167
175
|
if (filters && filters.length)
|
|
168
176
|
body.filters = filters;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataForSeoClient.js","sourceRoot":"","sources":["../../src/core/DataForSeoClient.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"DataForSeoClient.js","sourceRoot":"","sources":["../../src/core/DataForSeoClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gscFreshness.d.ts","sourceRoot":"","sources":["../../src/core/gscFreshness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gFAAgF;IAChF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"gscFreshness.d.ts","sourceRoot":"","sources":["../../src/core/gscFreshness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gFAAgF;IAChF,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,GAAG,YAAY,CA8BhE"}
|
|
@@ -12,21 +12,31 @@ export function gscFreshness(db) {
|
|
|
12
12
|
if (rows.length === 0)
|
|
13
13
|
return { rawMax: null, effectiveMax: null, trimmedDays: 0 };
|
|
14
14
|
const rawMax = rows[rows.length - 1].date;
|
|
15
|
-
|
|
15
|
+
// Calendar guard first: GSC marks roughly the last two days as not-yet-finalised, and a partial
|
|
16
|
+
// day can still clear the 50%-of-median test below (a 70%-of-normal day reads as a worrying dip,
|
|
17
|
+
// not a crater). Never chart a day within 2 days of now, regardless of its numbers.
|
|
18
|
+
const cutoff = new Date(Date.now() - 2 * 86400_000).toISOString().slice(0, 10);
|
|
19
|
+
let calTrimmed = 0;
|
|
20
|
+
while (rows.length - 1 - calTrimmed >= 0 && rows[rows.length - 1 - calTrimmed].date > cutoff)
|
|
21
|
+
calTrimmed++;
|
|
22
|
+
if (calTrimmed >= rows.length)
|
|
16
23
|
return { rawMax, effectiveMax: rawMax, trimmedDays: 0 };
|
|
24
|
+
const kept = rows.slice(0, rows.length - calTrimmed);
|
|
25
|
+
if (kept.length < 8)
|
|
26
|
+
return { rawMax, effectiveMax: kept[kept.length - 1].date, trimmedDays: calTrimmed };
|
|
17
27
|
// Reference level from a recent stable window (last ~21 days, excluding the last 3 that may be partial).
|
|
18
|
-
const stable =
|
|
28
|
+
const stable = kept.slice(Math.max(0, kept.length - 24), kept.length - 3).map(r => r.i).sort((a, b) => a - b);
|
|
19
29
|
const median = stable.length ? stable[Math.floor(stable.length / 2)] : 0;
|
|
20
30
|
if (median <= 0)
|
|
21
|
-
return { rawMax, effectiveMax:
|
|
31
|
+
return { rawMax, effectiveMax: kept[kept.length - 1].date, trimmedDays: calTrimmed };
|
|
22
32
|
let trimmed = 0;
|
|
23
|
-
for (let k =
|
|
24
|
-
if (
|
|
33
|
+
for (let k = kept.length - 1; k >= 0 && trimmed < 3; k--) {
|
|
34
|
+
if (kept[k].i < median * 0.5)
|
|
25
35
|
trimmed++;
|
|
26
36
|
else
|
|
27
37
|
break;
|
|
28
38
|
}
|
|
29
|
-
const effectiveMax =
|
|
30
|
-
return { rawMax, effectiveMax, trimmedDays: trimmed };
|
|
39
|
+
const effectiveMax = kept[kept.length - 1 - trimmed].date;
|
|
40
|
+
return { rawMax, effectiveMax, trimmedDays: calTrimmed + trimmed };
|
|
31
41
|
}
|
|
32
42
|
//# sourceMappingURL=gscFreshness.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gscFreshness.js","sourceRoot":"","sources":["../../src/core/gscFreshness.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,0GAA0G,CAAC;SACnH,GAAG,EAAmC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"gscFreshness.js","sourceRoot":"","sources":["../../src/core/gscFreshness.ts"],"names":[],"mappings":"AAWA;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,EAAqB;IAChD,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CAAC,0GAA0G,CAAC;SACnH,GAAG,EAAmC,CAAC;IAC1C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1C,gGAAgG;IAChG,iGAAiG;IACjG,oFAAoF;IACpF,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC/E,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,GAAG,MAAM;QAAE,UAAU,EAAE,CAAC;IAC3G,IAAI,UAAU,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IACvF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IAE1G,yGAAyG;IACzG,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9G,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;IAEtG,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACzD,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,GAAG;YAAE,OAAO,EAAE,CAAC;;YACnC,MAAM;IACb,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC;IAC1D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,UAAU,GAAG,OAAO,EAAE,CAAC;AACrE,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwDpE,wBAAgB,OAAO,IAAI,MAAM,CAGhC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwDpE,wBAAgB,OAAO,IAAI,MAAM,CAGhC;AAyJD,wBAAgB,YAAY,IAAI;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CA03C9E"}
|
package/dist/server.js
CHANGED
|
@@ -56,8 +56,10 @@ export function dataDir() {
|
|
|
56
56
|
return RESOLVED_DATA_DIR;
|
|
57
57
|
}
|
|
58
58
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
// Version the widget URIs: hosts may cache ui:// resources by URI indefinitely, so an
|
|
60
|
+
// unversioned URI can pin users to a stale (or broken) cached bundle across releases.
|
|
61
|
+
const DASHBOARD_URI = `ui://dashboard/main-${SERVER_VERSION}.html`;
|
|
62
|
+
const SYNC_PROGRESS_URI = `ui://sync-progress/main-${SERVER_VERSION}.html`;
|
|
61
63
|
// Must match the categories actually used by CHECKS (src/audit/checks.ts) so category
|
|
62
64
|
// filters never silently return empty. (Was listing performance/agentic/integrity/war-stories
|
|
63
65
|
// which no check uses, and omitting content/security which checks do use.)
|
|
@@ -115,7 +117,7 @@ Raw access: query_audit runs any single check with full evidence; every table ab
|
|
|
115
117
|
|
|
116
118
|
## Worked recipes
|
|
117
119
|
|
|
118
|
-
1. **AI Overview citation loss.** ranked_keywords target:<your domain> aioOnly:true →
|
|
120
|
+
1. **AI Overview exposure & citation loss.** ranked_keywords target:<your domain> aioOnly:true → keywords you rank for where the SERP shows an AI Overview (exposure). For citation (are YOU a source?) check specific keywords with related_terms/serpOrganic — the ai_overview item's references[] carries domain/url/quoted text. For each exposed keyword's ranking page, pull its per-day clicks from search_analytics (page_key × date). Pages whose clicks fell while the AIO citation appeared = you are feeding the answer without earning the visit.
|
|
119
121
|
2. **Striking distance without body coverage.** query_audit check:striking-distance (GSC rank 11–20) → for each page, check pages.body_chunks for the query's terms. The automated versions: body-missing-top-query, rag-answer-gap, and score_passages for the dense-answer test. Pages ranking 11–20 that never answer the query in one passage are the highest-yield rewrites.
|
|
120
122
|
3. **Not indexed + no equity.** url_inspection.coverage_state ~ 'not indexed' joined to pages.ipr + inlink_count. Low-iPR unindexed pages need internal links, not resubmission; high-iPR unindexed pages are the real anomalies. (Checks: coverage-not-indexed, underlinked-high-demand.)
|
|
121
123
|
4. **Cannibalisation with semantic overlap.** run_audit → keyword-cannibalisation evidence lists the competing URLs per query → compare those pages' body_chunks: heavy chunk overlap = consolidate (301 the loser); light overlap = differentiate the titles/H1s and interlink with distinct anchors.
|
|
@@ -228,12 +230,12 @@ export function createServer() {
|
|
|
228
230
|
title: 'Help — what this audit can do',
|
|
229
231
|
description: 'Overview of every tool/feature with an example prompt for each. Start here.',
|
|
230
232
|
inputSchema: {},
|
|
231
|
-
}, async () => ({ content: [{ type: 'text', text: HELP_TEXT }]
|
|
233
|
+
}, async () => ({ content: [{ type: 'text', text: HELP_TEXT }] }));
|
|
232
234
|
server.registerTool('composition_cookbook', {
|
|
233
235
|
title: 'Composition cookbook (data-surface map + recipes)',
|
|
234
236
|
description: 'The full data-surface map (every source: grain, dimensions, join keys, freshness, cost) plus worked multi-source recipes and novel combinations, in this server\'s actual tool and table names. Static — no API calls, no cost. Call this BEFORE planning any complex question that spans more than one data source.',
|
|
235
237
|
inputSchema: {},
|
|
236
|
-
}, async () => ({ content: [{ type: 'text', text: COOKBOOK_TEXT }]
|
|
238
|
+
}, async () => ({ content: [{ type: 'text', text: COOKBOOK_TEXT }] }));
|
|
237
239
|
server.registerTool('list_checks', {
|
|
238
240
|
title: 'List audit checks',
|
|
239
241
|
description: 'List the technical-SEO check categories this server can evaluate.',
|
|
@@ -1053,7 +1055,7 @@ export function createServer() {
|
|
|
1053
1055
|
});
|
|
1054
1056
|
server.registerTool('ranked_keywords', {
|
|
1055
1057
|
title: 'Ranked keywords for a domain / URL / folder (DataForSEO Labs)',
|
|
1056
|
-
description: 'Every keyword a target ranks for in Google organic — scope it to a whole domain, a subdomain, ONE page (scope:url with the full URL), or a subfolder (scope:folder + folder:"/blog/"). Returns keyword, position, search volume, ETV, the ranking URL, plus keyword difficulty, search intent and SERP features where the response carries them. Set aioOnly:true to list only keywords
|
|
1058
|
+
description: 'Every keyword a target ranks for in Google organic — scope it to a whole domain, a subdomain, ONE page (scope:url with the full URL), or a subfolder (scope:folder + folder:"/blog/"). Returns keyword, position, search volume, ETV, the ranking URL, plus keyword difficulty, search intent and SERP features where the response carries them. Set aioOnly:true to list only keywords whose SERP shows a Google AI Overview (your AIO exposure list; per-keyword CITATION checking uses the SERP tools — see the cookbook). The Semrush-style "keywords a page or site ranks for" view — works on any site. Labs call, cached 20 days. Pass location for the right market. Grain: keyword × target. Joins: keyword → GSC search_analytics.query; URL → pages.url_key.',
|
|
1057
1059
|
inputSchema: {
|
|
1058
1060
|
target: z.string().describe('Domain, subdomain, or full URL (full URL required for scope:url)'),
|
|
1059
1061
|
scope: z.enum(['domain', 'subdomain', 'url', 'folder']).optional(),
|
|
@@ -1062,7 +1064,7 @@ export function createServer() {
|
|
|
1062
1064
|
languageCode: z.string().optional(),
|
|
1063
1065
|
limit: z.number().int().min(1).max(200).optional(),
|
|
1064
1066
|
orderBy: z.enum(['etv', 'volume', 'position']).optional(),
|
|
1065
|
-
aioOnly: z.boolean().optional().describe('Only keywords
|
|
1067
|
+
aioOnly: z.boolean().optional().describe('Only keywords whose SERP shows an AI Overview (exposure, not citation)'),
|
|
1066
1068
|
},
|
|
1067
1069
|
}, async ({ target, scope, folder, location, languageCode, limit, orderBy, aioOnly }) => {
|
|
1068
1070
|
const client = requireDfs(dfs);
|
|
@@ -1080,13 +1082,18 @@ export function createServer() {
|
|
|
1080
1082
|
const folderPath = mode === 'folder'
|
|
1081
1083
|
? (folder.trim().startsWith('/') ? folder.trim() : '/' + folder.trim())
|
|
1082
1084
|
: null;
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1085
|
+
// aioOnly: only rows where the target's ranked element is an AI Overview citation —
|
|
1086
|
+
// expressed as a serp_item.type filter (item_types is invalid on this Labs endpoint).
|
|
1087
|
+
const clauses = [];
|
|
1088
|
+
if (folderPath)
|
|
1089
|
+
clauses.push(['ranked_serp_element.serp_item.relative_url', 'like', `${folderPath}%`]);
|
|
1090
|
+
// Exposure, not citation: Labs ranked_keywords carries no citation fields (verified via
|
|
1091
|
+
// available_filters) — this filters to keywords whose SERP CONTAINS an AI Overview.
|
|
1092
|
+
// Per-keyword citation checking (are WE a reference?) is the SERP-advanced recipe.
|
|
1093
|
+
if (aioOnly)
|
|
1094
|
+
clauses.push(['keyword_data.serp_info.serp_item_types', 'has', 'ai_overview']);
|
|
1095
|
+
const filters = clauses.length === 0 ? undefined : clauses.length === 1 ? clauses : [clauses[0], 'and', clauses[1]];
|
|
1096
|
+
const r = await client.rankedKeywords(dfsTarget, location, languageCode ?? 'en', limit ?? 50, order, filters);
|
|
1090
1097
|
const result = r.tasks[0]?.result?.[0] ?? {};
|
|
1091
1098
|
const items = result.items ?? [];
|
|
1092
1099
|
const kws = items
|
|
@@ -1127,7 +1134,7 @@ export function createServer() {
|
|
|
1127
1134
|
const hasFeatures = kws.some(k => (k.serpFeatures && k.serpFeatures.length) || k.isFeaturedSnippet);
|
|
1128
1135
|
const optHead = `${hasKd ? ' KD |' : ''}${hasIntent ? ' Intent |' : ''}${hasFeatures ? ' SERP features |' : ''}`;
|
|
1129
1136
|
const optSep = `${hasKd ? '---|' : ''}${hasIntent ? '---|' : ''}${hasFeatures ? '---|' : ''}`;
|
|
1130
|
-
const header = `**${scopeLabel}** (scope: ${mode})${aioOnly ? ' — AI Overview
|
|
1137
|
+
const header = `**${scopeLabel}** (scope: ${mode})${aioOnly ? ' — AI Overview SERPs only' : ''} — ${kws.length} of ${fmtNum(totalCount)} ${aioOnly ? 'AIO-exposed keywords' : 'ranked keywords'}, ordered by ${orderBy ?? 'etv'}\n\n` +
|
|
1131
1138
|
`| Keyword | Pos | Volume | ETV |${optHead} URL |\n|---|---|---|---|${optSep}---|`;
|
|
1132
1139
|
const featCell = (k) => {
|
|
1133
1140
|
const f = (k.serpFeatures ?? []).map(t => (t === 'featured_snippet' && k.isFeaturedSnippet ? 'featured_snippet (owned)' : t));
|