@listo-ai/mcp-observability 0.5.0 → 0.6.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 +4 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +6 -6
- package/dist/endpoints.js +1 -1
- package/dist/index.d.ts +8 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -4
- package/dist/remote-sink.d.ts.map +1 -1
- package/dist/remote-sink.js +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -85,7 +85,7 @@ import { createTelemetryClient } from '@listo-ai/mcp-observability/client';
|
|
|
85
85
|
|
|
86
86
|
const client = createTelemetryClient({
|
|
87
87
|
endpoint: 'https://myapp.com/telemetry',
|
|
88
|
-
|
|
88
|
+
userId: localStorage.getItem('user_id') ?? undefined,
|
|
89
89
|
});
|
|
90
90
|
|
|
91
91
|
// Share the session ID across widget instances
|
|
@@ -240,7 +240,7 @@ observability.recordBusinessEvent('product_search', {
|
|
|
240
240
|
status: 'ok',
|
|
241
241
|
category: 'conversion',
|
|
242
242
|
sessionId: 'sess-abc',
|
|
243
|
-
|
|
243
|
+
userId: 'user-xyz',
|
|
244
244
|
tenantId: 'tenant-1',
|
|
245
245
|
});
|
|
246
246
|
```
|
|
@@ -253,7 +253,7 @@ Options:
|
|
|
253
253
|
| `status` | `'ok' \| 'error'?` | Event status. Error events bypass sampling |
|
|
254
254
|
| `category` | `EventCategory?` | `'conversion'`, `'engagement'`, `'impression'`, `'navigation'`, or `'system'` |
|
|
255
255
|
| `sessionId` | `string?` | Session identifier for journey tracking |
|
|
256
|
-
| `
|
|
256
|
+
| `userId` | `string?` | User identifier for cross-session identification |
|
|
257
257
|
| `tenantId` | `string?` | Tenant identifier for multi-tenant apps |
|
|
258
258
|
|
|
259
259
|
### `observability.recordUiEvent(event)`
|
|
@@ -476,6 +476,7 @@ Browser interaction events via `recordUiEvent()` or the `POST /telemetry/event`
|
|
|
476
476
|
| `NODE_ENV` | No | `development` / `staging` / `production` -- controls defaults |
|
|
477
477
|
| `TELEMETRY_SAMPLE_RATE` | No | Override sampling percentage (0.0 - 1.0) |
|
|
478
478
|
| `TELEMETRY_CAPTURE_PAYLOADS` | No | Enable/disable payload capture |
|
|
479
|
+
| `HMAC_SECRET` | No | Secret key for HMAC-SHA-256 hashing of `sessionId`/`userId` in MCP events. Without it, falls back to SHA-256 |
|
|
479
480
|
|
|
480
481
|
## Security
|
|
481
482
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export interface TelemetryClientOptions {
|
|
2
2
|
endpoint: string;
|
|
3
3
|
sessionId?: string;
|
|
4
|
-
|
|
4
|
+
userId?: string;
|
|
5
5
|
tenantId?: string;
|
|
6
6
|
locale?: string;
|
|
7
7
|
batchSize?: number;
|
|
@@ -12,7 +12,7 @@ export interface TelemetryClientOptions {
|
|
|
12
12
|
export declare class TelemetryClient {
|
|
13
13
|
private readonly endpoint;
|
|
14
14
|
private readonly sessionId;
|
|
15
|
-
private readonly
|
|
15
|
+
private readonly userId?;
|
|
16
16
|
private readonly batchSize;
|
|
17
17
|
private readonly flushIntervalMs;
|
|
18
18
|
private readonly onError;
|
|
@@ -23,7 +23,7 @@ export declare class TelemetryClient {
|
|
|
23
23
|
private destroyed;
|
|
24
24
|
constructor(options: TelemetryClientOptions);
|
|
25
25
|
getSessionId(): string;
|
|
26
|
-
|
|
26
|
+
getUserId(): string | undefined;
|
|
27
27
|
track(name: string, properties?: Record<string, unknown>, category?: string): void;
|
|
28
28
|
trackUi(name: string, options: {
|
|
29
29
|
action?: string;
|
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,
|
|
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,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,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;AAgBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAS;IACjC,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;IAuB3C,YAAY,IAAI,MAAM;IAItB,SAAS,IAAI,MAAM,GAAG,SAAS;IAI/B,KAAK,CACH,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpC,QAAQ,CAAC,EAAE,MAAM,GAChB,IAAI;IAcP,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;IAiBP,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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export class TelemetryClient {
|
|
2
2
|
endpoint;
|
|
3
3
|
sessionId;
|
|
4
|
-
|
|
4
|
+
userId;
|
|
5
5
|
batchSize;
|
|
6
6
|
flushIntervalMs;
|
|
7
7
|
onError;
|
|
@@ -13,7 +13,7 @@ export class TelemetryClient {
|
|
|
13
13
|
constructor(options) {
|
|
14
14
|
this.endpoint = options.endpoint.replace(/\/+$/, '');
|
|
15
15
|
this.sessionId = options.sessionId ?? globalThis.crypto.randomUUID();
|
|
16
|
-
this.
|
|
16
|
+
this.userId = options.userId;
|
|
17
17
|
this.batchSize = options.batchSize ?? 20;
|
|
18
18
|
this.flushIntervalMs = options.flushIntervalMs ?? 5000;
|
|
19
19
|
this.onError = options.onError ?? (() => { });
|
|
@@ -30,8 +30,8 @@ export class TelemetryClient {
|
|
|
30
30
|
getSessionId() {
|
|
31
31
|
return this.sessionId;
|
|
32
32
|
}
|
|
33
|
-
|
|
34
|
-
return this.
|
|
33
|
+
getUserId() {
|
|
34
|
+
return this.userId;
|
|
35
35
|
}
|
|
36
36
|
track(name, properties, category) {
|
|
37
37
|
if (this.destroyed)
|
|
@@ -40,7 +40,7 @@ export class TelemetryClient {
|
|
|
40
40
|
name,
|
|
41
41
|
timestamp: Date.now(),
|
|
42
42
|
sessionId: this.sessionId,
|
|
43
|
-
|
|
43
|
+
userId: this.userId,
|
|
44
44
|
tenantId: this.context.tenantId,
|
|
45
45
|
locale: this.context.locale,
|
|
46
46
|
category,
|
|
@@ -54,7 +54,7 @@ export class TelemetryClient {
|
|
|
54
54
|
name,
|
|
55
55
|
timestamp: Date.now(),
|
|
56
56
|
sessionId: this.sessionId,
|
|
57
|
-
|
|
57
|
+
userId: this.userId,
|
|
58
58
|
tenantId: this.context.tenantId,
|
|
59
59
|
locale: this.context.locale,
|
|
60
60
|
action: options.action,
|
package/dist/endpoints.js
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -44,6 +44,7 @@ export type McpRequestEvent = {
|
|
|
44
44
|
latencyMs: number;
|
|
45
45
|
tenantId?: string;
|
|
46
46
|
sessionId?: string;
|
|
47
|
+
userId?: string;
|
|
47
48
|
platform?: Platform;
|
|
48
49
|
locale?: string;
|
|
49
50
|
userAgent?: string;
|
|
@@ -79,7 +80,7 @@ export type BusinessEvent = {
|
|
|
79
80
|
status?: EventStatus;
|
|
80
81
|
category?: EventCategory;
|
|
81
82
|
sessionId?: string;
|
|
82
|
-
|
|
83
|
+
userId?: string;
|
|
83
84
|
tenantId?: string;
|
|
84
85
|
properties?: Record<string, unknown>;
|
|
85
86
|
};
|
|
@@ -95,7 +96,7 @@ export type UiEvent = {
|
|
|
95
96
|
widgetId?: string;
|
|
96
97
|
toolName?: string;
|
|
97
98
|
sessionId?: string;
|
|
98
|
-
|
|
99
|
+
userId?: string;
|
|
99
100
|
tenantId?: string;
|
|
100
101
|
locale?: string;
|
|
101
102
|
properties?: Record<string, unknown>;
|
|
@@ -121,6 +122,7 @@ type HttpTrackingContext = {
|
|
|
121
122
|
};
|
|
122
123
|
type McpTrackingContext = {
|
|
123
124
|
sessionId?: string;
|
|
125
|
+
userId?: string;
|
|
124
126
|
tenantId?: string;
|
|
125
127
|
platform?: Platform;
|
|
126
128
|
locale?: string;
|
|
@@ -248,7 +250,7 @@ export type BusinessEventOptions = {
|
|
|
248
250
|
status?: EventStatus;
|
|
249
251
|
category?: EventCategory;
|
|
250
252
|
sessionId?: string;
|
|
251
|
-
|
|
253
|
+
userId?: string;
|
|
252
254
|
tenantId?: string;
|
|
253
255
|
};
|
|
254
256
|
export declare class McpObservability {
|
|
@@ -285,6 +287,9 @@ export declare function createMcpObservability(options: ObservabilityOptions): M
|
|
|
285
287
|
* 4. Fallback — 'other' when any hints are provided but no known platform matched
|
|
286
288
|
*/
|
|
287
289
|
export declare function detectPlatform(hints?: PlatformHints): Platform;
|
|
290
|
+
/** @internal Reset cached HMAC secret — only for testing. */
|
|
291
|
+
export declare function _resetHmacSecretCache(): void;
|
|
292
|
+
export declare function hashIdentifier(value: string | undefined): string | undefined;
|
|
288
293
|
export { RemoteSink, createRemoteSink, type RemoteSinkOptions, } from './remote-sink.js';
|
|
289
294
|
export { createMcpObservabilityEasy, type EasySetupConfig, } from './easy-setup.js';
|
|
290
295
|
export { createTelemetryRouter, expressTelemetry } from './endpoints.js';
|
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":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,OAAO,CAAC;AAEzC,MAAM,MAAM,aAAa,GACrB,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,QAAQ,CAAC;AAEb,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,aAAa,CAAC;AAErC,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,aAAa,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,aAAa,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,gBAAgB,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,OAAO,GAAG;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,aAAa,GACb,OAAO,CAAC;AAEZ,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,GAAG,SAAS,CAAC;CAC/D,CAAC;AAEF,KAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;CAC/C,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;CAC9C,CAAC;AAEF,qBAAa,YAAa,YAAW,SAAS;IAC5C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAIxC,IAAI,CAAC,KAAK,EAAE,kBAAkB;IAO9B,SAAS,IAAI,kBAAkB,EAAE;IAIjC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBAonB4B,MAAM;oBAAM,MAAM;uBAAS,MAAM;;;uBAI5D,MAAM;oBAAM,MAAM;uBAAS,MAAM;;;;CA9kB7C;AAED,wBAAgB,iBAAiB,CAAC,OAAO,CAAC,EAAE;IAC1C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,GAAG,SAAS,CAiCZ;AAED,wBAAgB,YAAY,CAAC,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,CAiB7D;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAER;gBACZ,OAAO,EAAE,oBAAoB;IA6BzC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC;IAe9D,gBAAgB,CACpB,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,OAAO,EAAE,CAAC,GAAG,EAAE,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC;IAsDtD,cAAc,CAAC,QAAQ,EAAE,SAAS,EAChC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,EAC9D,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,kBAAkB,GAClD,CAAC,OAAO,EAAE,QAAQ,KAAK,OAAO,CAAC,SAAS,CAAC;IAqF5C,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,SAAS,CAAC;IAWnE,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB;IAoBhE,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,eAAe;IAsBvB,OAAO,CAAC,QAAQ;CAejB;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,oBAAoB,oBAEnE;AA6CD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,QAAQ,CAwC9D;AAUD,6DAA6D;AAC7D,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAO5E;AAwKD,OAAO,EACL,UAAU,EACV,gBAAgB,EAChB,KAAK,iBAAiB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,KAAK,eAAe,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createHash, randomUUID } from 'node:crypto';
|
|
1
|
+
import { createHash, createHmac, randomUUID } from 'node:crypto';
|
|
2
2
|
export class InMemorySink {
|
|
3
3
|
events = [];
|
|
4
4
|
limit;
|
|
@@ -199,6 +199,8 @@ export class McpObservability {
|
|
|
199
199
|
const sanitizedResult = metadata.resultPreview
|
|
200
200
|
? this.sanitizePayload(metadata.resultPreview(result))
|
|
201
201
|
: undefined;
|
|
202
|
+
const hashedSessionId = hashIdentifier(metadata.sessionId);
|
|
203
|
+
const hashedUserId = hashIdentifier(metadata.userId);
|
|
202
204
|
this.safeEmit({
|
|
203
205
|
...this.baseMcpFields(),
|
|
204
206
|
type: 'mcp_request',
|
|
@@ -210,7 +212,8 @@ export class McpObservability {
|
|
|
210
212
|
status: 'ok',
|
|
211
213
|
latencyMs: performance.now() - start,
|
|
212
214
|
tenantId: metadata.tenantId,
|
|
213
|
-
sessionId:
|
|
215
|
+
sessionId: hashedSessionId,
|
|
216
|
+
userId: hashedUserId,
|
|
214
217
|
platform: metadata.platform,
|
|
215
218
|
locale: metadata.locale,
|
|
216
219
|
userAgent: metadata.userAgent,
|
|
@@ -241,6 +244,8 @@ export class McpObservability {
|
|
|
241
244
|
const sanitizedArgs = metadata.args
|
|
242
245
|
? this.sanitizePayload(metadata.args)
|
|
243
246
|
: undefined;
|
|
247
|
+
const hashedSessionId = hashIdentifier(metadata.sessionId);
|
|
248
|
+
const hashedUserId = hashIdentifier(metadata.userId);
|
|
244
249
|
this.safeEmit({
|
|
245
250
|
...this.baseMcpFields(),
|
|
246
251
|
type: 'mcp_request',
|
|
@@ -252,7 +257,8 @@ export class McpObservability {
|
|
|
252
257
|
status: 'error',
|
|
253
258
|
latencyMs: performance.now() - start,
|
|
254
259
|
tenantId: metadata.tenantId,
|
|
255
|
-
sessionId:
|
|
260
|
+
sessionId: hashedSessionId,
|
|
261
|
+
userId: hashedUserId,
|
|
256
262
|
platform: metadata.platform,
|
|
257
263
|
locale: metadata.locale,
|
|
258
264
|
userAgent: metadata.userAgent,
|
|
@@ -289,7 +295,7 @@ export class McpObservability {
|
|
|
289
295
|
status: options?.status,
|
|
290
296
|
category: options?.category,
|
|
291
297
|
sessionId: options?.sessionId,
|
|
292
|
-
|
|
298
|
+
userId: options?.userId,
|
|
293
299
|
tenantId: options?.tenantId,
|
|
294
300
|
};
|
|
295
301
|
this.safeEmit(event);
|
|
@@ -433,6 +439,26 @@ export function detectPlatform(hints) {
|
|
|
433
439
|
// 4. Nothing matched — bucket as 'other'
|
|
434
440
|
return 'other';
|
|
435
441
|
}
|
|
442
|
+
let _hmacSecret;
|
|
443
|
+
function getHmacSecret() {
|
|
444
|
+
if (_hmacSecret === undefined) {
|
|
445
|
+
_hmacSecret = process.env.HMAC_SECRET ?? '';
|
|
446
|
+
}
|
|
447
|
+
return _hmacSecret || undefined;
|
|
448
|
+
}
|
|
449
|
+
/** @internal Reset cached HMAC secret — only for testing. */
|
|
450
|
+
export function _resetHmacSecretCache() {
|
|
451
|
+
_hmacSecret = undefined;
|
|
452
|
+
}
|
|
453
|
+
export function hashIdentifier(value) {
|
|
454
|
+
if (!value)
|
|
455
|
+
return value;
|
|
456
|
+
const secret = getHmacSecret();
|
|
457
|
+
if (secret) {
|
|
458
|
+
return createHmac('sha256', secret).update(value).digest('hex');
|
|
459
|
+
}
|
|
460
|
+
return createHash('sha256').update(value).digest('hex');
|
|
461
|
+
}
|
|
436
462
|
function hashPayload(payload) {
|
|
437
463
|
try {
|
|
438
464
|
const json = JSON.stringify(payload);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-sink.d.ts","sourceRoot":"","sources":["../src/remote-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAShE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,UAAW,YAAW,SAAS;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,iBAAiB;IAatC,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAgB/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAed,SAAS;
|
|
1
|
+
{"version":3,"file":"remote-sink.d.ts","sourceRoot":"","sources":["../src/remote-sink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAShE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;CAChE,CAAC;AAEF,qBAAa,UAAW,YAAW,SAAS;IAC1C,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,UAAU,CAAS;gBAEf,OAAO,EAAE,iBAAiB;IAatC,IAAI,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI;IAgB/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAed,SAAS;IA4DvB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,eAAe;IAMvB,OAAO,IAAI,IAAI;CAOhB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAEtE"}
|
package/dist/remote-sink.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@listo-ai/mcp-observability",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.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",
|