@posthog/mcp 0.10.3 → 0.10.5
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/dist/extensions/analytics-parameters.d.ts +5 -0
- package/dist/extensions/analytics-parameters.d.ts.map +1 -1
- package/dist/extensions/analytics-parameters.js +57 -3
- package/dist/extensions/analytics-parameters.mjs +47 -2
- package/dist/extensions/capture.d.ts +2 -1
- package/dist/extensions/capture.d.ts.map +1 -1
- package/dist/extensions/capture.js +2 -3
- package/dist/extensions/capture.mjs +2 -3
- package/dist/extensions/compatibility.d.ts +3 -2
- package/dist/extensions/compatibility.d.ts.map +1 -1
- package/dist/extensions/compatibility.js +19 -20
- package/dist/extensions/compatibility.mjs +15 -16
- package/dist/extensions/context-parameters.d.ts +4 -3
- package/dist/extensions/context-parameters.d.ts.map +1 -1
- package/dist/extensions/context-parameters.js +4 -5
- package/dist/extensions/context-parameters.mjs +4 -4
- package/dist/extensions/conversation-id.d.ts +3 -8
- package/dist/extensions/conversation-id.d.ts.map +1 -1
- package/dist/extensions/conversation-id.js +6 -22
- package/dist/extensions/conversation-id.mjs +5 -17
- package/dist/extensions/instrument-highlevel.d.ts +2 -1
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +31 -51
- package/dist/extensions/instrument-highlevel.mjs +30 -50
- package/dist/extensions/instrument-lowlevel.d.ts +2 -1
- package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-lowlevel.js +8 -9
- package/dist/extensions/instrument-lowlevel.mjs +8 -9
- package/dist/extensions/instrumentation.d.ts +7 -8
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +57 -32
- package/dist/extensions/instrumentation.mjs +58 -33
- package/dist/extensions/intent.d.ts +1 -1
- package/dist/extensions/intent.d.ts.map +1 -1
- package/dist/extensions/intent.js +3 -4
- package/dist/extensions/intent.mjs +3 -4
- package/dist/extensions/internal.d.ts.map +1 -1
- package/dist/extensions/internal.js +5 -6
- package/dist/extensions/internal.mjs +5 -6
- package/dist/extensions/logger.d.ts +12 -4
- package/dist/extensions/logger.d.ts.map +1 -1
- package/dist/extensions/logger.js +12 -3
- package/dist/extensions/logger.mjs +10 -4
- package/dist/extensions/sink.d.ts +4 -2
- package/dist/extensions/sink.d.ts.map +1 -1
- package/dist/extensions/sink.js +11 -10
- package/dist/extensions/sink.mjs +11 -10
- package/dist/extensions/tools.d.ts +2 -1
- package/dist/extensions/tools.d.ts.map +1 -1
- package/dist/extensions/tools.js +2 -2
- package/dist/extensions/tools.mjs +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -16
- package/dist/index.mjs +20 -17
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +4 -4
- package/src/extensions/analytics-parameters.ts +67 -1
- package/src/extensions/capture.ts +3 -3
- package/src/extensions/compatibility.ts +16 -16
- package/src/extensions/context-parameters.ts +9 -7
- package/src/extensions/conversation-id.ts +12 -25
- package/src/extensions/instrument-highlevel.ts +52 -75
- package/src/extensions/instrument-lowlevel.ts +14 -10
- package/src/extensions/instrumentation.ts +101 -36
- package/src/extensions/intent.ts +8 -3
- package/src/extensions/internal.ts +7 -6
- package/src/extensions/logger.ts +22 -7
- package/src/extensions/sink.ts +17 -12
- package/src/extensions/tools.ts +3 -3
- package/src/index.ts +22 -19
- package/src/types.ts +8 -0
- package/src/version.ts +1 -1
|
@@ -32,6 +32,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
32
32
|
handleListToolsRequest: ()=>handleListToolsRequest,
|
|
33
33
|
patchRequestHandlers: ()=>patchRequestHandlers
|
|
34
34
|
});
|
|
35
|
+
const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
|
|
35
36
|
const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
|
|
36
37
|
const external_conversation_id_js_namespaceObject = require("./conversation-id.js");
|
|
37
38
|
const external_client_identity_js_namespaceObject = require("./client-identity.js");
|
|
@@ -40,7 +41,6 @@ const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
|
40
41
|
const external_exceptions_js_namespaceObject = require("./exceptions.js");
|
|
41
42
|
const external_intent_js_namespaceObject = require("./intent.js");
|
|
42
43
|
const external_internal_js_namespaceObject = require("./internal.js");
|
|
43
|
-
const external_logger_js_namespaceObject = require("./logger.js");
|
|
44
44
|
const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
|
|
45
45
|
const external_mcp_sdk_compat_js_namespaceObject = require("./mcp-sdk-compat.js");
|
|
46
46
|
const external_session_js_namespaceObject = require("./session.js");
|
|
@@ -48,24 +48,45 @@ const external_session_token_js_namespaceObject = require("./session-token.js");
|
|
|
48
48
|
const external_tools_js_namespaceObject = require("./tools.js");
|
|
49
49
|
const external_tracing_helpers_js_namespaceObject = require("./tracing-helpers.js");
|
|
50
50
|
async function captureToolCall(params) {
|
|
51
|
-
const { server, data, request, extra, execute, eventType, explicitContextIntent, takeCapturedError } = params;
|
|
52
|
-
const
|
|
53
|
-
const
|
|
51
|
+
const { server, data, request, extra, execute, parameterOwnership, eventType, explicitContextIntent, takeCapturedError } = params;
|
|
52
|
+
const ownership = getActiveAnalyticsParameterOwnership(data, request.params?.name, parameterOwnership);
|
|
53
|
+
const conversation = (0, external_conversation_id_js_namespaceObject.resolveConversationId)(ownership.conversationId, request.params?.arguments, request.params?.name, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options));
|
|
54
|
+
const downstreamRequest = cloneRequestWithoutOwnedAnalyticsArguments(request, ownership);
|
|
54
55
|
const startTime = new Date();
|
|
55
|
-
const event = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, eventType ?? external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall);
|
|
56
|
+
const event = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType ?? external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall);
|
|
56
57
|
if (event && explicitContextIntent) (0, external_intent_js_namespaceObject.setExplicitContextIntent)(event, explicitContextIntent);
|
|
57
58
|
let result;
|
|
58
59
|
try {
|
|
59
60
|
result = await execute(downstreamRequest);
|
|
60
61
|
} catch (error) {
|
|
61
|
-
publishFailedToolEvent(server, event, error, startTime, conversation);
|
|
62
|
+
publishFailedToolEvent(server, event, error, startTime, conversation, data.logger);
|
|
62
63
|
throw error;
|
|
63
64
|
}
|
|
64
65
|
const finalResult = applyConversationPromptBack(event, result, conversation);
|
|
65
|
-
publishSuccessfulToolEvent(server, event, finalResult, startTime, takeCapturedError);
|
|
66
|
+
publishSuccessfulToolEvent(server, event, finalResult, startTime, data.logger, takeCapturedError);
|
|
66
67
|
return finalResult;
|
|
67
68
|
}
|
|
68
|
-
|
|
69
|
+
function getActiveAnalyticsParameterOwnership(data, toolName, override) {
|
|
70
|
+
const ownership = override ?? (toolName ? data.toolAnalyticsParameterOwnership.get(toolName) : void 0);
|
|
71
|
+
const isMissingCapabilityTool = toolName === (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
|
|
72
|
+
return {
|
|
73
|
+
context: !isMissingCapabilityTool && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context) && ownership?.context === true,
|
|
74
|
+
conversationId: !isMissingCapabilityTool && true === data.options.enableConversationId && ownership?.conversationId === true
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
function cloneRequestWithoutOwnedAnalyticsArguments(request, ownership) {
|
|
78
|
+
const args = request.params?.arguments;
|
|
79
|
+
const cleanedArgs = (0, external_analytics_parameters_js_namespaceObject.stripOwnedAnalyticsArguments)(args, ownership);
|
|
80
|
+
if (cleanedArgs === args || !request.params) return request;
|
|
81
|
+
return {
|
|
82
|
+
...request,
|
|
83
|
+
params: {
|
|
84
|
+
...request.params,
|
|
85
|
+
arguments: cleanedArgs
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
async function prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType) {
|
|
69
90
|
try {
|
|
70
91
|
const sessionId = (0, external_session_js_namespaceObject.getSessionId)(server, extra);
|
|
71
92
|
await (0, external_internal_js_namespaceObject.handleIdentify)(server, data, sessionId, request, extra);
|
|
@@ -82,10 +103,10 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
|
|
|
82
103
|
};
|
|
83
104
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
|
|
84
105
|
await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
|
|
85
|
-
(0, external_intent_js_namespaceObject.setEventIntent)(event, await (0, external_intent_js_namespaceObject.resolveToolCallIntent)(data, request, extra));
|
|
106
|
+
(0, external_intent_js_namespaceObject.setEventIntent)(event, await (0, external_intent_js_namespaceObject.resolveToolCallIntent)(data, request, ownership.context, extra));
|
|
86
107
|
return event;
|
|
87
108
|
} catch (error) {
|
|
88
|
-
|
|
109
|
+
data.logger(`Warning: PostHog MCP analytics instrumentation failed for tool ${request.params?.name}, the tool will still run - ${error}`);
|
|
89
110
|
return null;
|
|
90
111
|
}
|
|
91
112
|
}
|
|
@@ -95,7 +116,7 @@ function applyConversationPromptBack(event, result, conversation) {
|
|
|
95
116
|
if (event) event.conversationId = void 0;
|
|
96
117
|
return result;
|
|
97
118
|
}
|
|
98
|
-
function publishSuccessfulToolEvent(server, event, result, startTime, takeCapturedError) {
|
|
119
|
+
function publishSuccessfulToolEvent(server, event, result, startTime, logger, takeCapturedError) {
|
|
99
120
|
if (!event) return;
|
|
100
121
|
try {
|
|
101
122
|
if ((0, external_tracing_helpers_js_namespaceObject.isToolResultError)(result)) {
|
|
@@ -105,21 +126,21 @@ function publishSuccessfulToolEvent(server, event, result, startTime, takeCaptur
|
|
|
105
126
|
} else event.isError = false;
|
|
106
127
|
event.response = result;
|
|
107
128
|
event.duration = Date.now() - startTime.getTime();
|
|
108
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
129
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, logger);
|
|
109
130
|
} catch (error) {
|
|
110
|
-
(
|
|
131
|
+
logger(`Warning: PostHog MCP analytics failed to publish tool event - ${error}`);
|
|
111
132
|
}
|
|
112
133
|
}
|
|
113
|
-
function publishFailedToolEvent(server, event, error, startTime, conversation) {
|
|
134
|
+
function publishFailedToolEvent(server, event, error, startTime, conversation, logger) {
|
|
114
135
|
if (!event) return;
|
|
115
136
|
try {
|
|
116
137
|
if (conversation.minted) event.conversationId = void 0;
|
|
117
138
|
event.isError = true;
|
|
118
139
|
event.error = (0, external_exceptions_js_namespaceObject.captureException)(error);
|
|
119
140
|
event.duration = Date.now() - startTime.getTime();
|
|
120
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
141
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, logger);
|
|
121
142
|
} catch (publishError) {
|
|
122
|
-
(
|
|
143
|
+
logger(`Warning: PostHog MCP analytics failed to publish failed tool event - ${publishError}`);
|
|
123
144
|
}
|
|
124
145
|
}
|
|
125
146
|
function patchRequestHandlers(server, patches) {
|
|
@@ -136,7 +157,7 @@ function patchRequestHandlers(server, patches) {
|
|
|
136
157
|
return originalSetRequestHandler(requestSchema, (request, extra)=>patch(server, originalHandler, request, extra));
|
|
137
158
|
};
|
|
138
159
|
}
|
|
139
|
-
async function handleListToolsRequest(server, originalListToolsHandler, request, extra) {
|
|
160
|
+
async function handleListToolsRequest(server, originalListToolsHandler, request, extra, logger) {
|
|
140
161
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
141
162
|
const startTime = new Date();
|
|
142
163
|
const event = {
|
|
@@ -147,19 +168,19 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
147
168
|
};
|
|
148
169
|
(0, external_client_identity_js_namespaceObject.stampMetaClientInfo)(event, request);
|
|
149
170
|
if (data) await (0, external_tracing_helpers_js_namespaceObject.applyResolvedMetadata)(event, data, request, extra);
|
|
150
|
-
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event);
|
|
171
|
+
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger);
|
|
151
172
|
if (!data) {
|
|
152
|
-
(
|
|
173
|
+
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
153
174
|
return {
|
|
154
175
|
tools
|
|
155
176
|
};
|
|
156
177
|
}
|
|
157
178
|
if (0 === tools.length) {
|
|
158
|
-
|
|
179
|
+
data.logger('Warning: No tools found in the original list. This is likely due to the tools not being registered before PostHog MCP analytics.instrument().');
|
|
159
180
|
event.error = (0, external_exceptions_js_namespaceObject.captureException)('No tools were sent to MCP client.');
|
|
160
181
|
event.isError = true;
|
|
161
182
|
event.duration = Date.now() - startTime.getTime();
|
|
162
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
183
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, data.logger);
|
|
163
184
|
return {
|
|
164
185
|
tools
|
|
165
186
|
};
|
|
@@ -170,23 +191,27 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
170
191
|
event.listedToolNames = collectListedToolNames(tools);
|
|
171
192
|
event.isError = false;
|
|
172
193
|
event.duration = Date.now() - startTime.getTime();
|
|
173
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
194
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, data.logger);
|
|
174
195
|
return {
|
|
175
196
|
tools
|
|
176
197
|
};
|
|
177
198
|
}
|
|
199
|
+
function cacheToolAnalyticsParameterOwnership(cache, tools) {
|
|
200
|
+
for (const tool of tools)if (tool?.name) cache.set(tool.name, (0, external_analytics_parameters_js_namespaceObject.getAnalyticsParameterOwnership)(tool.inputSchema));
|
|
201
|
+
}
|
|
178
202
|
function collectListedToolNames(tools) {
|
|
179
203
|
if (!tools || 0 === tools.length) return;
|
|
180
204
|
const names = tools.map((tool)=>tool?.name).filter((name)=>'string' == typeof name);
|
|
181
205
|
return names.length > 0 ? names : void 0;
|
|
182
206
|
}
|
|
183
|
-
async function getTracedToolsList(server, originalListToolsHandler, request, extra, event) {
|
|
207
|
+
async function getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger) {
|
|
184
208
|
try {
|
|
185
209
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
186
210
|
const originalResponse = await originalListToolsHandler(request, extra);
|
|
187
211
|
let tools = originalResponse.tools || [];
|
|
188
|
-
if (data
|
|
189
|
-
if (data
|
|
212
|
+
if (data) cacheToolAnalyticsParameterOwnership(data.toolAnalyticsParameterOwnership, tools);
|
|
213
|
+
if (data && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context)) tools = (0, external_context_parameters_js_namespaceObject.addContextParameterToTools)(tools, (0, external_context_parameters_js_namespaceObject.getContextDescription)(data.options.context), data.logger);
|
|
214
|
+
if (data?.options.enableConversationId) tools = (0, external_conversation_id_js_namespaceObject.addConversationIdToTools)(tools, (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options), data.logger);
|
|
190
215
|
if (data?.options.reportMissing) {
|
|
191
216
|
const missingToolName = (0, external_tools_js_namespaceObject.resolveMissingCapabilityToolName)(data.options);
|
|
192
217
|
const alreadyPresent = tools.some((tool)=>tool?.name === missingToolName);
|
|
@@ -198,11 +223,11 @@ async function getTracedToolsList(server, originalListToolsHandler, request, ext
|
|
|
198
223
|
}
|
|
199
224
|
return tools;
|
|
200
225
|
} catch (error) {
|
|
201
|
-
(
|
|
226
|
+
logger(`Warning: Original list tools handler failed, this suggests an error PostHog MCP analytics did not cause - ${error}`);
|
|
202
227
|
event.error = (0, external_exceptions_js_namespaceObject.captureException)(error);
|
|
203
228
|
event.isError = true;
|
|
204
229
|
event.duration = event.timestamp ? Date.now() - event.timestamp.getTime() : 0;
|
|
205
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
230
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, logger);
|
|
206
231
|
throw error;
|
|
207
232
|
}
|
|
208
233
|
}
|
|
@@ -247,7 +272,7 @@ function mintStatelessSessionOnInitialize(server, data, request, extra) {
|
|
|
247
272
|
(0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
|
|
248
273
|
return sessionId;
|
|
249
274
|
} catch (error) {
|
|
250
|
-
|
|
275
|
+
data.logger(`Warning: PostHog MCP analytics failed to mint a stateless session id - ${error}`);
|
|
251
276
|
return;
|
|
252
277
|
}
|
|
253
278
|
}
|
|
@@ -263,7 +288,7 @@ function upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiate
|
|
|
263
288
|
});
|
|
264
289
|
(0, external_session_token_js_namespaceObject.writeSessionIdToTransport)(transport, token);
|
|
265
290
|
} catch (error) {
|
|
266
|
-
|
|
291
|
+
data.logger(`Warning: PostHog MCP analytics failed to upgrade the stateless session token - ${error}`);
|
|
267
292
|
}
|
|
268
293
|
}
|
|
269
294
|
function readInitializeClientInfo(request) {
|
|
@@ -275,10 +300,10 @@ function readInitializeClientInfo(request) {
|
|
|
275
300
|
version: 'string' == typeof version ? version : void 0
|
|
276
301
|
};
|
|
277
302
|
}
|
|
278
|
-
async function handleInitializeRequest(server, originalInitializeHandler, request, extra) {
|
|
303
|
+
async function handleInitializeRequest(server, originalInitializeHandler, request, extra, logger) {
|
|
279
304
|
const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
|
|
280
305
|
if (!data) {
|
|
281
|
-
(
|
|
306
|
+
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
282
307
|
return await originalInitializeHandler(request, extra);
|
|
283
308
|
}
|
|
284
309
|
const mintedSessionId = mintStatelessSessionOnInitialize(server, data, request, extra);
|
|
@@ -300,7 +325,7 @@ async function handleInitializeRequest(server, originalInitializeHandler, reques
|
|
|
300
325
|
data.sessionInfo.protocolVersion = negotiatedProtocolVersion;
|
|
301
326
|
(0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
|
|
302
327
|
if (mintedSessionId) upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiatedProtocolVersion);
|
|
303
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, event);
|
|
328
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, event, data.logger);
|
|
304
329
|
return result;
|
|
305
330
|
}
|
|
306
331
|
function readProtocolVersion(result, request) {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import { getAnalyticsParameterOwnership, stripOwnedAnalyticsArguments } from "./analytics-parameters.mjs";
|
|
1
2
|
import { addContextParameterToTools, getContextDescription, isContextEnabled } from "./context-parameters.mjs";
|
|
2
|
-
import { addConversationIdToTools, canInjectConversationIdPromptBack,
|
|
3
|
+
import { addConversationIdToTools, canInjectConversationIdPromptBack, injectConversationIdPromptBack, resolveConversationId } from "./conversation-id.mjs";
|
|
3
4
|
import { stampMetaClientInfo } from "./client-identity.mjs";
|
|
4
5
|
import { captureEvent } from "./capture.mjs";
|
|
5
6
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
6
7
|
import { captureException } from "./exceptions.mjs";
|
|
7
8
|
import { resolveToolCallIntent, setEventIntent, setExplicitContextIntent } from "./intent.mjs";
|
|
8
9
|
import { getServerTrackingData, handleIdentify, setServerTrackingData } from "./internal.mjs";
|
|
9
|
-
import { log } from "./logger.mjs";
|
|
10
10
|
import { buildCapturedMcpParameters } from "./mcp-payloads.mjs";
|
|
11
11
|
import { getLiteralValue, getObjectShape } from "./mcp-sdk-compat.mjs";
|
|
12
12
|
import { getSessionId, newSessionId } from "./session.mjs";
|
|
@@ -14,24 +14,45 @@ import { encodeSessionId, readMcpSessionHeader, writeSessionIdToTransport } from
|
|
|
14
14
|
import { getReportMissingToolDescriptor, resolveMissingCapabilityToolName } from "./tools.mjs";
|
|
15
15
|
import { applyResolvedMetadata, isToolResultError } from "./tracing-helpers.mjs";
|
|
16
16
|
async function captureToolCall(params) {
|
|
17
|
-
const { server, data, request, extra, execute, eventType, explicitContextIntent, takeCapturedError } = params;
|
|
18
|
-
const
|
|
19
|
-
const
|
|
17
|
+
const { server, data, request, extra, execute, parameterOwnership, eventType, explicitContextIntent, takeCapturedError } = params;
|
|
18
|
+
const ownership = getActiveAnalyticsParameterOwnership(data, request.params?.name, parameterOwnership);
|
|
19
|
+
const conversation = resolveConversationId(ownership.conversationId, request.params?.arguments, request.params?.name, resolveMissingCapabilityToolName(data.options));
|
|
20
|
+
const downstreamRequest = cloneRequestWithoutOwnedAnalyticsArguments(request, ownership);
|
|
20
21
|
const startTime = new Date();
|
|
21
|
-
const event = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, eventType ?? MCPAnalyticsEventType.mcpToolsCall);
|
|
22
|
+
const event = await prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType ?? MCPAnalyticsEventType.mcpToolsCall);
|
|
22
23
|
if (event && explicitContextIntent) setExplicitContextIntent(event, explicitContextIntent);
|
|
23
24
|
let result;
|
|
24
25
|
try {
|
|
25
26
|
result = await execute(downstreamRequest);
|
|
26
27
|
} catch (error) {
|
|
27
|
-
publishFailedToolEvent(server, event, error, startTime, conversation);
|
|
28
|
+
publishFailedToolEvent(server, event, error, startTime, conversation, data.logger);
|
|
28
29
|
throw error;
|
|
29
30
|
}
|
|
30
31
|
const finalResult = applyConversationPromptBack(event, result, conversation);
|
|
31
|
-
publishSuccessfulToolEvent(server, event, finalResult, startTime, takeCapturedError);
|
|
32
|
+
publishSuccessfulToolEvent(server, event, finalResult, startTime, data.logger, takeCapturedError);
|
|
32
33
|
return finalResult;
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
function getActiveAnalyticsParameterOwnership(data, toolName, override) {
|
|
36
|
+
const ownership = override ?? (toolName ? data.toolAnalyticsParameterOwnership.get(toolName) : void 0);
|
|
37
|
+
const isMissingCapabilityTool = toolName === resolveMissingCapabilityToolName(data.options);
|
|
38
|
+
return {
|
|
39
|
+
context: !isMissingCapabilityTool && isContextEnabled(data.options.context) && ownership?.context === true,
|
|
40
|
+
conversationId: !isMissingCapabilityTool && true === data.options.enableConversationId && ownership?.conversationId === true
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function cloneRequestWithoutOwnedAnalyticsArguments(request, ownership) {
|
|
44
|
+
const args = request.params?.arguments;
|
|
45
|
+
const cleanedArgs = stripOwnedAnalyticsArguments(args, ownership);
|
|
46
|
+
if (cleanedArgs === args || !request.params) return request;
|
|
47
|
+
return {
|
|
48
|
+
...request,
|
|
49
|
+
params: {
|
|
50
|
+
...request.params,
|
|
51
|
+
arguments: cleanedArgs
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async function prepareToolCallEvent(server, data, request, downstreamRequest, extra, startTime, conversation, ownership, eventType) {
|
|
35
56
|
try {
|
|
36
57
|
const sessionId = getSessionId(server, extra);
|
|
37
58
|
await handleIdentify(server, data, sessionId, request, extra);
|
|
@@ -48,10 +69,10 @@ async function prepareToolCallEvent(server, data, request, downstreamRequest, ex
|
|
|
48
69
|
};
|
|
49
70
|
stampMetaClientInfo(event, request);
|
|
50
71
|
await applyResolvedMetadata(event, data, request, extra);
|
|
51
|
-
setEventIntent(event, await resolveToolCallIntent(data, request, extra));
|
|
72
|
+
setEventIntent(event, await resolveToolCallIntent(data, request, ownership.context, extra));
|
|
52
73
|
return event;
|
|
53
74
|
} catch (error) {
|
|
54
|
-
|
|
75
|
+
data.logger(`Warning: PostHog MCP analytics instrumentation failed for tool ${request.params?.name}, the tool will still run - ${error}`);
|
|
55
76
|
return null;
|
|
56
77
|
}
|
|
57
78
|
}
|
|
@@ -61,7 +82,7 @@ function applyConversationPromptBack(event, result, conversation) {
|
|
|
61
82
|
if (event) event.conversationId = void 0;
|
|
62
83
|
return result;
|
|
63
84
|
}
|
|
64
|
-
function publishSuccessfulToolEvent(server, event, result, startTime, takeCapturedError) {
|
|
85
|
+
function publishSuccessfulToolEvent(server, event, result, startTime, logger, takeCapturedError) {
|
|
65
86
|
if (!event) return;
|
|
66
87
|
try {
|
|
67
88
|
if (isToolResultError(result)) {
|
|
@@ -71,21 +92,21 @@ function publishSuccessfulToolEvent(server, event, result, startTime, takeCaptur
|
|
|
71
92
|
} else event.isError = false;
|
|
72
93
|
event.response = result;
|
|
73
94
|
event.duration = Date.now() - startTime.getTime();
|
|
74
|
-
captureEvent(server, event);
|
|
95
|
+
captureEvent(server, event, logger);
|
|
75
96
|
} catch (error) {
|
|
76
|
-
|
|
97
|
+
logger(`Warning: PostHog MCP analytics failed to publish tool event - ${error}`);
|
|
77
98
|
}
|
|
78
99
|
}
|
|
79
|
-
function publishFailedToolEvent(server, event, error, startTime, conversation) {
|
|
100
|
+
function publishFailedToolEvent(server, event, error, startTime, conversation, logger) {
|
|
80
101
|
if (!event) return;
|
|
81
102
|
try {
|
|
82
103
|
if (conversation.minted) event.conversationId = void 0;
|
|
83
104
|
event.isError = true;
|
|
84
105
|
event.error = captureException(error);
|
|
85
106
|
event.duration = Date.now() - startTime.getTime();
|
|
86
|
-
captureEvent(server, event);
|
|
107
|
+
captureEvent(server, event, logger);
|
|
87
108
|
} catch (publishError) {
|
|
88
|
-
|
|
109
|
+
logger(`Warning: PostHog MCP analytics failed to publish failed tool event - ${publishError}`);
|
|
89
110
|
}
|
|
90
111
|
}
|
|
91
112
|
function patchRequestHandlers(server, patches) {
|
|
@@ -102,7 +123,7 @@ function patchRequestHandlers(server, patches) {
|
|
|
102
123
|
return originalSetRequestHandler(requestSchema, (request, extra)=>patch(server, originalHandler, request, extra));
|
|
103
124
|
};
|
|
104
125
|
}
|
|
105
|
-
async function handleListToolsRequest(server, originalListToolsHandler, request, extra) {
|
|
126
|
+
async function handleListToolsRequest(server, originalListToolsHandler, request, extra, logger) {
|
|
106
127
|
const data = getServerTrackingData(server);
|
|
107
128
|
const startTime = new Date();
|
|
108
129
|
const event = {
|
|
@@ -113,19 +134,19 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
113
134
|
};
|
|
114
135
|
stampMetaClientInfo(event, request);
|
|
115
136
|
if (data) await applyResolvedMetadata(event, data, request, extra);
|
|
116
|
-
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event);
|
|
137
|
+
const tools = await getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger);
|
|
117
138
|
if (!data) {
|
|
118
|
-
|
|
139
|
+
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
119
140
|
return {
|
|
120
141
|
tools
|
|
121
142
|
};
|
|
122
143
|
}
|
|
123
144
|
if (0 === tools.length) {
|
|
124
|
-
|
|
145
|
+
data.logger('Warning: No tools found in the original list. This is likely due to the tools not being registered before PostHog MCP analytics.instrument().');
|
|
125
146
|
event.error = captureException('No tools were sent to MCP client.');
|
|
126
147
|
event.isError = true;
|
|
127
148
|
event.duration = Date.now() - startTime.getTime();
|
|
128
|
-
captureEvent(server, event);
|
|
149
|
+
captureEvent(server, event, data.logger);
|
|
129
150
|
return {
|
|
130
151
|
tools
|
|
131
152
|
};
|
|
@@ -136,23 +157,27 @@ async function handleListToolsRequest(server, originalListToolsHandler, request,
|
|
|
136
157
|
event.listedToolNames = collectListedToolNames(tools);
|
|
137
158
|
event.isError = false;
|
|
138
159
|
event.duration = Date.now() - startTime.getTime();
|
|
139
|
-
captureEvent(server, event);
|
|
160
|
+
captureEvent(server, event, data.logger);
|
|
140
161
|
return {
|
|
141
162
|
tools
|
|
142
163
|
};
|
|
143
164
|
}
|
|
165
|
+
function cacheToolAnalyticsParameterOwnership(cache, tools) {
|
|
166
|
+
for (const tool of tools)if (tool?.name) cache.set(tool.name, getAnalyticsParameterOwnership(tool.inputSchema));
|
|
167
|
+
}
|
|
144
168
|
function collectListedToolNames(tools) {
|
|
145
169
|
if (!tools || 0 === tools.length) return;
|
|
146
170
|
const names = tools.map((tool)=>tool?.name).filter((name)=>'string' == typeof name);
|
|
147
171
|
return names.length > 0 ? names : void 0;
|
|
148
172
|
}
|
|
149
|
-
async function getTracedToolsList(server, originalListToolsHandler, request, extra, event) {
|
|
173
|
+
async function getTracedToolsList(server, originalListToolsHandler, request, extra, event, logger) {
|
|
150
174
|
try {
|
|
151
175
|
const data = getServerTrackingData(server);
|
|
152
176
|
const originalResponse = await originalListToolsHandler(request, extra);
|
|
153
177
|
let tools = originalResponse.tools || [];
|
|
154
|
-
if (data
|
|
155
|
-
if (data
|
|
178
|
+
if (data) cacheToolAnalyticsParameterOwnership(data.toolAnalyticsParameterOwnership, tools);
|
|
179
|
+
if (data && isContextEnabled(data.options.context)) tools = addContextParameterToTools(tools, getContextDescription(data.options.context), data.logger);
|
|
180
|
+
if (data?.options.enableConversationId) tools = addConversationIdToTools(tools, resolveMissingCapabilityToolName(data.options), data.logger);
|
|
156
181
|
if (data?.options.reportMissing) {
|
|
157
182
|
const missingToolName = resolveMissingCapabilityToolName(data.options);
|
|
158
183
|
const alreadyPresent = tools.some((tool)=>tool?.name === missingToolName);
|
|
@@ -164,11 +189,11 @@ async function getTracedToolsList(server, originalListToolsHandler, request, ext
|
|
|
164
189
|
}
|
|
165
190
|
return tools;
|
|
166
191
|
} catch (error) {
|
|
167
|
-
|
|
192
|
+
logger(`Warning: Original list tools handler failed, this suggests an error PostHog MCP analytics did not cause - ${error}`);
|
|
168
193
|
event.error = captureException(error);
|
|
169
194
|
event.isError = true;
|
|
170
195
|
event.duration = event.timestamp ? Date.now() - event.timestamp.getTime() : 0;
|
|
171
|
-
captureEvent(server, event);
|
|
196
|
+
captureEvent(server, event, logger);
|
|
172
197
|
throw error;
|
|
173
198
|
}
|
|
174
199
|
}
|
|
@@ -213,7 +238,7 @@ function mintStatelessSessionOnInitialize(server, data, request, extra) {
|
|
|
213
238
|
setServerTrackingData(server, data);
|
|
214
239
|
return sessionId;
|
|
215
240
|
} catch (error) {
|
|
216
|
-
|
|
241
|
+
data.logger(`Warning: PostHog MCP analytics failed to mint a stateless session id - ${error}`);
|
|
217
242
|
return;
|
|
218
243
|
}
|
|
219
244
|
}
|
|
@@ -229,7 +254,7 @@ function upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiate
|
|
|
229
254
|
});
|
|
230
255
|
writeSessionIdToTransport(transport, token);
|
|
231
256
|
} catch (error) {
|
|
232
|
-
|
|
257
|
+
data.logger(`Warning: PostHog MCP analytics failed to upgrade the stateless session token - ${error}`);
|
|
233
258
|
}
|
|
234
259
|
}
|
|
235
260
|
function readInitializeClientInfo(request) {
|
|
@@ -241,10 +266,10 @@ function readInitializeClientInfo(request) {
|
|
|
241
266
|
version: 'string' == typeof version ? version : void 0
|
|
242
267
|
};
|
|
243
268
|
}
|
|
244
|
-
async function handleInitializeRequest(server, originalInitializeHandler, request, extra) {
|
|
269
|
+
async function handleInitializeRequest(server, originalInitializeHandler, request, extra, logger) {
|
|
245
270
|
const data = getServerTrackingData(server);
|
|
246
271
|
if (!data) {
|
|
247
|
-
|
|
272
|
+
logger('Warning: PostHog MCP analytics is unable to find server tracking data. Please ensure you have called instrument(server, options) before using tool calls.');
|
|
248
273
|
return await originalInitializeHandler(request, extra);
|
|
249
274
|
}
|
|
250
275
|
const mintedSessionId = mintStatelessSessionOnInitialize(server, data, request, extra);
|
|
@@ -266,7 +291,7 @@ async function handleInitializeRequest(server, originalInitializeHandler, reques
|
|
|
266
291
|
data.sessionInfo.protocolVersion = negotiatedProtocolVersion;
|
|
267
292
|
setServerTrackingData(server, data);
|
|
268
293
|
if (mintedSessionId) upgradeMintedTokenToNegotiated(server, data, mintedSessionId, negotiatedProtocolVersion);
|
|
269
|
-
captureEvent(server, event);
|
|
294
|
+
captureEvent(server, event, data.logger);
|
|
270
295
|
return result;
|
|
271
296
|
}
|
|
272
297
|
function readProtocolVersion(result, request) {
|
|
@@ -3,7 +3,7 @@ interface ResolvedIntent {
|
|
|
3
3
|
intent: string;
|
|
4
4
|
source: MCPAnalyticsIntentSource;
|
|
5
5
|
}
|
|
6
|
-
export declare function resolveToolCallIntent(data: MCPAnalyticsData, request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra): Promise<ResolvedIntent | null>;
|
|
6
|
+
export declare function resolveToolCallIntent(data: MCPAnalyticsData, request: MCPRequestLike, analyticsOwnsContext: boolean, extra?: CompatibleRequestHandlerExtra): Promise<ResolvedIntent | null>;
|
|
7
7
|
export declare function setEventIntent(event: McpEvent, resolvedIntent: ResolvedIntent | null): void;
|
|
8
8
|
export declare function setExplicitContextIntent(event: McpEvent, context: string): void;
|
|
9
9
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/extensions/intent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,QAAQ,EACT,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/extensions/intent.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,wBAAwB,EACxB,cAAc,EACd,QAAQ,EACT,MAAM,UAAU,CAAA;AAGjB,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,wBAAwB,CAAA;CACjC;AAkCD,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,cAAc,EACvB,oBAAoB,EAAE,OAAO,EAC7B,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAYhC;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,GAAG,IAAI,GAAG,IAAI,CAO3F;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAQ/E"}
|
|
@@ -29,7 +29,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
29
29
|
setEventIntent: ()=>setEventIntent
|
|
30
30
|
});
|
|
31
31
|
const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
|
|
32
|
-
const external_logger_js_namespaceObject = require("./logger.js");
|
|
33
32
|
function getContextArgument(request) {
|
|
34
33
|
const context = request.params?.arguments?.context;
|
|
35
34
|
return 'string' == typeof context && context.trim() ? context : void 0;
|
|
@@ -48,13 +47,13 @@ async function runIntentFallback(data, request, extra) {
|
|
|
48
47
|
source: 'inferred'
|
|
49
48
|
} : null;
|
|
50
49
|
} catch (error) {
|
|
51
|
-
|
|
50
|
+
data.logger(`intentFallback callback error: ${error}`);
|
|
52
51
|
return null;
|
|
53
52
|
}
|
|
54
53
|
}
|
|
55
|
-
async function resolveToolCallIntent(data, request, extra) {
|
|
54
|
+
async function resolveToolCallIntent(data, request, analyticsOwnsContext, extra) {
|
|
56
55
|
const contextArgument = getContextArgument(request);
|
|
57
|
-
if ((0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context) && request.params?.name !== 'get_more_tools' && contextArgument) return {
|
|
56
|
+
if (analyticsOwnsContext && (0, external_context_parameters_js_namespaceObject.isContextEnabled)(data.options.context) && request.params?.name !== 'get_more_tools' && contextArgument) return {
|
|
58
57
|
intent: contextArgument,
|
|
59
58
|
source: 'context_parameter'
|
|
60
59
|
};
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { isContextEnabled } from "./context-parameters.mjs";
|
|
2
|
-
import { log } from "./logger.mjs";
|
|
3
2
|
function getContextArgument(request) {
|
|
4
3
|
const context = request.params?.arguments?.context;
|
|
5
4
|
return 'string' == typeof context && context.trim() ? context : void 0;
|
|
@@ -18,13 +17,13 @@ async function runIntentFallback(data, request, extra) {
|
|
|
18
17
|
source: 'inferred'
|
|
19
18
|
} : null;
|
|
20
19
|
} catch (error) {
|
|
21
|
-
|
|
20
|
+
data.logger(`intentFallback callback error: ${error}`);
|
|
22
21
|
return null;
|
|
23
22
|
}
|
|
24
23
|
}
|
|
25
|
-
async function resolveToolCallIntent(data, request, extra) {
|
|
24
|
+
async function resolveToolCallIntent(data, request, analyticsOwnsContext, extra) {
|
|
26
25
|
const contextArgument = getContextArgument(request);
|
|
27
|
-
if (isContextEnabled(data.options.context) && request.params?.name !== 'get_more_tools' && contextArgument) return {
|
|
26
|
+
if (analyticsOwnsContext && isContextEnabled(data.options.context) && request.params?.name !== 'get_more_tools' && contextArgument) return {
|
|
28
27
|
intent: contextArgument,
|
|
29
28
|
source: 'context_parameter'
|
|
30
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/extensions/internal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAEb,YAAY,EACb,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/extensions/internal.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EAEb,YAAY,EACb,MAAM,UAAU,CAAA;AAKjB;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;gBAErB,OAAO,SAAO;IAI1B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAWhD,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAapD,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI/B,IAAI,IAAI,MAAM;CAGf;AAID,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,gBAAgB,GAAG,SAAS,CAEzF;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI,CAEzF;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,OAAO,CA4B5E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,YAAY,CAapG;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,cAAc,EACvB,KAAK,CAAC,EAAE,6BAA6B,GACpC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAUzC"}
|
|
@@ -33,7 +33,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
33
33
|
setServerTrackingData: ()=>setServerTrackingData
|
|
34
34
|
});
|
|
35
35
|
const external_event_types_js_namespaceObject = require("./event-types.js");
|
|
36
|
-
const external_logger_js_namespaceObject = require("./logger.js");
|
|
37
36
|
const external_capture_js_namespaceObject = require("./capture.js");
|
|
38
37
|
const external_client_identity_js_namespaceObject = require("./client-identity.js");
|
|
39
38
|
class IdentityCache {
|
|
@@ -119,12 +118,12 @@ async function handleIdentify(server, data, sessionId, request, extra) {
|
|
|
119
118
|
const shouldPublish = changed || firstSeen && !announcedAtInitialize;
|
|
120
119
|
data.identifiedSessions.set(sessionId, mergedIdentity);
|
|
121
120
|
if (shouldPublish) {
|
|
122
|
-
|
|
123
|
-
(0, external_capture_js_namespaceObject.captureEvent)(server, identifyEvent);
|
|
121
|
+
data.logger(`Identified session ${sessionId}`);
|
|
122
|
+
(0, external_capture_js_namespaceObject.captureEvent)(server, identifyEvent, data.logger);
|
|
124
123
|
}
|
|
125
|
-
} else
|
|
124
|
+
} else data.logger(`Warning: Supplied identify function returned null for session ${sessionId}`);
|
|
126
125
|
} catch (error) {
|
|
127
|
-
|
|
126
|
+
data.logger(`Error: User supplied identify function threw an error while identifying session ${sessionId} - ${error}`);
|
|
128
127
|
}
|
|
129
128
|
}
|
|
130
129
|
async function resolveEventProperties(data, request, extra) {
|
|
@@ -132,7 +131,7 @@ async function resolveEventProperties(data, request, extra) {
|
|
|
132
131
|
try {
|
|
133
132
|
return await data.options.eventProperties(request, extra) ?? null;
|
|
134
133
|
} catch (e) {
|
|
135
|
-
|
|
134
|
+
data.logger(`eventProperties callback error: ${e}`);
|
|
136
135
|
return null;
|
|
137
136
|
}
|
|
138
137
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { MCPAnalyticsEventType } from "./event-types.mjs";
|
|
2
|
-
import { log } from "./logger.mjs";
|
|
3
2
|
import { captureEvent } from "./capture.mjs";
|
|
4
3
|
import { stampMetaClientInfo } from "./client-identity.mjs";
|
|
5
4
|
class IdentityCache {
|
|
@@ -85,12 +84,12 @@ async function handleIdentify(server, data, sessionId, request, extra) {
|
|
|
85
84
|
const shouldPublish = changed || firstSeen && !announcedAtInitialize;
|
|
86
85
|
data.identifiedSessions.set(sessionId, mergedIdentity);
|
|
87
86
|
if (shouldPublish) {
|
|
88
|
-
|
|
89
|
-
captureEvent(server, identifyEvent);
|
|
87
|
+
data.logger(`Identified session ${sessionId}`);
|
|
88
|
+
captureEvent(server, identifyEvent, data.logger);
|
|
90
89
|
}
|
|
91
|
-
} else
|
|
90
|
+
} else data.logger(`Warning: Supplied identify function returned null for session ${sessionId}`);
|
|
92
91
|
} catch (error) {
|
|
93
|
-
|
|
92
|
+
data.logger(`Error: User supplied identify function threw an error while identifying session ${sessionId} - ${error}`);
|
|
94
93
|
}
|
|
95
94
|
}
|
|
96
95
|
async function resolveEventProperties(data, request, extra) {
|
|
@@ -98,7 +97,7 @@ async function resolveEventProperties(data, request, extra) {
|
|
|
98
97
|
try {
|
|
99
98
|
return await data.options.eventProperties(request, extra) ?? null;
|
|
100
99
|
} catch (e) {
|
|
101
|
-
|
|
100
|
+
data.logger(`eventProperties callback error: ${e}`);
|
|
102
101
|
return null;
|
|
103
102
|
}
|
|
104
103
|
}
|