@automatelab/ai-seo-mcp 0.3.0 → 0.3.4
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 +21 -21
- package/README.md +14 -1
- package/dist/cli/audit-cli.d.ts +3 -0
- package/dist/cli/audit-cli.d.ts.map +1 -0
- package/dist/cli/audit-cli.js +136 -0
- package/dist/cli/audit-cli.js.map +1 -0
- package/dist/index.js +246 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/cache.d.ts +12 -0
- package/dist/lib/cache.d.ts.map +1 -0
- package/dist/lib/cache.js +51 -0
- package/dist/lib/cache.js.map +1 -0
- package/dist/lib/config.js +1 -1
- package/dist/lib/fetch.d.ts +5 -0
- package/dist/lib/fetch.d.ts.map +1 -1
- package/dist/lib/fetch.js +42 -1
- package/dist/lib/fetch.js.map +1 -1
- package/dist/lib/headless.d.ts +13 -0
- package/dist/lib/headless.d.ts.map +1 -0
- package/dist/lib/headless.js +73 -0
- package/dist/lib/headless.js.map +1 -0
- package/dist/lib/scorecard-html.js +94 -94
- package/dist/tools/audit-page.d.ts +11 -0
- package/dist/tools/audit-page.d.ts.map +1 -1
- package/dist/tools/audit-page.js +49 -2
- package/dist/tools/audit-page.js.map +1 -1
- package/dist/tools/audit-schema.d.ts +2 -1
- package/dist/tools/audit-schema.d.ts.map +1 -1
- package/dist/tools/audit-schema.js +2 -1
- package/dist/tools/audit-schema.js.map +1 -1
- package/dist/tools/audit-site.d.ts +41 -0
- package/dist/tools/audit-site.d.ts.map +1 -0
- package/dist/tools/audit-site.js +113 -0
- package/dist/tools/audit-site.js.map +1 -0
- package/dist/tools/audit-sitemap.d.ts +66 -0
- package/dist/tools/audit-sitemap.d.ts.map +1 -0
- package/dist/tools/audit-sitemap.js +264 -0
- package/dist/tools/audit-sitemap.js.map +1 -0
- package/dist/tools/check-technical.d.ts +2 -1
- package/dist/tools/check-technical.d.ts.map +1 -1
- package/dist/tools/check-technical.js +2 -1
- package/dist/tools/check-technical.js.map +1 -1
- package/dist/tools/diff-pages.js +2 -2
- package/dist/tools/diff-pages.js.map +1 -1
- package/dist/tools/extract-entities.d.ts +8 -1
- package/dist/tools/extract-entities.d.ts.map +1 -1
- package/dist/tools/extract-entities.js +110 -3
- package/dist/tools/extract-entities.js.map +1 -1
- package/dist/tools/rewrite-for-aeo.js +28 -28
- package/dist/tools/rewrite-for-geo.js +28 -28
- package/dist/tools/save-audit-report.d.ts +22 -0
- package/dist/tools/save-audit-report.d.ts.map +1 -0
- package/dist/tools/save-audit-report.js +133 -0
- package/dist/tools/save-audit-report.js.map +1 -0
- package/dist/tools/test-citation.d.ts +51 -0
- package/dist/tools/test-citation.d.ts.map +1 -0
- package/dist/tools/test-citation.js +159 -0
- package/dist/tools/test-citation.js.map +1 -0
- package/package.json +7 -1
- package/src/lib/crawlers.json +6 -6
- package/src/lib/schema-types.json +56 -56
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-technical.d.ts","sourceRoot":"","sources":["../../src/tools/check-technical.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"check-technical.d.ts","sourceRoot":"","sources":["../../src/tools/check-technical.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAA+B,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,yBAAyB;;;;;;;;;EAUpC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE;QACT,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,YAAY,EAAE,OAAO,CAAC;KACvB,CAAC;IACF,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,CAAC;QACf,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,EAAE,OAAO,CAAC;QACf,GAAG,EAAE,OAAO,CAAC;QACb,IAAI,EAAE,OAAO,CAAC;KACf,CAAC;IACF,YAAY,EAAE;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE;QACR,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE;QAChB,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,UAAU,CAAC,EAAE,YAAY,EACzB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,UAAU,CAAC,EAAE,UAAU,GACtB,OAAO,CAAC,eAAe,CAAC,CAiN1B"}
|
|
@@ -14,11 +14,12 @@ export const checkTechnicalInputSchema = z.object({
|
|
|
14
14
|
.default(true)
|
|
15
15
|
.describe("If true (default), respect robots.txt before fetching. Set false only for auditing your own site where you've intentionally blocked crawlers."),
|
|
16
16
|
});
|
|
17
|
-
export async function checkTechnical(input, hostDelays, robotsCache) {
|
|
17
|
+
export async function checkTechnical(input, hostDelays, robotsCache, renderMode) {
|
|
18
18
|
const result = await politeFetch(input.url, {
|
|
19
19
|
respectRobots: input.respect_robots,
|
|
20
20
|
hostDelays,
|
|
21
21
|
robotsCache,
|
|
22
|
+
renderMode,
|
|
22
23
|
});
|
|
23
24
|
const ct = result.headers["content-type"];
|
|
24
25
|
const ctStr = Array.isArray(ct) ? ct[0] : (ct ?? "");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-technical.js","sourceRoot":"","sources":["../../src/tools/check-technical.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,8EAA8E;AAE9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAqB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"check-technical.js","sourceRoot":"","sources":["../../src/tools/check-technical.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/diff-pages.js
CHANGED
|
@@ -67,8 +67,8 @@ function deriveMissing(findingsA, findingsB) {
|
|
|
67
67
|
export async function diffPages(input) {
|
|
68
68
|
// Run both audits in parallel
|
|
69
69
|
const [resultA, resultB] = await Promise.all([
|
|
70
|
-
auditPage({ url: input.url_a, include_raw_html: false, generate_report: false, respect_robots: input.respect_robots }),
|
|
71
|
-
auditPage({ url: input.url_b, include_raw_html: false, generate_report: false, respect_robots: input.respect_robots }),
|
|
70
|
+
auditPage({ url: input.url_a, include_raw_html: false, generate_report: false, respect_robots: input.respect_robots, render: "static" }),
|
|
71
|
+
auditPage({ url: input.url_b, include_raw_html: false, generate_report: false, respect_robots: input.respect_robots, render: "static" }),
|
|
72
72
|
]);
|
|
73
73
|
const dimA = resultA.dimension_scores;
|
|
74
74
|
const dimB = resultB.dimension_scores;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff-pages.js","sourceRoot":"","sources":["../../src/tools/diff-pages.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"diff-pages.js","sourceRoot":"","sources":["../../src/tools/diff-pages.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,25 +2,31 @@ import { z } from "zod";
|
|
|
2
2
|
import { type HostDelayMap } from "../lib/fetch.js";
|
|
3
3
|
import { type ExtractedEntity } from "../lib/entities.js";
|
|
4
4
|
import type { Finding } from "../types.js";
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
5
6
|
export declare const extractEntitiesInputSchema: z.ZodEffects<z.ZodObject<{
|
|
6
7
|
url: z.ZodOptional<z.ZodString>;
|
|
7
8
|
text: z.ZodOptional<z.ZodString>;
|
|
8
9
|
respect_robots: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
10
|
+
render: z.ZodDefault<z.ZodOptional<z.ZodEnum<["static", "headless"]>>>;
|
|
9
11
|
}, "strip", z.ZodTypeAny, {
|
|
10
12
|
respect_robots: boolean;
|
|
13
|
+
render: "static" | "headless";
|
|
11
14
|
url?: string | undefined;
|
|
12
15
|
text?: string | undefined;
|
|
13
16
|
}, {
|
|
14
17
|
url?: string | undefined;
|
|
15
18
|
respect_robots?: boolean | undefined;
|
|
19
|
+
render?: "static" | "headless" | undefined;
|
|
16
20
|
text?: string | undefined;
|
|
17
21
|
}>, {
|
|
18
22
|
respect_robots: boolean;
|
|
23
|
+
render: "static" | "headless";
|
|
19
24
|
url?: string | undefined;
|
|
20
25
|
text?: string | undefined;
|
|
21
26
|
}, {
|
|
22
27
|
url?: string | undefined;
|
|
23
28
|
respect_robots?: boolean | undefined;
|
|
29
|
+
render?: "static" | "headless" | undefined;
|
|
24
30
|
text?: string | undefined;
|
|
25
31
|
}>;
|
|
26
32
|
export type ExtractEntitiesInput = z.infer<typeof extractEntitiesInputSchema>;
|
|
@@ -30,6 +36,7 @@ export interface ExtractEntitiesResult {
|
|
|
30
36
|
connected_entity_count: number;
|
|
31
37
|
citation_density_score: number;
|
|
32
38
|
findings: Finding[];
|
|
39
|
+
mode: "sampling" | "regex_fallback";
|
|
33
40
|
}
|
|
34
|
-
export declare function extractEntities(input: ExtractEntitiesInput, hostDelays?: HostDelayMap, robotsCache?: Map<string, string
|
|
41
|
+
export declare function extractEntities(input: ExtractEntitiesInput, hostDelays?: HostDelayMap, robotsCache?: Map<string, string>, server?: McpServer): Promise<ExtractEntitiesResult>;
|
|
35
42
|
//# sourceMappingURL=extract-entities.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-entities.d.ts","sourceRoot":"","sources":["../../src/tools/extract-entities.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"extract-entities.d.ts","sourceRoot":"","sources":["../../src/tools/extract-entities.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAIjE,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;EASnC,CAAC;AAEL,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAAC;CACrC;AA2ED,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,EAC3B,UAAU,CAAC,EAAE,YAAY,EACzB,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAoGhC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Tool: extract_entities
|
|
2
2
|
// Extracts named entities, linked concepts, and sameAs graph nodes from page content.
|
|
3
|
+
// Primary path: MCP sampling (host LLM does NER). Fallback: regex heuristic.
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
import { politeFetch } from "../lib/fetch.js";
|
|
5
6
|
import { parseBody } from "../lib/html.js";
|
|
@@ -10,30 +11,135 @@ export const extractEntitiesInputSchema = z
|
|
|
10
11
|
url: z.string().url().optional(),
|
|
11
12
|
text: z.string().optional(),
|
|
12
13
|
respect_robots: z.boolean().optional().default(true),
|
|
14
|
+
render: z.enum(["static", "headless"]).optional().default("static"),
|
|
13
15
|
})
|
|
14
16
|
.refine((d) => d.url !== undefined || d.text !== undefined, {
|
|
15
17
|
message: "One of url or text is required",
|
|
16
18
|
});
|
|
17
|
-
|
|
19
|
+
const SAMPLING_SYSTEM_PROMPT = `You are an entity extractor for AI-citation optimization. Identify named entities (organizations, people, products, technologies, locations) in the provided content.
|
|
20
|
+
|
|
21
|
+
For each entity:
|
|
22
|
+
- "name": the canonical entity name as it appears
|
|
23
|
+
- "type": one of "Organization", "Person", "Product", "Technology", "Location", "Event", "Other"
|
|
24
|
+
- "same_as": array of URLs found in the page that authoritatively identify this entity (Wikipedia, Wikidata, LinkedIn, official brand site, etc.). Empty array if none found in the provided URL list.
|
|
25
|
+
|
|
26
|
+
Skip generic terms, common words, and section headings. Cap at ~50 entities.
|
|
27
|
+
|
|
28
|
+
Return JSON only, no prose. Shape: { "entities": [{ "name": "...", "type": "...", "same_as": ["..."] }] }`;
|
|
29
|
+
async function trySampling(bodyText, externalLinks, server) {
|
|
30
|
+
const userMessage = `Page content (first 8000 chars):
|
|
31
|
+
---
|
|
32
|
+
${bodyText.substring(0, 8000)}
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
External links found on the page (use these to populate same_as where they authoritatively identify an entity):
|
|
36
|
+
${externalLinks.slice(0, 40).map((l) => `- ${l}`).join("\n") || "(none)"}
|
|
37
|
+
|
|
38
|
+
Extract entities and return JSON.`;
|
|
39
|
+
try {
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
41
|
+
// @ts-ignore - sampling API availability varies by client; not typed in all SDK versions
|
|
42
|
+
const samplingResult = await server.server.request({
|
|
43
|
+
method: "sampling/createMessage",
|
|
44
|
+
params: {
|
|
45
|
+
messages: [{ role: "user", content: { type: "text", text: userMessage } }],
|
|
46
|
+
systemPrompt: SAMPLING_SYSTEM_PROMPT,
|
|
47
|
+
maxTokens: 2048,
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
51
|
+
{});
|
|
52
|
+
const text = samplingResult?.content?.text ?? samplingResult?.content?.[0]?.text ?? "";
|
|
53
|
+
if (!text)
|
|
54
|
+
return null;
|
|
55
|
+
const jsonMatch = text.match(/```json\n([\s\S]+?)\n```/) ?? text.match(/\{[\s\S]+\}/);
|
|
56
|
+
const jsonStr = jsonMatch ? (jsonMatch[1] ?? jsonMatch[0]) : text;
|
|
57
|
+
const parsed = JSON.parse(jsonStr);
|
|
58
|
+
if (!parsed.entities || !Array.isArray(parsed.entities))
|
|
59
|
+
return null;
|
|
60
|
+
return parsed.entities;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function countOccurrences(text, term) {
|
|
67
|
+
if (!term)
|
|
68
|
+
return 0;
|
|
69
|
+
const lower = text.toLowerCase();
|
|
70
|
+
const termLower = term.toLowerCase();
|
|
71
|
+
let count = 0;
|
|
72
|
+
let idx = 0;
|
|
73
|
+
while ((idx = lower.indexOf(termLower, idx)) !== -1) {
|
|
74
|
+
count++;
|
|
75
|
+
idx += termLower.length;
|
|
76
|
+
}
|
|
77
|
+
return count;
|
|
78
|
+
}
|
|
79
|
+
export async function extractEntities(input, hostDelays, robotsCache, server) {
|
|
18
80
|
const findings = [];
|
|
19
81
|
let bodyText = "";
|
|
20
82
|
let jsonLdBlocks = [];
|
|
83
|
+
let externalLinks = [];
|
|
21
84
|
if (input.url) {
|
|
22
85
|
const result = await politeFetch(input.url, {
|
|
23
86
|
respectRobots: input.respect_robots,
|
|
24
87
|
hostDelays,
|
|
25
88
|
robotsCache,
|
|
89
|
+
renderMode: input.render,
|
|
26
90
|
});
|
|
27
91
|
const pageData = parseBody(result.body, input.url);
|
|
28
92
|
bodyText = pageData.bodyText;
|
|
93
|
+
externalLinks = pageData.externalLinks ?? [];
|
|
29
94
|
jsonLdBlocks = parseJsonLd(result.body);
|
|
30
95
|
}
|
|
31
96
|
else {
|
|
32
97
|
bodyText = input.text;
|
|
33
98
|
}
|
|
34
99
|
const jsonLdEntities = extractJsonLdEntities(jsonLdBlocks);
|
|
35
|
-
|
|
36
|
-
|
|
100
|
+
// Primary path: MCP sampling.
|
|
101
|
+
let mode = "regex_fallback";
|
|
102
|
+
let entities = [];
|
|
103
|
+
if (server) {
|
|
104
|
+
const sampled = await trySampling(bodyText, externalLinks, server);
|
|
105
|
+
if (sampled && sampled.length > 0) {
|
|
106
|
+
mode = "sampling";
|
|
107
|
+
const sampledEntities = sampled.map((e) => ({
|
|
108
|
+
name: e.name,
|
|
109
|
+
type: e.type ?? null,
|
|
110
|
+
same_as: Array.isArray(e.same_as) ? e.same_as.filter((s) => typeof s === "string") : [],
|
|
111
|
+
mention_count: countOccurrences(bodyText, e.name),
|
|
112
|
+
is_defined: false,
|
|
113
|
+
}));
|
|
114
|
+
// Merge with JSON-LD entities (JSON-LD wins on dup name, lowercase keyed).
|
|
115
|
+
const byName = new Map();
|
|
116
|
+
for (const e of sampledEntities)
|
|
117
|
+
byName.set(e.name.toLowerCase(), e);
|
|
118
|
+
for (const e of jsonLdEntities) {
|
|
119
|
+
const key = e.name.toLowerCase();
|
|
120
|
+
const existing = byName.get(key);
|
|
121
|
+
const count = countOccurrences(bodyText, e.name);
|
|
122
|
+
if (existing) {
|
|
123
|
+
// JSON-LD's sameAs wins; merge with sampled name/type.
|
|
124
|
+
byName.set(key, {
|
|
125
|
+
...existing,
|
|
126
|
+
same_as: e.same_as.length > 0 ? e.same_as : existing.same_as,
|
|
127
|
+
type: e.type ?? existing.type,
|
|
128
|
+
mention_count: count || existing.mention_count,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
byName.set(key, { ...e, mention_count: count });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
entities = Array.from(byName.values()).sort((a, b) => b.mention_count - a.mention_count);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Fallback: regex extractor.
|
|
139
|
+
if (mode === "regex_fallback") {
|
|
140
|
+
const textEntities = extractTextEntities(bodyText);
|
|
141
|
+
entities = mergeEntities(jsonLdEntities, textEntities, bodyText);
|
|
142
|
+
}
|
|
37
143
|
const entity_count = entities.length;
|
|
38
144
|
const connected_entity_count = entities.filter((e) => e.same_as.length > 0).length;
|
|
39
145
|
// Threshold: 15 connected entities = score of 100
|
|
@@ -64,6 +170,7 @@ export async function extractEntities(input, hostDelays, robotsCache) {
|
|
|
64
170
|
connected_entity_count,
|
|
65
171
|
citation_density_score,
|
|
66
172
|
findings,
|
|
173
|
+
mode,
|
|
67
174
|
};
|
|
68
175
|
}
|
|
69
176
|
//# sourceMappingURL=extract-entities.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-entities.js","sourceRoot":"","sources":["../../src/tools/extract-entities.ts"],"names":[],"mappings":"AAAA,yBAAyB;AACzB,sFAAsF;
|
|
1
|
+
{"version":3,"file":"extract-entities.js","sourceRoot":"","sources":["../../src/tools/extract-entities.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,20 +17,20 @@ export const rewriteForAeoInputSchema = z
|
|
|
17
17
|
.refine((d) => d.url !== undefined || d.text !== undefined, {
|
|
18
18
|
message: "One of url or text is required",
|
|
19
19
|
});
|
|
20
|
-
const AEO_SYSTEM_PROMPT = `You are an Answer Engine Optimization (AEO) specialist. Rewrite the provided content to maximize AI engine citation probability.
|
|
21
|
-
|
|
22
|
-
Rules:
|
|
23
|
-
1. Open with a direct 40-60 word answer to the target query (BLUF - Bottom Line Up Front).
|
|
24
|
-
2. Structure body content into FAQ format: H3 questions ending in "?" followed by 40-60 word answers.
|
|
25
|
-
3. Include at least one ordered list for procedural content.
|
|
26
|
-
4. Define key technical terms inline (e.g., "X is a type of Y that...").
|
|
27
|
-
5. Cite statistics with year and source where present.
|
|
28
|
-
6. End with a "Key Takeaways" or "Summary" section.
|
|
29
|
-
7. No em-dashes. No filler phrases ("In conclusion", "It is important to note").
|
|
30
|
-
8. Keep within the max_words limit.
|
|
31
|
-
9. For howto format: use numbered HowToStep structure.
|
|
32
|
-
10. For comparison format: include a comparison table.
|
|
33
|
-
|
|
20
|
+
const AEO_SYSTEM_PROMPT = `You are an Answer Engine Optimization (AEO) specialist. Rewrite the provided content to maximize AI engine citation probability.
|
|
21
|
+
|
|
22
|
+
Rules:
|
|
23
|
+
1. Open with a direct 40-60 word answer to the target query (BLUF - Bottom Line Up Front).
|
|
24
|
+
2. Structure body content into FAQ format: H3 questions ending in "?" followed by 40-60 word answers.
|
|
25
|
+
3. Include at least one ordered list for procedural content.
|
|
26
|
+
4. Define key technical terms inline (e.g., "X is a type of Y that...").
|
|
27
|
+
5. Cite statistics with year and source where present.
|
|
28
|
+
6. End with a "Key Takeaways" or "Summary" section.
|
|
29
|
+
7. No em-dashes. No filler phrases ("In conclusion", "It is important to note").
|
|
30
|
+
8. Keep within the max_words limit.
|
|
31
|
+
9. For howto format: use numbered HowToStep structure.
|
|
32
|
+
10. For comparison format: include a comparison table.
|
|
33
|
+
|
|
34
34
|
Also generate a JSON-LD schema block appropriate for the content type and format.`;
|
|
35
35
|
export async function rewriteForAeo(input, hostDelays, robotsCache, server) {
|
|
36
36
|
// Fetch URL if provided
|
|
@@ -47,18 +47,18 @@ export async function rewriteForAeo(input, hostDelays, robotsCache, server) {
|
|
|
47
47
|
// Compute before score
|
|
48
48
|
const beforeResult = await scoreCitationWorthiness({ text: originalText, target_query: input.target_query, respect_robots: false }, hostDelays, robotsCache);
|
|
49
49
|
const before_score = beforeResult.overall_score;
|
|
50
|
-
const userMessage = `Target query: "${input.target_query}"
|
|
51
|
-
Format: ${input.format}
|
|
52
|
-
Max words: ${input.max_words}
|
|
53
|
-
|
|
54
|
-
Original content:
|
|
55
|
-
---
|
|
56
|
-
${originalText.substring(0, 4000)}
|
|
57
|
-
---
|
|
58
|
-
|
|
59
|
-
Rewrite this content for AEO. Return your response as JSON with these fields:
|
|
60
|
-
- rewritten_text: the rewritten content (Markdown)
|
|
61
|
-
- schema_additions: JSON-LD string to add to the page <head>
|
|
50
|
+
const userMessage = `Target query: "${input.target_query}"
|
|
51
|
+
Format: ${input.format}
|
|
52
|
+
Max words: ${input.max_words}
|
|
53
|
+
|
|
54
|
+
Original content:
|
|
55
|
+
---
|
|
56
|
+
${originalText.substring(0, 4000)}
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
Rewrite this content for AEO. Return your response as JSON with these fields:
|
|
60
|
+
- rewritten_text: the rewritten content (Markdown)
|
|
61
|
+
- schema_additions: JSON-LD string to add to the page <head>
|
|
62
62
|
- changes_made: array of strings describing each change applied`;
|
|
63
63
|
// Attempt MCP sampling
|
|
64
64
|
if (server) {
|
|
@@ -102,8 +102,8 @@ Rewrite this content for AEO. Return your response as JSON with these fields:
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
// Prompt template fallback
|
|
105
|
-
const promptTemplate = `${AEO_SYSTEM_PROMPT}
|
|
106
|
-
|
|
105
|
+
const promptTemplate = `${AEO_SYSTEM_PROMPT}
|
|
106
|
+
|
|
107
107
|
${userMessage}`;
|
|
108
108
|
return {
|
|
109
109
|
rewritten_text: promptTemplate,
|
|
@@ -16,19 +16,19 @@ export const rewriteForGeoInputSchema = z
|
|
|
16
16
|
.refine((d) => d.url !== undefined || d.text !== undefined, {
|
|
17
17
|
message: "One of url or text is required",
|
|
18
18
|
});
|
|
19
|
-
const GEO_SYSTEM_PROMPT = `You are a Generative Engine Optimization (GEO) specialist focused on Google AI Overviews and multi-source synthesis engines.
|
|
20
|
-
|
|
21
|
-
Rules:
|
|
22
|
-
1. Define every key entity inline on first mention: "X (also known as Y) is a type of Z that...".
|
|
23
|
-
2. Include authoritative external citations with hyperlinks (Wikipedia, official docs, research papers).
|
|
24
|
-
3. Add a comparison table if requested or if the query implies comparison.
|
|
25
|
-
4. Use numbered feature lists for technical capabilities.
|
|
26
|
-
5. Structure for multi-source synthesis: each section should be independently citable without reading the full article.
|
|
27
|
-
6. Cite statistics with source, year, and context.
|
|
28
|
-
7. Add a "Related entities" section at the end listing key entities with sameAs links.
|
|
29
|
-
8. No em-dashes. No filler phrases.
|
|
30
|
-
9. Keep within the max_words limit.
|
|
31
|
-
|
|
19
|
+
const GEO_SYSTEM_PROMPT = `You are a Generative Engine Optimization (GEO) specialist focused on Google AI Overviews and multi-source synthesis engines.
|
|
20
|
+
|
|
21
|
+
Rules:
|
|
22
|
+
1. Define every key entity inline on first mention: "X (also known as Y) is a type of Z that...".
|
|
23
|
+
2. Include authoritative external citations with hyperlinks (Wikipedia, official docs, research papers).
|
|
24
|
+
3. Add a comparison table if requested or if the query implies comparison.
|
|
25
|
+
4. Use numbered feature lists for technical capabilities.
|
|
26
|
+
5. Structure for multi-source synthesis: each section should be independently citable without reading the full article.
|
|
27
|
+
6. Cite statistics with source, year, and context.
|
|
28
|
+
7. Add a "Related entities" section at the end listing key entities with sameAs links.
|
|
29
|
+
8. No em-dashes. No filler phrases.
|
|
30
|
+
9. Keep within the max_words limit.
|
|
31
|
+
|
|
32
32
|
Generate JSON-LD schema for all key entities mentioned (Organization, Person, Product, SoftwareApplication as appropriate) with sameAs links.`;
|
|
33
33
|
export async function rewriteForGeo(input, hostDelays, robotsCache, server) {
|
|
34
34
|
let originalText = input.text ?? "";
|
|
@@ -43,19 +43,19 @@ export async function rewriteForGeo(input, hostDelays, robotsCache, server) {
|
|
|
43
43
|
}
|
|
44
44
|
const beforeResult = await scoreCitationWorthiness({ text: originalText, target_query: input.target_query, respect_robots: false }, hostDelays, robotsCache);
|
|
45
45
|
const before_score = beforeResult.overall_score;
|
|
46
|
-
const userMessage = `Target query: "${input.target_query}"
|
|
47
|
-
Add comparison table: ${input.add_comparison_table}
|
|
48
|
-
Max words: ${input.max_words}
|
|
49
|
-
|
|
50
|
-
Original content:
|
|
51
|
-
---
|
|
52
|
-
${originalText.substring(0, 4000)}
|
|
53
|
-
---
|
|
54
|
-
|
|
55
|
-
Rewrite this content for GEO. Return JSON with:
|
|
56
|
-
- rewritten_text: Markdown content
|
|
57
|
-
- schema_additions: JSON-LD for key entities
|
|
58
|
-
- changes_made: array of changes applied
|
|
46
|
+
const userMessage = `Target query: "${input.target_query}"
|
|
47
|
+
Add comparison table: ${input.add_comparison_table}
|
|
48
|
+
Max words: ${input.max_words}
|
|
49
|
+
|
|
50
|
+
Original content:
|
|
51
|
+
---
|
|
52
|
+
${originalText.substring(0, 4000)}
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
Rewrite this content for GEO. Return JSON with:
|
|
56
|
+
- rewritten_text: Markdown content
|
|
57
|
+
- schema_additions: JSON-LD for key entities
|
|
58
|
+
- changes_made: array of changes applied
|
|
59
59
|
- entities_added: array of entity names you defined or linked`;
|
|
60
60
|
if (server) {
|
|
61
61
|
try {
|
|
@@ -97,8 +97,8 @@ Rewrite this content for GEO. Return JSON with:
|
|
|
97
97
|
// sampling unavailable
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
|
-
const promptTemplate = `${GEO_SYSTEM_PROMPT}
|
|
101
|
-
|
|
100
|
+
const promptTemplate = `${GEO_SYSTEM_PROMPT}
|
|
101
|
+
|
|
102
102
|
${userMessage}`;
|
|
103
103
|
return {
|
|
104
104
|
rewritten_text: promptTemplate,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export declare const saveAuditReportInputSchema: z.ZodObject<{
|
|
3
|
+
audit_result: z.ZodUnknown;
|
|
4
|
+
path: z.ZodString;
|
|
5
|
+
overwrite: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
6
|
+
}, "strip", z.ZodTypeAny, {
|
|
7
|
+
path: string;
|
|
8
|
+
overwrite: boolean;
|
|
9
|
+
audit_result?: unknown;
|
|
10
|
+
}, {
|
|
11
|
+
path: string;
|
|
12
|
+
audit_result?: unknown;
|
|
13
|
+
overwrite?: boolean | undefined;
|
|
14
|
+
}>;
|
|
15
|
+
export type SaveAuditReportInput = z.infer<typeof saveAuditReportInputSchema>;
|
|
16
|
+
export interface SaveAuditReportResult {
|
|
17
|
+
saved_to: string;
|
|
18
|
+
bytes_written: number;
|
|
19
|
+
format: "audit_page" | "audit_site";
|
|
20
|
+
}
|
|
21
|
+
export declare function saveAuditReport(input: SaveAuditReportInput): Promise<SaveAuditReportResult>;
|
|
22
|
+
//# sourceMappingURL=save-audit-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"save-audit-report.d.ts","sourceRoot":"","sources":["../../src/tools/save-audit-report.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAOxB,eAAO,MAAM,0BAA0B;;;;;;;;;;;;EAIrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,GAAG,YAAY,CAAC;CACrC;AA8GD,wBAAsB,eAAe,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAyBjG"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
// Tool: save_audit_report
|
|
2
|
+
// Render an audit_page / audit_site result as Markdown and write to a workspace file.
|
|
3
|
+
// Restricted to the directory tree under MCP_WORKSPACE_ROOT (or cwd if unset).
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { writeFile, mkdir } from "node:fs/promises";
|
|
6
|
+
import { dirname, isAbsolute, resolve, sep, relative } from "node:path";
|
|
7
|
+
export const saveAuditReportInputSchema = z.object({
|
|
8
|
+
audit_result: z.unknown().describe("The return value of audit_page or audit_site"),
|
|
9
|
+
path: z.string().min(1).describe("Target file path. May be relative to MCP_WORKSPACE_ROOT (or cwd)."),
|
|
10
|
+
overwrite: z.boolean().optional().default(true),
|
|
11
|
+
});
|
|
12
|
+
function severityEmoji(s) {
|
|
13
|
+
return s === "critical" ? "🔴" : s === "warning" ? "🟡" : "🔵";
|
|
14
|
+
}
|
|
15
|
+
function findingsToTable(findings) {
|
|
16
|
+
if (findings.length === 0)
|
|
17
|
+
return "_No findings._\n";
|
|
18
|
+
const rows = findings.map((f) => {
|
|
19
|
+
const impact = f.estimated_impact ? ` (impact: ${f.estimated_impact})` : "";
|
|
20
|
+
return `### ${severityEmoji(f.severity)} ${f.category} — ${f.message}\n\n` +
|
|
21
|
+
`**Where:** \`${f.where}\`${impact}\n\n` +
|
|
22
|
+
`**Fix:** ${f.fix}\n`;
|
|
23
|
+
});
|
|
24
|
+
return rows.join("\n");
|
|
25
|
+
}
|
|
26
|
+
function citationVerdict(grade) {
|
|
27
|
+
switch (grade) {
|
|
28
|
+
case "A": return "🟢 Highly citation-ready. AI assistants are likely to surface this page.";
|
|
29
|
+
case "B": return "🟢 Citation-ready with minor gaps. A few fixes will lift you into top-tier.";
|
|
30
|
+
case "C": return "🟡 Mixed signals. Several structural / authority issues are likely blocking citations.";
|
|
31
|
+
case "D": return "🟠 Low citation readiness. Multiple critical issues must be addressed.";
|
|
32
|
+
case "F": return "🔴 Not citation-ready. AI engines are likely skipping this page.";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function dimensionTable(scores) {
|
|
36
|
+
const rows = ["| Dimension | Score |", "|---|---|"];
|
|
37
|
+
for (const [k, v] of Object.entries(scores)) {
|
|
38
|
+
rows.push(`| ${k} | ${v}/100 |`);
|
|
39
|
+
}
|
|
40
|
+
return rows.join("\n");
|
|
41
|
+
}
|
|
42
|
+
function isAuditPage(x) {
|
|
43
|
+
return !!x && typeof x === "object" && "dimension_scores" in x && "grade" in x && "findings" in x;
|
|
44
|
+
}
|
|
45
|
+
function isAuditSite(x) {
|
|
46
|
+
return !!x && typeof x === "object" && "top_5_fixes" in x && "overall_grade" in x && "parts" in x;
|
|
47
|
+
}
|
|
48
|
+
function renderAuditPage(r) {
|
|
49
|
+
const sorted = [...r.findings].sort((a, b) => {
|
|
50
|
+
const rank = (s) => (s === "critical" ? 0 : s === "warning" ? 1 : 2);
|
|
51
|
+
return rank(a.severity) - rank(b.severity);
|
|
52
|
+
});
|
|
53
|
+
return [
|
|
54
|
+
`# AI-SEO audit: ${r.url}`,
|
|
55
|
+
``,
|
|
56
|
+
`> ${citationVerdict(r.grade)}`,
|
|
57
|
+
``,
|
|
58
|
+
`**Score:** ${r.score}/100 (grade ${r.grade})`,
|
|
59
|
+
`**Fetched:** ${r.fetched_at}`,
|
|
60
|
+
`**Content quality:** \`${r.content_quality}\``,
|
|
61
|
+
``,
|
|
62
|
+
`## Dimension scores`,
|
|
63
|
+
``,
|
|
64
|
+
dimensionTable(r.dimension_scores),
|
|
65
|
+
``,
|
|
66
|
+
`## Findings (${r.findings.length})`,
|
|
67
|
+
``,
|
|
68
|
+
findingsToTable(sorted),
|
|
69
|
+
``,
|
|
70
|
+
`---`,
|
|
71
|
+
``,
|
|
72
|
+
`_Generated by [@automatelab/ai-seo-mcp](https://github.com/AutomateLab-tech/ai-seo)._`,
|
|
73
|
+
``,
|
|
74
|
+
].join("\n");
|
|
75
|
+
}
|
|
76
|
+
function renderAuditSite(r) {
|
|
77
|
+
return [
|
|
78
|
+
`# AI-SEO site audit: ${r.domain}`,
|
|
79
|
+
``,
|
|
80
|
+
`**Overall score:** ${r.overall_score}/100 (grade ${r.overall_grade})`,
|
|
81
|
+
`**Homepage:** ${r.homepage_url}`,
|
|
82
|
+
`**Fetched:** ${r.fetched_at}`,
|
|
83
|
+
``,
|
|
84
|
+
`## Top 5 fixes`,
|
|
85
|
+
``,
|
|
86
|
+
findingsToTable(r.top_5_fixes),
|
|
87
|
+
``,
|
|
88
|
+
`## Components`,
|
|
89
|
+
``,
|
|
90
|
+
`- \`audit_page\`: ${"error" in r.parts.audit_page ? `❌ ${r.parts.audit_page.error}` : `${r.parts.audit_page.score}/100`}`,
|
|
91
|
+
`- \`check_robots\`: ${"error" in r.parts.check_robots ? `❌ ${r.parts.check_robots.error}` : r.parts.check_robots.recommended_posture}`,
|
|
92
|
+
`- \`check_sitemap\`: ${"error" in r.parts.check_sitemap ? `❌ ${r.parts.check_sitemap.error}` : r.parts.check_sitemap.status}`,
|
|
93
|
+
`- \`audit_schema\`: ${"error" in r.parts.audit_schema ? `❌ ${r.parts.audit_schema.error}` : `${r.parts.audit_schema.ai_citation_readiness_score}/100`}`,
|
|
94
|
+
``,
|
|
95
|
+
`---`,
|
|
96
|
+
``,
|
|
97
|
+
`_Generated by [@automatelab/ai-seo-mcp](https://github.com/AutomateLab-tech/ai-seo)._`,
|
|
98
|
+
``,
|
|
99
|
+
].join("\n");
|
|
100
|
+
}
|
|
101
|
+
function resolveSafePath(target) {
|
|
102
|
+
const workspaceRoot = resolve(process.env["MCP_WORKSPACE_ROOT"] ?? process.cwd());
|
|
103
|
+
const absolute = isAbsolute(target) ? resolve(target) : resolve(workspaceRoot, target);
|
|
104
|
+
const rel = relative(workspaceRoot, absolute);
|
|
105
|
+
if (rel.startsWith("..") || rel.includes(`..${sep}`) || isAbsolute(rel)) {
|
|
106
|
+
throw new Error(`path "${target}" escapes MCP_WORKSPACE_ROOT (${workspaceRoot}). Set MCP_WORKSPACE_ROOT or pass a path inside it.`);
|
|
107
|
+
}
|
|
108
|
+
return absolute;
|
|
109
|
+
}
|
|
110
|
+
export async function saveAuditReport(input) {
|
|
111
|
+
let markdown;
|
|
112
|
+
let format;
|
|
113
|
+
if (isAuditSite(input.audit_result)) {
|
|
114
|
+
markdown = renderAuditSite(input.audit_result);
|
|
115
|
+
format = "audit_site";
|
|
116
|
+
}
|
|
117
|
+
else if (isAuditPage(input.audit_result)) {
|
|
118
|
+
markdown = renderAuditPage(input.audit_result);
|
|
119
|
+
format = "audit_page";
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
throw new Error("audit_result does not look like an audit_page or audit_site output (missing expected fields).");
|
|
123
|
+
}
|
|
124
|
+
const absolute = resolveSafePath(input.path);
|
|
125
|
+
await mkdir(dirname(absolute), { recursive: true });
|
|
126
|
+
await writeFile(absolute, markdown, { encoding: "utf8", flag: input.overwrite ? "w" : "wx" });
|
|
127
|
+
return {
|
|
128
|
+
saved_to: absolute,
|
|
129
|
+
bytes_written: Buffer.byteLength(markdown, "utf8"),
|
|
130
|
+
format,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=save-audit-report.js.map
|