@listo-ai/mcp-observability 0.2.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.
@@ -0,0 +1,305 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ export type EventStatus = 'ok' | 'error';
3
+ export type HttpRequestEvent = {
4
+ type: 'http_request';
5
+ timestamp: number;
6
+ service: string;
7
+ serviceVersion?: string;
8
+ environment?: string;
9
+ requestId: string;
10
+ method: string;
11
+ path: string;
12
+ route: string;
13
+ statusCode: number;
14
+ status: EventStatus;
15
+ latencyMs: number;
16
+ tenantId?: string;
17
+ sessionId?: string;
18
+ bytesOut?: number;
19
+ error?: string;
20
+ };
21
+ export type McpRequestEvent = {
22
+ type: 'mcp_request';
23
+ timestamp: number;
24
+ service: string;
25
+ serviceVersion?: string;
26
+ environment?: string;
27
+ requestId: string;
28
+ requestKind: string;
29
+ toolName?: string;
30
+ resourceUri?: string;
31
+ status: EventStatus;
32
+ latencyMs: number;
33
+ tenantId?: string;
34
+ sessionId?: string;
35
+ locale?: string;
36
+ userAgent?: string;
37
+ argsHash?: string;
38
+ inputBytes?: number;
39
+ outputBytes?: number;
40
+ samplePayload?: unknown;
41
+ argsPreview?: unknown;
42
+ resultPreview?: unknown;
43
+ resultHash?: string;
44
+ conversationId?: string;
45
+ userQueryHash?: string;
46
+ userQueryPreview?: string;
47
+ error?: string;
48
+ };
49
+ export type McpSessionEvent = {
50
+ type: 'mcp_session';
51
+ timestamp: number;
52
+ service: string;
53
+ serviceVersion?: string;
54
+ environment?: string;
55
+ action: 'open' | 'close';
56
+ sessionId: string;
57
+ };
58
+ export type BusinessEvent = {
59
+ type: 'business_event';
60
+ timestamp: number;
61
+ service: string;
62
+ serviceVersion?: string;
63
+ environment?: string;
64
+ name: string;
65
+ status?: EventStatus;
66
+ properties?: Record<string, unknown>;
67
+ };
68
+ export type UiEvent = {
69
+ type: 'ui_event';
70
+ timestamp: number;
71
+ service: string;
72
+ serviceVersion?: string;
73
+ environment?: string;
74
+ name: string;
75
+ action?: string;
76
+ widgetId?: string;
77
+ toolName?: string;
78
+ sessionId?: string;
79
+ tenantId?: string;
80
+ locale?: string;
81
+ properties?: Record<string, unknown>;
82
+ };
83
+ export type ObservabilityEvent = HttpRequestEvent | McpRequestEvent | McpSessionEvent | BusinessEvent | UiEvent;
84
+ export type EventSink = {
85
+ emit: (event: ObservabilityEvent) => void | Promise<void>;
86
+ };
87
+ export type ObservabilityOptions = {
88
+ serviceName: string;
89
+ serviceVersion?: string;
90
+ environment?: string;
91
+ sinks?: EventSink[];
92
+ sampleRate?: number;
93
+ redactKeys?: string[];
94
+ capturePayloads?: boolean;
95
+ tenantResolver?: (req: IncomingMessage) => string | undefined;
96
+ };
97
+ type HttpTrackingContext = {
98
+ setRoute: (route: string) => void;
99
+ setTenant: (tenantId?: string | null) => void;
100
+ };
101
+ type McpTrackingContext = {
102
+ sessionId?: string;
103
+ tenantId?: string;
104
+ locale?: string;
105
+ userAgent?: string;
106
+ requestId?: string;
107
+ toolName?: string;
108
+ resourceUri?: string;
109
+ args?: unknown;
110
+ conversationId?: string;
111
+ userQuery?: string;
112
+ resultPreview?: (result: unknown) => unknown;
113
+ };
114
+ export declare class InMemorySink implements EventSink {
115
+ private events;
116
+ private readonly limit;
117
+ constructor(options?: {
118
+ limit?: number;
119
+ });
120
+ emit(event: ObservabilityEvent): void;
121
+ getEvents(): ObservabilityEvent[];
122
+ getMetrics(): {
123
+ totals: {
124
+ events: number;
125
+ http: number;
126
+ mcp: number;
127
+ sessions: number;
128
+ ui: number;
129
+ business: number;
130
+ };
131
+ http: {
132
+ overall: {
133
+ count: number;
134
+ errors: number;
135
+ avgMs?: undefined;
136
+ p50?: undefined;
137
+ p95?: undefined;
138
+ p99?: undefined;
139
+ } | {
140
+ count: number;
141
+ errors: number;
142
+ avgMs: number;
143
+ p50: number | null;
144
+ p95: number | null;
145
+ p99: number | null;
146
+ };
147
+ byRoute: Record<string, {
148
+ count: number;
149
+ errors: number;
150
+ avgMs?: undefined;
151
+ p50?: undefined;
152
+ p95?: undefined;
153
+ p99?: undefined;
154
+ } | {
155
+ count: number;
156
+ errors: number;
157
+ avgMs: number;
158
+ p50: number | null;
159
+ p95: number | null;
160
+ p99: number | null;
161
+ }>;
162
+ };
163
+ mcp: {
164
+ byKind: Record<string, {
165
+ count: number;
166
+ errors: number;
167
+ avgMs?: undefined;
168
+ p50?: undefined;
169
+ p95?: undefined;
170
+ p99?: undefined;
171
+ } | {
172
+ count: number;
173
+ errors: number;
174
+ avgMs: number;
175
+ p50: number | null;
176
+ p95: number | null;
177
+ p99: number | null;
178
+ }>;
179
+ tools: Record<string, {
180
+ count: number;
181
+ errors: number;
182
+ avgMs?: undefined;
183
+ p50?: undefined;
184
+ p95?: undefined;
185
+ p99?: undefined;
186
+ } | {
187
+ count: number;
188
+ errors: number;
189
+ avgMs: number;
190
+ p50: number | null;
191
+ p95: number | null;
192
+ p99: number | null;
193
+ }>;
194
+ };
195
+ sessions: {
196
+ open: number;
197
+ close: number;
198
+ };
199
+ ui: {
200
+ byName: Record<string, number>;
201
+ byAction: Record<string, number>;
202
+ byWidget: Record<string, number>;
203
+ total: number;
204
+ };
205
+ business: {
206
+ byName: Record<string, {
207
+ count: number;
208
+ ok: number;
209
+ error: number;
210
+ }>;
211
+ };
212
+ analytics: {
213
+ search: {
214
+ topQueries: CountEntry[];
215
+ topKeywords: CountEntry[];
216
+ minRatings: CountEntry[];
217
+ priceLevels: CountEntry[];
218
+ neighborhoods: CountEntry[];
219
+ styles: CountEntry[];
220
+ limits: CountEntry[];
221
+ };
222
+ geo: {
223
+ topCities: CountEntry[];
224
+ topCountries: CountEntry[];
225
+ };
226
+ hotels: {
227
+ topViewed: {
228
+ id: string;
229
+ name?: string;
230
+ count: number;
231
+ }[];
232
+ topBookingClicks: {
233
+ id: string;
234
+ name?: string;
235
+ count: number;
236
+ }[];
237
+ topBookingCtr: {
238
+ id: string;
239
+ name: string | undefined;
240
+ clicks: number;
241
+ views: number;
242
+ ctr: number | null;
243
+ }[];
244
+ topWebsiteClicks: {
245
+ id: string;
246
+ name?: string;
247
+ count: number;
248
+ }[];
249
+ viewedPriceLevels: CountEntry[];
250
+ viewedStyles: CountEntry[];
251
+ viewedCategories: CountEntry[];
252
+ viewedNeighborhoods: CountEntry[];
253
+ };
254
+ ctr: {
255
+ impressions: number;
256
+ clicks: number;
257
+ detailViews: number;
258
+ bookingClicks: number;
259
+ websiteClicks: number;
260
+ bookingPerImpression: number | null;
261
+ bookingPerDetailView: number | null;
262
+ };
263
+ sessions: {
264
+ total: number;
265
+ converted: number;
266
+ booking: number;
267
+ website: number;
268
+ conversionRate: number | null;
269
+ unknownSessionUiEvents: number;
270
+ };
271
+ };
272
+ };
273
+ }
274
+ export declare function createConsoleSink(options?: {
275
+ logSuccess?: boolean;
276
+ }): EventSink;
277
+ export declare function combineSinks(...sinks: EventSink[]): EventSink;
278
+ export declare class McpObservability {
279
+ private readonly serviceName;
280
+ private readonly serviceVersion?;
281
+ private readonly environment?;
282
+ private readonly sinks;
283
+ private readonly sampleRate;
284
+ private readonly redactKeys;
285
+ private readonly capturePayloads;
286
+ private readonly tenantResolver?;
287
+ constructor(options: ObservabilityOptions);
288
+ recordUiEvent(event: Omit<UiEvent, 'timestamp' | 'service' | 'type'>): void;
289
+ trackHttpRequest(req: IncomingMessage, res: ServerResponse, handler: (ctx: HttpTrackingContext) => Promise<void>): Promise<void>;
290
+ wrapMcpHandler<TRequest, TResponse>(requestKind: string, handler: (request: TRequest) => Promise<TResponse> | TResponse, context?: (request: TRequest) => McpTrackingContext): (request: TRequest) => Promise<TResponse>;
291
+ recordSession(event: Omit<McpSessionEvent, 'timestamp' | 'service'>): void;
292
+ recordBusinessEvent(name: string, properties?: Record<string, unknown>, status?: EventStatus): void;
293
+ private baseMcpFields;
294
+ private sanitizePayload;
295
+ private safeEmit;
296
+ }
297
+ export declare function createMcpObservability(options: ObservabilityOptions): McpObservability;
298
+ type CountEntry = {
299
+ value: string;
300
+ count: number;
301
+ };
302
+ export { RemoteSink, createRemoteSink, type RemoteSinkOptions, } from './remote-sink.js';
303
+ export { createMcpObservabilityEasy, type EasySetupConfig, } from './easy-setup.js';
304
+ export { createTelemetryRouter, expressTelemetry } from './endpoints.js';
305
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}