@canonry/canonry 4.146.0 → 4.147.1

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.
Files changed (31) hide show
  1. package/assets/assets/{AuditHistoryPanel-IDsSUFI3.js → AuditHistoryPanel-BbEZ_0W9.js} +1 -1
  2. package/assets/assets/{BacklinksPage-BswN-pyj.js → BacklinksPage-B72RKxC-.js} +1 -1
  3. package/assets/assets/{ChartPrimitives-CIe-R58_.js → ChartPrimitives-Cf-jQ3c8.js} +1 -1
  4. package/assets/assets/{HistoryPage-B18Jpq8c.js → HistoryPage-C2U1kxKw.js} +1 -1
  5. package/assets/assets/MeasurementPropertyPage-ltcSZ0tw.js +1 -0
  6. package/assets/assets/ProjectPage-ZcGjsDlb.js +12 -0
  7. package/assets/assets/{RunRow-3ZwTR4Bv.js → RunRow-DxO-zxCm.js} +1 -1
  8. package/assets/assets/{RunsPage-BCAJulR1.js → RunsPage-B1ON2nQC.js} +1 -1
  9. package/assets/assets/{SettingsPage-BT2_l0Do.js → SettingsPage-Cp0bHFHk.js} +1 -1
  10. package/assets/assets/{TrafficPage-Cux8rj5G.js → TrafficPage-QzitDjhV.js} +1 -1
  11. package/assets/assets/{TrafficSourceDetailPage-DI1Ad8KS.js → TrafficSourceDetailPage-BjfFyG2y.js} +1 -1
  12. package/assets/assets/{arrow-left-BMSx9HQB.js → arrow-left-DJ8ZwUlj.js} +1 -1
  13. package/assets/assets/extract-error-message-CX8ZNJ8S.js +1 -0
  14. package/assets/assets/{index-C6E5hp28.css → index-D5NO3NEG.css} +1 -1
  15. package/assets/assets/index-DF8X6nM0.js +213 -0
  16. package/assets/assets/{trash-2-CyoJtRAr.js → trash-2-UHAxuTT7.js} +1 -1
  17. package/assets/assets/{v2-overview-adapter-owDeFdUc.js → v2-overview-adapter-BHmxTmCf.js} +1 -1
  18. package/assets/index.html +2 -2
  19. package/dist/{chunk-UQOTEIA6.js → chunk-2NTWZHNF.js} +712 -330
  20. package/dist/{chunk-B5H55ZMA.js → chunk-BVOU4UJM.js} +3687 -3025
  21. package/dist/{chunk-Z7B6BRPP.js → chunk-GNKVF6TZ.js} +7 -4
  22. package/dist/{chunk-ED7C5TWT.js → chunk-ZRUNFIGA.js} +3818 -1439
  23. package/dist/cli.js +419 -15
  24. package/dist/index.js +4 -4
  25. package/dist/{intelligence-service-M5UNHF7X.js → intelligence-service-2E5YAXI3.js} +2 -2
  26. package/dist/mcp.js +5 -5
  27. package/package.json +12 -11
  28. package/assets/assets/MeasurementPropertyPage-CvmQeoo7.js +0 -1
  29. package/assets/assets/ProjectPage-BE1MUAB5.js +0 -11
  30. package/assets/assets/extract-error-message-B-9FdQh8.js +0 -1
  31. package/assets/assets/index-kOXUzdqD.js +0 -213
@@ -26,8 +26,11 @@ import {
26
26
  gscPerformanceOrderBySchema,
27
27
  keywordBatchRequestSchema,
28
28
  keywordGenerateRequestSchema,
29
+ measurementChangesQuerySchema,
30
+ measurementDataQualityQuerySchema,
29
31
  measurementDiscoveryRequestSchema,
30
32
  measurementDraftApplyAssignmentsRequestSchema,
33
+ measurementDraftApplyGroupMembershipRequestSchema,
31
34
  measurementDraftApplyPairedAssignmentsRequestSchema,
32
35
  measurementDraftApplySitemapSelectionRequestSchema,
33
36
  measurementDraftClassifyAssignmentsRequestSchema,
@@ -37,12 +40,15 @@ import {
37
40
  measurementDraftExcludeTargetRequestSchema,
38
41
  measurementDraftImportSitemapRequestSchema,
39
42
  measurementDraftMergeTargetsRequestSchema,
43
+ measurementDraftPreviewAssignmentsRequestSchema,
44
+ measurementDraftPreviewGroupMembershipRequestSchema,
40
45
  measurementDraftPublishRequestSchema,
41
46
  measurementDraftRebindTargetRequestSchema,
42
47
  measurementDraftRemoveAssignmentRequestSchema,
43
48
  measurementDraftRemoveCompetitorRequestSchema,
44
49
  measurementDraftRemoveGroupRequestSchema,
45
50
  measurementDraftRenameTargetRequestSchema,
51
+ measurementDraftReplaceAssignmentsRequestSchema,
46
52
  measurementDraftUpsertCompetitorRequestSchema,
47
53
  measurementDraftUpsertGroupRequestSchema,
48
54
  measurementDraftUpsertTargetRequestSchema,
@@ -50,10 +56,14 @@ import {
50
56
  measurementPlanAuthoringSchema,
51
57
  measurementPlanDeactivateRequestSchema,
52
58
  measurementPlanPublishRequestSchema,
59
+ measurementPortfolioSummaryQuerySchema,
60
+ measurementPropertyCompetitorsQuerySchema,
53
61
  measurementPropertyEvidenceQuerySchema,
62
+ measurementPropertyQuestionsQuerySchema,
54
63
  measurementQuerySetUpsertRequestSchema,
55
64
  measurementQueryTemplateApplyRequestSchema,
56
65
  measurementQueryTemplateUpsertRequestSchema,
66
+ measurementQuestionResultQuerySchema,
57
67
  notificationCreateRequestSchema,
58
68
  notificationEventSchema,
59
69
  organicEvidencePeriodSchema,
@@ -71,7 +81,7 @@ import {
71
81
  trafficConnectWordpressRequestSchema,
72
82
  trafficEventKindSchema,
73
83
  trafficSeriesGranularitySchema
74
- } from "./chunk-B5H55ZMA.js";
84
+ } from "./chunk-BVOU4UJM.js";
75
85
 
76
86
  // src/config.ts
77
87
  import fs from "fs";
@@ -298,6 +308,15 @@ function isEndpointMissing(err) {
298
308
  const status = err.details?.httpStatus;
299
309
  return status === 404 || status === 405;
300
310
  }
311
+ function systemError(message, options) {
312
+ return new CliError({
313
+ code: "CLI_SYSTEM_ERROR",
314
+ message,
315
+ displayMessage: options?.displayMessage,
316
+ details: options?.details,
317
+ exitCode: EXIT_SYSTEM_ERROR
318
+ });
319
+ }
301
320
  function printCliError(err, format) {
302
321
  if (isMachineFormat(format)) {
303
322
  const envelope = err instanceof CliError ? { error: { code: err.code, message: err.message, ...err.details ? { details: err.details } : {} } } : { error: { code: "CLI_ERROR", message: err instanceof Error ? err.message : "An unexpected error occurred" } };
@@ -1500,6 +1519,38 @@ var postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyAssignments = (option
1500
1519
  }
1501
1520
  });
1502
1521
  };
1522
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewAssignments = (options) => {
1523
+ return (options.client ?? client).post({
1524
+ security: [
1525
+ {
1526
+ scheme: "bearer",
1527
+ type: "http"
1528
+ }
1529
+ ],
1530
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/preview-assignments",
1531
+ ...options,
1532
+ headers: {
1533
+ "Content-Type": "application/json",
1534
+ ...options.headers
1535
+ }
1536
+ });
1537
+ };
1538
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsReplaceAssignments = (options) => {
1539
+ return (options.client ?? client).post({
1540
+ security: [
1541
+ {
1542
+ scheme: "bearer",
1543
+ type: "http"
1544
+ }
1545
+ ],
1546
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/replace-assignments",
1547
+ ...options,
1548
+ headers: {
1549
+ "Content-Type": "application/json",
1550
+ ...options.headers
1551
+ }
1552
+ });
1553
+ };
1503
1554
  var postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyPairedAssignments = (options) => {
1504
1555
  return (options.client ?? client).post({
1505
1556
  security: [
@@ -1596,6 +1647,38 @@ var postApiV1ProjectsByNameMeasurementPlanDraftActionsRemoveGroup = (options) =>
1596
1647
  }
1597
1648
  });
1598
1649
  };
1650
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewGroupMembership = (options) => {
1651
+ return (options.client ?? client).post({
1652
+ security: [
1653
+ {
1654
+ scheme: "bearer",
1655
+ type: "http"
1656
+ }
1657
+ ],
1658
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/preview-group-membership",
1659
+ ...options,
1660
+ headers: {
1661
+ "Content-Type": "application/json",
1662
+ ...options.headers
1663
+ }
1664
+ });
1665
+ };
1666
+ var postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyGroupMembership = (options) => {
1667
+ return (options.client ?? client).post({
1668
+ security: [
1669
+ {
1670
+ scheme: "bearer",
1671
+ type: "http"
1672
+ }
1673
+ ],
1674
+ url: "/api/v1/projects/{name}/measurement-plan/draft/actions/apply-group-membership",
1675
+ ...options,
1676
+ headers: {
1677
+ "Content-Type": "application/json",
1678
+ ...options.headers
1679
+ }
1680
+ });
1681
+ };
1599
1682
  var postApiV1ProjectsByNameMeasurementPlanDraftActionsUpsertCompetitor = (options) => {
1600
1683
  return (options.client ?? client).post({
1601
1684
  security: [
@@ -1720,6 +1803,78 @@ var getApiV1ProjectsByNameMeasurementPropertyEvidence = (options) => {
1720
1803
  ...options
1721
1804
  });
1722
1805
  };
1806
+ var getApiV1ProjectsByNameMeasurementPortfolioSummary = (options) => {
1807
+ return (options.client ?? client).get({
1808
+ security: [
1809
+ {
1810
+ scheme: "bearer",
1811
+ type: "http"
1812
+ }
1813
+ ],
1814
+ url: "/api/v1/projects/{name}/measurement-portfolio-summary",
1815
+ ...options
1816
+ });
1817
+ };
1818
+ var getApiV1ProjectsByNameMeasurementPropertyQuestions = (options) => {
1819
+ return (options.client ?? client).get({
1820
+ security: [
1821
+ {
1822
+ scheme: "bearer",
1823
+ type: "http"
1824
+ }
1825
+ ],
1826
+ url: "/api/v1/projects/{name}/measurement-property-questions",
1827
+ ...options
1828
+ });
1829
+ };
1830
+ var getApiV1ProjectsByNameMeasurementQuestionResult = (options) => {
1831
+ return (options.client ?? client).get({
1832
+ security: [
1833
+ {
1834
+ scheme: "bearer",
1835
+ type: "http"
1836
+ }
1837
+ ],
1838
+ url: "/api/v1/projects/{name}/measurement-question-result",
1839
+ ...options
1840
+ });
1841
+ };
1842
+ var getApiV1ProjectsByNameMeasurementPropertyCompetitors = (options) => {
1843
+ return (options.client ?? client).get({
1844
+ security: [
1845
+ {
1846
+ scheme: "bearer",
1847
+ type: "http"
1848
+ }
1849
+ ],
1850
+ url: "/api/v1/projects/{name}/measurement-property-competitors",
1851
+ ...options
1852
+ });
1853
+ };
1854
+ var getApiV1ProjectsByNameMeasurementChanges = (options) => {
1855
+ return (options.client ?? client).get({
1856
+ security: [
1857
+ {
1858
+ scheme: "bearer",
1859
+ type: "http"
1860
+ }
1861
+ ],
1862
+ url: "/api/v1/projects/{name}/measurement-changes",
1863
+ ...options
1864
+ });
1865
+ };
1866
+ var getApiV1ProjectsByNameMeasurementDataQuality = (options) => {
1867
+ return (options.client ?? client).get({
1868
+ security: [
1869
+ {
1870
+ scheme: "bearer",
1871
+ type: "http"
1872
+ }
1873
+ ],
1874
+ url: "/api/v1/projects/{name}/measurement-data-quality",
1875
+ ...options
1876
+ });
1877
+ };
1723
1878
  var getApiV1ProjectsByNameMeasurementQuerySets = (options) => {
1724
1879
  return (options.client ?? client).get({
1725
1880
  security: [
@@ -5383,6 +5538,60 @@ var ApiClient = class {
5383
5538
  })
5384
5539
  );
5385
5540
  }
5541
+ async getMeasurementPortfolioSummary(project, query) {
5542
+ return this.invoke(
5543
+ () => getApiV1ProjectsByNameMeasurementPortfolioSummary({
5544
+ client: this.heyClient,
5545
+ path: { name: project },
5546
+ query
5547
+ })
5548
+ );
5549
+ }
5550
+ async getMeasurementPropertyQuestions(project, query) {
5551
+ return this.invoke(
5552
+ () => getApiV1ProjectsByNameMeasurementPropertyQuestions({
5553
+ client: this.heyClient,
5554
+ path: { name: project },
5555
+ query
5556
+ })
5557
+ );
5558
+ }
5559
+ async getMeasurementQuestionResult(project, query) {
5560
+ return this.invoke(
5561
+ () => getApiV1ProjectsByNameMeasurementQuestionResult({
5562
+ client: this.heyClient,
5563
+ path: { name: project },
5564
+ query
5565
+ })
5566
+ );
5567
+ }
5568
+ async getMeasurementPropertyCompetitors(project, query) {
5569
+ return this.invoke(
5570
+ () => getApiV1ProjectsByNameMeasurementPropertyCompetitors({
5571
+ client: this.heyClient,
5572
+ path: { name: project },
5573
+ query
5574
+ })
5575
+ );
5576
+ }
5577
+ async getMeasurementChanges(project, query) {
5578
+ return this.invoke(
5579
+ () => getApiV1ProjectsByNameMeasurementChanges({
5580
+ client: this.heyClient,
5581
+ path: { name: project },
5582
+ query
5583
+ })
5584
+ );
5585
+ }
5586
+ async getMeasurementDataQuality(project, query) {
5587
+ return this.invoke(
5588
+ () => getApiV1ProjectsByNameMeasurementDataQuality({
5589
+ client: this.heyClient,
5590
+ path: { name: project },
5591
+ query
5592
+ })
5593
+ );
5594
+ }
5386
5595
  async getMeasurementPlanDraft(project) {
5387
5596
  return this.invoke(
5388
5597
  () => getApiV1ProjectsByNameMeasurementPlanDraft({ client: this.heyClient, path: { name: project } })
@@ -5506,6 +5715,25 @@ var ApiClient = class {
5506
5715
  })
5507
5716
  );
5508
5717
  }
5718
+ async previewMeasurementDraftAssignments(project, request) {
5719
+ return this.invoke(
5720
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewAssignments({
5721
+ client: this.heyClient,
5722
+ path: { name: project },
5723
+ body: request
5724
+ })
5725
+ );
5726
+ }
5727
+ async replaceMeasurementDraftAssignments(project, request, idempotencyKey, etag) {
5728
+ return this.invoke(
5729
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsReplaceAssignments({
5730
+ client: this.heyClient,
5731
+ path: { name: project },
5732
+ body: request,
5733
+ headers: this.measurementDraftMutationHeaders(idempotencyKey, etag)
5734
+ })
5735
+ );
5736
+ }
5509
5737
  async applyPairedMeasurementDraftAssignments(project, request, idempotencyKey, etag) {
5510
5738
  return this.invoke(
5511
5739
  () => postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyPairedAssignments({
@@ -5566,6 +5794,25 @@ var ApiClient = class {
5566
5794
  })
5567
5795
  );
5568
5796
  }
5797
+ async previewMeasurementDraftGroupMembership(project, request) {
5798
+ return this.invoke(
5799
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsPreviewGroupMembership({
5800
+ client: this.heyClient,
5801
+ path: { name: project },
5802
+ body: request
5803
+ })
5804
+ );
5805
+ }
5806
+ async applyMeasurementDraftGroupMembership(project, request, idempotencyKey, etag) {
5807
+ return this.invoke(
5808
+ () => postApiV1ProjectsByNameMeasurementPlanDraftActionsApplyGroupMembership({
5809
+ client: this.heyClient,
5810
+ path: { name: project },
5811
+ body: request,
5812
+ headers: this.measurementDraftMutationHeaders(idempotencyKey, etag)
5813
+ })
5814
+ );
5815
+ }
5569
5816
  async upsertMeasurementDraftCompetitor(project, request, idempotencyKey, etag) {
5570
5817
  return this.invoke(
5571
5818
  () => postApiV1ProjectsByNameMeasurementPlanDraftActionsUpsertCompetitor({
@@ -7193,21 +7440,133 @@ var _require = createRequire(import.meta.url);
7193
7440
  var PACKAGE_VERSION = _require("../package.json").version;
7194
7441
 
7195
7442
  // src/mcp/tool-registry.ts
7196
- import { z as z2 } from "zod";
7443
+ import { z as z3 } from "zod";
7197
7444
 
7198
- // src/mcp/schema.ts
7445
+ // src/measurement-draft-actions.ts
7199
7446
  import { z } from "zod";
7200
- var projectNameSchema = z.string().min(1).describe("Canonry project name.");
7201
- var runIdSchema = z.string().min(1).describe("Canonry run ID.");
7202
- var insightIdSchema = z.string().min(1).describe("Canonry insight ID.");
7203
- var analyticsWindowSchema = z.enum(["7d", "30d", "90d", "all"]).describe("Analytics time window.");
7204
- var emptyInputSchema = z.object({});
7205
- var projectInputSchema = z.object({
7447
+ var idempotencyKeySchema = z.string().trim().min(1).describe(
7448
+ "A fresh request key. Reuse it only when retrying the identical request."
7449
+ );
7450
+ var draftEtagSchema = z.string().trim().min(1).optional().describe(
7451
+ "Current draft ETag from canonry_measurement_draft_get. The API requires it for draft edits, publish, and discard; omit it only to receive the API\u2019s actionable 428 response."
7452
+ );
7453
+ function mutationOperationSchema(action, request) {
7454
+ return z.object({
7455
+ action: z.literal(action),
7456
+ request,
7457
+ etag: draftEtagSchema,
7458
+ idempotencyKey: idempotencyKeySchema
7459
+ }).strict().describe(`Operation for ${action}.`);
7460
+ }
7461
+ var measurementDraftOperationSchema = z.discriminatedUnion("action", [
7462
+ z.object({
7463
+ action: z.literal("create"),
7464
+ request: measurementDraftCreateRequestSchema,
7465
+ idempotencyKey: idempotencyKeySchema
7466
+ }).strict().describe("Operation for create."),
7467
+ mutationOperationSchema("import-sitemap", measurementDraftImportSitemapRequestSchema),
7468
+ mutationOperationSchema("apply-sitemap-selection", measurementDraftApplySitemapSelectionRequestSchema),
7469
+ mutationOperationSchema("upsert-target", measurementDraftUpsertTargetRequestSchema),
7470
+ mutationOperationSchema("rename-target", measurementDraftRenameTargetRequestSchema),
7471
+ mutationOperationSchema("merge-targets", measurementDraftMergeTargetsRequestSchema),
7472
+ mutationOperationSchema("exclude-target", measurementDraftExcludeTargetRequestSchema),
7473
+ mutationOperationSchema("rebind-target", measurementDraftRebindTargetRequestSchema),
7474
+ mutationOperationSchema("apply-assignments", measurementDraftApplyAssignmentsRequestSchema),
7475
+ z.object({
7476
+ action: z.literal("preview-assignments"),
7477
+ request: measurementDraftPreviewAssignmentsRequestSchema
7478
+ }).strict().describe("Read-semantic assignment impact preview."),
7479
+ mutationOperationSchema("replace-assignments", measurementDraftReplaceAssignmentsRequestSchema),
7480
+ mutationOperationSchema("apply-paired-assignments", measurementDraftApplyPairedAssignmentsRequestSchema),
7481
+ mutationOperationSchema("remove-assignment", measurementDraftRemoveAssignmentRequestSchema),
7482
+ mutationOperationSchema("clear-assignments", measurementDraftClearAssignmentsRequestSchema),
7483
+ mutationOperationSchema("classify-assignments", measurementDraftClassifyAssignmentsRequestSchema),
7484
+ mutationOperationSchema("upsert-group", measurementDraftUpsertGroupRequestSchema),
7485
+ mutationOperationSchema("remove-group", measurementDraftRemoveGroupRequestSchema),
7486
+ z.object({
7487
+ action: z.literal("preview-group-membership"),
7488
+ request: measurementDraftPreviewGroupMembershipRequestSchema
7489
+ }).strict().describe("Read-semantic CSV group-membership preview."),
7490
+ mutationOperationSchema("apply-group-membership", measurementDraftApplyGroupMembershipRequestSchema),
7491
+ mutationOperationSchema("upsert-competitor", measurementDraftUpsertCompetitorRequestSchema),
7492
+ mutationOperationSchema("remove-competitor", measurementDraftRemoveCompetitorRequestSchema),
7493
+ z.object({ action: z.literal("compile-preview") }).strict().describe("Operation for compile-preview."),
7494
+ z.object({ action: z.literal("diff-preview") }).strict().describe("Operation for diff-preview."),
7495
+ mutationOperationSchema("publish", measurementDraftPublishRequestSchema),
7496
+ z.object({
7497
+ action: z.literal("discard"),
7498
+ etag: draftEtagSchema,
7499
+ idempotencyKey: idempotencyKeySchema
7500
+ }).strict().describe("Operation for discard.")
7501
+ ]);
7502
+ function runMeasurementDraftAction(client2, project, actionInput) {
7503
+ switch (actionInput.action) {
7504
+ case "create":
7505
+ return client2.createMeasurementPlanDraft(project, actionInput.request, actionInput.idempotencyKey);
7506
+ case "import-sitemap":
7507
+ return client2.importMeasurementDraftSitemap(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7508
+ case "apply-sitemap-selection":
7509
+ return client2.applyMeasurementDraftSitemapSelection(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7510
+ case "upsert-target":
7511
+ return client2.upsertMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7512
+ case "rename-target":
7513
+ return client2.renameMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7514
+ case "merge-targets":
7515
+ return client2.mergeMeasurementDraftTargets(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7516
+ case "exclude-target":
7517
+ return client2.excludeMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7518
+ case "rebind-target":
7519
+ return client2.rebindMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7520
+ case "apply-assignments":
7521
+ return client2.applyMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7522
+ case "preview-assignments":
7523
+ return client2.previewMeasurementDraftAssignments(project, actionInput.request);
7524
+ case "replace-assignments":
7525
+ return client2.replaceMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7526
+ case "apply-paired-assignments":
7527
+ return client2.applyPairedMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7528
+ case "remove-assignment":
7529
+ return client2.removeMeasurementDraftAssignment(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7530
+ case "clear-assignments":
7531
+ return client2.clearMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7532
+ case "classify-assignments":
7533
+ return client2.classifyMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7534
+ case "upsert-group":
7535
+ return client2.upsertMeasurementDraftGroup(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7536
+ case "remove-group":
7537
+ return client2.removeMeasurementDraftGroup(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7538
+ case "preview-group-membership":
7539
+ return client2.previewMeasurementDraftGroupMembership(project, actionInput.request);
7540
+ case "apply-group-membership":
7541
+ return client2.applyMeasurementDraftGroupMembership(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7542
+ case "upsert-competitor":
7543
+ return client2.upsertMeasurementDraftCompetitor(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7544
+ case "remove-competitor":
7545
+ return client2.removeMeasurementDraftCompetitor(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7546
+ case "compile-preview":
7547
+ return client2.compileMeasurementDraftPreview(project);
7548
+ case "diff-preview":
7549
+ return client2.diffMeasurementDraftPreview(project);
7550
+ case "publish":
7551
+ return client2.publishMeasurementDraft(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7552
+ case "discard":
7553
+ return client2.discardMeasurementDraft(project, actionInput.idempotencyKey, actionInput.etag);
7554
+ }
7555
+ }
7556
+
7557
+ // src/mcp/schema.ts
7558
+ import { z as z2 } from "zod";
7559
+ var projectNameSchema = z2.string().min(1).describe("Canonry project name.");
7560
+ var runIdSchema = z2.string().min(1).describe("Canonry run ID.");
7561
+ var insightIdSchema = z2.string().min(1).describe("Canonry insight ID.");
7562
+ var analyticsWindowSchema = z2.enum(["7d", "30d", "90d", "all"]).describe("Analytics time window.");
7563
+ var emptyInputSchema = z2.object({});
7564
+ var projectInputSchema = z2.object({
7206
7565
  project: projectNameSchema
7207
7566
  });
7208
7567
  function toJsonSchema(schema, name) {
7209
7568
  return {
7210
- ...z.toJSONSchema(schema, { target: "draft-7" }),
7569
+ ...z2.toJSONSchema(schema, { target: "draft-7" }),
7211
7570
  title: name
7212
7571
  };
7213
7572
  }
@@ -7253,23 +7612,20 @@ function defineTool(tool) {
7253
7612
  inputJsonSchema: toJsonSchema(tool.inputSchema, tool.name)
7254
7613
  };
7255
7614
  }
7256
- var runTriggerInputSchema = z2.object({
7615
+ var runTriggerInputSchema = z3.object({
7257
7616
  project: projectNameSchema,
7258
7617
  request: runTriggerRequestSchema.optional()
7259
7618
  });
7260
- var measurementPlanVersionInputSchema = z2.object({ project: projectNameSchema, revision: z2.number().int().positive() });
7619
+ var measurementPlanVersionInputSchema = z3.object({ project: projectNameSchema, revision: z3.number().int().positive() });
7261
7620
  var measurementReportInputSchema = measurementPlanVersionInputSchema.extend({
7262
7621
  runId: runIdSchema.optional().describe("Exact eligible full measurement run to reconstruct. Omit for the latest run in the revision.")
7263
7622
  });
7264
- var measurementPlanPreviewInputSchema = z2.object({ project: projectNameSchema, plan: measurementPlanAuthoringSchema });
7623
+ var measurementPlanPreviewInputSchema = z3.object({ project: projectNameSchema, plan: measurementPlanAuthoringSchema });
7265
7624
  var measurementPlanPublishInputSchema = measurementPlanPublishRequestSchema.extend({ project: projectNameSchema });
7266
- var measurementPlanRetireInputSchema = z2.object({ project: projectNameSchema, stableKey: z2.string().min(1) });
7625
+ var measurementPlanRetireInputSchema = z3.object({ project: projectNameSchema, stableKey: z3.string().min(1) });
7267
7626
  var measurementDiscoveryInputSchema = measurementDiscoveryRequestSchema.extend({ project: projectNameSchema });
7268
- var idempotencyKeyInputSchema = z2.string().trim().min(1).describe("A fresh request key. Reuse it only when retrying the identical request.");
7269
- var measurementDraftEtagInputSchema = z2.string().trim().min(1).optional().describe(
7270
- "Current draft ETag from canonry_measurement_draft_get. The API requires it for draft edits, publish, and discard; omit it only to receive the API\u2019s actionable 428 response."
7271
- );
7272
- var measurementOverviewInputSchema = z2.object({
7627
+ var idempotencyKeyInputSchema = z3.string().trim().min(1).describe("A fresh request key. Reuse it only when retrying the identical request.");
7628
+ var measurementOverviewInputSchema = z3.object({
7273
7629
  project: projectNameSchema,
7274
7630
  scope: measurementOverviewQuerySchema.shape.scope.describe("Read all Properties, one reporting group, or one Property."),
7275
7631
  groupKey: measurementOverviewQuerySchema.shape.groupKey.describe("Group stable key. Required only for group scope."),
@@ -7300,19 +7656,40 @@ var measurementOverviewInputSchema = z2.object({
7300
7656
  });
7301
7657
  var measurementPropertyEvidenceInputSchema = measurementPropertyEvidenceQuerySchema.extend({
7302
7658
  project: projectNameSchema,
7303
- targetKey: measurementPropertyEvidenceQuerySchema.shape.targetKey.describe("Property stable key. Required \u2014 this read is scoped to exactly one Property.")
7659
+ targetKey: measurementPropertyEvidenceQuerySchema.shape.targetKey.describe("Property stable key. Required \u2014 this read is scoped to exactly one Property."),
7660
+ shape: measurementPropertyEvidenceQuerySchema.shape.shape.describe(
7661
+ "What one row is. Omit for sources (one row per cited URL). answers gives one row per measured answer with its cited URLs nested, including the answers that cited nothing."
7662
+ )
7663
+ }).strict();
7664
+ var measurementPortfolioSummaryInputSchema = measurementPortfolioSummaryQuerySchema.extend({
7665
+ project: projectNameSchema
7666
+ }).strict();
7667
+ var measurementPropertyQuestionsInputSchema = measurementPropertyQuestionsQuerySchema.extend({
7668
+ project: projectNameSchema
7669
+ }).strict();
7670
+ var measurementQuestionResultInputSchema = measurementQuestionResultQuerySchema.extend({
7671
+ project: projectNameSchema
7672
+ }).strict();
7673
+ var measurementPropertyCompetitorsInputSchema = measurementPropertyCompetitorsQuerySchema.extend({
7674
+ project: projectNameSchema
7675
+ }).strict();
7676
+ var measurementChangesInputSchema = measurementChangesQuerySchema.extend({
7677
+ project: projectNameSchema
7678
+ }).strict();
7679
+ var measurementDataQualityInputSchema = measurementDataQualityQuerySchema.extend({
7680
+ project: projectNameSchema
7304
7681
  }).strict();
7305
7682
  var measurementDraftCollectionInputSchema = measurementDraftCollectionQuerySchema.extend({ project: projectNameSchema });
7306
- var measurementQuerySetInputSchema = z2.object({
7683
+ var measurementQuerySetInputSchema = z3.object({
7307
7684
  project: projectNameSchema,
7308
- setId: z2.string().trim().min(1)
7685
+ setId: z3.string().trim().min(1)
7309
7686
  }).strict();
7310
7687
  var measurementQuerySetUpsertInputSchema = measurementQuerySetInputSchema.extend({
7311
7688
  request: measurementQuerySetUpsertRequestSchema
7312
7689
  }).strict();
7313
- var measurementQueryTemplateInputSchema = z2.object({
7690
+ var measurementQueryTemplateInputSchema = z3.object({
7314
7691
  project: projectNameSchema,
7315
- templateId: z2.string().trim().min(1)
7692
+ templateId: z3.string().trim().min(1)
7316
7693
  }).strict();
7317
7694
  var measurementQueryTemplateUpsertInputSchema = measurementQueryTemplateInputSchema.extend({
7318
7695
  request: measurementQueryTemplateUpsertRequestSchema
@@ -7325,46 +7702,7 @@ var measurementPlanDeactivateInputSchema = measurementPlanDeactivateRequestSchem
7325
7702
  project: projectNameSchema,
7326
7703
  idempotencyKey: idempotencyKeyInputSchema
7327
7704
  }).strict();
7328
- function measurementDraftMutationOperationSchema(action, request) {
7329
- return z2.object({
7330
- action: z2.literal(action),
7331
- request,
7332
- etag: measurementDraftEtagInputSchema,
7333
- idempotencyKey: idempotencyKeyInputSchema
7334
- }).strict().describe(`Operation for ${action}.`);
7335
- }
7336
- var measurementDraftOperationSchema = z2.discriminatedUnion("action", [
7337
- z2.object({
7338
- action: z2.literal("create"),
7339
- request: measurementDraftCreateRequestSchema,
7340
- idempotencyKey: idempotencyKeyInputSchema
7341
- }).strict().describe("Operation for create."),
7342
- measurementDraftMutationOperationSchema("import-sitemap", measurementDraftImportSitemapRequestSchema),
7343
- measurementDraftMutationOperationSchema("apply-sitemap-selection", measurementDraftApplySitemapSelectionRequestSchema),
7344
- measurementDraftMutationOperationSchema("upsert-target", measurementDraftUpsertTargetRequestSchema),
7345
- measurementDraftMutationOperationSchema("rename-target", measurementDraftRenameTargetRequestSchema),
7346
- measurementDraftMutationOperationSchema("merge-targets", measurementDraftMergeTargetsRequestSchema),
7347
- measurementDraftMutationOperationSchema("exclude-target", measurementDraftExcludeTargetRequestSchema),
7348
- measurementDraftMutationOperationSchema("rebind-target", measurementDraftRebindTargetRequestSchema),
7349
- measurementDraftMutationOperationSchema("apply-assignments", measurementDraftApplyAssignmentsRequestSchema),
7350
- measurementDraftMutationOperationSchema("apply-paired-assignments", measurementDraftApplyPairedAssignmentsRequestSchema),
7351
- measurementDraftMutationOperationSchema("remove-assignment", measurementDraftRemoveAssignmentRequestSchema),
7352
- measurementDraftMutationOperationSchema("clear-assignments", measurementDraftClearAssignmentsRequestSchema),
7353
- measurementDraftMutationOperationSchema("classify-assignments", measurementDraftClassifyAssignmentsRequestSchema),
7354
- measurementDraftMutationOperationSchema("upsert-group", measurementDraftUpsertGroupRequestSchema),
7355
- measurementDraftMutationOperationSchema("remove-group", measurementDraftRemoveGroupRequestSchema),
7356
- measurementDraftMutationOperationSchema("upsert-competitor", measurementDraftUpsertCompetitorRequestSchema),
7357
- measurementDraftMutationOperationSchema("remove-competitor", measurementDraftRemoveCompetitorRequestSchema),
7358
- z2.object({ action: z2.literal("compile-preview") }).strict().describe("Operation for compile-preview."),
7359
- z2.object({ action: z2.literal("diff-preview") }).strict().describe("Operation for diff-preview."),
7360
- measurementDraftMutationOperationSchema("publish", measurementDraftPublishRequestSchema),
7361
- z2.object({
7362
- action: z2.literal("discard"),
7363
- etag: measurementDraftEtagInputSchema,
7364
- idempotencyKey: idempotencyKeyInputSchema
7365
- }).strict().describe("Operation for discard.")
7366
- ]);
7367
- var measurementDraftActionInputSchema = z2.object({
7705
+ var measurementDraftActionInputSchema = z3.object({
7368
7706
  project: projectNameSchema,
7369
7707
  operation: measurementDraftOperationSchema.describe("Typed draft operation. Select exactly one action branch.")
7370
7708
  }).strict();
@@ -7378,12 +7716,16 @@ var measurementDraftActionOpenApiOperations = [
7378
7716
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/exclude-target",
7379
7717
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/rebind-target",
7380
7718
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/apply-assignments",
7719
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/preview-assignments",
7720
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/replace-assignments",
7381
7721
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/apply-paired-assignments",
7382
7722
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/remove-assignment",
7383
7723
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/clear-assignments",
7384
7724
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/classify-assignments",
7385
7725
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/upsert-group",
7386
7726
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/remove-group",
7727
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/preview-group-membership",
7728
+ "POST /api/v1/projects/{name}/measurement-plan/draft/actions/apply-group-membership",
7387
7729
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/upsert-competitor",
7388
7730
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/remove-competitor",
7389
7731
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/compile-preview",
@@ -7391,144 +7733,97 @@ var measurementDraftActionOpenApiOperations = [
7391
7733
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/publish",
7392
7734
  "POST /api/v1/projects/{name}/measurement-plan/draft/actions/discard"
7393
7735
  ];
7394
- function runMeasurementDraftAction(client2, input) {
7395
- const { project, operation: actionInput } = input;
7396
- switch (actionInput.action) {
7397
- case "create":
7398
- return client2.createMeasurementPlanDraft(project, actionInput.request, actionInput.idempotencyKey);
7399
- case "import-sitemap":
7400
- return client2.importMeasurementDraftSitemap(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7401
- case "apply-sitemap-selection":
7402
- return client2.applyMeasurementDraftSitemapSelection(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7403
- case "upsert-target":
7404
- return client2.upsertMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7405
- case "rename-target":
7406
- return client2.renameMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7407
- case "merge-targets":
7408
- return client2.mergeMeasurementDraftTargets(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7409
- case "exclude-target":
7410
- return client2.excludeMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7411
- case "rebind-target":
7412
- return client2.rebindMeasurementDraftTarget(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7413
- case "apply-assignments":
7414
- return client2.applyMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7415
- case "apply-paired-assignments":
7416
- return client2.applyPairedMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7417
- case "remove-assignment":
7418
- return client2.removeMeasurementDraftAssignment(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7419
- case "clear-assignments":
7420
- return client2.clearMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7421
- case "classify-assignments":
7422
- return client2.classifyMeasurementDraftAssignments(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7423
- case "upsert-group":
7424
- return client2.upsertMeasurementDraftGroup(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7425
- case "remove-group":
7426
- return client2.removeMeasurementDraftGroup(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7427
- case "upsert-competitor":
7428
- return client2.upsertMeasurementDraftCompetitor(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7429
- case "remove-competitor":
7430
- return client2.removeMeasurementDraftCompetitor(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7431
- case "compile-preview":
7432
- return client2.compileMeasurementDraftPreview(project);
7433
- case "diff-preview":
7434
- return client2.diffMeasurementDraftPreview(project);
7435
- case "publish":
7436
- return client2.publishMeasurementDraft(project, actionInput.request, actionInput.idempotencyKey, actionInput.etag);
7437
- case "discard":
7438
- return client2.discardMeasurementDraft(project, actionInput.idempotencyKey, actionInput.etag);
7439
- }
7440
- }
7441
- var runsListInputSchema = z2.object({
7736
+ var runsListInputSchema = z3.object({
7442
7737
  project: projectNameSchema,
7443
- limit: z2.number().int().positive().max(500).optional()
7738
+ limit: z3.number().int().positive().max(500).optional()
7444
7739
  });
7445
- var runGetInputSchema = z2.object({
7740
+ var runGetInputSchema = z3.object({
7446
7741
  runId: runIdSchema
7447
7742
  });
7448
- var timelineInputSchema = z2.object({
7743
+ var timelineInputSchema = z3.object({
7449
7744
  project: projectNameSchema,
7450
- location: z2.string().optional().describe("Location label. Use an empty string for locationless results."),
7451
- limit: z2.number().int().positive().max(100).optional().describe("Restrict history to the most recent N project runs.")
7745
+ location: z3.string().optional().describe("Location label. Use an empty string for locationless results."),
7746
+ limit: z3.number().int().positive().max(100).optional().describe("Restrict history to the most recent N project runs.")
7452
7747
  });
7453
7748
  var historyFilterShape = {
7454
- limit: z2.number().int().positive().max(500).optional(),
7455
- offset: z2.number().int().nonnegative().optional(),
7456
- since: z2.string().optional().describe("ISO 8601 lower bound."),
7457
- action: z2.string().optional().describe("Exact audit action filter."),
7458
- actor: z2.string().optional().describe("Exact actor filter."),
7459
- entityType: z2.string().optional().describe("Exact entity type filter.")
7460
- };
7461
- var projectHistoryInputSchema = z2.object({ project: projectNameSchema, ...historyFilterShape });
7462
- var globalHistoryInputSchema = z2.object(historyFilterShape);
7463
- var snapshotsListInputSchema = z2.object({
7749
+ limit: z3.number().int().positive().max(500).optional(),
7750
+ offset: z3.number().int().nonnegative().optional(),
7751
+ since: z3.string().optional().describe("ISO 8601 lower bound."),
7752
+ action: z3.string().optional().describe("Exact audit action filter."),
7753
+ actor: z3.string().optional().describe("Exact actor filter."),
7754
+ entityType: z3.string().optional().describe("Exact entity type filter.")
7755
+ };
7756
+ var projectHistoryInputSchema = z3.object({ project: projectNameSchema, ...historyFilterShape });
7757
+ var globalHistoryInputSchema = z3.object(historyFilterShape);
7758
+ var snapshotsListInputSchema = z3.object({
7464
7759
  project: projectNameSchema,
7465
- limit: z2.number().int().positive().max(500).optional(),
7466
- offset: z2.number().int().nonnegative().optional(),
7467
- location: z2.string().optional().describe("Location label. Use an empty string for locationless results.")
7760
+ limit: z3.number().int().positive().max(500).optional(),
7761
+ offset: z3.number().int().nonnegative().optional(),
7762
+ location: z3.string().optional().describe("Location label. Use an empty string for locationless results.")
7468
7763
  });
7469
- var snapshotsDiffInputSchema = z2.object({
7764
+ var snapshotsDiffInputSchema = z3.object({
7470
7765
  project: projectNameSchema,
7471
7766
  run1: runIdSchema,
7472
7767
  run2: runIdSchema
7473
7768
  });
7474
- var insightsListInputSchema = z2.object({
7769
+ var insightsListInputSchema = z3.object({
7475
7770
  project: projectNameSchema,
7476
- dismissed: z2.boolean().optional(),
7771
+ dismissed: z3.boolean().optional(),
7477
7772
  runId: runIdSchema.optional()
7478
7773
  });
7479
- var insightInputSchema = z2.object({
7774
+ var insightInputSchema = z3.object({
7480
7775
  project: projectNameSchema,
7481
7776
  insightId: insightIdSchema
7482
7777
  });
7483
- var healthHistoryInputSchema = z2.object({
7778
+ var healthHistoryInputSchema = z3.object({
7484
7779
  project: projectNameSchema,
7485
- limit: z2.number().int().positive().max(100).optional()
7780
+ limit: z3.number().int().positive().max(100).optional()
7486
7781
  });
7487
- var gscPerformanceInputSchema = z2.object({
7782
+ var gscPerformanceInputSchema = z3.object({
7488
7783
  project: projectNameSchema,
7489
- startDate: z2.string().optional(),
7490
- endDate: z2.string().optional(),
7491
- query: z2.string().optional(),
7492
- page: z2.string().optional(),
7493
- limit: z2.number().int().positive().max(5e3).optional(),
7494
- offset: z2.number().int().nonnegative().optional(),
7784
+ startDate: z3.string().optional(),
7785
+ endDate: z3.string().optional(),
7786
+ query: z3.string().optional(),
7787
+ page: z3.string().optional(),
7788
+ limit: z3.number().int().positive().max(5e3).optional(),
7789
+ offset: z3.number().int().nonnegative().optional(),
7495
7790
  orderBy: gscPerformanceOrderBySchema.optional(),
7496
7791
  window: analyticsWindowSchema.optional()
7497
7792
  });
7498
- var gscPerformanceDailyInputSchema = z2.object({
7793
+ var gscPerformanceDailyInputSchema = z3.object({
7499
7794
  project: projectNameSchema,
7500
- startDate: z2.string().optional(),
7501
- endDate: z2.string().optional(),
7795
+ startDate: z3.string().optional(),
7796
+ endDate: z3.string().optional(),
7502
7797
  window: analyticsWindowSchema.optional()
7503
7798
  });
7504
- var gscTopPagesInputSchema = z2.object({
7799
+ var gscTopPagesInputSchema = z3.object({
7505
7800
  project: projectNameSchema,
7506
- startDate: z2.string().optional(),
7507
- endDate: z2.string().optional(),
7508
- limit: z2.number().int().positive().max(500).optional(),
7801
+ startDate: z3.string().optional(),
7802
+ endDate: z3.string().optional(),
7803
+ limit: z3.number().int().positive().max(500).optional(),
7509
7804
  window: analyticsWindowSchema.optional()
7510
7805
  });
7511
- var gscInspectionsInputSchema = z2.object({
7806
+ var gscInspectionsInputSchema = z3.object({
7512
7807
  project: projectNameSchema,
7513
- url: z2.string().optional(),
7514
- limit: z2.number().int().positive().max(500).optional()
7808
+ url: z3.string().optional(),
7809
+ limit: z3.number().int().positive().max(500).optional()
7515
7810
  });
7516
- var gscCoverageHistoryInputSchema = z2.object({
7811
+ var gscCoverageHistoryInputSchema = z3.object({
7517
7812
  project: projectNameSchema,
7518
- limit: z2.number().int().positive().max(500).optional()
7813
+ limit: z3.number().int().positive().max(500).optional()
7519
7814
  });
7520
- var gscSitemapsInputSchema = z2.object({
7815
+ var gscSitemapsInputSchema = z3.object({
7521
7816
  project: projectNameSchema,
7522
- sitemapIndex: z2.string().url().optional()
7817
+ sitemapIndex: z3.string().url().optional()
7523
7818
  });
7524
- var gscSitemapsSubmitInputSchema = z2.union([
7525
- z2.object({
7819
+ var gscSitemapsSubmitInputSchema = z3.union([
7820
+ z3.object({
7526
7821
  project: projectNameSchema,
7527
- sitemapUrls: z2.array(z2.string().url()).min(1).max(50)
7822
+ sitemapUrls: z3.array(z3.string().url()).min(1).max(50)
7528
7823
  }).strict(),
7529
- z2.object({
7824
+ z3.object({
7530
7825
  project: projectNameSchema,
7531
- mode: z2.enum(["indexes", "all-files"])
7826
+ mode: z3.enum(["indexes", "all-files"])
7532
7827
  }).strict()
7533
7828
  ]);
7534
7829
  async function submitGscSitemapsFromMcp(client2, input) {
@@ -7603,82 +7898,82 @@ async function submitGscSitemapsFromMcp(client2, input) {
7603
7898
  }
7604
7899
  return aggregate;
7605
7900
  }
7606
- var gaWindowInputSchema = z2.object({
7901
+ var gaWindowInputSchema = z3.object({
7607
7902
  project: projectNameSchema,
7608
7903
  window: analyticsWindowSchema.optional(),
7609
- startDate: z2.string().optional(),
7610
- endDate: z2.string().optional()
7904
+ startDate: z3.string().optional(),
7905
+ endDate: z3.string().optional()
7611
7906
  });
7612
7907
  var GA_RANGE_PARAMS = ["window", "startDate", "endDate"];
7613
7908
  var gaTrafficInputSchema = gaWindowInputSchema.extend({
7614
- limit: z2.number().int().positive().max(500).optional()
7909
+ limit: z3.number().int().positive().max(500).optional()
7615
7910
  });
7616
- var gaMeasurementAnalysisInputSchema = z2.object({
7911
+ var gaMeasurementAnalysisInputSchema = z3.object({
7617
7912
  project: projectNameSchema,
7618
7913
  window: gaMeasurementAnalysisWindowSchema.optional(),
7619
7914
  hostScope: gaMeasurementHostScopeSchema.optional(),
7620
- pathPrefix: z2.string().min(1).optional(),
7621
- limit: z2.number().int().positive().max(100).optional()
7915
+ pathPrefix: z3.string().min(1).optional(),
7916
+ limit: z3.number().int().positive().max(100).optional()
7622
7917
  });
7623
- var queriesInputSchema = z2.object({
7918
+ var queriesInputSchema = z3.object({
7624
7919
  project: projectNameSchema,
7625
7920
  request: queryBatchRequestSchema
7626
7921
  });
7627
- var queryGenerateInputSchema = z2.object({
7922
+ var queryGenerateInputSchema = z3.object({
7628
7923
  project: projectNameSchema,
7629
7924
  request: queryGenerateRequestSchema
7630
7925
  });
7631
- var gbpListLocationsInputSchema = z2.object({
7926
+ var gbpListLocationsInputSchema = z3.object({
7632
7927
  project: projectNameSchema,
7633
- selected: z2.boolean().optional()
7928
+ selected: z3.boolean().optional()
7634
7929
  });
7635
- var gbpDiscoverInputSchema = z2.object({
7930
+ var gbpDiscoverInputSchema = z3.object({
7636
7931
  project: projectNameSchema,
7637
- selectAllNew: z2.boolean().optional().default(true),
7638
- accountName: z2.string().regex(/^accounts\//, 'accountName must be a Google resource name like "accounts/12345"').optional(),
7639
- switchAccount: z2.boolean().optional().default(false)
7932
+ selectAllNew: z3.boolean().optional().default(true),
7933
+ accountName: z3.string().regex(/^accounts\//, 'accountName must be a Google resource name like "accounts/12345"').optional(),
7934
+ switchAccount: z3.boolean().optional().default(false)
7640
7935
  });
7641
- var gbpLocationSelectionInputSchema = z2.object({
7936
+ var gbpLocationSelectionInputSchema = z3.object({
7642
7937
  project: projectNameSchema,
7643
- locationName: z2.string().min(1).regex(/^locations\//, 'locationName must be a Google resource name like "locations/12345"'),
7644
- selected: z2.boolean()
7938
+ locationName: z3.string().min(1).regex(/^locations\//, 'locationName must be a Google resource name like "locations/12345"'),
7939
+ selected: z3.boolean()
7645
7940
  });
7646
- var gbpSyncInputSchema = z2.object({
7941
+ var gbpSyncInputSchema = z3.object({
7647
7942
  project: projectNameSchema,
7648
- locationNames: z2.array(z2.string()).optional(),
7649
- daysOfMetrics: z2.number().int().positive().max(540).optional(),
7650
- monthsOfKeywords: z2.number().int().positive().max(18).optional()
7943
+ locationNames: z3.array(z3.string()).optional(),
7944
+ daysOfMetrics: z3.number().int().positive().max(540).optional(),
7945
+ monthsOfKeywords: z3.number().int().positive().max(18).optional()
7651
7946
  });
7652
- var gbpMetricsInputSchema = z2.object({
7947
+ var gbpMetricsInputSchema = z3.object({
7653
7948
  project: projectNameSchema,
7654
- locationName: z2.string().optional(),
7655
- metric: z2.string().optional()
7949
+ locationName: z3.string().optional(),
7950
+ metric: z3.string().optional()
7656
7951
  });
7657
- var gbpLocationScopedInputSchema = z2.object({
7952
+ var gbpLocationScopedInputSchema = z3.object({
7658
7953
  project: projectNameSchema,
7659
- locationName: z2.string().optional()
7954
+ locationName: z3.string().optional()
7660
7955
  });
7661
- var gbpAccountsInputSchema = z2.object({
7956
+ var gbpAccountsInputSchema = z3.object({
7662
7957
  project: projectNameSchema
7663
7958
  });
7664
- var adsInsightsInputSchema = z2.object({
7959
+ var adsInsightsInputSchema = z3.object({
7665
7960
  project: projectNameSchema,
7666
- level: z2.enum(["campaign", "ad_group"]).optional(),
7667
- entityId: z2.string().optional(),
7668
- from: z2.string().optional(),
7669
- to: z2.string().optional()
7961
+ level: z3.enum(["campaign", "ad_group"]).optional(),
7962
+ entityId: z3.string().optional(),
7963
+ from: z3.string().optional(),
7964
+ to: z3.string().optional()
7670
7965
  });
7671
7966
  var adsGeoSearchInputSchema = adsGeoSearchQuerySchema.extend({
7672
7967
  project: projectNameSchema
7673
7968
  });
7674
- var adsLiveDeliveryInputSchema = z2.object({
7969
+ var adsLiveDeliveryInputSchema = z3.object({
7675
7970
  project: projectNameSchema,
7676
- campaignId: z2.string().min(1).max(200).optional(),
7677
- lookbackDays: z2.number().int().min(1).max(30).optional()
7971
+ campaignId: z3.string().min(1).max(200).optional(),
7972
+ lookbackDays: z3.number().int().min(1).max(30).optional()
7678
7973
  });
7679
- var adsOperationInputSchema = z2.object({
7974
+ var adsOperationInputSchema = z3.object({
7680
7975
  project: projectNameSchema,
7681
- operationKey: z2.string().min(8).max(128)
7976
+ operationKey: z3.string().min(8).max(128)
7682
7977
  });
7683
7978
  var adsOperationResumeActivationInputSchema = adsOperationInputSchema.strict();
7684
7979
  var adsUnresolvedOperationsInputSchema = adsUnresolvedOperationListQuerySchema.extend({
@@ -7686,238 +7981,238 @@ var adsUnresolvedOperationsInputSchema = adsUnresolvedOperationListQuerySchema.e
7686
7981
  });
7687
7982
  var adsOperationReconcileInputSchema = adsOperationReconcileRequestSchema.extend({
7688
7983
  project: projectNameSchema,
7689
- operationKey: z2.string().min(8).max(128)
7984
+ operationKey: z3.string().min(8).max(128)
7690
7985
  });
7691
- var adsImageUploadInputSchema = z2.object({
7986
+ var adsImageUploadInputSchema = z3.object({
7692
7987
  project: projectNameSchema,
7693
7988
  request: adsImageUploadRequestSchema
7694
7989
  });
7695
- var adsCampaignCreateInputSchema = z2.object({
7990
+ var adsCampaignCreateInputSchema = z3.object({
7696
7991
  project: projectNameSchema,
7697
7992
  request: adsCampaignCreateRequestSchema
7698
7993
  });
7699
- var adsCampaignUpdateInputSchema = z2.object({
7994
+ var adsCampaignUpdateInputSchema = z3.object({
7700
7995
  project: projectNameSchema,
7701
- campaignId: z2.string().min(1),
7996
+ campaignId: z3.string().min(1),
7702
7997
  request: adsCampaignUpdateRequestSchema
7703
7998
  });
7704
- var adsCampaignActivateTreeInputSchema = z2.object({
7999
+ var adsCampaignActivateTreeInputSchema = z3.object({
7705
8000
  project: projectNameSchema,
7706
- campaignId: z2.string().min(1),
8001
+ campaignId: z3.string().min(1),
7707
8002
  request: adsActivateTreeRequestSchema
7708
8003
  });
7709
- var adsCampaignPauseInputSchema = z2.object({
8004
+ var adsCampaignPauseInputSchema = z3.object({
7710
8005
  project: projectNameSchema,
7711
- campaignId: z2.string().min(1),
8006
+ campaignId: z3.string().min(1),
7712
8007
  request: adsPauseRequestSchema
7713
8008
  });
7714
- var adsAdGroupCreateInputSchema = z2.object({
8009
+ var adsAdGroupCreateInputSchema = z3.object({
7715
8010
  project: projectNameSchema,
7716
8011
  request: adsAdGroupCreateRequestSchema
7717
8012
  });
7718
- var adsAdGroupUpdateInputSchema = z2.object({
8013
+ var adsAdGroupUpdateInputSchema = z3.object({
7719
8014
  project: projectNameSchema,
7720
- adGroupId: z2.string().min(1),
8015
+ adGroupId: z3.string().min(1),
7721
8016
  request: adsAdGroupUpdateRequestSchema
7722
8017
  });
7723
- var adsAdGroupPauseInputSchema = z2.object({
8018
+ var adsAdGroupPauseInputSchema = z3.object({
7724
8019
  project: projectNameSchema,
7725
- adGroupId: z2.string().min(1),
8020
+ adGroupId: z3.string().min(1),
7726
8021
  request: adsPauseRequestSchema
7727
8022
  });
7728
- var adsAdCreateInputSchema = z2.object({
8023
+ var adsAdCreateInputSchema = z3.object({
7729
8024
  project: projectNameSchema,
7730
8025
  request: adsAdCreateRequestSchema
7731
8026
  });
7732
- var adsAdUpdateInputSchema = z2.object({
8027
+ var adsAdUpdateInputSchema = z3.object({
7733
8028
  project: projectNameSchema,
7734
- adId: z2.string().min(1),
8029
+ adId: z3.string().min(1),
7735
8030
  request: adsAdUpdateRequestSchema
7736
8031
  });
7737
- var adsAdPauseInputSchema = z2.object({
8032
+ var adsAdPauseInputSchema = z3.object({
7738
8033
  project: projectNameSchema,
7739
- adId: z2.string().min(1),
8034
+ adId: z3.string().min(1),
7740
8035
  request: adsPauseRequestSchema
7741
8036
  });
7742
- var keywordsInputSchema = z2.object({
8037
+ var keywordsInputSchema = z3.object({
7743
8038
  project: projectNameSchema,
7744
8039
  request: keywordBatchRequestSchema
7745
8040
  });
7746
- var keywordGenerateInputSchema = z2.object({
8041
+ var keywordGenerateInputSchema = z3.object({
7747
8042
  project: projectNameSchema,
7748
8043
  request: keywordGenerateRequestSchema
7749
8044
  });
7750
- var competitorsInputSchema = z2.object({
8045
+ var competitorsInputSchema = z3.object({
7751
8046
  project: projectNameSchema,
7752
8047
  request: competitorBatchRequestSchema
7753
8048
  });
7754
- var projectUpsertInputSchema = z2.object({
8049
+ var projectUpsertInputSchema = z3.object({
7755
8050
  project: projectNameSchema,
7756
8051
  request: projectUpsertRequestSchema
7757
8052
  });
7758
- var applyConfigInputSchema = z2.object({
8053
+ var applyConfigInputSchema = z3.object({
7759
8054
  config: projectConfigSchema
7760
8055
  });
7761
- var scheduleSetInputSchema = z2.object({
8056
+ var scheduleSetInputSchema = z3.object({
7762
8057
  project: projectNameSchema,
7763
8058
  schedule: scheduleUpsertRequestSchema
7764
8059
  });
7765
- var scheduleReadInputSchema = z2.object({
8060
+ var scheduleReadInputSchema = z3.object({
7766
8061
  project: projectNameSchema,
7767
8062
  kind: schedulableRunKindSchema.optional().describe('Schedulable run kind. Defaults to "answer-visibility" if omitted.')
7768
8063
  });
7769
- var agentWebhookAttachInputSchema = z2.object({
8064
+ var agentWebhookAttachInputSchema = z3.object({
7770
8065
  project: projectNameSchema,
7771
- url: z2.string().url()
8066
+ url: z3.string().url()
7772
8067
  });
7773
- var doctorInputSchema = z2.object({
8068
+ var doctorInputSchema = z3.object({
7774
8069
  project: projectNameSchema.optional().describe("Project name to scope project-level checks. Omit to run global checks (provider keys, config, etc.)."),
7775
- checks: z2.array(z2.string().min(1)).optional().describe('Optional check IDs or wildcard prefixes (e.g. "google.auth.*", "config.providers"). Empty/omitted runs all matching checks for the chosen scope.')
8070
+ checks: z3.array(z3.string().min(1)).optional().describe('Optional check IDs or wildcard prefixes (e.g. "google.auth.*", "config.providers"). Empty/omitted runs all matching checks for the chosen scope.')
7776
8071
  });
7777
- var contentTargetsInputSchema = z2.object({
8072
+ var contentTargetsInputSchema = z3.object({
7778
8073
  project: projectNameSchema,
7779
- limit: z2.number().int().positive().max(500).optional().describe("Max rows. Defaults to all. Use a small number (3-10) when summarizing for the user."),
7780
- includeInProgress: z2.boolean().optional().describe("Include rows that already have an in-flight tracked action. Default false."),
7781
- winnabilityClass: z2.enum(["ownable", "ceded"]).optional().describe('Filter by winnability: "ownable" (worth a brief) or "ceded" (aggregator/editorial head term to skip).'),
7782
- ownable: z2.boolean().optional().describe('Convenience: when true, return only ownable targets (same as winnabilityClass="ownable").')
8074
+ limit: z3.number().int().positive().max(500).optional().describe("Max rows. Defaults to all. Use a small number (3-10) when summarizing for the user."),
8075
+ includeInProgress: z3.boolean().optional().describe("Include rows that already have an in-flight tracked action. Default false."),
8076
+ winnabilityClass: z3.enum(["ownable", "ceded"]).optional().describe('Filter by winnability: "ownable" (worth a brief) or "ceded" (aggregator/editorial head term to skip).'),
8077
+ ownable: z3.boolean().optional().describe('Convenience: when true, return only ownable targets (same as winnabilityClass="ownable").')
7783
8078
  });
7784
- var contentBriefInputSchema = z2.object({
8079
+ var contentBriefInputSchema = z3.object({
7785
8080
  project: projectNameSchema,
7786
- targetRef: z2.string().min(1).describe("Stable target ref from canonry_content_targets. The target must be ownable; ceded targets are rejected."),
7787
- provider: z2.string().optional().describe("Optional provider override (claude|openai|gemini|zai|deepinfra)."),
7788
- model: z2.string().optional().describe("Optional model override within the chosen provider."),
7789
- forceRefresh: z2.boolean().optional().describe("Force a fresh synthesis even if a cached brief exists.")
8081
+ targetRef: z3.string().min(1).describe("Stable target ref from canonry_content_targets. The target must be ownable; ceded targets are rejected."),
8082
+ provider: z3.string().optional().describe("Optional provider override (claude|openai|gemini|zai|deepinfra)."),
8083
+ model: z3.string().optional().describe("Optional model override within the chosen provider."),
8084
+ forceRefresh: z3.boolean().optional().describe("Force a fresh synthesis even if a cached brief exists.")
7790
8085
  });
7791
- var contentMapInputSchema = z2.object({
8086
+ var contentMapInputSchema = z3.object({
7792
8087
  project: projectNameSchema
7793
8088
  });
7794
- var backlinksDomainsInputSchema = z2.object({
8089
+ var backlinksDomainsInputSchema = z3.object({
7795
8090
  project: projectNameSchema,
7796
- limit: z2.number().int().positive().max(200).optional().describe("Max linking-domain rows. Default 50, max 200."),
7797
- release: z2.string().optional().describe("Common Crawl release id, e.g. cc-main-2026-jan-feb-mar. Omit for the most recent release with data."),
8091
+ limit: z3.number().int().positive().max(200).optional().describe("Max linking-domain rows. Default 50, max 200."),
8092
+ release: z3.string().optional().describe("Common Crawl release id, e.g. cc-main-2026-jan-feb-mar. Omit for the most recent release with data."),
7798
8093
  source: backlinkSourceSchema.optional().describe("Stored source. Common Crawl is active; bing-webmaster is historical-only.")
7799
8094
  });
7800
- var backlinksSourcesInputSchema = z2.object({
8095
+ var backlinksSourcesInputSchema = z3.object({
7801
8096
  project: projectNameSchema
7802
8097
  });
7803
- var memoryUpsertInputSchema = z2.object({
8098
+ var memoryUpsertInputSchema = z3.object({
7804
8099
  project: projectNameSchema,
7805
- key: z2.string().min(1).max(AGENT_MEMORY_KEY_MAX_LENGTH).describe(`Stable identifier for the note (max ${AGENT_MEMORY_KEY_MAX_LENGTH} chars). Writing the same key overwrites the prior value.`),
7806
- value: z2.string().min(1).describe(`Plain-text note body (max ${AGENT_MEMORY_VALUE_MAX_BYTES} bytes). Use for durable operator preferences, migration context, or non-obvious reasoning that should survive future sessions.`)
8100
+ key: z3.string().min(1).max(AGENT_MEMORY_KEY_MAX_LENGTH).describe(`Stable identifier for the note (max ${AGENT_MEMORY_KEY_MAX_LENGTH} chars). Writing the same key overwrites the prior value.`),
8101
+ value: z3.string().min(1).describe(`Plain-text note body (max ${AGENT_MEMORY_VALUE_MAX_BYTES} bytes). Use for durable operator preferences, migration context, or non-obvious reasoning that should survive future sessions.`)
7807
8102
  });
7808
- var memoryForgetInputSchema = z2.object({
8103
+ var memoryForgetInputSchema = z3.object({
7809
8104
  project: projectNameSchema,
7810
- key: z2.string().min(1).max(AGENT_MEMORY_KEY_MAX_LENGTH).describe("Exact key of the note to remove. No-op (status=missing) when no note exists for that key.")
8105
+ key: z3.string().min(1).max(AGENT_MEMORY_KEY_MAX_LENGTH).describe("Exact key of the note to remove. No-op (status=missing) when no note exists for that key.")
7811
8106
  });
7812
- var trafficConnectCloudRunInputSchema = z2.object({
8107
+ var trafficConnectCloudRunInputSchema = z3.object({
7813
8108
  project: projectNameSchema,
7814
8109
  request: trafficConnectCloudRunRequestSchema
7815
8110
  });
7816
- var trafficConnectWordpressInputSchema = z2.object({
8111
+ var trafficConnectWordpressInputSchema = z3.object({
7817
8112
  project: projectNameSchema,
7818
8113
  request: trafficConnectWordpressRequestSchema
7819
8114
  });
7820
- var trafficConnectVercelInputSchema = z2.object({
8115
+ var trafficConnectVercelInputSchema = z3.object({
7821
8116
  project: projectNameSchema,
7822
8117
  request: trafficConnectVercelRequestSchema
7823
8118
  });
7824
- var trafficSyncInputSchema = z2.object({
8119
+ var trafficSyncInputSchema = z3.object({
7825
8120
  project: projectNameSchema,
7826
- sourceId: z2.string().min(1).describe("Traffic source ID returned by canonry_traffic_connect_cloud_run or canonry_traffic_sources_list."),
7827
- sinceMinutes: z2.number().int().positive().max(7 * 24 * 60).optional().describe("Lookback window in minutes. Defaults to the source's configured window (60 min) when omitted; clamped forward to lastSyncedAt to avoid double-counting.")
8121
+ sourceId: z3.string().min(1).describe("Traffic source ID returned by canonry_traffic_connect_cloud_run or canonry_traffic_sources_list."),
8122
+ sinceMinutes: z3.number().int().positive().max(7 * 24 * 60).optional().describe("Lookback window in minutes. Defaults to the source's configured window (60 min) when omitted; clamped forward to lastSyncedAt to avoid double-counting.")
7828
8123
  });
7829
- var trafficBackfillInputSchema = z2.object({
8124
+ var trafficBackfillInputSchema = z3.object({
7830
8125
  project: projectNameSchema,
7831
- sourceId: z2.string().min(1).describe("Traffic source ID returned by canonry_traffic_sources_list."),
7832
- days: z2.number().int().positive().max(30).optional().describe("Lookback window in days. Default 30, capped server-side at the upstream log retention ceiling (Cloud Logging _Default = 30d).")
8126
+ sourceId: z3.string().min(1).describe("Traffic source ID returned by canonry_traffic_sources_list."),
8127
+ days: z3.number().int().positive().max(30).optional().describe("Lookback window in days. Default 30, capped server-side at the upstream log retention ceiling (Cloud Logging _Default = 30d).")
7833
8128
  });
7834
- var trafficResetInputSchema = z2.object({
8129
+ var trafficResetInputSchema = z3.object({
7835
8130
  project: projectNameSchema,
7836
- sourceId: z2.string().min(1).describe("Traffic source ID returned by canonry_traffic_sources_list."),
7837
- advanceToNow: z2.literal(true).describe("Must be `true`. Explicit gate against accidental resets. Advances lastSyncedAt to NOW and clears the source's error state.")
8131
+ sourceId: z3.string().min(1).describe("Traffic source ID returned by canonry_traffic_sources_list."),
8132
+ advanceToNow: z3.literal(true).describe("Must be `true`. Explicit gate against accidental resets. Advances lastSyncedAt to NOW and clears the source's error state.")
7838
8133
  });
7839
- var trafficEventsInputSchema = z2.object({
8134
+ var trafficEventsInputSchema = z3.object({
7840
8135
  project: projectNameSchema,
7841
- since: z2.string().optional().describe("ISO 8601 lower bound. Defaults to 24h ago when omitted."),
7842
- until: z2.string().optional().describe("ISO 8601 upper bound. Defaults to now when omitted."),
7843
- kind: z2.union([trafficEventKindSchema, z2.literal("all")]).optional().describe('Filter to one traffic kind; "all" (default) returns every kind.'),
7844
- sourceId: z2.string().min(1).optional().describe("Restrict to a single traffic source ID."),
7845
- limit: z2.number().int().positive().max(5e3).optional().describe("Max combined rows. Defaults to 500, max 5000. Totals always reflect the full window."),
8136
+ since: z3.string().optional().describe("ISO 8601 lower bound. Defaults to 24h ago when omitted."),
8137
+ until: z3.string().optional().describe("ISO 8601 upper bound. Defaults to now when omitted."),
8138
+ kind: z3.union([trafficEventKindSchema, z3.literal("all")]).optional().describe('Filter to one traffic kind; "all" (default) returns every kind.'),
8139
+ sourceId: z3.string().min(1).optional().describe("Restrict to a single traffic source ID."),
8140
+ limit: z3.number().int().positive().max(5e3).optional().describe("Max combined rows. Defaults to 500, max 5000. Totals always reflect the full window."),
7846
8141
  granularity: trafficSeriesGranularitySchema.optional().describe("Full-window chart series bucket size: hour (default) or day.")
7847
8142
  });
7848
- var trafficSourceIdInputSchema = z2.object({
8143
+ var trafficSourceIdInputSchema = z3.object({
7849
8144
  project: projectNameSchema,
7850
- sourceId: z2.string().min(1).describe("Traffic source ID.")
8145
+ sourceId: z3.string().min(1).describe("Traffic source ID.")
7851
8146
  });
7852
- var discoveryRunInputSchema = z2.object({
8147
+ var discoveryRunInputSchema = z3.object({
7853
8148
  project: projectNameSchema,
7854
8149
  request: discoveryRunRequestSchema.extend({
7855
8150
  // Stronger descriptions for the LLM. The base Zod schema enforces the
7856
8151
  // upper bound; this just clarifies the meaning of each knob.
7857
- icpDescription: z2.string().min(1).optional().describe("Free-text ICP description. If omitted, the project must already have spec.icpDescription stored."),
7858
- buyerDescription: z2.string().min(1).optional().describe("Who evaluates or buys the offering, separate from the ICP. When present, every generated query is anchored on this buyer."),
7859
- seedProviders: z2.array(z2.enum(["gemini", "openai"])).min(1).optional().describe('Which providers generate seed candidates. Omit for the Gemini-only default; ["gemini","openai"] merges both phrasing distributions before dedup.'),
7860
- dedupThreshold: z2.number().min(0).max(1).optional().describe("Cosine similarity threshold for clustering seed candidates. Defaults to 0.85. Lower values dedupe more aggressively."),
7861
- maxProbes: z2.number().int().positive().max(DISCOVERY_MAX_PROBES_CAP).optional().describe(`Max canonical queries to probe in this session. Default 100, hard cap ${DISCOVERY_MAX_PROBES_CAP}.`),
7862
- probeConcurrency: z2.number().int().min(1).max(DISCOVERY_PROBE_CONCURRENCY_CAP).optional().describe(`How many probes may run in parallel. Default 1 (strictly serial), hard cap ${DISCOVERY_PROBE_CONCURRENCY_CAP}. Probe rows are persisted in canonical order regardless of concurrency, so this only shortens wall-clock time.`)
8152
+ icpDescription: z3.string().min(1).optional().describe("Free-text ICP description. If omitted, the project must already have spec.icpDescription stored."),
8153
+ buyerDescription: z3.string().min(1).optional().describe("Who evaluates or buys the offering, separate from the ICP. When present, every generated query is anchored on this buyer."),
8154
+ seedProviders: z3.array(z3.enum(["gemini", "openai"])).min(1).optional().describe('Which providers generate seed candidates. Omit for the Gemini-only default; ["gemini","openai"] merges both phrasing distributions before dedup.'),
8155
+ dedupThreshold: z3.number().min(0).max(1).optional().describe("Cosine similarity threshold for clustering seed candidates. Defaults to 0.85. Lower values dedupe more aggressively."),
8156
+ maxProbes: z3.number().int().positive().max(DISCOVERY_MAX_PROBES_CAP).optional().describe(`Max canonical queries to probe in this session. Default 100, hard cap ${DISCOVERY_MAX_PROBES_CAP}.`),
8157
+ probeConcurrency: z3.number().int().min(1).max(DISCOVERY_PROBE_CONCURRENCY_CAP).optional().describe(`How many probes may run in parallel. Default 1 (strictly serial), hard cap ${DISCOVERY_PROBE_CONCURRENCY_CAP}. Probe rows are persisted in canonical order regardless of concurrency, so this only shortens wall-clock time.`)
7863
8158
  }).optional()
7864
8159
  });
7865
- var discoverySessionsListInputSchema = z2.object({
8160
+ var discoverySessionsListInputSchema = z3.object({
7866
8161
  project: projectNameSchema,
7867
- limit: z2.number().int().positive().max(200).optional().describe("Max sessions returned. Default 50.")
8162
+ limit: z3.number().int().positive().max(200).optional().describe("Max sessions returned. Default 50.")
7868
8163
  });
7869
- var discoverySessionIdInputSchema = z2.object({
8164
+ var discoverySessionIdInputSchema = z3.object({
7870
8165
  project: projectNameSchema,
7871
- sessionId: z2.string().min(1).describe("Discovery session ID returned by canonry_discover_run_start.")
8166
+ sessionId: z3.string().min(1).describe("Discovery session ID returned by canonry_discover_run_start.")
7872
8167
  });
7873
- var researchRunStartInputSchema = z2.object({
8168
+ var researchRunStartInputSchema = z3.object({
7874
8169
  project: projectNameSchema,
7875
8170
  request: researchRunCreateSchema.describe("One shared provider/model/location context for every free-form query in this saved research batch.")
7876
8171
  });
7877
- var researchRunsListInputSchema = z2.object({
8172
+ var researchRunsListInputSchema = z3.object({
7878
8173
  project: projectNameSchema,
7879
- limit: z2.number().int().positive().max(100).optional().describe("Max saved research runs returned. Default 20.")
8174
+ limit: z3.number().int().positive().max(100).optional().describe("Max saved research runs returned. Default 20.")
7880
8175
  });
7881
- var researchRunIdInputSchema = z2.object({
8176
+ var researchRunIdInputSchema = z3.object({
7882
8177
  project: projectNameSchema,
7883
- runId: z2.string().min(1).describe("Research run ID returned by canonry_research_run_start.")
8178
+ runId: z3.string().min(1).describe("Research run ID returned by canonry_research_run_start.")
7884
8179
  });
7885
- var discoveryHarvestInputSchema = z2.object({
8180
+ var discoveryHarvestInputSchema = z3.object({
7886
8181
  project: projectNameSchema,
7887
- sessionId: z2.string().min(1).describe("Discovery session ID returned by canonry_discover_run_start."),
7888
- minProbeHits: z2.number().int().positive().optional().describe("Recurrence floor \u2014 a candidate must have appeared in at least this many distinct probes to be admitted. Default 1."),
7889
- anchor: z2.boolean().optional().describe("Apply the subject-anchor filter that drops off-topic acronym collisions. Default true; pass false for new-subject discovery on a well-scoped project.")
8182
+ sessionId: z3.string().min(1).describe("Discovery session ID returned by canonry_discover_run_start."),
8183
+ minProbeHits: z3.number().int().positive().optional().describe("Recurrence floor \u2014 a candidate must have appeared in at least this many distinct probes to be admitted. Default 1."),
8184
+ anchor: z3.boolean().optional().describe("Apply the subject-anchor filter that drops off-topic acronym collisions. Default true; pass false for new-subject discovery on a well-scoped project.")
7890
8185
  });
7891
- var discoveryPromoteInputSchema = z2.object({
8186
+ var discoveryPromoteInputSchema = z3.object({
7892
8187
  project: projectNameSchema,
7893
- sessionId: z2.string().min(1).describe("Discovery session ID returned by canonry_discover_run_start."),
8188
+ sessionId: z3.string().min(1).describe("Discovery session ID returned by canonry_discover_run_start."),
7894
8189
  request: discoveryPromoteRequestSchema.extend({
7895
8190
  // Stronger descriptions for the LLM. The base Zod schema enforces the shape.
7896
- buckets: z2.array(discoveryBucketSchema).min(1).optional().describe("Which probe buckets to adopt into the tracked basket. Omitted promotes cited + aspirational; include wasted-surface explicitly for off-ICP competitor gaps."),
7897
- includeCompetitors: z2.boolean().optional().describe("Whether to also merge recurring discovered competitor domains into the project. Defaults to true."),
7898
- competitorTypes: z2.array(discoveryCompetitorTypeSchema).min(1).optional().describe("Which classified competitor types to merge. Omitted promotes direct-competitor only; pass an explicit list to also adopt editorial-media channels or to recover legacy unknown entries. Ignored when includeCompetitors is false.")
8191
+ buckets: z3.array(discoveryBucketSchema).min(1).optional().describe("Which probe buckets to adopt into the tracked basket. Omitted promotes cited + aspirational; include wasted-surface explicitly for off-ICP competitor gaps."),
8192
+ includeCompetitors: z3.boolean().optional().describe("Whether to also merge recurring discovered competitor domains into the project. Defaults to true."),
8193
+ competitorTypes: z3.array(discoveryCompetitorTypeSchema).min(1).optional().describe("Which classified competitor types to merge. Omitted promotes direct-competitor only; pass an explicit list to also adopt editorial-media channels or to recover legacy unknown entries. Ignored when includeCompetitors is false.")
7899
8194
  }).optional()
7900
8195
  });
7901
- var technicalAeoScoreInputSchema = z2.object({
8196
+ var technicalAeoScoreInputSchema = z3.object({
7902
8197
  project: projectNameSchema,
7903
8198
  runId: runIdSchema.optional().describe("Historical site-audit run ID. Omit for the latest audit.")
7904
8199
  });
7905
- var technicalAeoPagesInputSchema = z2.object({
8200
+ var technicalAeoPagesInputSchema = z3.object({
7906
8201
  project: projectNameSchema,
7907
8202
  runId: runIdSchema.optional().describe("Historical site-audit run ID. Omit for the latest audit."),
7908
- status: z2.enum(["success", "error"]).optional().describe("Filter to successfully-audited or errored pages."),
7909
- sort: z2.enum(["score-asc", "score-desc", "url"]).optional().describe("Sort order. Defaults to score-asc (worst pages first)."),
7910
- limit: z2.number().int().positive().max(500).optional(),
7911
- offset: z2.number().int().nonnegative().optional()
8203
+ status: z3.enum(["success", "error"]).optional().describe("Filter to successfully-audited or errored pages."),
8204
+ sort: z3.enum(["score-asc", "score-desc", "url"]).optional().describe("Sort order. Defaults to score-asc (worst pages first)."),
8205
+ limit: z3.number().int().positive().max(500).optional(),
8206
+ offset: z3.number().int().nonnegative().optional()
7912
8207
  });
7913
- var technicalAeoTrendInputSchema = z2.object({
8208
+ var technicalAeoTrendInputSchema = z3.object({
7914
8209
  project: projectNameSchema,
7915
- limit: z2.number().int().positive().max(365).optional()
8210
+ limit: z3.number().int().positive().max(365).optional()
7916
8211
  });
7917
- var technicalAeoRunInputSchema = z2.object({
8212
+ var technicalAeoRunInputSchema = z3.object({
7918
8213
  project: projectNameSchema,
7919
- sitemapUrl: z2.string().url().optional().describe("Override the sitemap URL. Defaults to https://<canonicalDomain>/sitemap.xml."),
7920
- limit: z2.number().int().positive().max(2e3).optional().describe("Cap pages audited (highest sitemap <priority> first).")
8214
+ 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("Cap pages audited (highest sitemap <priority> first).")
7921
8216
  });
7922
8217
  var AGENT_WEBHOOK_EVENTS = [
7923
8218
  notificationEventSchema.enum["run.completed"],
@@ -7943,7 +8238,7 @@ var canonryMcpTools = [
7943
8238
  description: "Get a Canonry project by name.",
7944
8239
  access: "read",
7945
8240
  tier: "core",
7946
- inputSchema: gscSitemapsInputSchema,
8241
+ inputSchema: projectInputSchema,
7947
8242
  annotations: readAnnotations(),
7948
8243
  openApiOperations: ["GET /api/v1/projects/{name}"],
7949
8244
  handler: (client2, input) => client2.getProject(input.project)
@@ -7965,10 +8260,10 @@ var canonryMcpTools = [
7965
8260
  description: 'One-call summary for "how is project X doing?". Returns independent mention and citation coverage, separate query-level movement for each signal, query-basket comparability with added/removed counts, latest run and health, insights, provider/model breakdowns, competitors, attention items, and recent history. Movement excludes queries not shared by both sweeps. Filterable by location and time window. Prefer this over fanning out to separate tools.',
7966
8261
  access: "read",
7967
8262
  tier: "core",
7968
- inputSchema: z2.object({
8263
+ inputSchema: z3.object({
7969
8264
  project: projectNameSchema,
7970
- location: z2.string().optional().describe('Filter to runs from this location label (e.g. "Boston, MA, US"). Omit for all locations.'),
7971
- since: z2.string().optional().describe("ISO 8601 datetime \u2014 only include runs at or after this time. Omit for full history.")
8265
+ location: z3.string().optional().describe('Filter to runs from this location label (e.g. "Boston, MA, US"). Omit for all locations.'),
8266
+ since: z3.string().optional().describe("ISO 8601 datetime \u2014 only include runs at or after this time. Omit for full history.")
7972
8267
  }),
7973
8268
  annotations: readAnnotations(),
7974
8269
  openApiOperations: ["GET /api/v1/projects/{name}/overview"],
@@ -7983,7 +8278,7 @@ var canonryMcpTools = [
7983
8278
  description: "Returns the full canonical AEO report bundle for a project \u2014 executive summary, client summary, agency diagnostics, action plan, per-query \xD7 per-provider citation matrix, competitor landscape, AI citation sources, GSC/GA4 performance, social and AI referrals, indexing health, citations trend, prioritized insights, and recommended next steps. Same payload `canonry report <project>` consumes to render audience-specific HTML. Pass `period` (7/14/30/90 days, default 30) to scope the GSC/GA4/server-activity sections and the period-over-period comparisons.",
7984
8279
  access: "read",
7985
8280
  tier: "monitoring",
7986
- inputSchema: z2.object({
8281
+ inputSchema: z3.object({
7987
8282
  project: projectNameSchema,
7988
8283
  period: reportPeriodSchema.optional()
7989
8284
  }),
@@ -7997,7 +8292,7 @@ var canonryMcpTools = [
7997
8292
  description: "One-call investigation of whether organic work is gaining visibility, traffic, or AI attention. Returns source-specific 30-day GSC and GA4 cohorts, URL-agnostic page evidence, available GA4 lead-event evidence (not lead attribution), server-observed AI crawling/user-fetch/referral evidence, the latest answer-visibility sweep, source coverage, findings, and limitations. It preserves native units. Prefer this over fanning out across GSC, GA, traffic, and visibility tools.",
7998
8293
  access: "read",
7999
8294
  tier: "monitoring",
8000
- inputSchema: z2.object({
8295
+ inputSchema: z3.object({
8001
8296
  project: projectNameSchema,
8002
8297
  period: organicEvidencePeriodSchema.optional().describe("Evidence window: 60 or 90 days (default 90).")
8003
8298
  }),
@@ -8011,7 +8306,7 @@ var canonryMcpTools = [
8011
8306
  description: "Citation and mention rates over time for a project, bucketed adaptively (daily \u2192 monthly by span) and probe-excluded. Returns overall + per-provider window aggregates AND a per-bucket `byProvider` breakdown so you can read how each engine's cited/mentioned rate moved run-over-run \u2014 the same data the dashboard's \"Citations & mentions over time\" chart plots. Includes trend direction (improving/declining/stable) for both signals and query-set-change annotations. Filter the range with `window` (7d/30d/90d/all).",
8012
8307
  access: "read",
8013
8308
  tier: "monitoring",
8014
- inputSchema: z2.object({
8309
+ inputSchema: z3.object({
8015
8310
  project: projectNameSchema,
8016
8311
  window: analyticsWindowSchema.optional().describe("Time range: 7d, 30d, 90d, or all (default all).")
8017
8312
  }),
@@ -8025,10 +8320,10 @@ var canonryMcpTools = [
8025
8320
  description: "Where AI engines get the facts they cite for a project. Returns the FULL ranked list of cited domains (not truncated) \u2014 each tagged with a category and an actionable surface class (own / direct-competitor / ota-aggregator / editorial-media / other) \u2014 plus a surface-class roll-up and a per-provider breakdown (each provider's cited-domain mix + total cited slots). The surface class is deterministic (own/competitor from project data, the rest from the source allow-list) and enriched by discovery's stored per-domain classifications when present \u2014 no new LLM calls. Probe-excluded, window-filterable (7d/30d/90d/all). Use `limit` to cap each ranked list to the top N domains (an explicit long-tail rollup preserves the totals). All counts/shares/classification are computed server-side.",
8026
8321
  access: "read",
8027
8322
  tier: "monitoring",
8028
- inputSchema: z2.object({
8323
+ inputSchema: z3.object({
8029
8324
  project: projectNameSchema,
8030
8325
  window: analyticsWindowSchema.optional().describe("Time range: 7d, 30d, 90d, or all (default all)."),
8031
- limit: z2.number().int().positive().optional().describe("Cap each ranked list to the top N domains. Omit for the full list.")
8326
+ limit: z3.number().int().positive().optional().describe("Cap each ranked list to the top N domains. Omit for the full list.")
8032
8327
  }),
8033
8328
  annotations: readAnnotations(),
8034
8329
  openApiOperations: ["GET /api/v1/projects/{name}/analytics/sources"],
@@ -8040,10 +8335,10 @@ var canonryMcpTools = [
8040
8335
  description: "Search query snapshots and intelligence insights for the given text. Looks at snapshot answer text, cited domains, raw provider responses, and insight title/query/recommendation/cause. Returns ranked hits with snippets \u2014 use it instead of paginating snapshots when you need to find a competitor mention or term.",
8041
8336
  access: "read",
8042
8337
  tier: "core",
8043
- inputSchema: z2.object({
8338
+ inputSchema: z3.object({
8044
8339
  project: projectNameSchema,
8045
- q: z2.string().min(2).describe("Search term, at least 2 characters."),
8046
- limit: z2.number().int().positive().max(50).optional().describe("Max combined hits (1-50, default 25).")
8340
+ q: z3.string().min(2).describe("Search term, at least 2 characters."),
8341
+ limit: z3.number().int().positive().max(50).optional().describe("Max combined hits (1-50, default 25).")
8047
8342
  }),
8048
8343
  annotations: readAnnotations(),
8049
8344
  openApiOperations: ["GET /api/v1/projects/{name}/search"],
@@ -8231,14 +8526,14 @@ var canonryMcpTools = [
8231
8526
  description: 'Per-query mention (answer-text) and citation (source-list) counts WITH a sample size, pooled across many answer-visibility runs (probe-excluded) \u2014 the data to compute a confidence-aware (Wilson) proportion or detect drift without fetching every run. Tri-state aware: `checked` (the n for the mention proportion) counts only snapshots where answerMentioned was recorded; `null` ("not checked") is excluded, never counted as not-mentioned. Returns per-query `total`/`checked`/`mentioned`/`cited` + derived `mentionRate` (mentioned/checked) and `citedRate` (cited/total), `firstObserved`/`lastObserved`, and pooled `totals`. Window with `since`/`until` (ISO), `lastRuns`, or `month=YYYY-MM` (mutually exclusive); with none set, EVERY completed/partial run is pooled (`window.runCount` says how many) \u2014 pass `lastRuns` for a recent sample. Set `groupBy=provider` for a per-provider breakdown whose counts sum to the pooled counts (`groupBy` is omitted from the response otherwise). Set `shareOfVoice=true` for pooled project-vs-tracked-competitor brand-mention share across the same attributed snapshot set.',
8232
8527
  access: "read",
8233
8528
  tier: "monitoring",
8234
- inputSchema: z2.object({
8529
+ inputSchema: z3.object({
8235
8530
  project: projectNameSchema,
8236
- since: z2.string().optional().describe("Inclusive lower bound on run createdAt (ISO 8601). A date-only value (YYYY-MM-DD) is the start of that UTC day. Mutually exclusive with lastRuns/month."),
8237
- until: z2.string().optional().describe("Inclusive upper bound on run createdAt (ISO 8601). A date-only value (YYYY-MM-DD) covers the whole UTC day (through 23:59:59.999). Mutually exclusive with lastRuns/month."),
8238
- lastRuns: z2.number().int().positive().optional().describe("Aggregate only the most recent N answer-visibility runs. Mutually exclusive with since/until/month."),
8239
- month: z2.string().optional().describe("Aggregate one calendar month (YYYY-MM), expanded to that month's inclusive UTC bounds. Mutually exclusive with since/until/lastRuns."),
8240
- groupBy: z2.enum(["provider"]).optional().describe('Set to "provider" for a per-provider breakdown.'),
8241
- shareOfVoice: z2.boolean().optional().describe("Include pooled project-vs-tracked-competitor brand-mention share across the same window.")
8531
+ since: z3.string().optional().describe("Inclusive lower bound on run createdAt (ISO 8601). A date-only value (YYYY-MM-DD) is the start of that UTC day. Mutually exclusive with lastRuns/month."),
8532
+ until: z3.string().optional().describe("Inclusive upper bound on run createdAt (ISO 8601). A date-only value (YYYY-MM-DD) covers the whole UTC day (through 23:59:59.999). Mutually exclusive with lastRuns/month."),
8533
+ lastRuns: z3.number().int().positive().optional().describe("Aggregate only the most recent N answer-visibility runs. Mutually exclusive with since/until/month."),
8534
+ month: z3.string().optional().describe("Aggregate one calendar month (YYYY-MM), expanded to that month's inclusive UTC bounds. Mutually exclusive with since/until/lastRuns."),
8535
+ groupBy: z3.enum(["provider"]).optional().describe('Set to "provider" for a per-provider breakdown.'),
8536
+ shareOfVoice: z3.boolean().optional().describe("Include pooled project-vs-tracked-competitor brand-mention share across the same window.")
8242
8537
  }),
8243
8538
  annotations: readAnnotations(),
8244
8539
  openApiOperations: ["GET /api/v1/projects/{name}/visibility-stats"],
@@ -8257,10 +8552,10 @@ var canonryMcpTools = [
8257
8552
  description: "Statistically honest month-over-month AEO comparison in ONE call \u2014 use this instead of hand-computing deltas from two visibility-stats calls. Share of voice (`mention-share-of-voice`, `driftRobust: true`) is less exposed to broad model-wide naming propensity than absolute rates, but it never overrides model continuity. The response restricts to common query/provider pairs, then includes only providers with exactly one known, identical configured model id in both months. `continuity` surfaces every provider, its model evidence, and whether it was excluded for a changed, mixed mid-month, or unknown model. When no provider remains, metrics return `model-discontinuous` or `model-unknown`, never a directional call. A silent upstream version bump under an unchanged configured id remains undetectable. `from` must be a month strictly before `to`.",
8258
8553
  access: "read",
8259
8554
  tier: "monitoring",
8260
- inputSchema: z2.object({
8555
+ inputSchema: z3.object({
8261
8556
  project: projectNameSchema,
8262
- from: z2.string().describe('Earlier calendar month (YYYY-MM), the baseline. Must be strictly before "to".'),
8263
- to: z2.string().describe('Later calendar month (YYYY-MM), compared against "from".')
8557
+ from: z3.string().describe('Earlier calendar month (YYYY-MM), the baseline. Must be strictly before "to".'),
8558
+ to: z3.string().describe('Later calendar month (YYYY-MM), compared against "from".')
8264
8559
  }),
8265
8560
  annotations: readAnnotations(),
8266
8561
  openApiOperations: ["GET /api/v1/projects/{name}/visibility-compare"],
@@ -9122,7 +9417,7 @@ var canonryMcpTools = [
9122
9417
  defineTool({
9123
9418
  name: "canonry_measurement_property_evidence",
9124
9419
  title: "Page one Property's measurement evidence",
9125
- description: "Return the stored source-evidence rows for exactly one Property out of one revision-pinned run, optionally narrowed to a question class, provider, or location. Prefer this over canonry_measurement_report when you want one Property: the report reconstructs every group and every Target for a revision and does not paginate. Run selection matches canonry_measurement_overview \u2014 the most recent completed run pinned to the active revision unless runId names another, and a run pinned to a different revision is refused rather than joined. The cursor pins the active revision, displayed run, evidence snapshot, and filters; reuse it unchanged. Not available for a schema v1 revision, which records no question class to scope by. It never starts provider work; page size is at most 100. An empty page under measurement.state = not_measured means the Property has not been measured at all, which is NOT a measured result of zero.",
9420
+ description: "Return the stored evidence rows for exactly one Property out of one revision-pinned run, optionally narrowed to a question class, provider, or location. shape chooses what a row is: sources (the default) returns one row per cited URL under evidence; answers returns one row per measured answer under answers, with the cited URLs nested inside and both signals on the row (mentioned, cited). Use shape=answers to explain a GAP \u2014 an answer that mentioned the Property without linking it, or that named nobody at all, has no URL to hang a source row on and does not appear in the default shape, so counting source rows understates what was measured. mentioned is null, never false, when the answer text was never captured: that is a missing signal, not a measured no. Exactly one of evidence or answers is returned and the other is absent rather than empty. A cursor is bound to the shape that issued it and is refused on the other. Prefer this over canonry_measurement_report when you want one Property: the report reconstructs every group and every Target for a revision and does not paginate. Run selection matches canonry_measurement_overview \u2014 the most recent completed run pinned to the active revision unless runId names another, and a run pinned to a different revision is refused rather than joined. The cursor also pins the active revision, displayed run, evidence snapshot, and filters; reuse it unchanged. Not available for a schema v1 revision, which records no question class to scope by. It never starts provider work; page size is at most 100. An empty page under measurement.state = not_measured means the Property has not been measured at all, which is NOT a measured result of zero.",
9126
9421
  access: "read",
9127
9422
  tier: "setup",
9128
9423
  inputSchema: measurementPropertyEvidenceInputSchema,
@@ -9133,6 +9428,90 @@ var canonryMcpTools = [
9133
9428
  return client2.getMeasurementPropertyEvidence(project, query);
9134
9429
  }
9135
9430
  }),
9431
+ defineTool({
9432
+ name: "canonry_measurement_portfolio_summary",
9433
+ title: "Summarize measured Properties",
9434
+ description: "Start here to rank the weakest measured Properties and their stored replacement names. Reads stored data only; it never starts provider work.",
9435
+ access: "read",
9436
+ tier: "monitoring",
9437
+ inputSchema: measurementPortfolioSummaryInputSchema,
9438
+ annotations: readAnnotations(),
9439
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-portfolio-summary"],
9440
+ handler: (client2, input) => {
9441
+ const { project, ...query } = input;
9442
+ return client2.getMeasurementPortfolioSummary(project, query);
9443
+ }
9444
+ }),
9445
+ defineTool({
9446
+ name: "canonry_measurement_property_questions",
9447
+ title: "List a Property\u2019s stored questions",
9448
+ description: "After identifying a Property, list its stored question outcomes and use a returned resultId with canonry_measurement_question_result. Reads stored data only; it never starts provider work.",
9449
+ access: "read",
9450
+ tier: "monitoring",
9451
+ inputSchema: measurementPropertyQuestionsInputSchema,
9452
+ annotations: readAnnotations(),
9453
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-property-questions"],
9454
+ handler: (client2, input) => {
9455
+ const { project, ...query } = input;
9456
+ return client2.getMeasurementPropertyQuestions(project, query);
9457
+ }
9458
+ }),
9459
+ defineTool({
9460
+ name: "canonry_measurement_question_result",
9461
+ title: "Get a stored question result",
9462
+ description: "After listing a Property\u2019s questions, expand one returned resultId into its stored answer and attribution sources. Reads stored data only; it never starts provider work.",
9463
+ access: "read",
9464
+ tier: "monitoring",
9465
+ inputSchema: measurementQuestionResultInputSchema,
9466
+ annotations: readAnnotations(),
9467
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-question-result"],
9468
+ handler: (client2, input) => {
9469
+ const { project, ...query } = input;
9470
+ return client2.getMeasurementQuestionResult(project, query);
9471
+ }
9472
+ }),
9473
+ defineTool({
9474
+ name: "canonry_measurement_property_competitors",
9475
+ title: "List a Property\u2019s stored replacements",
9476
+ description: "After reviewing a Property\u2019s question outcomes, find repeated stored replacement names for its misses. Reads stored data only; it never starts provider work.",
9477
+ access: "read",
9478
+ tier: "monitoring",
9479
+ inputSchema: measurementPropertyCompetitorsInputSchema,
9480
+ annotations: readAnnotations(),
9481
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-property-competitors"],
9482
+ handler: (client2, input) => {
9483
+ const { project, ...query } = input;
9484
+ return client2.getMeasurementPropertyCompetitors(project, query);
9485
+ }
9486
+ }),
9487
+ defineTool({
9488
+ name: "canonry_measurement_changes",
9489
+ title: "Compare stored measurement changes",
9490
+ description: "After reviewing the current summary, compare stored runs only when their execution identity is compatible. Reads stored data only; it never starts provider work.",
9491
+ access: "read",
9492
+ tier: "monitoring",
9493
+ inputSchema: measurementChangesInputSchema,
9494
+ annotations: readAnnotations(),
9495
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-changes"],
9496
+ handler: (client2, input) => {
9497
+ const { project, ...query } = input;
9498
+ return client2.getMeasurementChanges(project, query);
9499
+ }
9500
+ }),
9501
+ defineTool({
9502
+ name: "canonry_measurement_data_quality",
9503
+ title: "Inspect stored measurement data quality",
9504
+ description: "Before acting on a measurement, inspect its stored completeness, capture, retrieval, and comparability context. Reads stored data only; it never starts provider work.",
9505
+ access: "read",
9506
+ tier: "monitoring",
9507
+ inputSchema: measurementDataQualityInputSchema,
9508
+ annotations: readAnnotations(),
9509
+ openApiOperations: ["GET /api/v1/projects/{name}/measurement-data-quality"],
9510
+ handler: (client2, input) => {
9511
+ const { project, ...query } = input;
9512
+ return client2.getMeasurementDataQuality(project, query);
9513
+ }
9514
+ }),
9136
9515
  defineTool({
9137
9516
  name: "canonry_measurement_draft_get",
9138
9517
  title: "Get Advanced Measurement draft",
@@ -9228,7 +9607,7 @@ var canonryMcpTools = [
9228
9607
  inputSchema: measurementDraftActionInputSchema,
9229
9608
  annotations: writeAnnotations({ idempotentHint: true, destructiveHint: true, openWorldHint: true }),
9230
9609
  openApiOperations: measurementDraftActionOpenApiOperations,
9231
- handler: runMeasurementDraftAction
9610
+ handler: (client2, input) => runMeasurementDraftAction(client2, input.project, input.operation)
9232
9611
  }),
9233
9612
  defineTool({
9234
9613
  name: "canonry_measurement_plan_deactivate",
@@ -10011,10 +10390,13 @@ export {
10011
10390
  CliError,
10012
10391
  usageError,
10013
10392
  isEndpointMissing,
10393
+ systemError,
10014
10394
  printCliError,
10015
10395
  createApiClient,
10016
10396
  ApiClient,
10017
10397
  PACKAGE_VERSION,
10398
+ measurementDraftOperationSchema,
10399
+ runMeasurementDraftAction,
10018
10400
  canonryMcpTools,
10019
10401
  CanonryMcpToolNames
10020
10402
  };