@posthog/mcp 0.0.8 → 0.1.16

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.
Files changed (138) hide show
  1. package/LICENSE +307 -2
  2. package/README.md +186 -93
  3. package/dist/extensions/capture.d.ts +13 -0
  4. package/dist/extensions/capture.d.ts.map +1 -0
  5. package/dist/extensions/capture.js +80 -0
  6. package/dist/extensions/capture.mjs +46 -0
  7. package/dist/extensions/compatibility.d.ts +23 -0
  8. package/dist/extensions/compatibility.d.ts.map +1 -0
  9. package/dist/extensions/compatibility.js +113 -0
  10. package/dist/extensions/compatibility.mjs +67 -0
  11. package/dist/extensions/constants.d.ts +39 -0
  12. package/dist/extensions/constants.d.ts.map +1 -0
  13. package/dist/extensions/constants.js +86 -0
  14. package/dist/extensions/constants.mjs +37 -0
  15. package/dist/extensions/context-parameters.d.ts +31 -0
  16. package/dist/extensions/context-parameters.d.ts.map +1 -0
  17. package/dist/extensions/context-parameters.js +93 -0
  18. package/dist/extensions/context-parameters.mjs +50 -0
  19. package/dist/extensions/conversation-id.d.ts +52 -0
  20. package/dist/extensions/conversation-id.d.ts.map +1 -0
  21. package/dist/extensions/conversation-id.js +164 -0
  22. package/dist/extensions/conversation-id.mjs +103 -0
  23. package/dist/extensions/event-types.d.ts +21 -0
  24. package/dist/extensions/event-types.d.ts.map +1 -0
  25. package/dist/extensions/event-types.js +47 -0
  26. package/dist/extensions/event-types.mjs +13 -0
  27. package/dist/extensions/exceptions.d.ts +13 -0
  28. package/dist/extensions/exceptions.d.ts.map +1 -0
  29. package/dist/extensions/exceptions.js +58 -0
  30. package/dist/extensions/exceptions.mjs +24 -0
  31. package/dist/extensions/ids.d.ts +13 -0
  32. package/dist/extensions/ids.d.ts.map +1 -0
  33. package/dist/extensions/ids.js +55 -0
  34. package/dist/extensions/ids.mjs +18 -0
  35. package/dist/extensions/instrument-highlevel.d.ts +3 -0
  36. package/dist/extensions/instrument-highlevel.d.ts.map +1 -0
  37. package/dist/extensions/instrument-highlevel.js +229 -0
  38. package/dist/extensions/instrument-highlevel.mjs +195 -0
  39. package/dist/extensions/instrument-lowlevel.d.ts +8 -0
  40. package/dist/extensions/instrument-lowlevel.d.ts.map +1 -0
  41. package/dist/extensions/instrument-lowlevel.js +85 -0
  42. package/dist/extensions/instrument-lowlevel.mjs +51 -0
  43. package/dist/extensions/instrumentation.d.ts +59 -0
  44. package/dist/extensions/instrumentation.d.ts.map +1 -0
  45. package/dist/extensions/instrumentation.js +237 -0
  46. package/dist/extensions/instrumentation.mjs +194 -0
  47. package/dist/extensions/intent.d.ts +10 -0
  48. package/dist/extensions/intent.d.ts.map +1 -0
  49. package/dist/extensions/intent.js +84 -0
  50. package/dist/extensions/intent.mjs +44 -0
  51. package/dist/extensions/internal.d.ts +32 -0
  52. package/dist/extensions/internal.d.ts.map +1 -0
  53. package/dist/extensions/internal.js +158 -0
  54. package/dist/extensions/internal.mjs +106 -0
  55. package/dist/extensions/logger.d.ts +14 -0
  56. package/dist/extensions/logger.d.ts.map +1 -0
  57. package/dist/extensions/logger.js +47 -0
  58. package/dist/extensions/logger.mjs +10 -0
  59. package/dist/extensions/mcp-payloads.d.ts +5 -0
  60. package/dist/extensions/mcp-payloads.d.ts.map +1 -0
  61. package/dist/extensions/mcp-payloads.js +91 -0
  62. package/dist/extensions/mcp-payloads.mjs +54 -0
  63. package/dist/extensions/mcp-sdk-compat.d.ts +33 -0
  64. package/dist/extensions/mcp-sdk-compat.d.ts.map +1 -0
  65. package/dist/extensions/mcp-sdk-compat.js +112 -0
  66. package/dist/extensions/mcp-sdk-compat.mjs +60 -0
  67. package/dist/extensions/posthog-events.d.ts +14 -0
  68. package/dist/extensions/posthog-events.d.ts.map +1 -0
  69. package/dist/extensions/posthog-events.js +143 -0
  70. package/dist/extensions/posthog-events.mjs +109 -0
  71. package/dist/extensions/sanitization.d.ts +10 -0
  72. package/dist/extensions/sanitization.d.ts.map +1 -0
  73. package/dist/extensions/sanitization.js +96 -0
  74. package/dist/extensions/sanitization.mjs +62 -0
  75. package/dist/extensions/session.d.ts +20 -0
  76. package/dist/extensions/session.d.ts.map +1 -0
  77. package/dist/extensions/session.js +113 -0
  78. package/dist/extensions/session.mjs +67 -0
  79. package/dist/extensions/sink.d.ts +44 -0
  80. package/dist/extensions/sink.d.ts.map +1 -0
  81. package/dist/extensions/sink.js +102 -0
  82. package/dist/extensions/sink.mjs +65 -0
  83. package/dist/extensions/tools.d.ts +9 -0
  84. package/dist/extensions/tools.d.ts.map +1 -0
  85. package/dist/extensions/tools.js +79 -0
  86. package/dist/extensions/tools.mjs +39 -0
  87. package/dist/extensions/tracing-helpers.d.ts +29 -0
  88. package/dist/extensions/tracing-helpers.d.ts.map +1 -0
  89. package/dist/extensions/tracing-helpers.js +59 -0
  90. package/dist/extensions/tracing-helpers.mjs +16 -0
  91. package/dist/extensions/truncation.d.ts +25 -0
  92. package/dist/extensions/truncation.d.ts.map +1 -0
  93. package/dist/extensions/truncation.js +277 -0
  94. package/dist/extensions/truncation.mjs +228 -0
  95. package/dist/index.d.ts +36 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +132 -0
  98. package/dist/index.mjs +83 -2928
  99. package/dist/types.d.ts +220 -0
  100. package/dist/types.d.ts.map +1 -0
  101. package/dist/types.js +18 -0
  102. package/dist/types.mjs +0 -0
  103. package/dist/version.d.ts +2 -0
  104. package/dist/version.d.ts.map +1 -0
  105. package/dist/version.js +36 -0
  106. package/dist/version.mjs +2 -0
  107. package/package.json +55 -87
  108. package/src/extensions/capture.ts +68 -0
  109. package/src/extensions/compatibility.ts +138 -0
  110. package/src/extensions/constants.ts +48 -0
  111. package/src/extensions/context-parameters.ts +119 -0
  112. package/src/extensions/conversation-id.ts +177 -0
  113. package/src/extensions/event-types.ts +21 -0
  114. package/src/extensions/exceptions.ts +83 -0
  115. package/src/extensions/ids.ts +32 -0
  116. package/src/extensions/instrument-highlevel.ts +297 -0
  117. package/src/extensions/instrument-lowlevel.ts +83 -0
  118. package/src/extensions/instrumentation.ts +415 -0
  119. package/src/extensions/intent.ts +78 -0
  120. package/src/extensions/internal.ts +193 -0
  121. package/src/extensions/logger.ts +27 -0
  122. package/src/extensions/mcp-payloads.ts +98 -0
  123. package/src/extensions/mcp-sdk-compat.ts +160 -0
  124. package/src/extensions/posthog-events.ts +212 -0
  125. package/src/extensions/sanitization.ts +121 -0
  126. package/src/extensions/session.ts +117 -0
  127. package/src/extensions/sink.ts +130 -0
  128. package/src/extensions/tools.ts +50 -0
  129. package/src/extensions/tracing-helpers.ts +51 -0
  130. package/src/extensions/truncation.ts +453 -0
  131. package/src/index.ts +174 -0
  132. package/src/types.ts +244 -0
  133. package/src/version.ts +1 -0
  134. package/dist/index.cjs +0 -2936
  135. package/dist/index.cjs.map +0 -1
  136. package/dist/index.d.cts +0 -264
  137. package/dist/index.d.mts +0 -263
  138. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,60 @@
1
+ function getToolFunction(tool) {
2
+ if ('handler' in tool && 'function' == typeof tool.handler) return tool.handler;
3
+ if ('callback' in tool && 'function' == typeof tool.callback) return tool.callback;
4
+ throw new Error('Tool has neither callback nor handler property');
5
+ }
6
+ function getToolFunctionKey(tool) {
7
+ if ('handler' in tool && 'function' == typeof tool.handler) return 'handler';
8
+ return 'callback';
9
+ }
10
+ function hasToolFunction(tool) {
11
+ if (!tool || 'object' != typeof tool) return false;
12
+ const t = tool;
13
+ return 'handler' in t && 'function' == typeof t.handler || 'callback' in t && 'function' == typeof t.callback;
14
+ }
15
+ function createWrappedTool(originalTool, wrappedFunction) {
16
+ const key = getToolFunctionKey(originalTool);
17
+ return {
18
+ ...originalTool,
19
+ [key]: wrappedFunction
20
+ };
21
+ }
22
+ function isZ4Schema(schema) {
23
+ if (!schema || 'object' != typeof schema) return false;
24
+ return !!schema._zod;
25
+ }
26
+ function getObjectShape(schema) {
27
+ if (!schema || 'object' != typeof schema) return;
28
+ let rawShape;
29
+ if (isZ4Schema(schema)) {
30
+ const v4Schema = schema;
31
+ rawShape = v4Schema._zod?.def?.shape;
32
+ } else {
33
+ const v3Schema = schema;
34
+ rawShape = v3Schema.shape ?? v3Schema._def?.shape;
35
+ }
36
+ if (!rawShape) return;
37
+ if ('function' == typeof rawShape) try {
38
+ return rawShape();
39
+ } catch {
40
+ return;
41
+ }
42
+ return rawShape;
43
+ }
44
+ function getLiteralValue(schema) {
45
+ if (!schema || 'object' != typeof schema) return;
46
+ if (isZ4Schema(schema)) {
47
+ const v4Schema = schema;
48
+ const def = v4Schema._zod?.def;
49
+ if (def?.value !== void 0) return def.value;
50
+ if (Array.isArray(def?.values) && def.values.length > 0) return def.values[0];
51
+ } else {
52
+ const v3Schema = schema;
53
+ const def = v3Schema._def;
54
+ if (def?.value !== void 0) return def.value;
55
+ if (Array.isArray(def?.values) && def.values.length > 0) return def.values[0];
56
+ }
57
+ const directValue = schema.value;
58
+ if (void 0 !== directValue) return directValue;
59
+ }
60
+ export { createWrappedTool, getLiteralValue, getObjectShape, getToolFunction, getToolFunctionKey, hasToolFunction, isZ4Schema };
@@ -0,0 +1,14 @@
1
+ import type { Event } from '../types';
2
+ export interface PostHogCaptureEvent {
3
+ distinct_id: string;
4
+ event: string;
5
+ properties: Record<string, unknown>;
6
+ timestamp: string;
7
+ type: 'capture';
8
+ }
9
+ export interface BuildPostHogCaptureEventsOptions {
10
+ /** Whether to emit a `$exception` sibling alongside errored events. Defaults to `true`. */
11
+ enableExceptionAutocapture?: boolean;
12
+ }
13
+ export declare function buildPostHogCaptureEvents(event: Event, options?: BuildPostHogCaptureEventsOptions): PostHogCaptureEvent[];
14
+ //# sourceMappingURL=posthog-events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"posthog-events.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAyBrC,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,gCAAgC;IAC/C,2FAA2F;IAC3F,0BAA0B,CAAC,EAAE,OAAO,CAAA;CACrC;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE,gCAAqC,GAC7C,mBAAmB,EAAE,CAQvB"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ buildPostHogCaptureEvents: ()=>buildPostHogCaptureEvents
28
+ });
29
+ const external_constants_js_namespaceObject = require("./constants.js");
30
+ const external_event_types_js_namespaceObject = require("./event-types.js");
31
+ const BUILT_IN_EVENT_NAME_BY_TYPE = {
32
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.custom]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Custom,
33
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.identify]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Identify,
34
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpMissingCapability]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.MissingCapability,
35
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpInitialize]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Initialize,
36
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpPromptsGet]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.PromptGet,
37
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpPromptsList]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.PromptsList,
38
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpResourcesList]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.ResourcesList,
39
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpResourcesRead]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.ResourceRead,
40
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.ToolCall,
41
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsList]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.ToolsList
42
+ };
43
+ function getDistinctId(event) {
44
+ return event.identifyActorGivenId || event.sessionId || 'anonymous';
45
+ }
46
+ function getTimestamp(event) {
47
+ return event.timestamp ? event.timestamp.toISOString() : new Date().toISOString();
48
+ }
49
+ function buildPostHogCaptureEvents(event, options = {}) {
50
+ const batch = [
51
+ buildCaptureEvent(event)
52
+ ];
53
+ if (event.isError && event.error && false !== options.enableExceptionAutocapture) batch.push(buildExceptionEvent(event));
54
+ return batch;
55
+ }
56
+ function buildCaptureEvent(event) {
57
+ const distinctId = getDistinctId(event);
58
+ const timestamp = getTimestamp(event);
59
+ const properties = {
60
+ [external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.SessionId]: event.sessionId,
61
+ [external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.Source]: external_constants_js_namespaceObject.POSTHOG_MCP_ANALYTICS_SOURCE
62
+ };
63
+ addConversationIdProperty(event, properties);
64
+ addPersonProcessingProperty(event, properties);
65
+ addGroupsProperty(event, properties);
66
+ addCommonEventProperties(event, properties);
67
+ addCustomEventProperties(event, properties);
68
+ return {
69
+ event: event.eventName ?? BUILT_IN_EVENT_NAME_BY_TYPE[event.eventType],
70
+ distinct_id: distinctId,
71
+ properties,
72
+ timestamp,
73
+ type: 'capture'
74
+ };
75
+ }
76
+ function addConversationIdProperty(event, properties) {
77
+ if (void 0 !== event.conversationId && '' !== event.conversationId) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ConversationId] = event.conversationId;
78
+ }
79
+ function addGroupsProperty(event, properties) {
80
+ if (event.groups && Object.keys(event.groups).length > 0) properties.$groups = event.groups;
81
+ }
82
+ function addPersonProcessingProperty(event, properties) {
83
+ if (!event.identifyActorGivenId) properties.$process_person_profile = false;
84
+ }
85
+ function addCommonEventProperties(event, properties) {
86
+ if (event.resourceName) {
87
+ properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ResourceName] = event.resourceName;
88
+ if (event.eventType === external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ToolName] = event.resourceName;
89
+ }
90
+ if (event.toolDescription && event.eventType === external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ToolDescription] = event.toolDescription;
91
+ if (event.listedToolNames && event.listedToolNames.length > 0 && event.eventType === external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsList) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ListedToolNames] = event.listedToolNames;
92
+ if (void 0 !== event.duration) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.DurationMs] = event.duration;
93
+ if (event.serverName) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ServerName] = event.serverName;
94
+ if (event.serverVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
95
+ if (event.clientName) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
96
+ if (event.clientVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
97
+ if (event.userIntent) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.Intent] = event.userIntent;
98
+ if (event.userIntentSource) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.IntentSource] = event.userIntentSource;
99
+ if (void 0 !== event.isError) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.IsError] = event.isError;
100
+ if (void 0 !== event.parameters) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.Parameters] = event.parameters;
101
+ if (void 0 !== event.response) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.Response] = event.response;
102
+ if (event.identifyActorData && Object.keys(event.identifyActorData).length > 0) properties.$set = {
103
+ ...event.identifyActorData
104
+ };
105
+ }
106
+ function addCustomEventProperties(event, properties) {
107
+ if (event.properties) for (const [key, value] of Object.entries(event.properties))properties[key] = value;
108
+ }
109
+ function buildExceptionEvent(event) {
110
+ const distinctId = getDistinctId(event);
111
+ const timestamp = getTimestamp(event);
112
+ const properties = {
113
+ [external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.SessionId]: event.sessionId
114
+ };
115
+ addConversationIdProperty(event, properties);
116
+ addPersonProcessingProperty(event, properties);
117
+ addGroupsProperty(event, properties);
118
+ if (event.error) Object.assign(properties, event.error);
119
+ if (event.resourceName) {
120
+ properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ResourceName] = event.resourceName;
121
+ if (event.eventType === external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ToolName] = event.resourceName;
122
+ }
123
+ if (event.toolDescription && event.eventType === external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ToolDescription] = event.toolDescription;
124
+ if (event.serverName) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ServerName] = event.serverName;
125
+ if (event.serverVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
126
+ if (event.clientName) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
127
+ if (event.clientVersion) properties[external_constants_js_namespaceObject.PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
128
+ addCustomEventProperties(event, properties);
129
+ return {
130
+ event: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Exception,
131
+ distinct_id: distinctId,
132
+ properties,
133
+ timestamp,
134
+ type: 'capture'
135
+ };
136
+ }
137
+ exports.buildPostHogCaptureEvents = __webpack_exports__.buildPostHogCaptureEvents;
138
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
139
+ "buildPostHogCaptureEvents"
140
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
141
+ Object.defineProperty(exports, '__esModule', {
142
+ value: true
143
+ });
@@ -0,0 +1,109 @@
1
+ import { POSTHOG_MCP_ANALYTICS_SOURCE, PostHogMCPAnalyticsEvent, PostHogMCPAnalyticsProperty } from "./constants.mjs";
2
+ import { MCPAnalyticsEventType } from "./event-types.mjs";
3
+ const BUILT_IN_EVENT_NAME_BY_TYPE = {
4
+ [MCPAnalyticsEventType.custom]: PostHogMCPAnalyticsEvent.Custom,
5
+ [MCPAnalyticsEventType.identify]: PostHogMCPAnalyticsEvent.Identify,
6
+ [MCPAnalyticsEventType.mcpMissingCapability]: PostHogMCPAnalyticsEvent.MissingCapability,
7
+ [MCPAnalyticsEventType.mcpInitialize]: PostHogMCPAnalyticsEvent.Initialize,
8
+ [MCPAnalyticsEventType.mcpPromptsGet]: PostHogMCPAnalyticsEvent.PromptGet,
9
+ [MCPAnalyticsEventType.mcpPromptsList]: PostHogMCPAnalyticsEvent.PromptsList,
10
+ [MCPAnalyticsEventType.mcpResourcesList]: PostHogMCPAnalyticsEvent.ResourcesList,
11
+ [MCPAnalyticsEventType.mcpResourcesRead]: PostHogMCPAnalyticsEvent.ResourceRead,
12
+ [MCPAnalyticsEventType.mcpToolsCall]: PostHogMCPAnalyticsEvent.ToolCall,
13
+ [MCPAnalyticsEventType.mcpToolsList]: PostHogMCPAnalyticsEvent.ToolsList
14
+ };
15
+ function getDistinctId(event) {
16
+ return event.identifyActorGivenId || event.sessionId || 'anonymous';
17
+ }
18
+ function getTimestamp(event) {
19
+ return event.timestamp ? event.timestamp.toISOString() : new Date().toISOString();
20
+ }
21
+ function buildPostHogCaptureEvents(event, options = {}) {
22
+ const batch = [
23
+ buildCaptureEvent(event)
24
+ ];
25
+ if (event.isError && event.error && false !== options.enableExceptionAutocapture) batch.push(buildExceptionEvent(event));
26
+ return batch;
27
+ }
28
+ function buildCaptureEvent(event) {
29
+ const distinctId = getDistinctId(event);
30
+ const timestamp = getTimestamp(event);
31
+ const properties = {
32
+ [PostHogMCPAnalyticsProperty.SessionId]: event.sessionId,
33
+ [PostHogMCPAnalyticsProperty.Source]: POSTHOG_MCP_ANALYTICS_SOURCE
34
+ };
35
+ addConversationIdProperty(event, properties);
36
+ addPersonProcessingProperty(event, properties);
37
+ addGroupsProperty(event, properties);
38
+ addCommonEventProperties(event, properties);
39
+ addCustomEventProperties(event, properties);
40
+ return {
41
+ event: event.eventName ?? BUILT_IN_EVENT_NAME_BY_TYPE[event.eventType],
42
+ distinct_id: distinctId,
43
+ properties,
44
+ timestamp,
45
+ type: 'capture'
46
+ };
47
+ }
48
+ function addConversationIdProperty(event, properties) {
49
+ if (void 0 !== event.conversationId && '' !== event.conversationId) properties[PostHogMCPAnalyticsProperty.ConversationId] = event.conversationId;
50
+ }
51
+ function addGroupsProperty(event, properties) {
52
+ if (event.groups && Object.keys(event.groups).length > 0) properties.$groups = event.groups;
53
+ }
54
+ function addPersonProcessingProperty(event, properties) {
55
+ if (!event.identifyActorGivenId) properties.$process_person_profile = false;
56
+ }
57
+ function addCommonEventProperties(event, properties) {
58
+ if (event.resourceName) {
59
+ properties[PostHogMCPAnalyticsProperty.ResourceName] = event.resourceName;
60
+ if (event.eventType === MCPAnalyticsEventType.mcpToolsCall) properties[PostHogMCPAnalyticsProperty.ToolName] = event.resourceName;
61
+ }
62
+ if (event.toolDescription && event.eventType === MCPAnalyticsEventType.mcpToolsCall) properties[PostHogMCPAnalyticsProperty.ToolDescription] = event.toolDescription;
63
+ if (event.listedToolNames && event.listedToolNames.length > 0 && event.eventType === MCPAnalyticsEventType.mcpToolsList) properties[PostHogMCPAnalyticsProperty.ListedToolNames] = event.listedToolNames;
64
+ if (void 0 !== event.duration) properties[PostHogMCPAnalyticsProperty.DurationMs] = event.duration;
65
+ if (event.serverName) properties[PostHogMCPAnalyticsProperty.ServerName] = event.serverName;
66
+ if (event.serverVersion) properties[PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
67
+ if (event.clientName) properties[PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
68
+ if (event.clientVersion) properties[PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
69
+ if (event.userIntent) properties[PostHogMCPAnalyticsProperty.Intent] = event.userIntent;
70
+ if (event.userIntentSource) properties[PostHogMCPAnalyticsProperty.IntentSource] = event.userIntentSource;
71
+ if (void 0 !== event.isError) properties[PostHogMCPAnalyticsProperty.IsError] = event.isError;
72
+ if (void 0 !== event.parameters) properties[PostHogMCPAnalyticsProperty.Parameters] = event.parameters;
73
+ if (void 0 !== event.response) properties[PostHogMCPAnalyticsProperty.Response] = event.response;
74
+ if (event.identifyActorData && Object.keys(event.identifyActorData).length > 0) properties.$set = {
75
+ ...event.identifyActorData
76
+ };
77
+ }
78
+ function addCustomEventProperties(event, properties) {
79
+ if (event.properties) for (const [key, value] of Object.entries(event.properties))properties[key] = value;
80
+ }
81
+ function buildExceptionEvent(event) {
82
+ const distinctId = getDistinctId(event);
83
+ const timestamp = getTimestamp(event);
84
+ const properties = {
85
+ [PostHogMCPAnalyticsProperty.SessionId]: event.sessionId
86
+ };
87
+ addConversationIdProperty(event, properties);
88
+ addPersonProcessingProperty(event, properties);
89
+ addGroupsProperty(event, properties);
90
+ if (event.error) Object.assign(properties, event.error);
91
+ if (event.resourceName) {
92
+ properties[PostHogMCPAnalyticsProperty.ResourceName] = event.resourceName;
93
+ if (event.eventType === MCPAnalyticsEventType.mcpToolsCall) properties[PostHogMCPAnalyticsProperty.ToolName] = event.resourceName;
94
+ }
95
+ if (event.toolDescription && event.eventType === MCPAnalyticsEventType.mcpToolsCall) properties[PostHogMCPAnalyticsProperty.ToolDescription] = event.toolDescription;
96
+ if (event.serverName) properties[PostHogMCPAnalyticsProperty.ServerName] = event.serverName;
97
+ if (event.serverVersion) properties[PostHogMCPAnalyticsProperty.ServerVersion] = event.serverVersion;
98
+ if (event.clientName) properties[PostHogMCPAnalyticsProperty.ClientName] = event.clientName;
99
+ if (event.clientVersion) properties[PostHogMCPAnalyticsProperty.ClientVersion] = event.clientVersion;
100
+ addCustomEventProperties(event, properties);
101
+ return {
102
+ event: PostHogMCPAnalyticsEvent.Exception,
103
+ distinct_id: distinctId,
104
+ properties,
105
+ timestamp,
106
+ type: 'capture'
107
+ };
108
+ }
109
+ export { buildPostHogCaptureEvents };
@@ -0,0 +1,10 @@
1
+ import type { Event, McpEvent } from '../types';
2
+ /**
3
+ * Sanitizes an event by redacting non-text content blocks from responses
4
+ * and large base64-encoded strings from parameters.
5
+ *
6
+ * This is a synchronous operation that returns a new object without mutating the original.
7
+ * It should run after customer redaction in the event pipeline.
8
+ */
9
+ export declare function sanitizeEvent<T extends Event | McpEvent>(event: T): T;
10
+ //# sourceMappingURL=sanitization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitization.d.ts","sourceRoot":"","sources":["../../src/extensions/sanitization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAS/C;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,KAAK,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAYrE"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ sanitizeEvent: ()=>sanitizeEvent
28
+ });
29
+ const external_mcp_payloads_js_namespaceObject = require("./mcp-payloads.js");
30
+ function isRecord(value) {
31
+ return !!value && 'object' == typeof value && !Array.isArray(value);
32
+ }
33
+ function sanitizeEvent(event) {
34
+ const result = {
35
+ ...event
36
+ };
37
+ if (null != result.response) result.response = sanitizeResponse(result.response);
38
+ if (null != result.parameters) result.parameters = sanitizeParameters(result.parameters);
39
+ return result;
40
+ }
41
+ function sanitizeResponse(response) {
42
+ if (null == response || 'object' != typeof response) return (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(response);
43
+ const sanitized = (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(response);
44
+ if (!isRecord(sanitized)) return sanitized;
45
+ const result = {
46
+ ...sanitized
47
+ };
48
+ const content = result.content;
49
+ if (Array.isArray(content)) result.content = content.map(sanitizeContentBlock);
50
+ if (null != result.structuredContent && 'object' == typeof result.structuredContent) result.structuredContent = (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(result.structuredContent);
51
+ return result;
52
+ }
53
+ function sanitizeContentBlock(block) {
54
+ if (null == block || 'object' != typeof block) return block;
55
+ if (!isRecord(block)) return block;
56
+ switch(block.type){
57
+ case 'text':
58
+ return (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(block);
59
+ case 'image':
60
+ return {
61
+ type: 'text',
62
+ text: '[image content redacted - not supported by PostHog MCP analytics]'
63
+ };
64
+ case 'audio':
65
+ return {
66
+ type: 'text',
67
+ text: '[audio content redacted - not supported by PostHog MCP analytics]'
68
+ };
69
+ case 'resource':
70
+ return sanitizeResourceBlock(block);
71
+ case 'resource_link':
72
+ return (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(block);
73
+ default:
74
+ return {
75
+ type: 'text',
76
+ text: `[unsupported content type "${block.type}" redacted - not supported by PostHog MCP analytics]`
77
+ };
78
+ }
79
+ }
80
+ function sanitizeResourceBlock(block) {
81
+ if (isRecord(block.resource) && 'blob' in block.resource) return {
82
+ type: 'text',
83
+ text: '[binary resource content redacted - not supported by PostHog MCP analytics]'
84
+ };
85
+ return (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(block);
86
+ }
87
+ function sanitizeParameters(obj) {
88
+ return (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(obj);
89
+ }
90
+ exports.sanitizeEvent = __webpack_exports__.sanitizeEvent;
91
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
92
+ "sanitizeEvent"
93
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
94
+ Object.defineProperty(exports, '__esModule', {
95
+ value: true
96
+ });
@@ -0,0 +1,62 @@
1
+ import { sanitizeCapturedValue } from "./mcp-payloads.mjs";
2
+ function isRecord(value) {
3
+ return !!value && 'object' == typeof value && !Array.isArray(value);
4
+ }
5
+ function sanitizeEvent(event) {
6
+ const result = {
7
+ ...event
8
+ };
9
+ if (null != result.response) result.response = sanitizeResponse(result.response);
10
+ if (null != result.parameters) result.parameters = sanitizeParameters(result.parameters);
11
+ return result;
12
+ }
13
+ function sanitizeResponse(response) {
14
+ if (null == response || 'object' != typeof response) return sanitizeCapturedValue(response);
15
+ const sanitized = sanitizeCapturedValue(response);
16
+ if (!isRecord(sanitized)) return sanitized;
17
+ const result = {
18
+ ...sanitized
19
+ };
20
+ const content = result.content;
21
+ if (Array.isArray(content)) result.content = content.map(sanitizeContentBlock);
22
+ if (null != result.structuredContent && 'object' == typeof result.structuredContent) result.structuredContent = sanitizeCapturedValue(result.structuredContent);
23
+ return result;
24
+ }
25
+ function sanitizeContentBlock(block) {
26
+ if (null == block || 'object' != typeof block) return block;
27
+ if (!isRecord(block)) return block;
28
+ switch(block.type){
29
+ case 'text':
30
+ return sanitizeCapturedValue(block);
31
+ case 'image':
32
+ return {
33
+ type: 'text',
34
+ text: '[image content redacted - not supported by PostHog MCP analytics]'
35
+ };
36
+ case 'audio':
37
+ return {
38
+ type: 'text',
39
+ text: '[audio content redacted - not supported by PostHog MCP analytics]'
40
+ };
41
+ case 'resource':
42
+ return sanitizeResourceBlock(block);
43
+ case 'resource_link':
44
+ return sanitizeCapturedValue(block);
45
+ default:
46
+ return {
47
+ type: 'text',
48
+ text: `[unsupported content type "${block.type}" redacted - not supported by PostHog MCP analytics]`
49
+ };
50
+ }
51
+ }
52
+ function sanitizeResourceBlock(block) {
53
+ if (isRecord(block.resource) && 'blob' in block.resource) return {
54
+ type: 'text',
55
+ text: '[binary resource content redacted - not supported by PostHog MCP analytics]'
56
+ };
57
+ return sanitizeCapturedValue(block);
58
+ }
59
+ function sanitizeParameters(obj) {
60
+ return sanitizeCapturedValue(obj);
61
+ }
62
+ export { sanitizeEvent };
@@ -0,0 +1,20 @@
1
+ import type { CompatibleRequestHandlerExtra, MCPAnalyticsData, MCPServerLike, SessionInfo } from '../types';
2
+ export declare function newSessionId(): string;
3
+ /**
4
+ * Derives the SDK session id deterministically from the MCP sessionId, so the
5
+ * same MCP session correlates to one SDK session across server restarts.
6
+ */
7
+ export declare function deriveSessionIdFromMCPSession(mcpSessionId: string): string;
8
+ /**
9
+ * Resolves the session id for a request, preferring the MCP protocol sessionId
10
+ * over an SDK-generated one so a transport-supplied session wins.
11
+ */
12
+ export declare function getServerSessionId(server: MCPServerLike, extra?: CompatibleRequestHandlerExtra): string;
13
+ export declare function setLastActivity(server: MCPServerLike): void;
14
+ /**
15
+ * Builds the session metadata stamped onto an event. The caller passes the
16
+ * session id resolved for *this* request so identity attribution can't be
17
+ * clobbered by a concurrent request mutating shared `data.sessionId`.
18
+ */
19
+ export declare function getSessionInfo(server: MCPServerLike, data: MCPAnalyticsData | undefined, sessionId?: string): SessionInfo;
20
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/extensions/session.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,6BAA6B,EAC7B,gBAAgB,EAChB,aAAa,EAEb,WAAW,EACZ,MAAM,UAAU,CAAA;AAKjB,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,EAAE,KAAK,CAAC,EAAE,6BAA6B,GAAG,MAAM,CAoCvG;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAS3D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,gBAAgB,GAAG,SAAS,EAClC,SAAS,CAAC,EAAE,MAAM,GACjB,WAAW,CA8Bb"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ setLastActivity: ()=>setLastActivity,
28
+ getServerSessionId: ()=>getServerSessionId,
29
+ deriveSessionIdFromMCPSession: ()=>deriveSessionIdFromMCPSession,
30
+ getSessionInfo: ()=>getSessionInfo,
31
+ newSessionId: ()=>newSessionId
32
+ });
33
+ const external_version_js_namespaceObject = require("../version.js");
34
+ const external_constants_js_namespaceObject = require("./constants.js");
35
+ const external_ids_js_namespaceObject = require("./ids.js");
36
+ const external_internal_js_namespaceObject = require("./internal.js");
37
+ function newSessionId() {
38
+ return (0, external_ids_js_namespaceObject.newPrefixedId)('ses');
39
+ }
40
+ function deriveSessionIdFromMCPSession(mcpSessionId) {
41
+ return (0, external_ids_js_namespaceObject.deterministicPrefixedId)('ses', mcpSessionId);
42
+ }
43
+ function getServerSessionId(server, extra) {
44
+ const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
45
+ if (!data) throw new Error('Server tracking data not found');
46
+ const mcpSessionId = extra?.sessionId;
47
+ if (mcpSessionId) {
48
+ data.sessionId = deriveSessionIdFromMCPSession(mcpSessionId);
49
+ data.lastMcpSessionId = mcpSessionId;
50
+ data.sessionSource = 'mcp';
51
+ (0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
52
+ setLastActivity(server);
53
+ return data.sessionId;
54
+ }
55
+ if ('mcp' === data.sessionSource && data.lastMcpSessionId) {
56
+ setLastActivity(server);
57
+ return data.sessionId;
58
+ }
59
+ const now = Date.now();
60
+ const timeoutMs = 60 * external_constants_js_namespaceObject.INACTIVITY_TIMEOUT_IN_MINUTES * 1000;
61
+ if (now - data.lastActivity.getTime() > timeoutMs) {
62
+ data.sessionId = newSessionId();
63
+ data.sessionSource = 'generated';
64
+ (0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
65
+ }
66
+ setLastActivity(server);
67
+ return data.sessionId;
68
+ }
69
+ function setLastActivity(server) {
70
+ const data = (0, external_internal_js_namespaceObject.getServerTrackingData)(server);
71
+ if (!data) throw new Error('Server tracking data not found');
72
+ data.lastActivity = new Date();
73
+ (0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
74
+ }
75
+ function getSessionInfo(server, data, sessionId) {
76
+ let clientInfo = {
77
+ name: void 0,
78
+ version: void 0
79
+ };
80
+ if (!data?.sessionInfo.clientName) clientInfo = server.getClientVersion();
81
+ const actorInfo = data?.identifiedSessions.get(sessionId ?? data.sessionId);
82
+ const sessionInfo = {
83
+ ipAddress: void 0,
84
+ sdkLanguage: 'TypeScript',
85
+ sdkVersion: external_version_js_namespaceObject.version,
86
+ serverName: server._serverInfo?.name,
87
+ serverVersion: server._serverInfo?.version,
88
+ clientName: clientInfo?.name,
89
+ clientVersion: clientInfo?.version,
90
+ identifyActorGivenId: actorInfo?.distinctId,
91
+ identifyActorData: actorInfo?.properties || {},
92
+ identifyActorGroups: actorInfo?.groups
93
+ };
94
+ if (!data) return sessionInfo;
95
+ data.sessionInfo = sessionInfo;
96
+ (0, external_internal_js_namespaceObject.setServerTrackingData)(server, data);
97
+ return data.sessionInfo;
98
+ }
99
+ exports.deriveSessionIdFromMCPSession = __webpack_exports__.deriveSessionIdFromMCPSession;
100
+ exports.getServerSessionId = __webpack_exports__.getServerSessionId;
101
+ exports.getSessionInfo = __webpack_exports__.getSessionInfo;
102
+ exports.newSessionId = __webpack_exports__.newSessionId;
103
+ exports.setLastActivity = __webpack_exports__.setLastActivity;
104
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
105
+ "deriveSessionIdFromMCPSession",
106
+ "getServerSessionId",
107
+ "getSessionInfo",
108
+ "newSessionId",
109
+ "setLastActivity"
110
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
111
+ Object.defineProperty(exports, '__esModule', {
112
+ value: true
113
+ });