umami-compass 0.1.3 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +44 -9
  2. package/SECURITY.md +2 -2
  3. package/dist/api/client.d.ts +1 -0
  4. package/dist/api/client.d.ts.map +1 -1
  5. package/dist/api/client.js +76 -19
  6. package/dist/api/client.js.map +1 -1
  7. package/dist/config.d.ts +2 -1
  8. package/dist/config.d.ts.map +1 -1
  9. package/dist/config.js +8 -6
  10. package/dist/config.js.map +1 -1
  11. package/dist/mcp/insights-utils.d.ts +206 -0
  12. package/dist/mcp/insights-utils.d.ts.map +1 -0
  13. package/dist/mcp/insights-utils.js +505 -0
  14. package/dist/mcp/insights-utils.js.map +1 -0
  15. package/dist/mcp/modules/core.d.ts.map +1 -1
  16. package/dist/mcp/modules/core.js +14 -6
  17. package/dist/mcp/modules/core.js.map +1 -1
  18. package/dist/mcp/modules/events.d.ts.map +1 -1
  19. package/dist/mcp/modules/events.js +3 -3
  20. package/dist/mcp/modules/events.js.map +1 -1
  21. package/dist/mcp/modules/heatmaps.d.ts.map +1 -1
  22. package/dist/mcp/modules/heatmaps.js +3 -2
  23. package/dist/mcp/modules/heatmaps.js.map +1 -1
  24. package/dist/mcp/modules/insights.d.ts +3 -0
  25. package/dist/mcp/modules/insights.d.ts.map +1 -0
  26. package/dist/mcp/modules/insights.js +963 -0
  27. package/dist/mcp/modules/insights.js.map +1 -0
  28. package/dist/mcp/modules/performance.d.ts.map +1 -1
  29. package/dist/mcp/modules/performance.js +5 -3
  30. package/dist/mcp/modules/performance.js.map +1 -1
  31. package/dist/mcp/modules/replay.d.ts.map +1 -1
  32. package/dist/mcp/modules/replay.js +3 -2
  33. package/dist/mcp/modules/replay.js.map +1 -1
  34. package/dist/mcp/modules/reports.d.ts.map +1 -1
  35. package/dist/mcp/modules/reports.js +71 -19
  36. package/dist/mcp/modules/reports.js.map +1 -1
  37. package/dist/mcp/modules/revenue.d.ts.map +1 -1
  38. package/dist/mcp/modules/revenue.js +2 -2
  39. package/dist/mcp/modules/revenue.js.map +1 -1
  40. package/dist/mcp/modules/sessions.d.ts.map +1 -1
  41. package/dist/mcp/modules/sessions.js +4 -4
  42. package/dist/mcp/modules/sessions.js.map +1 -1
  43. package/dist/mcp/report-utils.d.ts.map +1 -1
  44. package/dist/mcp/report-utils.js +2 -1
  45. package/dist/mcp/report-utils.js.map +1 -1
  46. package/dist/mcp/result.d.ts +13 -1
  47. package/dist/mcp/result.d.ts.map +1 -1
  48. package/dist/mcp/result.js +88 -2
  49. package/dist/mcp/result.js.map +1 -1
  50. package/dist/mcp/schemas.d.ts +1185 -20
  51. package/dist/mcp/schemas.d.ts.map +1 -1
  52. package/dist/mcp/schemas.js +182 -21
  53. package/dist/mcp/schemas.js.map +1 -1
  54. package/dist/mcp/traffic-segmentation.d.ts +82 -0
  55. package/dist/mcp/traffic-segmentation.d.ts.map +1 -0
  56. package/dist/mcp/traffic-segmentation.js +256 -0
  57. package/dist/mcp/traffic-segmentation.js.map +1 -0
  58. package/dist/server-info.d.ts +32 -0
  59. package/dist/server-info.d.ts.map +1 -0
  60. package/dist/server-info.js +34 -0
  61. package/dist/server-info.js.map +1 -0
  62. package/dist/server.d.ts.map +1 -1
  63. package/dist/server.js +152 -31
  64. package/dist/server.js.map +1 -1
  65. package/dist/version.d.ts +1 -1
  66. package/dist/version.js +1 -1
  67. package/package.json +1 -1
  68. package/server.json +9 -4
@@ -0,0 +1,505 @@
1
+ import { toSafeError, UmamiError } from "../api/errors.js";
2
+ import { parseTimeRange } from "../time.js";
3
+ import { reportFilters } from "./report-utils.js";
4
+ import { appendReferrerExclusions, rangeQuery, serializeFilters, } from "./schemas.js";
5
+ import { appendDimensionEquality, fetchExpandedMetricRows, selectChannelTotals, } from "./traffic-segmentation.js";
6
+ export const TRAFFIC_DIMENSIONS = [
7
+ "path",
8
+ "referrer",
9
+ "country",
10
+ "device",
11
+ "channel",
12
+ "event",
13
+ ];
14
+ function analysisFilters(filters, excludedReferrers = []) {
15
+ return appendReferrerExclusions(serializeFilters(filters), excludedReferrers);
16
+ }
17
+ function isRecord(value) {
18
+ return typeof value === "object" && value !== null && !Array.isArray(value);
19
+ }
20
+ export function finiteNumber(value) {
21
+ if (typeof value === "number" && Number.isFinite(value))
22
+ return value;
23
+ if (typeof value !== "string" || value.trim() === "")
24
+ return undefined;
25
+ const parsed = Number(value);
26
+ return Number.isFinite(parsed) ? parsed : undefined;
27
+ }
28
+ function requireNumber(record, key) {
29
+ const value = finiteNumber(record[key]);
30
+ if (value === undefined) {
31
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned invalid website statistics.");
32
+ }
33
+ return value;
34
+ }
35
+ function parseTotals(value) {
36
+ if (!isRecord(value)) {
37
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned invalid website statistics.");
38
+ }
39
+ return {
40
+ pageviews: requireNumber(value, "pageviews"),
41
+ visitors: requireNumber(value, "visitors"),
42
+ visits: requireNumber(value, "visits"),
43
+ bounces: requireNumber(value, "bounces"),
44
+ totaltime: requireNumber(value, "totaltime"),
45
+ };
46
+ }
47
+ export function parseWebsiteStats(value) {
48
+ const totals = parseTotals(value);
49
+ const comparison = isRecord(value) && value.comparison !== undefined ? parseTotals(value.comparison) : undefined;
50
+ return { ...totals, ...(comparison ? { comparison } : {}) };
51
+ }
52
+ export function percentChange(current, comparison) {
53
+ if (comparison === 0)
54
+ return current === 0 ? 0 : null;
55
+ return Math.round(((current - comparison) / Math.abs(comparison)) * 10_000) / 100;
56
+ }
57
+ export function totalsChanges(current, comparison) {
58
+ return Object.fromEntries(Object.keys(current).map((key) => [
59
+ key,
60
+ {
61
+ absolute: current[key] - comparison[key],
62
+ percent: percentChange(current[key], comparison[key]),
63
+ },
64
+ ]));
65
+ }
66
+ function websiteTotals(stats) {
67
+ return {
68
+ pageviews: stats.pageviews,
69
+ visitors: stats.visitors,
70
+ visits: stats.visits,
71
+ bounces: stats.bounces,
72
+ totaltime: stats.totaltime,
73
+ };
74
+ }
75
+ export function isoPeriod(period) {
76
+ return {
77
+ start: new Date(period.startAt).toISOString(),
78
+ end: new Date(period.endAt).toISOString(),
79
+ };
80
+ }
81
+ export function normalizePeriod(start, end, maxRangeDays) {
82
+ return parseTimeRange(start, end, maxRangeDays);
83
+ }
84
+ function shiftUtcYear(timestamp, years) {
85
+ const source = new Date(timestamp);
86
+ const year = source.getUTCFullYear() + years;
87
+ const month = source.getUTCMonth();
88
+ const day = source.getUTCDate();
89
+ const lastDay = new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
90
+ return Date.UTC(year, month, Math.min(day, lastDay), source.getUTCHours(), source.getUTCMinutes(), source.getUTCSeconds(), source.getUTCMilliseconds());
91
+ }
92
+ export function comparisonPeriod(current, mode) {
93
+ if (mode === "year_over_year") {
94
+ return {
95
+ startAt: shiftUtcYear(current.startAt, -1),
96
+ endAt: shiftUtcYear(current.endAt, -1),
97
+ };
98
+ }
99
+ const duration = current.endAt - current.startAt;
100
+ const endAt = current.startAt - 1;
101
+ return { startAt: endAt - duration, endAt };
102
+ }
103
+ export async function mapConcurrent(values, concurrency, operation) {
104
+ const results = new Array(values.length);
105
+ let nextIndex = 0;
106
+ const workers = Array.from({ length: Math.min(concurrency, values.length) }, async () => {
107
+ while (nextIndex < values.length) {
108
+ const index = nextIndex;
109
+ nextIndex += 1;
110
+ results[index] = await operation(values[index], index);
111
+ }
112
+ });
113
+ await Promise.all(workers);
114
+ return results;
115
+ }
116
+ export async function fetchWebsiteStats(client, websiteId, period, maxRangeDays, filters, signal, excludedReferrers = []) {
117
+ return parseWebsiteStats(await client.get(`websites/${encodeURIComponent(websiteId)}/stats`, rangeQuery(period.startAt, period.endAt, maxRangeDays, {
118
+ serializedFilters: analysisFilters(filters, excludedReferrers),
119
+ }), signal));
120
+ }
121
+ const MAX_METRIC_COMPARISON_ROWS = 100;
122
+ const MAX_CHANNEL_COMPARISON_CANDIDATES = 20;
123
+ function parseMetricRows(value) {
124
+ if (!Array.isArray(value)) {
125
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned invalid metric breakdown data.");
126
+ }
127
+ const rows = [];
128
+ for (const item of value) {
129
+ if (!isRecord(item))
130
+ continue;
131
+ const number = finiteNumber(item.y);
132
+ if (typeof item.x !== "string" || number === undefined)
133
+ continue;
134
+ rows.push({ name: item.x, value: number });
135
+ }
136
+ return rows;
137
+ }
138
+ async function fetchMetricRows(client, websiteId, period, maxRangeDays, dimension, limit, filters, signal, excludedReferrers = []) {
139
+ const rows = parseMetricRows(await client.get(`websites/${encodeURIComponent(websiteId)}/metrics`, {
140
+ ...rangeQuery(period.startAt, period.endAt, maxRangeDays, {
141
+ serializedFilters: analysisFilters(filters, excludedReferrers),
142
+ }),
143
+ type: dimension,
144
+ limit,
145
+ offset: 0,
146
+ }, signal));
147
+ return { rows, truncated: rows.length >= limit };
148
+ }
149
+ function diffMetricRows(currentResult, comparisonResult, limit) {
150
+ const { rows: current, truncated: currentTruncated } = currentResult;
151
+ const { rows: comparison, truncated: comparisonTruncated } = comparisonResult;
152
+ const names = new Set([
153
+ ...current.map(({ name }) => name),
154
+ ...comparison.map(({ name }) => name),
155
+ ]);
156
+ const currentMap = new Map(current.map(({ name, value }) => [name, value]));
157
+ const comparisonMap = new Map(comparison.map(({ name, value }) => [name, value]));
158
+ let omittedUncertainRows = 0;
159
+ const rows = [...names]
160
+ .flatMap((name) => {
161
+ if ((!currentMap.has(name) && currentTruncated) ||
162
+ (!comparisonMap.has(name) && comparisonTruncated)) {
163
+ omittedUncertainRows += 1;
164
+ return [];
165
+ }
166
+ const currentValue = currentMap.get(name) ?? 0;
167
+ const comparisonValue = comparisonMap.get(name) ?? 0;
168
+ const delta = currentValue - comparisonValue;
169
+ return [
170
+ {
171
+ name,
172
+ current: currentValue,
173
+ comparison: comparisonValue,
174
+ delta,
175
+ percent: percentChange(currentValue, comparisonValue),
176
+ direction: delta > 0 ? "up" : delta < 0 ? "down" : "flat",
177
+ },
178
+ ];
179
+ })
180
+ .sort((left, right) => Math.abs(right.delta) - Math.abs(left.delta) || left.name.localeCompare(right.name))
181
+ .slice(0, limit);
182
+ return {
183
+ rows,
184
+ dataQuality: {
185
+ currentRowsTruncated: currentTruncated,
186
+ comparisonRowsTruncated: comparisonTruncated,
187
+ omittedUncertainRows,
188
+ },
189
+ };
190
+ }
191
+ export async function compareTraffic(client, input) {
192
+ const { channel, comparison, current, dimensions, excludedReferrers = [], filters, limit, maxRangeDays, signal, website, } = input;
193
+ const serializedFilters = analysisFilters(filters, excludedReferrers);
194
+ let currentTotals;
195
+ let comparisonTotals;
196
+ if (channel) {
197
+ const channelTotals = async (period) => {
198
+ const row = selectChannelTotals(await fetchExpandedMetricRows(client, {
199
+ filters: serializedFilters,
200
+ maxRangeDays,
201
+ period,
202
+ signal,
203
+ type: "channel",
204
+ websiteId: website.id,
205
+ }), channel);
206
+ return {
207
+ pageviews: row.pageviews,
208
+ visitors: row.visitors,
209
+ visits: row.visits,
210
+ bounces: row.bounces,
211
+ totaltime: row.totaltime,
212
+ };
213
+ };
214
+ [currentTotals, comparisonTotals] = await Promise.all([
215
+ channelTotals(current),
216
+ channelTotals(comparison),
217
+ ]);
218
+ }
219
+ else {
220
+ const totals = async (period) => websiteTotals(await fetchWebsiteStats(client, website.id, period, maxRangeDays, filters, signal, excludedReferrers));
221
+ [currentTotals, comparisonTotals] = await Promise.all([totals(current), totals(comparison)]);
222
+ }
223
+ const metricFetchLimit = Math.min(MAX_METRIC_COMPARISON_ROWS, Math.max(limit * 5, 20));
224
+ const breakdowns = await mapConcurrent(dimensions, channel ? 1 : 3, async (dimension) => {
225
+ try {
226
+ if (channel && dimension === "event") {
227
+ throw new UmamiError("VALIDATION_ERROR", "Umami cannot cross-tabulate attributed channels with custom events.");
228
+ }
229
+ if (dimension === "channel") {
230
+ const channelRows = async (period) => {
231
+ const rows = await fetchExpandedMetricRows(client, {
232
+ filters: serializedFilters,
233
+ maxRangeDays,
234
+ period,
235
+ signal,
236
+ type: "channel",
237
+ websiteId: website.id,
238
+ });
239
+ return {
240
+ rows: rows
241
+ .filter(({ name }) => channel === undefined || name === channel)
242
+ .map(({ name, visitors }) => ({ name, value: visitors })),
243
+ truncated: false,
244
+ };
245
+ };
246
+ const [currentChannels, comparisonChannels] = await Promise.all([
247
+ channelRows(current),
248
+ channelRows(comparison),
249
+ ]);
250
+ const difference = diffMetricRows(currentChannels, comparisonChannels, limit);
251
+ return {
252
+ dimension,
253
+ status: "available",
254
+ measure: "visitors",
255
+ rows: difference.rows,
256
+ dataQuality: difference.dataQuality,
257
+ };
258
+ }
259
+ if (channel) {
260
+ const [currentCandidates, comparisonCandidates] = await Promise.all([
261
+ fetchMetricRows(client, website.id, current, maxRangeDays, dimension, metricFetchLimit, filters, signal, excludedReferrers),
262
+ fetchMetricRows(client, website.id, comparison, maxRangeDays, dimension, metricFetchLimit, filters, signal, excludedReferrers),
263
+ ]);
264
+ const candidateScores = new Map();
265
+ for (const { name, value } of [...currentCandidates.rows, ...comparisonCandidates.rows]) {
266
+ candidateScores.set(name, Math.max(candidateScores.get(name) ?? 0, value));
267
+ }
268
+ const allCandidates = [...candidateScores]
269
+ .sort((left, right) => right[1] - left[1] || left[0].localeCompare(right[0]))
270
+ .map(([name]) => name);
271
+ const candidates = allCandidates.slice(0, MAX_CHANNEL_COMPARISON_CANDIDATES);
272
+ let omittedUnsupportedRows = 0;
273
+ const values = await mapConcurrent(candidates, 4, async (name) => {
274
+ const candidateFilters = appendDimensionEquality(serializedFilters, dimension, name);
275
+ if (!candidateFilters) {
276
+ omittedUnsupportedRows += 1;
277
+ return undefined;
278
+ }
279
+ const expanded = (period) => fetchExpandedMetricRows(client, {
280
+ filters: candidateFilters,
281
+ maxRangeDays,
282
+ period,
283
+ signal,
284
+ type: "channel",
285
+ websiteId: website.id,
286
+ });
287
+ const [currentRows, comparisonRows] = await Promise.all([
288
+ expanded(current),
289
+ expanded(comparison),
290
+ ]);
291
+ return {
292
+ name,
293
+ current: selectChannelTotals(currentRows, channel).visitors,
294
+ comparison: selectChannelTotals(comparisonRows, channel).visitors,
295
+ };
296
+ });
297
+ const difference = diffMetricRows({
298
+ rows: values.flatMap((value) => value ? [{ name: value.name, value: value.current }] : []),
299
+ truncated: false,
300
+ }, {
301
+ rows: values.flatMap((value) => value ? [{ name: value.name, value: value.comparison }] : []),
302
+ truncated: false,
303
+ }, limit);
304
+ return {
305
+ dimension,
306
+ status: "available",
307
+ measure: "visitors",
308
+ rows: difference.rows,
309
+ dataQuality: {
310
+ ...difference.dataQuality,
311
+ candidateRowsTruncated: allCandidates.length > candidates.length ||
312
+ currentCandidates.truncated ||
313
+ comparisonCandidates.truncated,
314
+ candidateRows: candidates.length,
315
+ omittedUnsupportedRows,
316
+ fanoutRequests: candidates.length * 2,
317
+ },
318
+ };
319
+ }
320
+ const [currentRows, comparisonRows] = await Promise.all([
321
+ fetchMetricRows(client, website.id, current, maxRangeDays, dimension, metricFetchLimit, filters, signal, excludedReferrers),
322
+ fetchMetricRows(client, website.id, comparison, maxRangeDays, dimension, metricFetchLimit, filters, signal, excludedReferrers),
323
+ ]);
324
+ const difference = diffMetricRows(currentRows, comparisonRows, limit);
325
+ return {
326
+ dimension,
327
+ status: "available",
328
+ measure: "visitors",
329
+ rows: difference.rows,
330
+ dataQuality: difference.dataQuality,
331
+ };
332
+ }
333
+ catch (error) {
334
+ return {
335
+ dimension,
336
+ status: "unavailable",
337
+ error: toSafeError(error),
338
+ };
339
+ }
340
+ });
341
+ const leadingObservedChanges = breakdowns
342
+ .filter((item) => item.status === "available")
343
+ .flatMap((item) => item.rows.slice(0, 1).map((row) => ({
344
+ dimension: item.dimension,
345
+ ...row,
346
+ })))
347
+ .sort((left, right) => Math.abs(right.delta) - Math.abs(left.delta))
348
+ .slice(0, 5);
349
+ const pageviewDelta = currentTotals.pageviews - comparisonTotals.pageviews;
350
+ const pageviewPercent = percentChange(currentTotals.pageviews, comparisonTotals.pageviews);
351
+ const direction = pageviewDelta > 0 ? "increase" : pageviewDelta < 0 ? "decrease" : "flat";
352
+ const leading = leadingObservedChanges[0];
353
+ const subject = channel ? `${channel} channel traffic` : "Traffic";
354
+ const explanation = leading
355
+ ? `${subject} shows a ${direction}${pageviewPercent === null ? "" : ` of ${Math.abs(pageviewPercent)}%`}. The largest observed breakdown change is ${leading.dimension}=${leading.name} (${leading.delta > 0 ? "+" : ""}${leading.delta} visitors); this is evidence of association, not proof of causation.`
356
+ : `${subject} shows a ${direction}${pageviewPercent === null ? "" : ` of ${Math.abs(pageviewPercent)}%`}. No authorized breakdown produced enough evidence to identify a leading observed change.`;
357
+ return {
358
+ dataStatus: currentTotals.pageviews === 0 &&
359
+ currentTotals.visitors === 0 &&
360
+ currentTotals.visits === 0 &&
361
+ comparisonTotals.pageviews === 0 &&
362
+ comparisonTotals.visitors === 0 &&
363
+ comparisonTotals.visits === 0
364
+ ? "empty"
365
+ : "available",
366
+ website,
367
+ ...(channel ? { channel } : {}),
368
+ currentPeriod: isoPeriod(current),
369
+ comparisonPeriod: isoPeriod(comparison),
370
+ current: currentTotals,
371
+ comparison: comparisonTotals,
372
+ changes: totalsChanges(currentTotals, comparisonTotals),
373
+ direction,
374
+ explanation,
375
+ breakdownMeasure: "visitors",
376
+ breakdowns,
377
+ leadingObservedChanges,
378
+ dataQuality: {
379
+ comparisonBaselineZero: comparisonTotals.pageviews === 0,
380
+ currentPageviews: currentTotals.pageviews,
381
+ comparisonPageviews: comparisonTotals.pageviews,
382
+ unavailableDimensions: breakdowns
383
+ .filter((item) => item.status === "unavailable")
384
+ .map(({ dimension }) => dimension),
385
+ truncatedDimensions: breakdowns
386
+ .filter((item) => item.status === "available" &&
387
+ (item.dataQuality.currentRowsTruncated ||
388
+ item.dataQuality.comparisonRowsTruncated ||
389
+ ("candidateRowsTruncated" in item.dataQuality &&
390
+ item.dataQuality.candidateRowsTruncated === true)))
391
+ .map(({ dimension }) => dimension),
392
+ omittedUncertainRows: breakdowns
393
+ .filter((item) => item.status === "available")
394
+ .reduce((total, item) => total + item.dataQuality.omittedUncertainRows, 0),
395
+ },
396
+ };
397
+ }
398
+ const WEB_VITAL_THRESHOLDS = {
399
+ lcp: [2_500, 4_000],
400
+ inp: [200, 500],
401
+ cls: [0.1, 0.25],
402
+ fcp: [1_800, 3_000],
403
+ ttfb: [800, 1_800],
404
+ };
405
+ const MIN_PERFORMANCE_SAMPLES = 100;
406
+ const MIN_PERFORMANCE_CHANGE_PERCENT = 5;
407
+ const MIN_PERFORMANCE_ABSOLUTE_CHANGE = {
408
+ lcp: 100,
409
+ inp: 20,
410
+ cls: 0.02,
411
+ fcp: 100,
412
+ ttfb: 50,
413
+ };
414
+ function vitalRating(metric, value) {
415
+ const [good, poor] = WEB_VITAL_THRESHOLDS[metric];
416
+ return value <= good ? "good" : value <= poor ? "needs_improvement" : "poor";
417
+ }
418
+ function performanceSummary(value) {
419
+ if (!isRecord(value) || !isRecord(value.summary)) {
420
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned invalid performance summary data.");
421
+ }
422
+ const summary = value.summary;
423
+ const count = finiteNumber(summary.count);
424
+ if (count === undefined) {
425
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned invalid performance summary data.");
426
+ }
427
+ const metrics = Object.fromEntries(Object.keys(WEB_VITAL_THRESHOLDS).map((metric) => {
428
+ const row = summary[metric];
429
+ const p75 = isRecord(row) ? finiteNumber(row.p75) : undefined;
430
+ if (p75 === undefined) {
431
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned invalid performance summary data.");
432
+ }
433
+ return [metric, { p75, rating: vitalRating(metric, p75) }];
434
+ }));
435
+ return { count, metrics };
436
+ }
437
+ export async function comparePerformance(client, input) {
438
+ const request = (period) => ({
439
+ websiteId: input.websiteId,
440
+ type: "performance",
441
+ parameters: {
442
+ startDate: new Date(period.startAt).toISOString(),
443
+ endDate: new Date(period.endAt).toISOString(),
444
+ metric: "lcp",
445
+ timezone: input.timezone,
446
+ unit: "day",
447
+ },
448
+ filters: reportFilters(input.filters),
449
+ });
450
+ try {
451
+ const [currentResult, comparisonResult] = await Promise.all([
452
+ client.runReport(request(input.current), input.signal),
453
+ client.runReport(request(input.comparison), input.signal),
454
+ ]);
455
+ const current = performanceSummary(currentResult);
456
+ const comparison = performanceSummary(comparisonResult);
457
+ const sampleSufficient = current.count >= MIN_PERFORMANCE_SAMPLES && comparison.count >= MIN_PERFORMANCE_SAMPLES;
458
+ const changes = Object.fromEntries(Object.keys(WEB_VITAL_THRESHOLDS).map((metric) => {
459
+ const currentP75 = current.metrics[metric].p75;
460
+ const comparisonP75 = comparison.metrics[metric].p75;
461
+ const absolute = currentP75 - comparisonP75;
462
+ const percent = percentChange(currentP75, comparisonP75);
463
+ const ratingOrder = { good: 0, needs_improvement: 1, poor: 2 };
464
+ const currentRating = current.metrics[metric].rating;
465
+ const comparisonRating = comparison.metrics[metric].rating;
466
+ const ratingDelta = ratingOrder[currentRating] - ratingOrder[comparisonRating];
467
+ const materiallyChanged = Math.abs(absolute) >= MIN_PERFORMANCE_ABSOLUTE_CHANGE[metric] &&
468
+ percent !== null &&
469
+ Math.abs(percent) >= MIN_PERFORMANCE_CHANGE_PERCENT;
470
+ const impact = !sampleSufficient
471
+ ? "inconclusive"
472
+ : ratingDelta > 0 || (absolute > 0 && materiallyChanged)
473
+ ? "regressed"
474
+ : ratingDelta < 0 || (absolute < 0 && materiallyChanged)
475
+ ? "improved"
476
+ : "unchanged";
477
+ return [
478
+ metric,
479
+ {
480
+ currentP75,
481
+ comparisonP75,
482
+ absolute,
483
+ percent,
484
+ impact,
485
+ material: impact === "regressed" || impact === "improved",
486
+ currentRating,
487
+ comparisonRating,
488
+ },
489
+ ];
490
+ }));
491
+ const status = current.count === 0 && comparison.count === 0 ? "empty" : "available";
492
+ return {
493
+ status,
494
+ currentSampleCount: current.count,
495
+ comparisonSampleCount: comparison.count,
496
+ minimumSampleCount: MIN_PERFORMANCE_SAMPLES,
497
+ sampleSufficient,
498
+ changes,
499
+ };
500
+ }
501
+ catch (error) {
502
+ return { status: "unavailable", error: toSafeError(error) };
503
+ }
504
+ }
505
+ //# sourceMappingURL=insights-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insights-utils.js","sourceRoot":"","sources":["../../src/mcp/insights-utils.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/mcp/modules/core.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyBpD,eAAO,MAAM,UAAU,EAAE,UA6KxB,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/mcp/modules/core.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAyBpD,eAAO,MAAM,UAAU,EAAE,UA0MxB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { z } from "zod";
2
+ import { getServerInfo } from "../../server-info.js";
2
3
  import { READ_ONLY_ANNOTATIONS, runTool } from "../result.js";
3
4
  import { arrayOutputSchema, filtersSchema, outputSchema, pagedOutputSchema, pageSchema, pageSizeSchema, pageviewsDataSchema, pageviewsOutputSchema, parseUpstream, rangeQuery, recordOutputSchema, seriesRangeQuery, timeSchema, timezoneSchema, unitSchema, uuidSchema, } from "../schemas.js";
4
5
  const metricTypeSchema = z.enum([
@@ -27,6 +28,13 @@ export const coreModule = {
27
28
  id: "core",
28
29
  access: "read",
29
30
  register(server, { client, config }) {
31
+ server.registerTool("get_server_info", {
32
+ title: "Get Umami Compass server information",
33
+ description: "Get the local package version, enabled toolsets, safety limits, and supported analysis capabilities without exposing credentials.",
34
+ inputSchema: {},
35
+ outputSchema: recordOutputSchema,
36
+ annotations: READ_ONLY_ANNOTATIONS,
37
+ }, () => runTool(async () => getServerInfo(config)));
30
38
  server.registerTool("list_websites", {
31
39
  title: "List Umami websites",
32
40
  description: "List websites visible directly or through any team membership of the configured Umami identity. If UMAMI_WEBSITE_IDS is set, returns only that exact allowlist.",
@@ -44,7 +52,7 @@ export const coreModule = {
44
52
  inputSchema: { websiteId: uuidSchema },
45
53
  outputSchema: recordOutputSchema,
46
54
  annotations: READ_ONLY_ANNOTATIONS,
47
- }, ({ websiteId }, extra) => runTool(() => client.getWebsite(websiteId, extra.signal)));
55
+ }, ({ websiteId }, extra) => runTool(() => client.getWebsite(websiteId, extra.signal), { websiteId }));
48
56
  server.registerTool("get_website_stats", {
49
57
  title: "Get website statistics",
50
58
  description: "Get visits, visitors, pageviews, bounces, visit duration and Umami's comparison values for a time range.",
@@ -59,7 +67,7 @@ export const coreModule = {
59
67
  }, ({ websiteId, start, end, filters }, extra) => runTool(() => {
60
68
  client.assertWebsiteAllowed(websiteId);
61
69
  return client.get(`websites/${encodeURIComponent(websiteId)}/stats`, rangeQuery(start, end, config.maxRangeDays, { filters }), extra.signal);
62
- }));
70
+ }, { websiteId, range: { start, end } }));
63
71
  server.registerTool("get_pageviews", {
64
72
  title: "Get pageview and session series",
65
73
  description: "Get Umami 3.2 pageview and session time series. Both arrays are preserved in the response.",
@@ -81,7 +89,7 @@ export const coreModule = {
81
89
  unit,
82
90
  seriesCount: 2,
83
91
  }), extra.signal), "pageview series");
84
- }));
92
+ }, { websiteId, range: { start, end }, timezone }));
85
93
  server.registerTool("get_metrics", {
86
94
  title: "Break down website metrics",
87
95
  description: "Get a ranked aggregate Umami metric breakdown such as paths, referrers, countries, devices, events, channels or URLs. Visitor identifiers are excluded from the core toolset.",
@@ -106,7 +114,7 @@ export const coreModule = {
106
114
  offset,
107
115
  search,
108
116
  }, extra.signal);
109
- }));
117
+ }, { websiteId, range: { start, end } }));
110
118
  server.registerTool("get_active_visitors", {
111
119
  title: "Get active visitors",
112
120
  description: "Get the current number of active visitors for a website.",
@@ -116,7 +124,7 @@ export const coreModule = {
116
124
  }, ({ websiteId }, extra) => runTool(() => {
117
125
  client.assertWebsiteAllowed(websiteId);
118
126
  return client.get(`websites/${encodeURIComponent(websiteId)}/active`, undefined, extra.signal);
119
- }));
127
+ }, { websiteId }));
120
128
  server.registerTool("get_website_date_range", {
121
129
  title: "Get website data range",
122
130
  description: "Get the earliest and latest analytics timestamps available for a website.",
@@ -126,7 +134,7 @@ export const coreModule = {
126
134
  }, ({ websiteId }, extra) => runTool(() => {
127
135
  client.assertWebsiteAllowed(websiteId);
128
136
  return client.get(`websites/${encodeURIComponent(websiteId)}/daterange`, undefined, extra.signal);
129
- }));
137
+ }, { websiteId }));
130
138
  },
131
139
  };
132
140
  //# sourceMappingURL=core.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/mcp/modules/core.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/mcp/modules/core.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/mcp/modules/events.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,YAAY,EAAE,UAwG1B,CAAC"}
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/mcp/modules/events.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,YAAY,EAAE,UAiH1B,CAAC"}