@canonry/canonry 4.154.1 → 4.156.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/assets/agent-workspace/AGENTS.md +2 -2
- package/assets/agent-workspace/skills/aero/references/orchestration.md +3 -3
- package/assets/agent-workspace/skills/canonry/SKILL.md +2 -2
- package/assets/agent-workspace/skills/canonry/references/canonry-cli.md +27 -7
- package/assets/assets/{AuditHistoryPanel-WKf-vvmg.js → AuditHistoryPanel-gmJMVlXX.js} +1 -1
- package/assets/assets/{BacklinksPage-By06DbHN.js → BacklinksPage-Bv2sTCyN.js} +1 -1
- package/assets/assets/{HistoryPage-C_PcPiyX.js → HistoryPage-13q7GkiI.js} +1 -1
- package/assets/assets/{MeasurementPropertyPage-BHnNegEa.js → MeasurementPropertyPage-BgBqXT1p.js} +1 -1
- package/assets/assets/ProjectPage-EsGwKhot.js +15 -0
- package/assets/assets/{RunRow-9qn5Eer_.js → RunRow-bPzapIGJ.js} +1 -1
- package/assets/assets/{RunsPage-FxMTprK1.js → RunsPage-Dqfz18lH.js} +1 -1
- package/assets/assets/{SettingsPage-Cr7_PrNW.js → SettingsPage-_wMecn-V.js} +1 -1
- package/assets/assets/{TrafficPage-D0qk9uMN.js → TrafficPage-RYBdsOLB.js} +1 -1
- package/assets/assets/{TrafficSourceDetailPage-CXa_3_Gy.js → TrafficSourceDetailPage-DpeMMyKU.js} +1 -1
- package/assets/assets/{extract-error-message-RkTEH1Vb.js → extract-error-message-DUarAlyD.js} +1 -1
- package/assets/assets/index-BxegEwic.css +1 -0
- package/assets/assets/index-DP-fT2uI.js +83 -0
- package/assets/assets/react-sigma_core.esm.min-DnypJl5w.js +312 -0
- package/assets/assets/vendor-lucide-BtYdosYk.js +1 -0
- package/assets/assets/{vendor-markdown-CpDJch4G.js → vendor-markdown-D274_wsI.js} +1 -1
- package/assets/assets/{vendor-radix-DnzzbllM.js → vendor-radix-BxMXSwbC.js} +1 -1
- package/assets/assets/{vendor-recharts-33ACLxsD.js → vendor-recharts-C4ktw_aE.js} +1 -1
- package/assets/assets/{vendor-tanstack-BjS7iY3g.js → vendor-tanstack-pFxw0eGP.js} +1 -1
- package/assets/index.html +7 -7
- package/dist/{chunk-KRMLGFY3.js → chunk-ABNN2ZVR.js} +2438 -114
- package/dist/{chunk-NNW7TJUZ.js → chunk-AMPT2EP7.js} +527 -5
- package/dist/{chunk-ANSQ6JNO.js → chunk-CPASKGUE.js} +563 -4
- package/dist/{chunk-JOP2DGXL.js → chunk-ZWESOFA5.js} +1230 -310
- package/dist/cli.js +742 -8
- package/dist/index.js +4 -4
- package/dist/{intelligence-service-ZY5KOSZV.js → intelligence-service-WHC7B32V.js} +2 -2
- package/dist/mcp.js +4 -4
- package/package.json +13 -11
- package/assets/assets/ProjectPage-VTbW21dz.js +0 -12
- package/assets/assets/index-DyL54s8x.css +0 -1
- package/assets/assets/index-nSWJ9yka.js +0 -83
- package/assets/assets/vendor-lucide-ByU7vBHt.js +0 -1
|
@@ -81,7 +81,7 @@ import {
|
|
|
81
81
|
trafficConnectWordpressRequestSchema,
|
|
82
82
|
trafficEventKindSchema,
|
|
83
83
|
trafficSeriesGranularitySchema
|
|
84
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-AMPT2EP7.js";
|
|
85
85
|
|
|
86
86
|
// src/config.ts
|
|
87
87
|
import fs from "fs";
|
|
@@ -4907,6 +4907,126 @@ var getApiV1ProjectsByNameTechnicalAeoTrend = (options) => {
|
|
|
4907
4907
|
...options
|
|
4908
4908
|
});
|
|
4909
4909
|
};
|
|
4910
|
+
var getApiV1ProjectsByNameTechnicalAeoCrawl = (options) => {
|
|
4911
|
+
return (options.client ?? client).get({
|
|
4912
|
+
security: [
|
|
4913
|
+
{
|
|
4914
|
+
scheme: "bearer",
|
|
4915
|
+
type: "http"
|
|
4916
|
+
}
|
|
4917
|
+
],
|
|
4918
|
+
url: "/api/v1/projects/{name}/technical-aeo/crawl",
|
|
4919
|
+
...options
|
|
4920
|
+
});
|
|
4921
|
+
};
|
|
4922
|
+
var getApiV1ProjectsByNameTechnicalAeoSubgraph = (options) => {
|
|
4923
|
+
return (options.client ?? client).get({
|
|
4924
|
+
security: [
|
|
4925
|
+
{
|
|
4926
|
+
scheme: "bearer",
|
|
4927
|
+
type: "http"
|
|
4928
|
+
}
|
|
4929
|
+
],
|
|
4930
|
+
url: "/api/v1/projects/{name}/technical-aeo/subgraph",
|
|
4931
|
+
...options
|
|
4932
|
+
});
|
|
4933
|
+
};
|
|
4934
|
+
var getApiV1ProjectsByNameTechnicalAeoPath = (options) => {
|
|
4935
|
+
return (options.client ?? client).get({
|
|
4936
|
+
security: [
|
|
4937
|
+
{
|
|
4938
|
+
scheme: "bearer",
|
|
4939
|
+
type: "http"
|
|
4940
|
+
}
|
|
4941
|
+
],
|
|
4942
|
+
url: "/api/v1/projects/{name}/technical-aeo/path",
|
|
4943
|
+
...options
|
|
4944
|
+
});
|
|
4945
|
+
};
|
|
4946
|
+
var getApiV1ProjectsByNameTechnicalAeoChanges = (options) => {
|
|
4947
|
+
return (options.client ?? client).get({
|
|
4948
|
+
security: [
|
|
4949
|
+
{
|
|
4950
|
+
scheme: "bearer",
|
|
4951
|
+
type: "http"
|
|
4952
|
+
}
|
|
4953
|
+
],
|
|
4954
|
+
url: "/api/v1/projects/{name}/technical-aeo/changes",
|
|
4955
|
+
...options
|
|
4956
|
+
});
|
|
4957
|
+
};
|
|
4958
|
+
var getApiV1ProjectsByNameTechnicalAeoCrawlPagesAudit = (options) => {
|
|
4959
|
+
return (options.client ?? client).get({
|
|
4960
|
+
security: [
|
|
4961
|
+
{
|
|
4962
|
+
scheme: "bearer",
|
|
4963
|
+
type: "http"
|
|
4964
|
+
}
|
|
4965
|
+
],
|
|
4966
|
+
url: "/api/v1/projects/{name}/technical-aeo/crawl/pages/audit",
|
|
4967
|
+
...options
|
|
4968
|
+
});
|
|
4969
|
+
};
|
|
4970
|
+
var getApiV1ProjectsByNameTechnicalAeoCrawlPages = (options) => {
|
|
4971
|
+
return (options.client ?? client).get({
|
|
4972
|
+
security: [
|
|
4973
|
+
{
|
|
4974
|
+
scheme: "bearer",
|
|
4975
|
+
type: "http"
|
|
4976
|
+
}
|
|
4977
|
+
],
|
|
4978
|
+
url: "/api/v1/projects/{name}/technical-aeo/crawl/pages",
|
|
4979
|
+
...options
|
|
4980
|
+
});
|
|
4981
|
+
};
|
|
4982
|
+
var getApiV1ProjectsByNameTechnicalAeoStructure = (options) => {
|
|
4983
|
+
return (options.client ?? client).get({
|
|
4984
|
+
security: [
|
|
4985
|
+
{
|
|
4986
|
+
scheme: "bearer",
|
|
4987
|
+
type: "http"
|
|
4988
|
+
}
|
|
4989
|
+
],
|
|
4990
|
+
url: "/api/v1/projects/{name}/technical-aeo/structure",
|
|
4991
|
+
...options
|
|
4992
|
+
});
|
|
4993
|
+
};
|
|
4994
|
+
var getApiV1ProjectsByNameTechnicalAeoInternalLinks = (options) => {
|
|
4995
|
+
return (options.client ?? client).get({
|
|
4996
|
+
security: [
|
|
4997
|
+
{
|
|
4998
|
+
scheme: "bearer",
|
|
4999
|
+
type: "http"
|
|
5000
|
+
}
|
|
5001
|
+
],
|
|
5002
|
+
url: "/api/v1/projects/{name}/technical-aeo/internal-links",
|
|
5003
|
+
...options
|
|
5004
|
+
});
|
|
5005
|
+
};
|
|
5006
|
+
var getApiV1ProjectsByNameTechnicalAeoInternalLinksNeighbors = (options) => {
|
|
5007
|
+
return (options.client ?? client).get({
|
|
5008
|
+
security: [
|
|
5009
|
+
{
|
|
5010
|
+
scheme: "bearer",
|
|
5011
|
+
type: "http"
|
|
5012
|
+
}
|
|
5013
|
+
],
|
|
5014
|
+
url: "/api/v1/projects/{name}/technical-aeo/internal-links/neighbors",
|
|
5015
|
+
...options
|
|
5016
|
+
});
|
|
5017
|
+
};
|
|
5018
|
+
var getApiV1ProjectsByNameTechnicalAeoDeadLinks = (options) => {
|
|
5019
|
+
return (options.client ?? client).get({
|
|
5020
|
+
security: [
|
|
5021
|
+
{
|
|
5022
|
+
scheme: "bearer",
|
|
5023
|
+
type: "http"
|
|
5024
|
+
}
|
|
5025
|
+
],
|
|
5026
|
+
url: "/api/v1/projects/{name}/technical-aeo/dead-links",
|
|
5027
|
+
...options
|
|
5028
|
+
});
|
|
5029
|
+
};
|
|
4910
5030
|
var postApiV1ProjectsByNameTechnicalAeoRuns = (options) => {
|
|
4911
5031
|
return (options.client ?? client).post({
|
|
4912
5032
|
security: [
|
|
@@ -7041,6 +7161,161 @@ var ApiClient = class {
|
|
|
7041
7161
|
})
|
|
7042
7162
|
);
|
|
7043
7163
|
}
|
|
7164
|
+
/** Persisted full-crawl metadata. This never synthesizes a graph from legacy audit rows. */
|
|
7165
|
+
async getTechnicalAeoCrawl(project, opts) {
|
|
7166
|
+
return this.invoke(
|
|
7167
|
+
() => getApiV1ProjectsByNameTechnicalAeoCrawl({
|
|
7168
|
+
client: this.heyClient,
|
|
7169
|
+
path: { name: project },
|
|
7170
|
+
query: { runId: opts?.runId }
|
|
7171
|
+
})
|
|
7172
|
+
);
|
|
7173
|
+
}
|
|
7174
|
+
/** Bounded semantic Site Health neighborhood; this never returns visualization layout. */
|
|
7175
|
+
async getSiteHealthSubgraph(project, opts) {
|
|
7176
|
+
return this.invoke(
|
|
7177
|
+
() => getApiV1ProjectsByNameTechnicalAeoSubgraph({
|
|
7178
|
+
client: this.heyClient,
|
|
7179
|
+
path: { name: project },
|
|
7180
|
+
query: {
|
|
7181
|
+
runId: opts?.runId,
|
|
7182
|
+
nodeKey: opts?.nodeKey,
|
|
7183
|
+
url: opts?.url,
|
|
7184
|
+
hops: opts?.hops,
|
|
7185
|
+
maxNodes: opts?.maxNodes,
|
|
7186
|
+
maxEdges: opts?.maxEdges
|
|
7187
|
+
}
|
|
7188
|
+
})
|
|
7189
|
+
);
|
|
7190
|
+
}
|
|
7191
|
+
/** Directed shortest path over persisted, followable internal links. */
|
|
7192
|
+
async getSiteHealthPath(project, opts) {
|
|
7193
|
+
return this.invoke(
|
|
7194
|
+
() => getApiV1ProjectsByNameTechnicalAeoPath({
|
|
7195
|
+
client: this.heyClient,
|
|
7196
|
+
path: { name: project },
|
|
7197
|
+
query: {
|
|
7198
|
+
runId: opts.runId,
|
|
7199
|
+
fromNodeKey: opts.fromNodeKey,
|
|
7200
|
+
fromUrl: opts.fromUrl,
|
|
7201
|
+
toNodeKey: opts.toNodeKey,
|
|
7202
|
+
toUrl: opts.toUrl,
|
|
7203
|
+
maxDepth: opts.maxDepth
|
|
7204
|
+
}
|
|
7205
|
+
})
|
|
7206
|
+
);
|
|
7207
|
+
}
|
|
7208
|
+
/** Cursor-paged canonical page/link changes between immutable complete crawls. */
|
|
7209
|
+
async getSiteHealthChanges(project, opts) {
|
|
7210
|
+
return this.invoke(
|
|
7211
|
+
() => getApiV1ProjectsByNameTechnicalAeoChanges({
|
|
7212
|
+
client: this.heyClient,
|
|
7213
|
+
path: { name: project },
|
|
7214
|
+
query: {
|
|
7215
|
+
fromRunId: opts?.fromRunId,
|
|
7216
|
+
toRunId: opts?.toRunId,
|
|
7217
|
+
scope: opts?.scope,
|
|
7218
|
+
change: opts?.change,
|
|
7219
|
+
cursor: opts?.cursor,
|
|
7220
|
+
limit: opts?.limit
|
|
7221
|
+
}
|
|
7222
|
+
})
|
|
7223
|
+
);
|
|
7224
|
+
}
|
|
7225
|
+
/** Bounded, cursor-paged crawl nodes. */
|
|
7226
|
+
async getTechnicalAeoCrawlPages(project, opts) {
|
|
7227
|
+
return this.invoke(
|
|
7228
|
+
() => getApiV1ProjectsByNameTechnicalAeoCrawlPages({
|
|
7229
|
+
client: this.heyClient,
|
|
7230
|
+
path: { name: project },
|
|
7231
|
+
query: {
|
|
7232
|
+
runId: opts?.runId,
|
|
7233
|
+
inventoryEligible: opts?.inventoryEligible,
|
|
7234
|
+
fetchState: opts?.fetchState,
|
|
7235
|
+
indexabilityState: opts?.indexabilityState,
|
|
7236
|
+
auditState: opts?.auditState,
|
|
7237
|
+
sort: opts?.sort,
|
|
7238
|
+
cursor: opts?.cursor,
|
|
7239
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7240
|
+
}
|
|
7241
|
+
})
|
|
7242
|
+
);
|
|
7243
|
+
}
|
|
7244
|
+
/** Exact page-scoped audit evidence tied to a persisted crawl node. */
|
|
7245
|
+
async getTechnicalAeoPageAudit(project, opts) {
|
|
7246
|
+
return this.invoke(
|
|
7247
|
+
() => getApiV1ProjectsByNameTechnicalAeoCrawlPagesAudit({
|
|
7248
|
+
client: this.heyClient,
|
|
7249
|
+
path: { name: project },
|
|
7250
|
+
query: {
|
|
7251
|
+
runId: opts.runId,
|
|
7252
|
+
nodeKey: opts.nodeKey,
|
|
7253
|
+
url: opts.url
|
|
7254
|
+
}
|
|
7255
|
+
})
|
|
7256
|
+
);
|
|
7257
|
+
}
|
|
7258
|
+
/** One bounded path level from a persisted crawl. */
|
|
7259
|
+
async getTechnicalAeoStructure(project, opts) {
|
|
7260
|
+
return this.invoke(
|
|
7261
|
+
() => getApiV1ProjectsByNameTechnicalAeoStructure({
|
|
7262
|
+
client: this.heyClient,
|
|
7263
|
+
path: { name: project },
|
|
7264
|
+
query: {
|
|
7265
|
+
runId: opts?.runId,
|
|
7266
|
+
parentPath: opts?.parentPath,
|
|
7267
|
+
cursor: opts?.cursor,
|
|
7268
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7269
|
+
}
|
|
7270
|
+
})
|
|
7271
|
+
);
|
|
7272
|
+
}
|
|
7273
|
+
/** Bounded, cursor-paged internal crawl edges. */
|
|
7274
|
+
async getTechnicalAeoInternalLinks(project, opts) {
|
|
7275
|
+
return this.invoke(
|
|
7276
|
+
() => getApiV1ProjectsByNameTechnicalAeoInternalLinks({
|
|
7277
|
+
client: this.heyClient,
|
|
7278
|
+
path: { name: project },
|
|
7279
|
+
query: {
|
|
7280
|
+
runId: opts?.runId,
|
|
7281
|
+
sourceUrl: opts?.sourceUrl,
|
|
7282
|
+
targetUrl: opts?.targetUrl,
|
|
7283
|
+
followable: opts?.followable,
|
|
7284
|
+
cursor: opts?.cursor,
|
|
7285
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7286
|
+
}
|
|
7287
|
+
})
|
|
7288
|
+
);
|
|
7289
|
+
}
|
|
7290
|
+
/** Bounded inbound/outbound internal edges for one crawl node. */
|
|
7291
|
+
async getTechnicalAeoInternalLinkNeighbors(project, opts) {
|
|
7292
|
+
return this.invoke(
|
|
7293
|
+
() => getApiV1ProjectsByNameTechnicalAeoInternalLinksNeighbors({
|
|
7294
|
+
client: this.heyClient,
|
|
7295
|
+
path: { name: project },
|
|
7296
|
+
query: {
|
|
7297
|
+
runId: opts.runId,
|
|
7298
|
+
nodeKey: opts.nodeKey,
|
|
7299
|
+
url: opts.url,
|
|
7300
|
+
limit: opts.limit !== void 0 ? String(opts.limit) : void 0
|
|
7301
|
+
}
|
|
7302
|
+
})
|
|
7303
|
+
);
|
|
7304
|
+
}
|
|
7305
|
+
/** Dead-link state/findings; `disabled` means the crawl did not opt in. */
|
|
7306
|
+
async getTechnicalAeoDeadLinks(project, opts) {
|
|
7307
|
+
return this.invoke(
|
|
7308
|
+
() => getApiV1ProjectsByNameTechnicalAeoDeadLinks({
|
|
7309
|
+
client: this.heyClient,
|
|
7310
|
+
path: { name: project },
|
|
7311
|
+
query: {
|
|
7312
|
+
runId: opts?.runId,
|
|
7313
|
+
cursor: opts?.cursor,
|
|
7314
|
+
limit: opts?.limit !== void 0 ? String(opts.limit) : void 0
|
|
7315
|
+
}
|
|
7316
|
+
})
|
|
7317
|
+
);
|
|
7318
|
+
}
|
|
7044
7319
|
async triggerSiteAudit(project, body) {
|
|
7045
7320
|
return this.invoke(
|
|
7046
7321
|
() => postApiV1ProjectsByNameTechnicalAeoRuns({
|
|
@@ -8209,10 +8484,114 @@ var technicalAeoTrendInputSchema = z3.object({
|
|
|
8209
8484
|
project: projectNameSchema,
|
|
8210
8485
|
limit: z3.number().int().positive().max(365).optional()
|
|
8211
8486
|
});
|
|
8487
|
+
var technicalAeoCrawlInputSchema = z3.object({
|
|
8488
|
+
project: projectNameSchema,
|
|
8489
|
+
runId: runIdSchema.optional().describe("Historical crawl-bearing site-audit run ID. Omit for the latest persisted crawl.")
|
|
8490
|
+
});
|
|
8491
|
+
var siteHealthPageAuditInputSchema = z3.object({
|
|
8492
|
+
project: projectNameSchema,
|
|
8493
|
+
runId: runIdSchema.optional().describe("Historical crawl-bearing site-audit run ID. Omit for the latest persisted crawl."),
|
|
8494
|
+
nodeKey: z3.string().min(1).optional().describe("Exact crawl node key, as returned by Site Health page or subgraph reads."),
|
|
8495
|
+
url: z3.string().url().optional().describe("Exact page URL. Use this only when a crawl node key is unavailable.")
|
|
8496
|
+
}).refine((value) => Boolean(value.nodeKey || value.url), {
|
|
8497
|
+
message: "Provide nodeKey or url.",
|
|
8498
|
+
path: ["nodeKey"]
|
|
8499
|
+
}).refine((value) => !(value.nodeKey && value.url), {
|
|
8500
|
+
message: "Provide nodeKey or url, not both.",
|
|
8501
|
+
path: ["nodeKey"]
|
|
8502
|
+
});
|
|
8503
|
+
var SITE_HEALTH_MCP_MAX_NODES = 25;
|
|
8504
|
+
var SITE_HEALTH_MCP_MAX_EDGES = 50;
|
|
8505
|
+
var siteHealthSubgraphInputSchema = z3.object({
|
|
8506
|
+
project: projectNameSchema,
|
|
8507
|
+
runId: runIdSchema.optional().describe("Historical crawl-bearing site-audit run ID. Omit for the latest complete crawl."),
|
|
8508
|
+
nodeKey: z3.string().min(1).optional().describe("Focus crawl node key. Omit with url to focus the crawl root."),
|
|
8509
|
+
url: z3.string().url().optional().describe("Focus canonical URL. Omit with nodeKey to focus the crawl root."),
|
|
8510
|
+
hops: z3.number().int().min(0).max(3).optional().describe("Neighborhood depth from the focus node. Keep this small."),
|
|
8511
|
+
maxNodes: z3.number().int().positive().max(SITE_HEALTH_MCP_MAX_NODES).default(SITE_HEALTH_MCP_MAX_NODES).describe("Hard MCP cap: at most 25 nodes. Narrow or refocus instead of loading the site."),
|
|
8512
|
+
maxEdges: z3.number().int().positive().max(SITE_HEALTH_MCP_MAX_EDGES).default(SITE_HEALTH_MCP_MAX_EDGES).describe("Hard MCP cap: at most 50 edges. Narrow or refocus instead of loading the site.")
|
|
8513
|
+
}).refine((value) => !(value.nodeKey && value.url), {
|
|
8514
|
+
message: "Provide nodeKey or url, not both.",
|
|
8515
|
+
path: ["nodeKey"]
|
|
8516
|
+
});
|
|
8517
|
+
var siteHealthPathInputSchema = z3.object({
|
|
8518
|
+
project: projectNameSchema,
|
|
8519
|
+
runId: runIdSchema.optional().describe("Historical crawl-bearing site-audit run ID. Omit for the latest complete crawl."),
|
|
8520
|
+
fromNodeKey: z3.string().min(1).optional().describe("Origin node key. Omit with fromUrl to start at the crawl root."),
|
|
8521
|
+
fromUrl: z3.string().url().optional().describe("Origin URL. Omit with fromNodeKey to start at the crawl root."),
|
|
8522
|
+
toNodeKey: z3.string().min(1).optional().describe("Required destination node key."),
|
|
8523
|
+
toUrl: z3.string().url().optional().describe("Required destination URL."),
|
|
8524
|
+
maxDepth: z3.number().int().positive().max(24).optional().describe("Maximum directed-link depth to search.")
|
|
8525
|
+
}).refine((value) => !(value.fromNodeKey && value.fromUrl), {
|
|
8526
|
+
message: "Provide fromNodeKey or fromUrl, not both.",
|
|
8527
|
+
path: ["fromNodeKey"]
|
|
8528
|
+
}).refine((value) => Boolean(value.toNodeKey || value.toUrl), {
|
|
8529
|
+
message: "Provide toNodeKey or toUrl.",
|
|
8530
|
+
path: ["toNodeKey"]
|
|
8531
|
+
}).refine((value) => !(value.toNodeKey && value.toUrl), {
|
|
8532
|
+
message: "Provide toNodeKey or toUrl, not both.",
|
|
8533
|
+
path: ["toNodeKey"]
|
|
8534
|
+
});
|
|
8535
|
+
var siteHealthChangesInputSchema = z3.object({
|
|
8536
|
+
project: projectNameSchema,
|
|
8537
|
+
fromRunId: runIdSchema.optional().describe("Earlier complete crawl run ID. Omit to compare the previous complete crawl."),
|
|
8538
|
+
toRunId: runIdSchema.optional().describe("Later complete crawl run ID. Omit to compare the latest complete crawl."),
|
|
8539
|
+
scope: z3.enum(["all", "pages", "links"]).optional().describe("Limit the diff to page or link changes. Omit or use all for both."),
|
|
8540
|
+
change: z3.enum(["all", "added", "removed", "changed"]).optional().describe("Limit the diff to one change kind. Omit or use all for every kind."),
|
|
8541
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous Site Health changes result."),
|
|
8542
|
+
limit: z3.number().int().positive().max(25).default(25).describe("Hard MCP cap: 25 records, because each change carries before and after DTOs.")
|
|
8543
|
+
});
|
|
8544
|
+
var technicalAeoCrawlPagesInputSchema = z3.object({
|
|
8545
|
+
project: projectNameSchema,
|
|
8546
|
+
runId: runIdSchema.optional(),
|
|
8547
|
+
inventoryEligible: z3.boolean().optional().describe("Filter Canonry technical-inventory eligibility. This is not actual Google index coverage."),
|
|
8548
|
+
fetchState: z3.string().min(1).optional().describe("Filter crawler fetch state, for example html, redirect, non-html, or fetch-error."),
|
|
8549
|
+
indexabilityState: z3.string().min(1).optional().describe("Filter crawler-derived indexability state. This is not Google index coverage."),
|
|
8550
|
+
auditState: z3.string().min(1).optional().describe("Filter audit state."),
|
|
8551
|
+
sort: z3.enum(["url", "path", "score-asc", "score-desc"]).optional(),
|
|
8552
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous crawl-pages result."),
|
|
8553
|
+
limit: z3.number().int().positive().max(200).optional()
|
|
8554
|
+
});
|
|
8555
|
+
var technicalAeoStructureInputSchema = z3.object({
|
|
8556
|
+
project: projectNameSchema,
|
|
8557
|
+
runId: runIdSchema.optional(),
|
|
8558
|
+
parentPath: z3.string().min(1).optional().describe("Path whose immediate children to list. Defaults to /. This never returns a whole site tree."),
|
|
8559
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous structure result."),
|
|
8560
|
+
limit: z3.number().int().positive().max(100).optional()
|
|
8561
|
+
});
|
|
8562
|
+
var technicalAeoInternalLinksInputSchema = z3.object({
|
|
8563
|
+
project: projectNameSchema,
|
|
8564
|
+
runId: runIdSchema.optional(),
|
|
8565
|
+
sourceUrl: z3.string().url().optional(),
|
|
8566
|
+
targetUrl: z3.string().url().optional(),
|
|
8567
|
+
followable: z3.boolean().optional(),
|
|
8568
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous internal-links result."),
|
|
8569
|
+
limit: z3.number().int().positive().max(200).optional()
|
|
8570
|
+
});
|
|
8571
|
+
var technicalAeoLinkNeighborsInputSchema = z3.object({
|
|
8572
|
+
project: projectNameSchema,
|
|
8573
|
+
runId: runIdSchema.optional(),
|
|
8574
|
+
nodeKey: z3.string().min(1).optional(),
|
|
8575
|
+
url: z3.string().url().optional(),
|
|
8576
|
+
limit: z3.number().int().positive().max(100).optional()
|
|
8577
|
+
}).refine((value) => Boolean(value.nodeKey || value.url), {
|
|
8578
|
+
message: "Provide nodeKey or url.",
|
|
8579
|
+
path: ["nodeKey"]
|
|
8580
|
+
});
|
|
8581
|
+
var technicalAeoDeadLinksInputSchema = z3.object({
|
|
8582
|
+
project: projectNameSchema,
|
|
8583
|
+
runId: runIdSchema.optional(),
|
|
8584
|
+
cursor: z3.string().min(1).optional().describe("Opaque cursor from the previous dead-links result."),
|
|
8585
|
+
limit: z3.number().int().positive().max(200).optional()
|
|
8586
|
+
});
|
|
8212
8587
|
var technicalAeoRunInputSchema = z3.object({
|
|
8213
8588
|
project: projectNameSchema,
|
|
8214
8589
|
sitemapUrl: z3.string().url().optional().describe("Override the sitemap URL. Defaults to https://<canonicalDomain>/sitemap.xml."),
|
|
8215
|
-
limit: z3.number().int().positive().max(2e3).optional().describe("
|
|
8590
|
+
limit: z3.number().int().positive().max(2e3).optional().describe("Deprecated compatibility alias for maxPages."),
|
|
8591
|
+
maxPages: z3.number().int().positive().max(5e4).optional().describe("Maximum pages crawled and audited. Defaults to 1,000; hard maximum 50,000."),
|
|
8592
|
+
maxEdges: z3.number().int().positive().max(1e6).optional().describe("Maximum link observations retained for this crawl. Defaults to 100,000; hard maximum 1,000,000."),
|
|
8593
|
+
maxDepth: z3.number().int().min(0).max(100).optional().describe("Maximum internal-link depth from the root page."),
|
|
8594
|
+
checkDeadLinks: z3.boolean().optional().describe("Opt in to internal dead-link checks. Omitted and false both disable checks.")
|
|
8216
8595
|
});
|
|
8217
8596
|
var AGENT_WEBHOOK_EVENTS = [
|
|
8218
8597
|
notificationEventSchema.enum["run.completed"],
|
|
@@ -10021,6 +10400,86 @@ var canonryMcpTools = [
|
|
|
10021
10400
|
openApiOperations: ["POST /api/v1/projects/{name}/discover/sessions/{id}/promote"],
|
|
10022
10401
|
handler: (client2, input) => client2.promoteDiscovery(input.project, input.sessionId, input.request)
|
|
10023
10402
|
}),
|
|
10403
|
+
defineTool({
|
|
10404
|
+
name: "canonry_site_health_overview",
|
|
10405
|
+
title: "Get Site Health overview",
|
|
10406
|
+
description: "Start a Site Health investigation with the latest or selected scan summary: root URL, completeness, crawl and link counts, budgets, versions, termination, and dead-link check state. Follow with a focused Site Health subgraph, shortest path, or scan changes; never request the interactive graph projection through MCP.",
|
|
10407
|
+
access: "read",
|
|
10408
|
+
tier: "monitoring",
|
|
10409
|
+
inputSchema: technicalAeoCrawlInputSchema,
|
|
10410
|
+
annotations: readAnnotations(),
|
|
10411
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl"],
|
|
10412
|
+
handler: (client2, input) => client2.getTechnicalAeoCrawl(input.project, { runId: input.runId })
|
|
10413
|
+
}),
|
|
10414
|
+
defineTool({
|
|
10415
|
+
name: "canonry_site_health_page_audit",
|
|
10416
|
+
title: "Get Site Health page audit",
|
|
10417
|
+
description: "Connect one graph page's audit score to its exact persisted evidence: factor scores, stable finding codes and messages, recommendations, and critical defects. The response includes crawl provenance and explicit no-crawl, details-unavailable, not-found, not-audited, ready/scores-only states. Use nodeKey from a Site Health page or subgraph read when possible. Link score remains an importance signal, not an audit finding.",
|
|
10418
|
+
access: "read",
|
|
10419
|
+
tier: "monitoring",
|
|
10420
|
+
inputSchema: siteHealthPageAuditInputSchema,
|
|
10421
|
+
annotations: readAnnotations(),
|
|
10422
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl/pages/audit"],
|
|
10423
|
+
handler: (client2, input) => client2.getTechnicalAeoPageAudit(input.project, {
|
|
10424
|
+
runId: input.runId,
|
|
10425
|
+
nodeKey: input.nodeKey,
|
|
10426
|
+
url: input.url
|
|
10427
|
+
})
|
|
10428
|
+
}),
|
|
10429
|
+
defineTool({
|
|
10430
|
+
name: "canonry_site_health_subgraph",
|
|
10431
|
+
title: "Inspect focused Site Health subgraph",
|
|
10432
|
+
description: "Read a compact canonical neighborhood around one page or the crawl root. Defaults to 25 nodes and 50 edges; expand hops or refocus only when needed. `countAccuracy=lower-bound` means traversal reached a cap, and `complete`/`termination` qualify partial-crawl results. This intentionally omits visualization coordinates and never materializes the full site graph.",
|
|
10433
|
+
access: "read",
|
|
10434
|
+
tier: "monitoring",
|
|
10435
|
+
inputSchema: siteHealthSubgraphInputSchema,
|
|
10436
|
+
annotations: readAnnotations(),
|
|
10437
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/subgraph"],
|
|
10438
|
+
handler: (client2, input) => client2.getSiteHealthSubgraph(input.project, {
|
|
10439
|
+
runId: input.runId,
|
|
10440
|
+
nodeKey: input.nodeKey,
|
|
10441
|
+
url: input.url,
|
|
10442
|
+
hops: input.hops,
|
|
10443
|
+
maxNodes: input.maxNodes,
|
|
10444
|
+
maxEdges: input.maxEdges
|
|
10445
|
+
})
|
|
10446
|
+
}),
|
|
10447
|
+
defineTool({
|
|
10448
|
+
name: "canonry_site_health_path",
|
|
10449
|
+
title: "Find shortest Site Health path",
|
|
10450
|
+
description: "Find the shortest directed path of followable internal links from the crawl root or a selected page to one required destination. Use `complete` and `termination` to qualify unreachable or truncated outcomes from a partial crawl; it returns one path, not a graph traversal.",
|
|
10451
|
+
access: "read",
|
|
10452
|
+
tier: "monitoring",
|
|
10453
|
+
inputSchema: siteHealthPathInputSchema,
|
|
10454
|
+
annotations: readAnnotations(),
|
|
10455
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/path"],
|
|
10456
|
+
handler: (client2, input) => client2.getSiteHealthPath(input.project, {
|
|
10457
|
+
runId: input.runId,
|
|
10458
|
+
fromNodeKey: input.fromNodeKey,
|
|
10459
|
+
fromUrl: input.fromUrl,
|
|
10460
|
+
toNodeKey: input.toNodeKey,
|
|
10461
|
+
toUrl: input.toUrl,
|
|
10462
|
+
maxDepth: input.maxDepth
|
|
10463
|
+
})
|
|
10464
|
+
}),
|
|
10465
|
+
defineTool({
|
|
10466
|
+
name: "canonry_site_health_changes",
|
|
10467
|
+
title: "Compare Site Health scans",
|
|
10468
|
+
description: "Compare two immutable complete scans (or the latest pair) for added, removed, and changed canonical pages or links. Results echo resolved filters and scan IDs; the first page has an exact summary, while continuations omit summary/total. MCP pages cap at 25 because every change carries before/after DTOs; filter before paging.",
|
|
10469
|
+
access: "read",
|
|
10470
|
+
tier: "monitoring",
|
|
10471
|
+
inputSchema: siteHealthChangesInputSchema,
|
|
10472
|
+
annotations: readAnnotations(),
|
|
10473
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/changes"],
|
|
10474
|
+
handler: (client2, input) => client2.getSiteHealthChanges(input.project, {
|
|
10475
|
+
fromRunId: input.fromRunId,
|
|
10476
|
+
toRunId: input.toRunId,
|
|
10477
|
+
scope: input.scope,
|
|
10478
|
+
change: input.change,
|
|
10479
|
+
cursor: input.cursor,
|
|
10480
|
+
limit: input.limit
|
|
10481
|
+
})
|
|
10482
|
+
}),
|
|
10024
10483
|
defineTool({
|
|
10025
10484
|
name: "canonry_technical_aeo_score",
|
|
10026
10485
|
title: "Get Technical AEO score",
|
|
@@ -10060,10 +10519,106 @@ var canonryMcpTools = [
|
|
|
10060
10519
|
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/trend"],
|
|
10061
10520
|
handler: (client2, input) => client2.getTechnicalAeoTrend(input.project, input.limit !== void 0 ? { limit: input.limit } : void 0)
|
|
10062
10521
|
}),
|
|
10522
|
+
defineTool({
|
|
10523
|
+
name: "canonry_technical_aeo_crawl",
|
|
10524
|
+
title: "Get persisted Technical AEO crawl",
|
|
10525
|
+
description: "Read persisted full-crawl metadata for the latest or selected Technical AEO site-audit run: root URL, crawl/indexability/link-score versions, effective budgets, completeness, counts, and explicit dead-link check state. This does not fabricate a graph from older scorecard-only audits.",
|
|
10526
|
+
access: "read",
|
|
10527
|
+
tier: "monitoring",
|
|
10528
|
+
inputSchema: technicalAeoCrawlInputSchema,
|
|
10529
|
+
annotations: readAnnotations(),
|
|
10530
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl"],
|
|
10531
|
+
handler: (client2, input) => client2.getTechnicalAeoCrawl(input.project, { runId: input.runId })
|
|
10532
|
+
}),
|
|
10533
|
+
defineTool({
|
|
10534
|
+
name: "canonry_technical_aeo_crawl_pages",
|
|
10535
|
+
title: "List Technical AEO crawl pages",
|
|
10536
|
+
description: "Read one bounded, cursor-paged list of canonical crawl nodes. Filter crawler-derived indexability and audit state, then follow nextCursor; this is technical inventory eligibility, not a claim about Google index coverage.",
|
|
10537
|
+
access: "read",
|
|
10538
|
+
tier: "monitoring",
|
|
10539
|
+
inputSchema: technicalAeoCrawlPagesInputSchema,
|
|
10540
|
+
annotations: readAnnotations(),
|
|
10541
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/crawl/pages"],
|
|
10542
|
+
handler: (client2, input) => client2.getTechnicalAeoCrawlPages(input.project, {
|
|
10543
|
+
runId: input.runId,
|
|
10544
|
+
inventoryEligible: input.inventoryEligible,
|
|
10545
|
+
fetchState: input.fetchState,
|
|
10546
|
+
indexabilityState: input.indexabilityState,
|
|
10547
|
+
auditState: input.auditState,
|
|
10548
|
+
sort: input.sort,
|
|
10549
|
+
cursor: input.cursor,
|
|
10550
|
+
limit: input.limit
|
|
10551
|
+
})
|
|
10552
|
+
}),
|
|
10553
|
+
defineTool({
|
|
10554
|
+
name: "canonry_technical_aeo_structure",
|
|
10555
|
+
title: "List Technical AEO site structure",
|
|
10556
|
+
description: "Read one bounded level of the persisted site hierarchy below parentPath. Follow nextCursor for more siblings; request a child path separately rather than attempting to materialize the entire website tree.",
|
|
10557
|
+
access: "read",
|
|
10558
|
+
tier: "monitoring",
|
|
10559
|
+
inputSchema: technicalAeoStructureInputSchema,
|
|
10560
|
+
annotations: readAnnotations(),
|
|
10561
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/structure"],
|
|
10562
|
+
handler: (client2, input) => client2.getTechnicalAeoStructure(input.project, {
|
|
10563
|
+
runId: input.runId,
|
|
10564
|
+
parentPath: input.parentPath,
|
|
10565
|
+
cursor: input.cursor,
|
|
10566
|
+
limit: input.limit
|
|
10567
|
+
})
|
|
10568
|
+
}),
|
|
10569
|
+
defineTool({
|
|
10570
|
+
name: "canonry_technical_aeo_internal_links",
|
|
10571
|
+
title: "List Technical AEO internal links",
|
|
10572
|
+
description: "Read a bounded, cursor-paged list of persisted internal crawl edges. Filter by source URL, target URL, or followability. Use the neighbors tool for one page rather than loading a graph.",
|
|
10573
|
+
access: "read",
|
|
10574
|
+
tier: "monitoring",
|
|
10575
|
+
inputSchema: technicalAeoInternalLinksInputSchema,
|
|
10576
|
+
annotations: readAnnotations(),
|
|
10577
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/internal-links"],
|
|
10578
|
+
handler: (client2, input) => client2.getTechnicalAeoInternalLinks(input.project, {
|
|
10579
|
+
runId: input.runId,
|
|
10580
|
+
sourceUrl: input.sourceUrl,
|
|
10581
|
+
targetUrl: input.targetUrl,
|
|
10582
|
+
followable: input.followable,
|
|
10583
|
+
cursor: input.cursor,
|
|
10584
|
+
limit: input.limit
|
|
10585
|
+
})
|
|
10586
|
+
}),
|
|
10587
|
+
defineTool({
|
|
10588
|
+
name: "canonry_technical_aeo_link_neighbors",
|
|
10589
|
+
title: "Get Technical AEO page link neighbors",
|
|
10590
|
+
description: "Read bounded inbound and outbound internal links for exactly one crawl node, selected by nodeKey or URL. It returns independent truncation flags for inbound and outbound edges, not a transitive traversal.",
|
|
10591
|
+
access: "read",
|
|
10592
|
+
tier: "monitoring",
|
|
10593
|
+
inputSchema: technicalAeoLinkNeighborsInputSchema,
|
|
10594
|
+
annotations: readAnnotations(),
|
|
10595
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/internal-links/neighbors"],
|
|
10596
|
+
handler: (client2, input) => client2.getTechnicalAeoInternalLinkNeighbors(input.project, {
|
|
10597
|
+
runId: input.runId,
|
|
10598
|
+
nodeKey: input.nodeKey,
|
|
10599
|
+
url: input.url,
|
|
10600
|
+
limit: input.limit
|
|
10601
|
+
})
|
|
10602
|
+
}),
|
|
10603
|
+
defineTool({
|
|
10604
|
+
name: "canonry_technical_aeo_dead_links",
|
|
10605
|
+
title: "List Technical AEO dead links",
|
|
10606
|
+
description: "Read the persisted dead-link check state and a bounded, cursor-paged list of findings. A disabled result means the crawl was run without opt-in checks; it never means zero dead links.",
|
|
10607
|
+
access: "read",
|
|
10608
|
+
tier: "monitoring",
|
|
10609
|
+
inputSchema: technicalAeoDeadLinksInputSchema,
|
|
10610
|
+
annotations: readAnnotations(),
|
|
10611
|
+
openApiOperations: ["GET /api/v1/projects/{name}/technical-aeo/dead-links"],
|
|
10612
|
+
handler: (client2, input) => client2.getTechnicalAeoDeadLinks(input.project, {
|
|
10613
|
+
runId: input.runId,
|
|
10614
|
+
cursor: input.cursor,
|
|
10615
|
+
limit: input.limit
|
|
10616
|
+
})
|
|
10617
|
+
}),
|
|
10063
10618
|
defineTool({
|
|
10064
10619
|
name: "canonry_technical_aeo_run",
|
|
10065
10620
|
title: "Run Technical AEO site audit",
|
|
10066
|
-
description: "
|
|
10621
|
+
description: "Start a site-audit run. The run discovers root, sitemap, and linked pages. Its unattended default is 1,000 pages and 100,000 link observations; callers may explicitly raise either to its hard maximum. It returns {runId, status} and continues in the background. If an active run has identical effective options, this tool returns it; different options are refused. Poll canonry_run_get, then read the crawl and score tools.",
|
|
10067
10622
|
access: "write",
|
|
10068
10623
|
tier: "monitoring",
|
|
10069
10624
|
inputSchema: technicalAeoRunInputSchema,
|
|
@@ -10071,7 +10626,11 @@ var canonryMcpTools = [
|
|
|
10071
10626
|
openApiOperations: ["POST /api/v1/projects/{name}/technical-aeo/runs"],
|
|
10072
10627
|
handler: (client2, input) => client2.triggerSiteAudit(input.project, {
|
|
10073
10628
|
sitemapUrl: input.sitemapUrl,
|
|
10074
|
-
limit: input.limit
|
|
10629
|
+
limit: input.limit,
|
|
10630
|
+
maxPages: input.maxPages,
|
|
10631
|
+
maxEdges: input.maxEdges,
|
|
10632
|
+
maxDepth: input.maxDepth,
|
|
10633
|
+
checkDeadLinks: input.checkDeadLinks
|
|
10075
10634
|
})
|
|
10076
10635
|
}),
|
|
10077
10636
|
// ----- OpenAI ads (ChatGPT ads) -----
|