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.
- package/LICENSE +21 -0
- package/README.md +300 -0
- package/SECURITY.md +32 -0
- package/dist/api/client.d.ts +15 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +313 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/errors.d.ts +18 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +28 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/types.d.ts +101 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +46 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +148 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/modules/core.d.ts +3 -0
- package/dist/mcp/modules/core.d.ts.map +1 -0
- package/dist/mcp/modules/core.js +132 -0
- package/dist/mcp/modules/core.js.map +1 -0
- package/dist/mcp/modules/events.d.ts +3 -0
- package/dist/mcp/modules/events.d.ts.map +1 -0
- package/dist/mcp/modules/events.js +77 -0
- package/dist/mcp/modules/events.js.map +1 -0
- package/dist/mcp/modules/heatmaps.d.ts +3 -0
- package/dist/mcp/modules/heatmaps.d.ts.map +1 -0
- package/dist/mcp/modules/heatmaps.js +90 -0
- package/dist/mcp/modules/heatmaps.js.map +1 -0
- package/dist/mcp/modules/performance.d.ts +3 -0
- package/dist/mcp/modules/performance.d.ts.map +1 -0
- package/dist/mcp/modules/performance.js +114 -0
- package/dist/mcp/modules/performance.js.map +1 -0
- package/dist/mcp/modules/replay.d.ts +3 -0
- package/dist/mcp/modules/replay.d.ts.map +1 -0
- package/dist/mcp/modules/replay.js +41 -0
- package/dist/mcp/modules/replay.js.map +1 -0
- package/dist/mcp/modules/reports.d.ts +3 -0
- package/dist/mcp/modules/reports.d.ts.map +1 -0
- package/dist/mcp/modules/reports.js +301 -0
- package/dist/mcp/modules/reports.js.map +1 -0
- package/dist/mcp/modules/revenue.d.ts +3 -0
- package/dist/mcp/modules/revenue.d.ts.map +1 -0
- package/dist/mcp/modules/revenue.js +57 -0
- package/dist/mcp/modules/revenue.js.map +1 -0
- package/dist/mcp/modules/sessions.d.ts +3 -0
- package/dist/mcp/modules/sessions.d.ts.map +1 -0
- package/dist/mcp/modules/sessions.js +75 -0
- package/dist/mcp/modules/sessions.js.map +1 -0
- package/dist/mcp/report-utils.d.ts +15 -0
- package/dist/mcp/report-utils.d.ts.map +1 -0
- package/dist/mcp/report-utils.js +58 -0
- package/dist/mcp/report-utils.js.map +1 -0
- package/dist/mcp/result.d.ts +27 -0
- package/dist/mcp/result.d.ts.map +1 -0
- package/dist/mcp/result.js +42 -0
- package/dist/mcp/result.js.map +1 -0
- package/dist/mcp/schemas.d.ts +120 -0
- package/dist/mcp/schemas.d.ts.map +1 -0
- package/dist/mcp/schemas.js +148 -0
- package/dist/mcp/schemas.js.map +1 -0
- package/dist/mcp/tool-module.d.ts +19 -0
- package/dist/mcp/tool-module.d.ts.map +1 -0
- package/dist/mcp/tool-module.js +7 -0
- package/dist/mcp/tool-module.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +100 -0
- package/dist/server.js.map +1 -0
- package/dist/time.d.ts +6 -0
- package/dist/time.d.ts.map +1 -0
- package/dist/time.js +51 -0
- package/dist/time.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +78 -0
- 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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|
package/dist/server.d.ts
ADDED
|
@@ -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"}
|