@posthog/mcp 0.10.4 → 0.10.6

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 (70) hide show
  1. package/dist/extensions/capture.d.ts +2 -1
  2. package/dist/extensions/capture.d.ts.map +1 -1
  3. package/dist/extensions/capture.js +2 -3
  4. package/dist/extensions/capture.mjs +2 -3
  5. package/dist/extensions/compatibility.d.ts +3 -2
  6. package/dist/extensions/compatibility.d.ts.map +1 -1
  7. package/dist/extensions/compatibility.js +19 -20
  8. package/dist/extensions/compatibility.mjs +15 -16
  9. package/dist/extensions/context-parameters.d.ts +3 -2
  10. package/dist/extensions/context-parameters.d.ts.map +1 -1
  11. package/dist/extensions/context-parameters.js +4 -8
  12. package/dist/extensions/context-parameters.mjs +4 -7
  13. package/dist/extensions/conversation-id.d.ts +3 -2
  14. package/dist/extensions/conversation-id.d.ts.map +1 -1
  15. package/dist/extensions/conversation-id.js +5 -6
  16. package/dist/extensions/conversation-id.mjs +5 -5
  17. package/dist/extensions/instrument-highlevel.d.ts +2 -1
  18. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  19. package/dist/extensions/instrument-highlevel.js +29 -30
  20. package/dist/extensions/instrument-highlevel.mjs +30 -31
  21. package/dist/extensions/instrument-lowlevel.d.ts +2 -1
  22. package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
  23. package/dist/extensions/instrument-lowlevel.js +15 -11
  24. package/dist/extensions/instrument-lowlevel.mjs +16 -12
  25. package/dist/extensions/instrumentation.d.ts +9 -8
  26. package/dist/extensions/instrumentation.d.ts.map +1 -1
  27. package/dist/extensions/instrumentation.js +84 -40
  28. package/dist/extensions/instrumentation.mjs +80 -39
  29. package/dist/extensions/intent.d.ts.map +1 -1
  30. package/dist/extensions/intent.js +2 -3
  31. package/dist/extensions/intent.mjs +2 -3
  32. package/dist/extensions/internal.d.ts.map +1 -1
  33. package/dist/extensions/internal.js +5 -6
  34. package/dist/extensions/internal.mjs +5 -6
  35. package/dist/extensions/logger.d.ts +12 -4
  36. package/dist/extensions/logger.d.ts.map +1 -1
  37. package/dist/extensions/logger.js +12 -3
  38. package/dist/extensions/logger.mjs +10 -4
  39. package/dist/extensions/sink.d.ts +4 -2
  40. package/dist/extensions/sink.d.ts.map +1 -1
  41. package/dist/extensions/sink.js +11 -10
  42. package/dist/extensions/sink.mjs +11 -10
  43. package/dist/extensions/tools.d.ts +2 -1
  44. package/dist/extensions/tools.d.ts.map +1 -1
  45. package/dist/extensions/tools.js +2 -2
  46. package/dist/extensions/tools.mjs +2 -2
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +18 -16
  49. package/dist/index.mjs +19 -17
  50. package/dist/types.d.ts +2 -0
  51. package/dist/types.d.ts.map +1 -1
  52. package/dist/version.d.ts +1 -1
  53. package/dist/version.js +1 -1
  54. package/dist/version.mjs +1 -1
  55. package/package.json +3 -3
  56. package/src/extensions/capture.ts +3 -3
  57. package/src/extensions/compatibility.ts +16 -16
  58. package/src/extensions/context-parameters.ts +8 -12
  59. package/src/extensions/conversation-id.ts +14 -7
  60. package/src/extensions/instrument-highlevel.ts +45 -44
  61. package/src/extensions/instrument-lowlevel.ts +30 -15
  62. package/src/extensions/instrumentation.ts +119 -42
  63. package/src/extensions/intent.ts +2 -8
  64. package/src/extensions/internal.ts +7 -6
  65. package/src/extensions/logger.ts +22 -7
  66. package/src/extensions/sink.ts +17 -12
  67. package/src/extensions/tools.ts +3 -3
  68. package/src/index.ts +21 -19
  69. package/src/types.ts +2 -0
  70. package/src/version.ts +1 -1
package/src/index.ts CHANGED
@@ -8,7 +8,7 @@ import { isCompatibleServerType, isHighLevelServer } from './extensions/compatib
8
8
  import { McpEventSink } from './extensions/sink'
9
9
  import { MCPAnalyticsEventType } from './extensions/event-types'
10
10
  import { IdentityCache, getServerTrackingData, setServerTrackingData } from './extensions/internal'
11
- import { log, setLogger } from './extensions/logger'
11
+ import { createLogger } from './extensions/logger'
12
12
  import { captureEvent } from './extensions/capture'
13
13
  import { applyMcpLibIdentity } from './extensions/lib-identity'
14
14
  import { deriveSessionIdFromMCPSession, getSessionInfo, newSessionId } from './extensions/session'
@@ -51,19 +51,18 @@ import type {
51
51
  * ```
52
52
  */
53
53
  function instrument(server: unknown, posthog: PostHog, options: MCPAnalyticsOptions = {}): McpAnalytics {
54
+ const logger = createLogger(options?.logger)
54
55
  try {
55
- if (options.logger) {
56
- setLogger(options.logger)
57
- }
58
56
  if (!posthog) {
59
- log('Warning: No PostHog client passed to instrument(). Events will not be sent anywhere.')
57
+ logger('Warning: No PostHog client passed to instrument(). Events will not be sent anywhere.')
60
58
  }
61
59
 
62
- const validatedServer = isCompatibleServerType(server)
60
+ const validatedServer = isCompatibleServerType(server, logger)
63
61
  const lowLevelServer = getLowLevelServer(validatedServer)
62
+ const existingData = getServerTrackingData(lowLevelServer)
64
63
 
65
- if (getServerTrackingData(lowLevelServer)) {
66
- log('instrument() - Server already instrumented, skipping initialization')
64
+ if (existingData) {
65
+ existingData.logger('instrument() - Server already instrumented, skipping initialization')
67
66
  return createAnalyticsHandle(lowLevelServer)
68
67
  }
69
68
 
@@ -72,15 +71,15 @@ function instrument(server: unknown, posthog: PostHog, options: MCPAnalyticsOpti
72
71
  // inherited `posthog-node`. Relabels every event the client sends.
73
72
  applyMcpLibIdentity(posthog)
74
73
  }
75
- const sink = posthog ? new McpEventSink(posthog) : undefined
76
- const mcpAnalyticsData = buildTrackingData(lowLevelServer, options, sink)
74
+ const sink = posthog ? new McpEventSink(posthog, logger) : undefined
75
+ const mcpAnalyticsData = buildTrackingData(lowLevelServer, options, sink, logger)
77
76
 
78
77
  setServerTrackingData(lowLevelServer, mcpAnalyticsData)
79
- setupTrackedServer(validatedServer, lowLevelServer)
78
+ setupTrackedServer(validatedServer, lowLevelServer, logger)
80
79
 
81
80
  return createAnalyticsHandle(lowLevelServer)
82
81
  } catch (error) {
83
- log(`Warning: Failed to instrument server - ${error}`)
82
+ logger(`Warning: Failed to instrument server - ${error}`)
84
83
  // Degrade gracefully: a no-op handle so the host app keeps working.
85
84
  return { capture: async () => undefined }
86
85
  }
@@ -136,10 +135,12 @@ const DEFAULT_OPTIONS = {
136
135
  function buildTrackingData(
137
136
  lowLevelServer: MCPServerLike,
138
137
  options: MCPAnalyticsOptions,
139
- sink: McpEventSink | undefined
138
+ sink: McpEventSink | undefined,
139
+ logger: MCPAnalyticsData['logger']
140
140
  ): MCPAnalyticsData {
141
141
  return {
142
142
  sink,
143
+ logger,
143
144
  sessionId: newSessionId(),
144
145
  lastActivity: new Date(),
145
146
  identifiedSessions: new IdentityCache(),
@@ -154,18 +155,19 @@ function buildTrackingData(
154
155
 
155
156
  function setupTrackedServer(
156
157
  validatedServer: MCPServerLike | HighLevelMCPServerLike,
157
- lowLevelServer: MCPServerLike
158
+ lowLevelServer: MCPServerLike,
159
+ logger: MCPAnalyticsData['logger']
158
160
  ): void {
159
161
  if (isHighLevelServer(validatedServer)) {
160
162
  const highLevelServer = validatedServer as HighLevelMCPServerLike
161
- instrumentHighLevelServer(highLevelServer)
163
+ instrumentHighLevelServer(highLevelServer, logger)
162
164
  return
163
165
  }
164
166
 
165
167
  try {
166
- instrumentLowLevelServer(lowLevelServer)
168
+ instrumentLowLevelServer(lowLevelServer, logger)
167
169
  } catch (error) {
168
- log(`Warning: Failed to setup tool call instrumentation - ${error}`)
170
+ logger(`Warning: Failed to setup tool call instrumentation - ${error}`)
169
171
  }
170
172
  }
171
173
 
@@ -189,8 +191,8 @@ async function captureCustomEvent(lowLevelServer: MCPServerLike, eventData: Capt
189
191
 
190
192
  // Re-use the same per-server publish path so the event picks up session info,
191
193
  // identity, sdk metadata, etc. Awaited so callers know the event was processed.
192
- await captureEvent(lowLevelServer, event)
193
- log(`Captured event "${eventData.event}" for session ${trackingData.sessionId}`)
194
+ await captureEvent(lowLevelServer, event, trackingData.logger)
195
+ trackingData.logger(`Captured event "${eventData.event}" for session ${trackingData.sessionId}`)
194
196
  }
195
197
 
196
198
  export { deriveSessionIdFromMCPSession, newSessionId }
package/src/types.ts CHANGED
@@ -279,6 +279,8 @@ export interface AnalyticsParameterOwnership {
279
279
  export interface MCPAnalyticsData {
280
280
  sink: McpEventSink | undefined
281
281
  identifiedSessions: IdentityCache
282
+ /** Safe logger bound to this server; a no-op when no logger was configured. */
283
+ logger: LoggerFn
282
284
  lastActivity: Date
283
285
  options: MCPAnalyticsOptions
284
286
  sessionId: string
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.10.4'
1
+ export const version = '0.10.6'