umami-compass 0.1.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 (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +300 -0
  3. package/SECURITY.md +32 -0
  4. package/dist/api/client.d.ts +15 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +313 -0
  7. package/dist/api/client.js.map +1 -0
  8. package/dist/api/errors.d.ts +18 -0
  9. package/dist/api/errors.d.ts.map +1 -0
  10. package/dist/api/errors.js +28 -0
  11. package/dist/api/errors.js.map +1 -0
  12. package/dist/api/types.d.ts +101 -0
  13. package/dist/api/types.d.ts.map +1 -0
  14. package/dist/api/types.js +2 -0
  15. package/dist/api/types.js.map +1 -0
  16. package/dist/cli.d.ts +3 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +46 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/config.d.ts +25 -0
  21. package/dist/config.d.ts.map +1 -0
  22. package/dist/config.js +148 -0
  23. package/dist/config.js.map +1 -0
  24. package/dist/index.d.ts +9 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +8 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/mcp/modules/core.d.ts +3 -0
  29. package/dist/mcp/modules/core.d.ts.map +1 -0
  30. package/dist/mcp/modules/core.js +132 -0
  31. package/dist/mcp/modules/core.js.map +1 -0
  32. package/dist/mcp/modules/events.d.ts +3 -0
  33. package/dist/mcp/modules/events.d.ts.map +1 -0
  34. package/dist/mcp/modules/events.js +77 -0
  35. package/dist/mcp/modules/events.js.map +1 -0
  36. package/dist/mcp/modules/heatmaps.d.ts +3 -0
  37. package/dist/mcp/modules/heatmaps.d.ts.map +1 -0
  38. package/dist/mcp/modules/heatmaps.js +90 -0
  39. package/dist/mcp/modules/heatmaps.js.map +1 -0
  40. package/dist/mcp/modules/performance.d.ts +3 -0
  41. package/dist/mcp/modules/performance.d.ts.map +1 -0
  42. package/dist/mcp/modules/performance.js +114 -0
  43. package/dist/mcp/modules/performance.js.map +1 -0
  44. package/dist/mcp/modules/replay.d.ts +3 -0
  45. package/dist/mcp/modules/replay.d.ts.map +1 -0
  46. package/dist/mcp/modules/replay.js +41 -0
  47. package/dist/mcp/modules/replay.js.map +1 -0
  48. package/dist/mcp/modules/reports.d.ts +3 -0
  49. package/dist/mcp/modules/reports.d.ts.map +1 -0
  50. package/dist/mcp/modules/reports.js +301 -0
  51. package/dist/mcp/modules/reports.js.map +1 -0
  52. package/dist/mcp/modules/revenue.d.ts +3 -0
  53. package/dist/mcp/modules/revenue.d.ts.map +1 -0
  54. package/dist/mcp/modules/revenue.js +57 -0
  55. package/dist/mcp/modules/revenue.js.map +1 -0
  56. package/dist/mcp/modules/sessions.d.ts +3 -0
  57. package/dist/mcp/modules/sessions.d.ts.map +1 -0
  58. package/dist/mcp/modules/sessions.js +75 -0
  59. package/dist/mcp/modules/sessions.js.map +1 -0
  60. package/dist/mcp/report-utils.d.ts +15 -0
  61. package/dist/mcp/report-utils.d.ts.map +1 -0
  62. package/dist/mcp/report-utils.js +58 -0
  63. package/dist/mcp/report-utils.js.map +1 -0
  64. package/dist/mcp/result.d.ts +27 -0
  65. package/dist/mcp/result.d.ts.map +1 -0
  66. package/dist/mcp/result.js +42 -0
  67. package/dist/mcp/result.js.map +1 -0
  68. package/dist/mcp/schemas.d.ts +120 -0
  69. package/dist/mcp/schemas.d.ts.map +1 -0
  70. package/dist/mcp/schemas.js +148 -0
  71. package/dist/mcp/schemas.js.map +1 -0
  72. package/dist/mcp/tool-module.d.ts +19 -0
  73. package/dist/mcp/tool-module.d.ts.map +1 -0
  74. package/dist/mcp/tool-module.js +7 -0
  75. package/dist/mcp/tool-module.js.map +1 -0
  76. package/dist/server.d.ts +13 -0
  77. package/dist/server.d.ts.map +1 -0
  78. package/dist/server.js +100 -0
  79. package/dist/server.js.map +1 -0
  80. package/dist/time.d.ts +6 -0
  81. package/dist/time.d.ts.map +1 -0
  82. package/dist/time.js +51 -0
  83. package/dist/time.js.map +1 -0
  84. package/dist/version.d.ts +2 -0
  85. package/dist/version.d.ts.map +1 -0
  86. package/dist/version.js +2 -0
  87. package/dist/version.js.map +1 -0
  88. package/package.json +78 -0
  89. package/server.json +80 -0
@@ -0,0 +1,75 @@
1
+ import { z } from "zod";
2
+ import { boundedItems } from "../report-utils.js";
3
+ import { READ_ONLY_ANNOTATIONS, runTool } from "../result.js";
4
+ import { boundedItemsOutputSchema, filtersSchema, pagedOutputSchema, pageSchema, pageSizeSchema, rangeQuery, recordOutputSchema, timeSchema, uuidSchema, } from "../schemas.js";
5
+ export const sessionsModule = {
6
+ id: "sessions",
7
+ access: "read",
8
+ register(server, { client, config }) {
9
+ server.registerTool("list_sessions", {
10
+ title: "List Umami sessions",
11
+ description: "List and search visitor sessions for a website and time range.",
12
+ inputSchema: {
13
+ websiteId: uuidSchema,
14
+ start: timeSchema,
15
+ end: timeSchema,
16
+ page: pageSchema,
17
+ pageSize: pageSizeSchema,
18
+ search: z.string().max(500).optional(),
19
+ filters: filtersSchema.optional(),
20
+ },
21
+ outputSchema: pagedOutputSchema,
22
+ annotations: READ_ONLY_ANNOTATIONS,
23
+ }, ({ websiteId, start, end, page, pageSize, search, filters }, extra) => runTool(() => {
24
+ client.assertWebsiteAllowed(websiteId);
25
+ return client.get(`websites/${encodeURIComponent(websiteId)}/sessions`, {
26
+ ...rangeQuery(start, end, config.maxRangeDays, { filters }),
27
+ page,
28
+ pageSize,
29
+ search,
30
+ }, extra.signal);
31
+ }));
32
+ server.registerTool("get_session_stats", {
33
+ title: "Get session statistics",
34
+ description: "Get aggregate session metrics for a website and time range.",
35
+ inputSchema: {
36
+ websiteId: uuidSchema,
37
+ start: timeSchema,
38
+ end: timeSchema,
39
+ filters: filtersSchema.optional(),
40
+ },
41
+ outputSchema: recordOutputSchema,
42
+ annotations: READ_ONLY_ANNOTATIONS,
43
+ }, ({ websiteId, start, end, filters }, extra) => runTool(() => {
44
+ client.assertWebsiteAllowed(websiteId);
45
+ return client.get(`websites/${encodeURIComponent(websiteId)}/sessions/stats`, rangeQuery(start, end, config.maxRangeDays, { filters }), extra.signal);
46
+ }));
47
+ server.registerTool("get_session", {
48
+ title: "Get a session",
49
+ description: "Get metadata for one Umami visitor session.",
50
+ inputSchema: { websiteId: uuidSchema, sessionId: uuidSchema },
51
+ outputSchema: recordOutputSchema,
52
+ annotations: READ_ONLY_ANNOTATIONS,
53
+ }, ({ websiteId, sessionId }, extra) => runTool(() => {
54
+ client.assertWebsiteAllowed(websiteId);
55
+ return client.get(`websites/${encodeURIComponent(websiteId)}/sessions/${encodeURIComponent(sessionId)}`, undefined, extra.signal);
56
+ }));
57
+ server.registerTool("get_session_activity", {
58
+ title: "Get session activity",
59
+ description: "Get a bounded list of pageviews and events that occurred during one session and time range.",
60
+ inputSchema: {
61
+ websiteId: uuidSchema,
62
+ sessionId: uuidSchema,
63
+ start: timeSchema,
64
+ end: timeSchema,
65
+ maxItems: z.number().int().min(1).max(1_000).default(500),
66
+ },
67
+ outputSchema: boundedItemsOutputSchema,
68
+ annotations: READ_ONLY_ANNOTATIONS,
69
+ }, ({ websiteId, sessionId, start, end, maxItems }, extra) => runTool(async () => {
70
+ client.assertWebsiteAllowed(websiteId);
71
+ return boundedItems(await client.get(`websites/${encodeURIComponent(websiteId)}/sessions/${encodeURIComponent(sessionId)}/activity`, rangeQuery(start, end, config.maxRangeDays), extra.signal), maxItems);
72
+ }));
73
+ },
74
+ };
75
+ //# sourceMappingURL=sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/mcp/modules/sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { TimeInput } from "../time.js";
2
+ export declare function reportDateRange(start: TimeInput, end: TimeInput, maxRangeDays: number): {
3
+ endDate: string;
4
+ startDate: string;
5
+ };
6
+ export declare function reportFilters(filters: Record<string, unknown> | undefined): Record<string, unknown>;
7
+ export declare function boundedItems(value: unknown, limit: number): {
8
+ itemLimit: number;
9
+ items: unknown[];
10
+ itemsTruncated: boolean;
11
+ totalItems: number;
12
+ };
13
+ export declare function boundTopLevelArrays(value: unknown, limit: number): unknown;
14
+ export declare function requireRecord(value: unknown): Record<string, unknown>;
15
+ //# sourceMappingURL=report-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-utils.d.ts","sourceRoot":"","sources":["../../src/mcp/report-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG5C,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,SAAS,EACd,YAAY,EAAE,MAAM,GACnB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAMxC;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC3C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMzB;AAED,wBAAgB,YAAY,CAC1B,KAAK,EAAE,OAAO,EACd,KAAK,EAAE,MAAM,GACZ;IACD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB,CAUA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAwB1E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAKrE"}
@@ -0,0 +1,58 @@
1
+ import { UmamiError } from "../api/errors.js";
2
+ import { parseTimeRange } from "../time.js";
3
+ export function reportDateRange(start, end, maxRangeDays) {
4
+ const { startAt, endAt } = parseTimeRange(start, end, maxRangeDays);
5
+ return {
6
+ startDate: new Date(startAt).toISOString(),
7
+ endDate: new Date(endAt).toISOString(),
8
+ };
9
+ }
10
+ export function reportFilters(filters) {
11
+ const { excludeBounce, ...rest } = filters ?? {};
12
+ return {
13
+ ...rest,
14
+ ...(excludeBounce === true ? { excludeBounce: "true" } : {}),
15
+ };
16
+ }
17
+ export function boundedItems(value, limit) {
18
+ if (!Array.isArray(value)) {
19
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned an unexpected report response.");
20
+ }
21
+ return {
22
+ items: value.slice(0, limit),
23
+ itemLimit: limit,
24
+ itemsTruncated: value.length > limit,
25
+ totalItems: value.length,
26
+ };
27
+ }
28
+ export function boundTopLevelArrays(value, limit) {
29
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
30
+ return Array.isArray(value) ? boundedItems(value, limit) : value;
31
+ }
32
+ const result = { ...value };
33
+ const arrays = {};
34
+ for (const [key, item] of Object.entries(result)) {
35
+ if (!Array.isArray(item))
36
+ continue;
37
+ result[key] = item.slice(0, limit);
38
+ arrays[key] = {
39
+ returnedItems: Math.min(item.length, limit),
40
+ totalItems: item.length,
41
+ truncated: item.length > limit,
42
+ };
43
+ }
44
+ return {
45
+ ...result,
46
+ umamiCompass: {
47
+ arrayLimit: limit,
48
+ arrays,
49
+ },
50
+ };
51
+ }
52
+ export function requireRecord(value) {
53
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
54
+ throw new UmamiError("INVALID_RESPONSE", "Umami returned an unexpected report response.");
55
+ }
56
+ return value;
57
+ }
58
+ //# sourceMappingURL=report-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report-utils.js","sourceRoot":"","sources":["../../src/mcp/report-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,UAAU,eAAe,CAC7B,KAAgB,EAChB,GAAc,EACd,YAAoB;IAEpB,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IACpE,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;QAC1C,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAA4C;IAE5C,MAAM,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IACjD,OAAO;QACL,GAAG,IAAI;QACP,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,KAAc,EACd,KAAa;IAOb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,+CAA+C,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;QAC5B,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK;QACpC,UAAU,EAAE,KAAK,CAAC,MAAM;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAc,EAAE,KAAa;IAC/D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnE,CAAC;IAED,MAAM,MAAM,GAAG,EAAE,GAAI,KAAiC,EAAE,CAAC;IACzD,MAAM,MAAM,GACV,EAAE,CAAC;IACL,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,SAAS;QACnC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,GAAG;YACZ,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,MAAM;YACvB,SAAS,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK;SAC/B,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,MAAM;QACT,YAAY,EAAE;YACZ,UAAU,EAAE,KAAK;YACjB,MAAM;SACP;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,+CAA+C,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
2
+ export declare const READ_ONLY_ANNOTATIONS: {
3
+ destructiveHint: false;
4
+ idempotentHint: true;
5
+ openWorldHint: true;
6
+ readOnlyHint: true;
7
+ };
8
+ export declare const CREATE_ANNOTATIONS: {
9
+ destructiveHint: false;
10
+ idempotentHint: false;
11
+ openWorldHint: true;
12
+ readOnlyHint: false;
13
+ };
14
+ export declare const UPDATE_ANNOTATIONS: {
15
+ destructiveHint: false;
16
+ idempotentHint: true;
17
+ openWorldHint: true;
18
+ readOnlyHint: false;
19
+ };
20
+ export declare const DESTRUCTIVE_ANNOTATIONS: {
21
+ destructiveHint: true;
22
+ idempotentHint: true;
23
+ openWorldHint: true;
24
+ readOnlyHint: false;
25
+ };
26
+ export declare function runTool<T>(operation: () => Promise<T>): Promise<CallToolResult>;
27
+ //# sourceMappingURL=result.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/mcp/result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAmB,MAAM,oCAAoC,CAAC;AAG1F,eAAO,MAAM,qBAAqB;;;;;CAKP,CAAC;AAE5B,eAAO,MAAM,kBAAkB;;;;;CAKJ,CAAC;AAE5B,eAAO,MAAM,kBAAkB;;;;;CAKJ,CAAC;AAE5B,eAAO,MAAM,uBAAuB;;;;;CAKT,CAAC;AAE5B,wBAAsB,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,CAcrF"}
@@ -0,0 +1,42 @@
1
+ import { toSafeError } from "../api/errors.js";
2
+ export const READ_ONLY_ANNOTATIONS = {
3
+ destructiveHint: false,
4
+ idempotentHint: true,
5
+ openWorldHint: true,
6
+ readOnlyHint: true,
7
+ };
8
+ export const CREATE_ANNOTATIONS = {
9
+ destructiveHint: false,
10
+ idempotentHint: false,
11
+ openWorldHint: true,
12
+ readOnlyHint: false,
13
+ };
14
+ export const UPDATE_ANNOTATIONS = {
15
+ destructiveHint: false,
16
+ idempotentHint: true,
17
+ openWorldHint: true,
18
+ readOnlyHint: false,
19
+ };
20
+ export const DESTRUCTIVE_ANNOTATIONS = {
21
+ destructiveHint: true,
22
+ idempotentHint: true,
23
+ openWorldHint: true,
24
+ readOnlyHint: false,
25
+ };
26
+ export async function runTool(operation) {
27
+ try {
28
+ const data = await operation();
29
+ const structuredContent = { data };
30
+ return {
31
+ content: [{ type: "text", text: JSON.stringify(structuredContent) }],
32
+ structuredContent,
33
+ };
34
+ }
35
+ catch (error) {
36
+ return {
37
+ content: [{ type: "text", text: JSON.stringify({ error: toSafeError(error) }) }],
38
+ isError: true,
39
+ };
40
+ }
41
+ }
42
+ //# sourceMappingURL=result.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/mcp/result.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,IAAI;CACO,CAAC;AAE5B,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,KAAK;IACrB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,KAAK;CACM,CAAC;AAE5B,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE,KAAK;IACtB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,KAAK;CACM,CAAC;AAE5B,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,IAAI;IACpB,aAAa,EAAE,IAAI;IACnB,YAAY,EAAE,KAAK;CACM,CAAC;AAE5B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAI,SAA2B;IAC1D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;QAC/B,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,CAAC;YACpE,iBAAiB;SAClB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;YAChF,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,120 @@
1
+ import { z } from "zod";
2
+ import type { Query } from "../api/types.js";
3
+ import { type TimeInput } from "../time.js";
4
+ export declare const uuidSchema: z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>;
5
+ export declare const timeSchema: z.ZodUnion<readonly [z.ZodNumber, z.ZodString]>;
6
+ export declare const timezoneSchema: z.ZodDefault<z.ZodString>;
7
+ export declare const unitSchema: z.ZodOptional<z.ZodEnum<{
8
+ day: "day";
9
+ hour: "hour";
10
+ minute: "minute";
11
+ month: "month";
12
+ year: "year";
13
+ }>>;
14
+ export declare const pageSchema: z.ZodDefault<z.ZodNumber>;
15
+ export declare const pageSizeSchema: z.ZodDefault<z.ZodNumber>;
16
+ export declare const filtersSchema: z.ZodObject<{
17
+ browser: z.ZodOptional<z.ZodString>;
18
+ city: z.ZodOptional<z.ZodString>;
19
+ cohort: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
20
+ country: z.ZodOptional<z.ZodString>;
21
+ device: z.ZodOptional<z.ZodString>;
22
+ distinctId: z.ZodOptional<z.ZodString>;
23
+ eventType: z.ZodOptional<z.ZodNumber>;
24
+ event: z.ZodOptional<z.ZodString>;
25
+ excludeBounce: z.ZodOptional<z.ZodBoolean>;
26
+ hostname: z.ZodOptional<z.ZodString>;
27
+ language: z.ZodOptional<z.ZodString>;
28
+ os: z.ZodOptional<z.ZodString>;
29
+ match: z.ZodOptional<z.ZodEnum<{
30
+ all: "all";
31
+ any: "any";
32
+ }>>;
33
+ path: z.ZodOptional<z.ZodString>;
34
+ query: z.ZodOptional<z.ZodString>;
35
+ referrer: z.ZodOptional<z.ZodString>;
36
+ region: z.ZodOptional<z.ZodString>;
37
+ segment: z.ZodOptional<z.ZodPipe<z.ZodString, z.ZodTransform<string, string>>>;
38
+ tag: z.ZodOptional<z.ZodString>;
39
+ title: z.ZodOptional<z.ZodString>;
40
+ utmCampaign: z.ZodOptional<z.ZodString>;
41
+ utmContent: z.ZodOptional<z.ZodString>;
42
+ utmMedium: z.ZodOptional<z.ZodString>;
43
+ utmSource: z.ZodOptional<z.ZodString>;
44
+ utmTerm: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strict>;
46
+ export declare function rangeQuery(start: TimeInput, end: TimeInput, maxRangeDays: number, options?: {
47
+ filters?: z.infer<typeof filtersSchema>;
48
+ timezone?: string;
49
+ unit?: string;
50
+ }): Query;
51
+ declare const UNIT_MILLISECONDS: {
52
+ readonly minute: 60000;
53
+ readonly hour: 3600000;
54
+ readonly day: 86400000;
55
+ readonly month: 2592000000;
56
+ readonly year: 31536000000;
57
+ };
58
+ export declare function seriesRangeQuery(start: TimeInput, end: TimeInput, maxRangeDays: number, options?: {
59
+ filters?: z.infer<typeof filtersSchema>;
60
+ timezone?: string;
61
+ unit?: keyof typeof UNIT_MILLISECONDS;
62
+ seriesCount?: number;
63
+ }): Query;
64
+ export declare function selectSafeSeriesUnit(start: TimeInput, end: TimeInput, maxRangeDays: number, seriesCount?: number): keyof typeof UNIT_MILLISECONDS;
65
+ export declare const outputSchema: {
66
+ data: z.ZodJSONSchema;
67
+ };
68
+ export declare const recordOutputSchema: {
69
+ data: z.ZodObject<{}, z.core.$loose>;
70
+ };
71
+ export declare const arrayOutputSchema: {
72
+ data: z.ZodArray<z.ZodJSONSchema>;
73
+ };
74
+ export declare const pagedOutputSchema: {
75
+ data: z.ZodObject<{
76
+ data: z.ZodArray<z.ZodJSONSchema>;
77
+ count: z.ZodNumber;
78
+ page: z.ZodNumber;
79
+ pageSize: z.ZodNumber;
80
+ }, z.core.$loose>;
81
+ };
82
+ export declare const pageviewsDataSchema: z.ZodObject<{
83
+ pageviews: z.ZodArray<z.ZodObject<{
84
+ x: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
85
+ y: z.ZodNumber;
86
+ }, z.core.$loose>>;
87
+ sessions: z.ZodArray<z.ZodObject<{
88
+ x: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
89
+ y: z.ZodNumber;
90
+ }, z.core.$loose>>;
91
+ }, z.core.$loose>;
92
+ export declare const pageviewsOutputSchema: {
93
+ data: z.ZodObject<{
94
+ pageviews: z.ZodArray<z.ZodObject<{
95
+ x: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
96
+ y: z.ZodNumber;
97
+ }, z.core.$loose>>;
98
+ sessions: z.ZodArray<z.ZodObject<{
99
+ x: z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>;
100
+ y: z.ZodNumber;
101
+ }, z.core.$loose>>;
102
+ }, z.core.$loose>;
103
+ };
104
+ export declare const boundedItemsDataSchema: z.ZodObject<{
105
+ items: z.ZodArray<z.ZodJSONSchema>;
106
+ itemLimit: z.ZodNumber;
107
+ itemsTruncated: z.ZodBoolean;
108
+ totalItems: z.ZodNumber;
109
+ }, z.core.$loose>;
110
+ export declare const boundedItemsOutputSchema: {
111
+ data: z.ZodObject<{
112
+ items: z.ZodArray<z.ZodJSONSchema>;
113
+ itemLimit: z.ZodNumber;
114
+ itemsTruncated: z.ZodBoolean;
115
+ totalItems: z.ZodNumber;
116
+ }, z.core.$loose>;
117
+ };
118
+ export declare function parseUpstream<T>(schema: z.ZodType<T>, value: unknown, label: string): T;
119
+ export {};
120
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../src/mcp/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5D,eAAO,MAAM,UAAU,wDAIE,CAAC;AAC1B,eAAO,MAAM,UAAU,iDAEsD,CAAC;AAC9E,eAAO,MAAM,cAAc,2BAYV,CAAC;AAClB,eAAO,MAAM,UAAU;;;;;;GAAgE,CAAC;AACxF,eAAO,MAAM,UAAU,2BAAiD,CAAC;AACzE,eAAO,MAAM,cAAc,2BAA+C,CAAC;AAE3E,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBA4Bf,CAAC;AAEZ,wBAAgB,UAAU,CACxB,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,SAAS,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAC1F,KAAK,CAUP;AAED,QAAA,MAAM,iBAAiB;;;;;;CAMb,CAAC;AAEX,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,SAAS,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,OAAO,iBAAiB,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;CACjB,GACL,KAAK,CAeP;AAED,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,SAAS,EACd,YAAY,EAAE,MAAM,EACpB,WAAW,SAAI,GACd,MAAM,OAAO,iBAAiB,CAUhC;AAUD,eAAO,MAAM,YAAY;;CAExB,CAAC;AAEF,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;CAE7B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;CAS7B,CAAC;AAEF,eAAO,MAAM,mBAAmB;;;;;;;;;iBAKhB,CAAC;AAEjB,eAAO,MAAM,qBAAqB;;;;;;;;;;;CAEjC,CAAC;AAEF,eAAO,MAAM,sBAAsB;;;;;iBAOnB,CAAC;AAEjB,eAAO,MAAM,wBAAwB;;;;;;;CAEpC,CAAC;AAEF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,CAAC,CAMvF"}
@@ -0,0 +1,148 @@
1
+ import { z } from "zod";
2
+ import { UmamiError } from "../api/errors.js";
3
+ import { parseTimeRange } from "../time.js";
4
+ export const uuidSchema = z
5
+ .string()
6
+ .uuid()
7
+ .transform((value) => value.toLowerCase())
8
+ .describe("Umami UUID");
9
+ export const timeSchema = z
10
+ .union([z.number().int().nonnegative(), z.string().min(1)])
11
+ .describe("Unix milliseconds, ISO 8601 with timezone, or YYYY-MM-DD (UTC)");
12
+ export const timezoneSchema = z
13
+ .string()
14
+ .min(1)
15
+ .max(100)
16
+ .refine((value) => {
17
+ try {
18
+ new Intl.DateTimeFormat("en-US", { timeZone: value }).format(0);
19
+ return true;
20
+ }
21
+ catch {
22
+ return false;
23
+ }
24
+ }, "timezone must be UTC or a valid IANA time zone")
25
+ .default("UTC");
26
+ export const unitSchema = z.enum(["minute", "hour", "day", "month", "year"]).optional();
27
+ export const pageSchema = z.number().int().min(1).max(10_000).default(1);
28
+ export const pageSizeSchema = z.number().int().min(1).max(100).default(20);
29
+ export const filtersSchema = z
30
+ .object({
31
+ browser: z.string().max(200).optional(),
32
+ city: z.string().max(200).optional(),
33
+ cohort: uuidSchema.optional(),
34
+ country: z.string().max(10).optional(),
35
+ device: z.string().max(200).optional(),
36
+ distinctId: z.string().max(500).optional(),
37
+ eventType: z.number().int().positive().optional(),
38
+ event: z.string().max(500).optional(),
39
+ excludeBounce: z.boolean().optional(),
40
+ hostname: z.string().max(500).optional(),
41
+ language: z.string().max(100).optional(),
42
+ os: z.string().max(200).optional(),
43
+ match: z.enum(["all", "any"]).optional(),
44
+ path: z.string().max(2_000).optional(),
45
+ query: z.string().max(2_000).optional(),
46
+ referrer: z.string().max(2_000).optional(),
47
+ region: z.string().max(200).optional(),
48
+ segment: uuidSchema.optional(),
49
+ tag: z.string().max(500).optional(),
50
+ title: z.string().max(1_000).optional(),
51
+ utmCampaign: z.string().max(500).optional(),
52
+ utmContent: z.string().max(500).optional(),
53
+ utmMedium: z.string().max(500).optional(),
54
+ utmSource: z.string().max(500).optional(),
55
+ utmTerm: z.string().max(500).optional(),
56
+ })
57
+ .strict();
58
+ export function rangeQuery(start, end, maxRangeDays, options = {}) {
59
+ const range = parseTimeRange(start, end, maxRangeDays);
60
+ const { excludeBounce, ...filters } = options.filters ?? {};
61
+ return {
62
+ ...range,
63
+ ...filters,
64
+ ...(excludeBounce === true ? { excludeBounce: true } : {}),
65
+ timezone: options.timezone,
66
+ unit: options.unit,
67
+ };
68
+ }
69
+ const UNIT_MILLISECONDS = {
70
+ minute: 60_000,
71
+ hour: 3_600_000,
72
+ day: 86_400_000,
73
+ month: 2_592_000_000,
74
+ year: 31_536_000_000,
75
+ };
76
+ export function seriesRangeQuery(start, end, maxRangeDays, options = {}) {
77
+ const query = rangeQuery(start, end, maxRangeDays, options);
78
+ if (options.unit) {
79
+ const bucketCount = Math.floor((query.endAt - query.startAt) / UNIT_MILLISECONDS[options.unit]) + 1;
80
+ if (bucketCount * (options.seriesCount ?? 1) > 10_000) {
81
+ throw new UmamiError("VALIDATION_ERROR", "The requested series could exceed 10,000 points. Use a coarser unit, shorter range, or smaller limit.");
82
+ }
83
+ }
84
+ return query;
85
+ }
86
+ export function selectSafeSeriesUnit(start, end, maxRangeDays, seriesCount = 1) {
87
+ const { startAt, endAt } = parseTimeRange(start, end, maxRangeDays);
88
+ for (const unit of ["minute", "hour", "day", "month", "year"]) {
89
+ const bucketCount = Math.floor((endAt - startAt) / UNIT_MILLISECONDS[unit]) + 1;
90
+ if (bucketCount * seriesCount <= 10_000)
91
+ return unit;
92
+ }
93
+ throw new UmamiError("VALIDATION_ERROR", "The requested event series cannot fit within the 10,000-point safety limit.");
94
+ }
95
+ const jsonRecordSchema = z.object({}).passthrough();
96
+ const seriesPointSchema = z
97
+ .object({
98
+ x: z.union([z.string(), z.number()]),
99
+ y: z.number(),
100
+ })
101
+ .passthrough();
102
+ export const outputSchema = {
103
+ data: z.json().describe("JSON analytics data returned by Umami Compass"),
104
+ };
105
+ export const recordOutputSchema = {
106
+ data: jsonRecordSchema,
107
+ };
108
+ export const arrayOutputSchema = {
109
+ data: z.array(z.json()),
110
+ };
111
+ export const pagedOutputSchema = {
112
+ data: z
113
+ .object({
114
+ data: z.array(z.json()),
115
+ count: z.number().int().nonnegative(),
116
+ page: z.number().int().positive(),
117
+ pageSize: z.number().int().nonnegative(),
118
+ })
119
+ .passthrough(),
120
+ };
121
+ export const pageviewsDataSchema = z
122
+ .object({
123
+ pageviews: z.array(seriesPointSchema),
124
+ sessions: z.array(seriesPointSchema),
125
+ })
126
+ .passthrough();
127
+ export const pageviewsOutputSchema = {
128
+ data: pageviewsDataSchema,
129
+ };
130
+ export const boundedItemsDataSchema = z
131
+ .object({
132
+ items: z.array(z.json()),
133
+ itemLimit: z.number().int().positive(),
134
+ itemsTruncated: z.boolean(),
135
+ totalItems: z.number().int().nonnegative(),
136
+ })
137
+ .passthrough();
138
+ export const boundedItemsOutputSchema = {
139
+ data: boundedItemsDataSchema,
140
+ };
141
+ export function parseUpstream(schema, value, label) {
142
+ const parsed = schema.safeParse(value);
143
+ if (!parsed.success) {
144
+ throw new UmamiError("INVALID_RESPONSE", `Umami returned invalid ${label} data.`);
145
+ }
146
+ return parsed.data;
147
+ }
148
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/mcp/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAE5D,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,MAAM,EAAE;KACR,IAAI,EAAE;KACN,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;KACzC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAC1B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC;KACxB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;KAC1D,QAAQ,CAAC,gEAAgE,CAAC,CAAC;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,EAAE;KACR,GAAG,CAAC,CAAC,CAAC;KACN,GAAG,CAAC,GAAG,CAAC;KACR,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;IAChB,IAAI,CAAC;QACH,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,EAAE,gDAAgD,CAAC;KACnD,OAAO,CAAC,KAAK,CAAC,CAAC;AAClB,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;AACxF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AACzE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACvC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACpC,MAAM,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC7B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;IACtC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACtC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACrC,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACxC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACxC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IACvC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IAC1C,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE;IAC9B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IACvC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC3C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAC1C,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACzC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;CACxC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,MAAM,UAAU,UAAU,CACxB,KAAgB,EAChB,GAAc,EACd,YAAoB,EACpB,UAAyF,EAAE;IAE3F,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;IAC5D,OAAO;QACL,GAAG,KAAK;QACR,GAAG,OAAO;QACV,GAAG,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,MAAM,iBAAiB,GAAG;IACxB,MAAM,EAAE,MAAM;IACd,IAAI,EAAE,SAAS;IACf,GAAG,EAAE,UAAU;IACf,KAAK,EAAE,aAAa;IACpB,IAAI,EAAE,cAAc;CACZ,CAAC;AAEX,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,GAAc,EACd,YAAoB,EACpB,UAKI,EAAE;IAEN,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;IAC5D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,WAAW,GACf,IAAI,CAAC,KAAK,CACR,CAAE,KAAK,CAAC,KAAgB,GAAI,KAAK,CAAC,OAAkB,CAAC,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CACxF,GAAG,CAAC,CAAC;QACR,IAAI,WAAW,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;YACtD,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,uGAAuG,CACxG,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,KAAgB,EAChB,GAAc,EACd,YAAoB,EACpB,WAAW,GAAG,CAAC;IAEf,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IACpE,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAU,EAAE,CAAC;QACvE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,WAAW,GAAG,WAAW,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC;IACvD,CAAC;IACD,MAAM,IAAI,UAAU,CAClB,kBAAkB,EAClB,6EAA6E,CAC9E,CAAC;AACJ,CAAC;AAED,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACpD,MAAM,iBAAiB,GAAG,CAAC;KACxB,MAAM,CAAC;IACN,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE;CACd,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;CACzE,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,gBAAgB;CACvB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,CAAC;SACJ,MAAM,CAAC;QACN,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;QACrC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;KACzC,CAAC;SACD,WAAW,EAAE;CACjB,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC;KACjC,MAAM,CAAC;IACN,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACrC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC;CACrC,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,mBAAmB;CAC1B,CAAC;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC;KACpC,MAAM,CAAC;IACN,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IACtC,cAAc,EAAE,CAAC,CAAC,OAAO,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,WAAW,EAAE;CAC3C,CAAC;KACD,WAAW,EAAE,CAAC;AAEjB,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,IAAI,EAAE,sBAAsB;CAC7B,CAAC;AAEF,MAAM,UAAU,aAAa,CAAI,MAAoB,EAAE,KAAc,EAAE,KAAa;IAClF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,UAAU,CAAC,kBAAkB,EAAE,0BAA0B,KAAK,QAAQ,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { UmamiClient } from "../api/client.js";
3
+ import type { Toolset, UmamiCompassConfig } from "../config.js";
4
+ export type ToolAccess = "read" | "write";
5
+ export interface ToolContext {
6
+ client: UmamiClient;
7
+ config: UmamiCompassConfig;
8
+ }
9
+ export interface ToolModule {
10
+ access: ToolAccess;
11
+ id: Toolset;
12
+ register(server: McpServer, context: ToolContext): void;
13
+ }
14
+ export interface AccessPolicy {
15
+ allowWriteModules: boolean;
16
+ }
17
+ export declare const READ_ONLY_POLICY: AccessPolicy;
18
+ export declare function assertModuleAllowed(module: ToolModule, policy: AccessPolicy): void;
19
+ //# sourceMappingURL=tool-module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-module.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-module.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEhE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACzD;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,eAAO,MAAM,gBAAgB,EAAE,YAA0D,CAAC;AAE1F,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAMlF"}
@@ -0,0 +1,7 @@
1
+ export const READ_ONLY_POLICY = Object.freeze({ allowWriteModules: false });
2
+ export function assertModuleAllowed(module, policy) {
3
+ if (module.access === "write" && !policy.allowWriteModules) {
4
+ throw new Error(`Refusing to register write-capable module "${module.id}" without an explicit write policy.`);
5
+ }
6
+ }
7
+ //# sourceMappingURL=tool-module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-module.js","sourceRoot":"","sources":["../../src/mcp/tool-module.ts"],"names":[],"mappings":"AAqBA,MAAM,CAAC,MAAM,gBAAgB,GAAiB,MAAM,CAAC,MAAM,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;AAE1F,MAAM,UAAU,mBAAmB,CAAC,MAAkB,EAAE,MAAoB;IAC1E,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,8CAA8C,MAAM,CAAC,EAAE,qCAAqC,CAC7F,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { type Fetch } from "./api/client.js";
3
+ import type { UmamiCompassConfig } from "./config.js";
4
+ import { type AccessPolicy, type ToolModule } from "./mcp/tool-module.js";
5
+ export declare const BUILTIN_MODULES: readonly ToolModule[];
6
+ export interface CreateServerOptions {
7
+ accessPolicy?: AccessPolicy;
8
+ config: UmamiCompassConfig;
9
+ fetch?: Fetch;
10
+ modules?: readonly ToolModule[];
11
+ }
12
+ export declare function createServer(options: CreateServerOptions): McpServer;
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,OAAO,EAAE,KAAK,KAAK,EAAe,MAAM,iBAAiB,CAAC;AAE1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAStD,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAC;AAG9B,eAAO,MAAM,eAAe,EAAE,SAAS,UAAU,EAShD,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,SAAS,CAyFpE"}