@listo-ai/mcp-observability 0.3.1 → 0.4.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/README.md +31 -6
- package/dist/client.d.ts +3 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -1
- package/dist/endpoints.d.ts.map +1 -1
- package/dist/endpoints.js +12 -0
- package/dist/index.d.ts +19 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -6
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -85,8 +85,16 @@ const client = createTelemetryClient({
|
|
|
85
85
|
endpoint: 'https://myapp.com/telemetry',
|
|
86
86
|
});
|
|
87
87
|
|
|
88
|
+
// Share the session ID across widget instances
|
|
89
|
+
const sessionId = client.getSessionId();
|
|
90
|
+
|
|
88
91
|
client.track('page_view', { path: '/home' });
|
|
89
|
-
client.
|
|
92
|
+
client.track('purchase', { amount: 99 }, 'conversion');
|
|
93
|
+
client.trackUi('button_click', {
|
|
94
|
+
action: 'click',
|
|
95
|
+
category: 'engagement',
|
|
96
|
+
widgetId: 'cta-1',
|
|
97
|
+
});
|
|
90
98
|
```
|
|
91
99
|
|
|
92
100
|
The client has no Node.js dependencies — it uses `fetch()`, `crypto.randomUUID()`, and `navigator.sendBeacon()`. See [Browser Client docs](./docs/client.md) for full API reference.
|
|
@@ -219,18 +227,30 @@ server.setRequestHandler(
|
|
|
219
227
|
);
|
|
220
228
|
```
|
|
221
229
|
|
|
222
|
-
### `observability.recordBusinessEvent(name,
|
|
230
|
+
### `observability.recordBusinessEvent(name, options?)`
|
|
223
231
|
|
|
224
232
|
Record custom business events for domain-specific analytics.
|
|
225
233
|
|
|
226
234
|
```typescript
|
|
227
235
|
observability.recordBusinessEvent('product_search', {
|
|
228
|
-
q: 'premium items',
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
236
|
+
properties: { q: 'premium items', results: 42 },
|
|
237
|
+
status: 'ok',
|
|
238
|
+
category: 'conversion',
|
|
239
|
+
sessionId: 'sess-abc',
|
|
240
|
+
tenantId: 'tenant-1',
|
|
241
|
+
});
|
|
232
242
|
```
|
|
233
243
|
|
|
244
|
+
Options:
|
|
245
|
+
|
|
246
|
+
| Field | Type | Description |
|
|
247
|
+
| --- | --- | --- |
|
|
248
|
+
| `properties` | `Record<string, unknown>?` | Arbitrary key-value metadata |
|
|
249
|
+
| `status` | `'ok' \| 'error'?` | Event status. Error events bypass sampling |
|
|
250
|
+
| `category` | `EventCategory?` | `'conversion'`, `'engagement'`, `'impression'`, `'navigation'`, or `'system'` |
|
|
251
|
+
| `sessionId` | `string?` | Session identifier for journey tracking |
|
|
252
|
+
| `tenantId` | `string?` | Tenant identifier for multi-tenant apps |
|
|
253
|
+
|
|
234
254
|
### `observability.recordUiEvent(event)`
|
|
235
255
|
|
|
236
256
|
Record UI interaction events from the browser.
|
|
@@ -239,6 +259,7 @@ Record UI interaction events from the browser.
|
|
|
239
259
|
observability.recordUiEvent({
|
|
240
260
|
name: 'cta_click',
|
|
241
261
|
action: 'click',
|
|
262
|
+
category: 'engagement',
|
|
242
263
|
widgetId: 'signup-btn',
|
|
243
264
|
properties: { itemId: 'i-123' },
|
|
244
265
|
sessionId: 'session-456',
|
|
@@ -400,6 +421,9 @@ Custom domain events via `recordBusinessEvent()`.
|
|
|
400
421
|
type: 'business_event',
|
|
401
422
|
name: 'product_search',
|
|
402
423
|
status: 'ok',
|
|
424
|
+
category: 'engagement',
|
|
425
|
+
sessionId: 'sess-abc',
|
|
426
|
+
tenantId: 'tenant-1',
|
|
403
427
|
properties: { q: 'premium', results: 42 },
|
|
404
428
|
}
|
|
405
429
|
```
|
|
@@ -413,6 +437,7 @@ Browser interaction events via `recordUiEvent()` or the `POST /telemetry/event`
|
|
|
413
437
|
type: 'ui_event',
|
|
414
438
|
name: 'cta_click',
|
|
415
439
|
action: 'click',
|
|
440
|
+
category: 'engagement',
|
|
416
441
|
sessionId: 'session-123',
|
|
417
442
|
properties: { itemId: 'i-456' },
|
|
418
443
|
}
|
package/dist/client.d.ts
CHANGED
|
@@ -20,9 +20,11 @@ export declare class TelemetryClient {
|
|
|
20
20
|
private context;
|
|
21
21
|
private destroyed;
|
|
22
22
|
constructor(options: TelemetryClientOptions);
|
|
23
|
-
|
|
23
|
+
getSessionId(): string;
|
|
24
|
+
track(name: string, properties?: Record<string, unknown>, category?: string): void;
|
|
24
25
|
trackUi(name: string, options: {
|
|
25
26
|
action?: string;
|
|
27
|
+
category?: string;
|
|
26
28
|
widgetId?: string;
|
|
27
29
|
toolName?: string;
|
|
28
30
|
properties?: Record<string, unknown>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAeD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;IAChC,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,OAAO,CAAyC;IACxD,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,sBAAsB;IAsB3C,YAAY,IAAI,MAAM;IAItB,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAaP,OAAO,CACL,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE;QACP,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACtC,GACA,IAAI;IAgBP,UAAU,CAAC,GAAG,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAK7D,KAAK,IAAI,IAAI;IAMb,OAAO,IAAI,IAAI;IAef,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,IAAI;IA8BZ,OAAO,CAAC,sBAAsB,CAI5B;CACH;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CAEjB"}
|
package/dist/client.js
CHANGED
|
@@ -25,7 +25,10 @@ export class TelemetryClient {
|
|
|
25
25
|
globalThis.document.addEventListener('visibilitychange', this.handleVisibilityChange);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
|
-
|
|
28
|
+
getSessionId() {
|
|
29
|
+
return this.sessionId;
|
|
30
|
+
}
|
|
31
|
+
track(name, properties, category) {
|
|
29
32
|
if (this.destroyed)
|
|
30
33
|
return;
|
|
31
34
|
this.enqueue({
|
|
@@ -34,6 +37,7 @@ export class TelemetryClient {
|
|
|
34
37
|
sessionId: this.sessionId,
|
|
35
38
|
tenantId: this.context.tenantId,
|
|
36
39
|
locale: this.context.locale,
|
|
40
|
+
category,
|
|
37
41
|
properties,
|
|
38
42
|
});
|
|
39
43
|
}
|
|
@@ -47,6 +51,7 @@ export class TelemetryClient {
|
|
|
47
51
|
tenantId: this.context.tenantId,
|
|
48
52
|
locale: this.context.locale,
|
|
49
53
|
action: options.action,
|
|
54
|
+
category: options.category,
|
|
50
55
|
widgetId: options.widgetId,
|
|
51
56
|
toolName: options.toolName,
|
|
52
57
|
properties: options.properties,
|
package/dist/endpoints.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAC;AAEjE,QAAA,MAAM,kBAAkB,eAAsC,CAAC;AAC/D,QAAA,MAAM,iBAAiB,eAAsC,CAAC;AAe9D,iBAAS,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAEjD;
|
|
1
|
+
{"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../src/endpoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,YAAY,CAAC;AAEjE,QAAA,MAAM,kBAAkB,eAAsC,CAAC;AAC/D,QAAA,MAAM,iBAAiB,eAAsC,CAAC;AAe9D,iBAAS,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAEjD;AA2CD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,gBAAgB,IAChD,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,mBAW9D;AAED;;;;;;;;;;;;;;;;;;GAkBG;AAEH,wBAAgB,qBAAqB,CAAC,aAAa,EAAE,GAAG,OAySvD;AAED,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/endpoints.js
CHANGED
|
@@ -17,6 +17,7 @@ function setGlobal(key, value) {
|
|
|
17
17
|
const UI_EVENT_FIELDS = new Set([
|
|
18
18
|
'name',
|
|
19
19
|
'action',
|
|
20
|
+
'category',
|
|
20
21
|
'widgetId',
|
|
21
22
|
'toolName',
|
|
22
23
|
'sessionId',
|
|
@@ -24,6 +25,13 @@ const UI_EVENT_FIELDS = new Set([
|
|
|
24
25
|
'locale',
|
|
25
26
|
'properties',
|
|
26
27
|
]);
|
|
28
|
+
const VALID_CATEGORIES = new Set([
|
|
29
|
+
'conversion',
|
|
30
|
+
'engagement',
|
|
31
|
+
'impression',
|
|
32
|
+
'navigation',
|
|
33
|
+
'system',
|
|
34
|
+
]);
|
|
27
35
|
const MAX_EVENT_BODY_SIZE = 8192;
|
|
28
36
|
function validateUiEventBody(body) {
|
|
29
37
|
if (!body || typeof body !== 'object' || Array.isArray(body))
|
|
@@ -31,6 +39,10 @@ function validateUiEventBody(body) {
|
|
|
31
39
|
const raw = body;
|
|
32
40
|
if (typeof raw.name !== 'string' || raw.name.length === 0)
|
|
33
41
|
return null;
|
|
42
|
+
if (raw.category !== undefined &&
|
|
43
|
+
(typeof raw.category !== 'string' || !VALID_CATEGORIES.has(raw.category))) {
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
34
46
|
const cleaned = {};
|
|
35
47
|
for (const key of UI_EVENT_FIELDS) {
|
|
36
48
|
if (key in raw) {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
2
|
export type EventStatus = 'ok' | 'error';
|
|
3
|
+
export type EventCategory = 'conversion' | 'engagement' | 'impression' | 'navigation' | 'system';
|
|
3
4
|
export type HttpRequestEvent = {
|
|
4
5
|
type: 'http_request';
|
|
5
6
|
timestamp: number;
|
|
@@ -63,6 +64,9 @@ export type BusinessEvent = {
|
|
|
63
64
|
environment?: string;
|
|
64
65
|
name: string;
|
|
65
66
|
status?: EventStatus;
|
|
67
|
+
category?: EventCategory;
|
|
68
|
+
sessionId?: string;
|
|
69
|
+
tenantId?: string;
|
|
66
70
|
properties?: Record<string, unknown>;
|
|
67
71
|
};
|
|
68
72
|
export type UiEvent = {
|
|
@@ -73,6 +77,7 @@ export type UiEvent = {
|
|
|
73
77
|
environment?: string;
|
|
74
78
|
name: string;
|
|
75
79
|
action?: string;
|
|
80
|
+
category?: EventCategory;
|
|
76
81
|
widgetId?: string;
|
|
77
82
|
toolName?: string;
|
|
78
83
|
sessionId?: string;
|
|
@@ -200,6 +205,7 @@ export declare class InMemorySink implements EventSink {
|
|
|
200
205
|
byName: Record<string, number>;
|
|
201
206
|
byAction: Record<string, number>;
|
|
202
207
|
byWidget: Record<string, number>;
|
|
208
|
+
byCategory: Record<string, number>;
|
|
203
209
|
total: number;
|
|
204
210
|
};
|
|
205
211
|
business: {
|
|
@@ -208,6 +214,11 @@ export declare class InMemorySink implements EventSink {
|
|
|
208
214
|
ok: number;
|
|
209
215
|
error: number;
|
|
210
216
|
}>;
|
|
217
|
+
byCategory: Record<string, {
|
|
218
|
+
count: number;
|
|
219
|
+
ok: number;
|
|
220
|
+
error: number;
|
|
221
|
+
}>;
|
|
211
222
|
};
|
|
212
223
|
};
|
|
213
224
|
}
|
|
@@ -215,6 +226,13 @@ export declare function createConsoleSink(options?: {
|
|
|
215
226
|
logSuccess?: boolean;
|
|
216
227
|
}): EventSink;
|
|
217
228
|
export declare function combineSinks(...sinks: EventSink[]): EventSink;
|
|
229
|
+
export type BusinessEventOptions = {
|
|
230
|
+
properties?: Record<string, unknown>;
|
|
231
|
+
status?: EventStatus;
|
|
232
|
+
category?: EventCategory;
|
|
233
|
+
sessionId?: string;
|
|
234
|
+
tenantId?: string;
|
|
235
|
+
};
|
|
218
236
|
export declare class McpObservability {
|
|
219
237
|
private readonly serviceName;
|
|
220
238
|
private readonly serviceVersion?;
|
|
@@ -229,7 +247,7 @@ export declare class McpObservability {
|
|
|
229
247
|
trackHttpRequest(req: IncomingMessage, res: ServerResponse, handler: (ctx: HttpTrackingContext) => Promise<void>): Promise<void>;
|
|
230
248
|
wrapMcpHandler<TRequest, TResponse>(requestKind: string, handler: (request: TRequest) => Promise<TResponse> | TResponse, context?: (request: TRequest) => McpTrackingContext): (request: TRequest) => Promise<TResponse>;
|
|
231
249
|
recordSession(event: Omit<McpSessionEvent, 'timestamp' | 'service'>): void;
|
|
232
|
-
recordBusinessEvent(name: string,
|
|
250
|
+
recordBusinessEvent(name: string, options?: BusinessEventOptions): void;
|
|
233
251
|
private baseMcpFields;
|
|
234
252
|
private sanitizePayload;
|
|
235
253
|
private safeEmit;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -273,7 +273,7 @@ export class McpObservability {
|
|
|
273
273
|
};
|
|
274
274
|
this.safeEmit(enriched);
|
|
275
275
|
}
|
|
276
|
-
recordBusinessEvent(name,
|
|
276
|
+
recordBusinessEvent(name, options) {
|
|
277
277
|
const event = {
|
|
278
278
|
type: 'business_event',
|
|
279
279
|
timestamp: Date.now(),
|
|
@@ -281,10 +281,13 @@ export class McpObservability {
|
|
|
281
281
|
serviceVersion: this.serviceVersion,
|
|
282
282
|
environment: this.environment,
|
|
283
283
|
name,
|
|
284
|
-
properties: properties
|
|
285
|
-
? this.sanitizePayload(properties)
|
|
284
|
+
properties: options?.properties
|
|
285
|
+
? this.sanitizePayload(options.properties)
|
|
286
286
|
: undefined,
|
|
287
|
-
status,
|
|
287
|
+
status: options?.status,
|
|
288
|
+
category: options?.category,
|
|
289
|
+
sessionId: options?.sessionId,
|
|
290
|
+
tenantId: options?.tenantId,
|
|
288
291
|
};
|
|
289
292
|
this.safeEmit(event);
|
|
290
293
|
}
|
|
@@ -432,6 +435,7 @@ function summarizeUiEvents(events) {
|
|
|
432
435
|
const byName = {};
|
|
433
436
|
const byAction = {};
|
|
434
437
|
const byWidget = {};
|
|
438
|
+
const byCategory = {};
|
|
435
439
|
for (const event of events) {
|
|
436
440
|
const nameKey = event.name || 'unknown';
|
|
437
441
|
const actionKey = event.action || 'unspecified';
|
|
@@ -439,11 +443,15 @@ function summarizeUiEvents(events) {
|
|
|
439
443
|
byName[nameKey] = (byName[nameKey] ?? 0) + 1;
|
|
440
444
|
byAction[actionKey] = (byAction[actionKey] ?? 0) + 1;
|
|
441
445
|
byWidget[widgetKey] = (byWidget[widgetKey] ?? 0) + 1;
|
|
446
|
+
if (event.category) {
|
|
447
|
+
byCategory[event.category] = (byCategory[event.category] ?? 0) + 1;
|
|
448
|
+
}
|
|
442
449
|
}
|
|
443
|
-
return { byName, byAction, byWidget, total: events.length };
|
|
450
|
+
return { byName, byAction, byWidget, byCategory, total: events.length };
|
|
444
451
|
}
|
|
445
452
|
function summarizeBusinessEvents(events) {
|
|
446
453
|
const byName = {};
|
|
454
|
+
const byCategory = {};
|
|
447
455
|
for (const event of events) {
|
|
448
456
|
const key = event.name || 'unknown';
|
|
449
457
|
if (!byName[key]) {
|
|
@@ -454,8 +462,18 @@ function summarizeBusinessEvents(events) {
|
|
|
454
462
|
byName[key].error += 1;
|
|
455
463
|
if (event.status === 'ok')
|
|
456
464
|
byName[key].ok += 1;
|
|
465
|
+
if (event.category) {
|
|
466
|
+
if (!byCategory[event.category]) {
|
|
467
|
+
byCategory[event.category] = { count: 0, ok: 0, error: 0 };
|
|
468
|
+
}
|
|
469
|
+
byCategory[event.category].count += 1;
|
|
470
|
+
if (event.status === 'error')
|
|
471
|
+
byCategory[event.category].error += 1;
|
|
472
|
+
if (event.status === 'ok')
|
|
473
|
+
byCategory[event.category].ok += 1;
|
|
474
|
+
}
|
|
457
475
|
}
|
|
458
|
-
return { byName };
|
|
476
|
+
return { byName, byCategory };
|
|
459
477
|
}
|
|
460
478
|
function truncateString(value, max = 240) {
|
|
461
479
|
if (value.length <= max)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@listo-ai/mcp-observability",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Lightweight telemetry SDK for MCP servers and web applications. Captures HTTP requests, MCP tool invocations, business events, and UI interactions with built-in payload sanitization.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|