@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
package/src/index.ts ADDED
@@ -0,0 +1,174 @@
1
+ import type { PostHog } from 'posthog-node'
2
+ import { isCompatibleServerType, isHighLevelServer } from './extensions/compatibility'
3
+ import { McpEventSink } from './extensions/sink'
4
+ import { MCPAnalyticsEventType } from './extensions/event-types'
5
+ import { IdentityCache, getServerTrackingData, setServerTrackingData } from './extensions/internal'
6
+ import { log, setLogger } from './extensions/logger'
7
+ import { captureEvent } from './extensions/capture'
8
+ import { deriveSessionIdFromMCPSession, getSessionInfo, newSessionId } from './extensions/session'
9
+ import { instrumentLowLevelServer } from './extensions/instrument-lowlevel'
10
+ import { instrumentHighLevelServer } from './extensions/instrument-highlevel'
11
+ import type {
12
+ CaptureEventData,
13
+ HighLevelMCPServerLike,
14
+ McpAnalytics,
15
+ MCPAnalyticsData,
16
+ MCPAnalyticsOptions,
17
+ MCPServerLike,
18
+ McpEvent,
19
+ } from './types'
20
+
21
+ /**
22
+ * Instruments an MCP server so PostHog auto-captures tool calls, tool listings, initialize
23
+ * requests, identity, and exceptions. Returns a handle whose `capture()` method records
24
+ * custom events, so you don't pass the server around after wiring it up.
25
+ *
26
+ * **Idempotent per server instance.** Per-server tracking state lives in a module-level
27
+ * `WeakMap<MCPServerLike, MCPAnalyticsData>` (`internal.ts`); a second `instrument()` call
28
+ * on the same server reuses it rather than double-wrapping handlers.
29
+ *
30
+ * @param server - The MCP server to instrument (low-level `Server` or high-level `McpServer`).
31
+ * @param posthog - A `posthog-node` client you construct and own (matching `@posthog/ai`); call `posthog.shutdown()` on exit to flush.
32
+ * @param options - Optional configuration. See `MCPAnalyticsOptions`.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"
37
+ * import { PostHog } from "posthog-node"
38
+ * import { instrument } from "@posthog/mcp"
39
+ *
40
+ * const posthog = new PostHog(process.env.POSTHOG_PROJECT_TOKEN, { host: "https://us.i.posthog.com" })
41
+ * const server = new McpServer({ name: "my-mcp", version: "1.0.0" })
42
+ * const analytics = instrument(server, posthog)
43
+ *
44
+ * await analytics.capture({ event: "feedback_submitted", properties: { rating: 5 } })
45
+ * ```
46
+ */
47
+ function instrument(server: unknown, posthog: PostHog, options: MCPAnalyticsOptions = {}): McpAnalytics {
48
+ try {
49
+ if (options.logger) {
50
+ setLogger(options.logger)
51
+ }
52
+ if (!posthog) {
53
+ log('Warning: No PostHog client passed to instrument(). Events will not be sent anywhere.')
54
+ }
55
+
56
+ const validatedServer = isCompatibleServerType(server)
57
+ const lowLevelServer = getLowLevelServer(validatedServer)
58
+
59
+ if (getServerTrackingData(lowLevelServer)) {
60
+ log('instrument() - Server already instrumented, skipping initialization')
61
+ return createAnalyticsHandle(lowLevelServer)
62
+ }
63
+
64
+ const sink = posthog ? new McpEventSink(posthog) : undefined
65
+ const mcpAnalyticsData = buildTrackingData(lowLevelServer, options, sink)
66
+
67
+ setServerTrackingData(lowLevelServer, mcpAnalyticsData)
68
+ setupTrackedServer(validatedServer, lowLevelServer)
69
+
70
+ return createAnalyticsHandle(lowLevelServer)
71
+ } catch (error) {
72
+ log(`Warning: Failed to instrument server - ${error}`)
73
+ // Degrade gracefully: a no-op handle so the host app keeps working.
74
+ return { capture: async () => undefined }
75
+ }
76
+ }
77
+
78
+ function createAnalyticsHandle(lowLevelServer: MCPServerLike): McpAnalytics {
79
+ return {
80
+ capture: (eventData) => captureCustomEvent(lowLevelServer, eventData),
81
+ }
82
+ }
83
+
84
+ function getLowLevelServer(server: MCPServerLike | HighLevelMCPServerLike): MCPServerLike {
85
+ return isHighLevelServer(server) ? (server as HighLevelMCPServerLike).server : (server as MCPServerLike)
86
+ }
87
+
88
+ /**
89
+ * Defaults for the boolean toggles. User options are spread over these, so the
90
+ * resolved config is the single source of truth — adding a new option can never
91
+ * be silently dropped by a hand-maintained field list (the bug that left
92
+ * `enableExceptionAutocapture` dead). Options without a meaningful default (e.g.
93
+ * `enableExceptionAutocapture`) are left to their read-site fallbacks.
94
+ */
95
+ const DEFAULT_OPTIONS = {
96
+ reportMissing: false,
97
+ enableConversationId: false,
98
+ } satisfies Partial<MCPAnalyticsOptions>
99
+
100
+ function buildTrackingData(
101
+ lowLevelServer: MCPServerLike,
102
+ options: MCPAnalyticsOptions,
103
+ sink: McpEventSink | undefined
104
+ ): MCPAnalyticsData {
105
+ return {
106
+ sink,
107
+ sessionId: newSessionId(),
108
+ lastActivity: new Date(),
109
+ identifiedSessions: new IdentityCache(),
110
+ toolDescriptions: new Map<string, string>(),
111
+ sessionInfo: getSessionInfo(lowLevelServer, undefined),
112
+ options: { ...DEFAULT_OPTIONS, ...options },
113
+ sessionSource: 'generated',
114
+ }
115
+ }
116
+
117
+ function setupTrackedServer(
118
+ validatedServer: MCPServerLike | HighLevelMCPServerLike,
119
+ lowLevelServer: MCPServerLike
120
+ ): void {
121
+ if (isHighLevelServer(validatedServer)) {
122
+ const highLevelServer = validatedServer as HighLevelMCPServerLike
123
+ instrumentHighLevelServer(highLevelServer)
124
+ return
125
+ }
126
+
127
+ try {
128
+ instrumentLowLevelServer(lowLevelServer)
129
+ } catch (error) {
130
+ log(`Warning: Failed to setup tool call instrumentation - ${error}`)
131
+ }
132
+ }
133
+
134
+ async function captureCustomEvent(lowLevelServer: MCPServerLike, eventData: CaptureEventData): Promise<void> {
135
+ if (!eventData || typeof eventData.event !== 'string' || eventData.event.length === 0) {
136
+ throw new Error('`capture` requires an `event` name, e.g. analytics.capture({ event: "feedback_submitted" })')
137
+ }
138
+
139
+ const trackingData = getServerTrackingData(lowLevelServer)
140
+ if (!trackingData) {
141
+ return
142
+ }
143
+
144
+ const event: McpEvent = {
145
+ sessionId: trackingData.sessionId,
146
+ eventType: MCPAnalyticsEventType.custom,
147
+ eventName: eventData.event,
148
+ timestamp: new Date(),
149
+ properties: eventData.properties,
150
+ }
151
+
152
+ // Re-use the same per-server publish path so the event picks up session info,
153
+ // identity, sdk metadata, etc. Awaited so callers know the event was processed.
154
+ await captureEvent(lowLevelServer, event)
155
+ log(`Captured event "${eventData.event}" for session ${trackingData.sessionId}`)
156
+ }
157
+
158
+ export { deriveSessionIdFromMCPSession }
159
+ export {
160
+ POSTHOG_MCP_ANALYTICS_SOURCE,
161
+ PostHogMCPAnalyticsEvent,
162
+ PostHogMCPAnalyticsProperty,
163
+ } from './extensions/constants'
164
+ export type {
165
+ BeforeSendFn,
166
+ CaptureEventData,
167
+ McpAnalytics,
168
+ MCPAnalyticsContextOptions,
169
+ MCPAnalyticsIntentSource,
170
+ MCPAnalyticsOptions,
171
+ UserIdentity,
172
+ } from './types'
173
+ export type IdentifyFunction = MCPAnalyticsOptions['identify']
174
+ export { instrument }
package/src/types.ts ADDED
@@ -0,0 +1,244 @@
1
+ import type { CallToolResult } from '@modelcontextprotocol/sdk/types.js'
2
+ import type { ErrorTracking } from '@posthog/core'
3
+ import type { MCPAnalyticsEventType } from './extensions/event-types'
4
+ import type { IdentityCache } from './extensions/internal'
5
+ import type { PostHogCaptureEvent } from './extensions/posthog-events'
6
+ import type { McpEventSink } from './extensions/sink'
7
+ import type { LoggerFn } from './extensions/logger'
8
+
9
+ export type JsonRecord = Record<string, unknown>
10
+
11
+ /** PostHog error-tracking properties (`$exception_list`). Re-exported from `@posthog/core`. */
12
+ export type ErrorProperties = ErrorTracking.ErrorProperties
13
+ /** A single parsed stack frame. Re-exported from `@posthog/core`. */
14
+ export type StackFrame = ErrorTracking.StackFrame
15
+
16
+ export interface MCPRequestParamsLike {
17
+ arguments?: JsonRecord
18
+ name?: string
19
+ [key: string]: unknown
20
+ }
21
+
22
+ export interface MCPRequestLike {
23
+ id?: number | string
24
+ jsonrpc?: string
25
+ method?: string
26
+ params?: MCPRequestParamsLike
27
+ [key: string]: unknown
28
+ }
29
+
30
+ /** Handle returned by `instrument()` — the analytics surface for an instrumented server. */
31
+ export interface McpAnalytics {
32
+ /**
33
+ * Capture a custom event for this server. The `event` name is required and sent
34
+ * verbatim (a customer event, so it is not `$`-prefixed). Resolves once the event
35
+ * has been processed. Use for domain-specific actions that aren't auto-captured
36
+ * (user feedback, workflow milestones, etc).
37
+ */
38
+ capture(eventData: CaptureEventData): Promise<void>
39
+ }
40
+
41
+ export interface MCPAnalyticsOptions {
42
+ /**
43
+ * Optional STDIO-safe log sink for SDK-internal warnings. Receives single string messages.
44
+ * Defaults to a no-op since MCP STDIO transports cannot use console.
45
+ */
46
+ logger?: LoggerFn
47
+ /** Enable the `get_more_tools` virtual tool so agents can report missing functionality. */
48
+ reportMissing?: boolean
49
+ /** Enables the `conversation_id` tool parameter + prompt-back loop. */
50
+ enableConversationId?: boolean
51
+ /**
52
+ * Emit a `$exception` event alongside any failed tool call. Defaults to `true`.
53
+ * Set to `false` if you handle error tracking elsewhere and don't want MCP errors
54
+ * fanning out into PostHog error tracking.
55
+ */
56
+ enableExceptionAutocapture?: boolean
57
+ /** Inject a required `context` parameter on every tool to capture user intent. */
58
+ context?: boolean | MCPAnalyticsContextOptions
59
+ /**
60
+ * Identify the calling user. Returning a non-null value sets `distinct_id` and `$set`
61
+ * on subsequent events for the session. Object form is treated as a static identity.
62
+ */
63
+ identify?:
64
+ | ((request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra) => Promise<UserIdentity | null>)
65
+ | UserIdentity
66
+ | null
67
+ /**
68
+ * Called when a tool is invoked without an explicit `context` argument. Return a short
69
+ * intent string to record as `$mcp_intent` with `$mcp_intent_source = "inferred"`.
70
+ */
71
+ intentFallback?: (
72
+ request: MCPRequestLike,
73
+ extra?: CompatibleRequestHandlerExtra
74
+ ) => MaybePromise<string | null | undefined>
75
+ /**
76
+ * Inspect, modify, or drop each event right before it is sent to PostHog
77
+ * (matching posthog-node's `beforeSend`). Receives the fully-built capture
78
+ * payload — event name, `distinct_id`, and `properties` — and runs once per
79
+ * emitted event, including the `$exception` sibling of a failed tool call.
80
+ *
81
+ * Return the (possibly mutated) event to send it, or `null`/`undefined` to
82
+ * drop it. Use this to redact sensitive values, add or remove properties, or
83
+ * suppress specific events. A throw drops that event.
84
+ */
85
+ beforeSend?: BeforeSendFn
86
+ /**
87
+ * Attach extra event properties on every auto-captured event. Spread into the PostHog
88
+ * event properties as-is; values must be JSON-serializable.
89
+ */
90
+ eventProperties?: (
91
+ request: MCPRequestLike,
92
+ extra?: CompatibleRequestHandlerExtra
93
+ ) => JsonRecord | null | Promise<JsonRecord | null>
94
+ }
95
+
96
+ export interface MCPAnalyticsContextOptions {
97
+ description?: string
98
+ }
99
+
100
+ export type MaybePromise<T> = T | Promise<T>
101
+ export type MCPAnalyticsIntentSource = 'context_parameter' | 'inferred'
102
+
103
+ export type ToolCallback =
104
+ | ((args: unknown, extra: CompatibleRequestHandlerExtra) => CallToolResult | Promise<CallToolResult>)
105
+ | ((extra: CompatibleRequestHandlerExtra) => CallToolResult | Promise<CallToolResult>)
106
+
107
+ // RegisteredTool type that supports both MCP SDK 1.23- (callback) and 1.24+ (handler)
108
+ export type RegisteredTool = {
109
+ description?: string
110
+ inputSchema?: unknown
111
+ update?: (...args: unknown[]) => unknown
112
+ } & ({ callback: ToolCallback; handler?: never } | { handler: ToolCallback; callback?: never })
113
+
114
+ /**
115
+ * Hook invoked for every event just before it is handed to `posthog.capture()`.
116
+ * Return the event (optionally mutated) to send it, or a nullish value to drop it.
117
+ */
118
+ export type BeforeSendFn = (event: PostHogCaptureEvent) => MaybePromise<PostHogCaptureEvent | null | undefined>
119
+
120
+ export interface Event {
121
+ actorId?: string
122
+ clientName?: string
123
+ clientVersion?: string
124
+ conversationId?: string
125
+ duration?: number
126
+ error?: ErrorProperties | null
127
+ eventId?: string
128
+ eventType: MCPAnalyticsEventType
129
+ groups?: Record<string, string>
130
+ /**
131
+ * Explicit PostHog event name. When set (via `capture(server, { event })`) it
132
+ * overrides the built-in name derived from `eventType`, so callers can emit any
133
+ * event name. User-supplied names are sent verbatim (not `$`-prefixed).
134
+ */
135
+ eventName?: string
136
+ id: string
137
+ /** Resolved person properties for the session, written to `$set`. */
138
+ identifyActorData?: JsonRecord
139
+ /** Resolved distinct id for the session (from `identify().distinctId`). */
140
+ identifyActorGivenId?: string
141
+ ipAddress?: string
142
+ isError?: boolean
143
+ listedToolNames?: string[]
144
+ parameters?: unknown
145
+ properties?: JsonRecord | null
146
+ resourceName?: string
147
+ response?: unknown
148
+ sdkLanguage?: string
149
+ sdkVersion?: string
150
+ serverName?: string
151
+ serverVersion?: string
152
+ sessionId: string
153
+ timestamp: Date
154
+ toolDescription?: string
155
+ userIntent?: string
156
+ userIntentSource?: MCPAnalyticsIntentSource
157
+ }
158
+
159
+ /** A partially-built MCP event as it flows through the SDK before capture. */
160
+ export type McpEvent = Partial<Event>
161
+
162
+ export interface CompatibleRequestHandlerExtra {
163
+ headers?: Record<string, string | string[]>
164
+ sessionId?: string
165
+ [key: string]: unknown
166
+ }
167
+
168
+ export interface ServerClientInfoLike {
169
+ name?: string
170
+ version?: string
171
+ }
172
+
173
+ export interface HighLevelMCPServerLike {
174
+ _registeredTools: { [name: string]: RegisteredTool }
175
+ registerTool?(name: string, config: { description?: string; inputSchema?: unknown }, handler: ToolCallback): void
176
+ server: MCPServerLike
177
+ tool?(name: string, cb: ToolCallback): void
178
+ tool?(name: string, paramsSchema: unknown, cb: ToolCallback): void
179
+ tool?(name: string, description: string, paramsSchema: unknown, cb: ToolCallback): void
180
+ }
181
+
182
+ export interface MCPServerLike {
183
+ _requestHandlers: Map<string, (request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra) => Promise<unknown>>
184
+ _serverInfo?: ServerClientInfoLike
185
+ getClientVersion(): ServerClientInfoLike | undefined
186
+ setRequestHandler(
187
+ schema: unknown,
188
+ handler: (request: MCPRequestLike, extra?: CompatibleRequestHandlerExtra) => Promise<unknown>
189
+ ): void
190
+ }
191
+
192
+ export interface UserIdentity {
193
+ /**
194
+ * The person's distinct id (becomes `distinct_id`). Same concept as
195
+ * posthog-node's `identify({ distinctId })`.
196
+ */
197
+ distinctId: string
198
+ /**
199
+ * Person properties, written to `$set` (e.g. `{ name, email, plan }`) — the
200
+ * same `properties` you'd pass to posthog-node's `identify`.
201
+ */
202
+ properties?: JsonRecord
203
+ /**
204
+ * PostHog group memberships as `{ groupType: groupKey }`. Stamped onto every
205
+ * event for the session as `$groups`, so callers never hand-write the
206
+ * `$groups` dollar-key themselves.
207
+ */
208
+ groups?: Record<string, string>
209
+ }
210
+
211
+ export interface SessionInfo {
212
+ clientName?: string
213
+ clientVersion?: string
214
+ identifyActorData?: JsonRecord
215
+ identifyActorGivenId?: string
216
+ identifyActorGroups?: Record<string, string>
217
+ ipAddress?: string
218
+ sdkLanguage?: string
219
+ sdkVersion?: string
220
+ serverName?: string
221
+ serverVersion?: string
222
+ }
223
+
224
+ export interface MCPAnalyticsData {
225
+ sink: McpEventSink | undefined
226
+ identifiedSessions: IdentityCache
227
+ lastActivity: Date
228
+ lastMcpSessionId?: string
229
+ options: MCPAnalyticsOptions
230
+ sessionId: string
231
+ sessionInfo: SessionInfo
232
+ sessionSource: 'generated' | 'mcp'
233
+ toolDescriptions: Map<string, string>
234
+ }
235
+
236
+ export interface CaptureEventData {
237
+ /**
238
+ * PostHog event name (required). Sent verbatim — a custom event is a
239
+ * customer-defined event, so it is NOT `$`-prefixed.
240
+ */
241
+ event: string
242
+ /** Event properties, spread onto the PostHog event. Values must be JSON-serializable. */
243
+ properties?: JsonRecord
244
+ }
package/src/version.ts ADDED
@@ -0,0 +1 @@
1
+ export const version = '0.1.16'