@posthog/mcp 0.0.9 → 0.1.17
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/LICENSE +307 -3
- package/README.md +182 -90
- package/dist/extensions/capture.d.ts +13 -0
- package/dist/extensions/capture.d.ts.map +1 -0
- package/dist/extensions/capture.js +80 -0
- package/dist/extensions/capture.mjs +46 -0
- package/dist/extensions/compatibility.d.ts +23 -0
- package/dist/extensions/compatibility.d.ts.map +1 -0
- package/dist/extensions/compatibility.js +113 -0
- package/dist/extensions/compatibility.mjs +67 -0
- package/dist/extensions/constants.d.ts +39 -0
- package/dist/extensions/constants.d.ts.map +1 -0
- package/dist/extensions/constants.js +86 -0
- package/dist/extensions/constants.mjs +37 -0
- package/dist/extensions/context-parameters.d.ts +31 -0
- package/dist/extensions/context-parameters.d.ts.map +1 -0
- package/dist/extensions/context-parameters.js +93 -0
- package/dist/extensions/context-parameters.mjs +50 -0
- package/dist/extensions/conversation-id.d.ts +52 -0
- package/dist/extensions/conversation-id.d.ts.map +1 -0
- package/dist/extensions/conversation-id.js +164 -0
- package/dist/extensions/conversation-id.mjs +103 -0
- package/dist/extensions/event-types.d.ts +21 -0
- package/dist/extensions/event-types.d.ts.map +1 -0
- package/dist/extensions/event-types.js +47 -0
- package/dist/extensions/event-types.mjs +13 -0
- package/dist/extensions/exceptions.d.ts +13 -0
- package/dist/extensions/exceptions.d.ts.map +1 -0
- package/dist/extensions/exceptions.js +58 -0
- package/dist/extensions/exceptions.mjs +24 -0
- package/dist/extensions/ids.d.ts +13 -0
- package/dist/extensions/ids.d.ts.map +1 -0
- package/dist/extensions/ids.js +55 -0
- package/dist/extensions/ids.mjs +18 -0
- package/dist/extensions/instrument-highlevel.d.ts +3 -0
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -0
- package/dist/extensions/instrument-highlevel.js +229 -0
- package/dist/extensions/instrument-highlevel.mjs +195 -0
- package/dist/extensions/instrument-lowlevel.d.ts +8 -0
- package/dist/extensions/instrument-lowlevel.d.ts.map +1 -0
- package/dist/extensions/instrument-lowlevel.js +85 -0
- package/dist/extensions/instrument-lowlevel.mjs +51 -0
- package/dist/extensions/instrumentation.d.ts +59 -0
- package/dist/extensions/instrumentation.d.ts.map +1 -0
- package/dist/extensions/instrumentation.js +237 -0
- package/dist/extensions/instrumentation.mjs +194 -0
- package/dist/extensions/intent.d.ts +10 -0
- package/dist/extensions/intent.d.ts.map +1 -0
- package/dist/extensions/intent.js +84 -0
- package/dist/extensions/intent.mjs +44 -0
- package/dist/extensions/internal.d.ts +32 -0
- package/dist/extensions/internal.d.ts.map +1 -0
- package/dist/extensions/internal.js +158 -0
- package/dist/extensions/internal.mjs +106 -0
- package/dist/extensions/logger.d.ts +14 -0
- package/dist/extensions/logger.d.ts.map +1 -0
- package/dist/extensions/logger.js +47 -0
- package/dist/extensions/logger.mjs +10 -0
- package/dist/extensions/mcp-payloads.d.ts +5 -0
- package/dist/extensions/mcp-payloads.d.ts.map +1 -0
- package/dist/extensions/mcp-payloads.js +91 -0
- package/dist/extensions/mcp-payloads.mjs +54 -0
- package/dist/extensions/mcp-sdk-compat.d.ts +33 -0
- package/dist/extensions/mcp-sdk-compat.d.ts.map +1 -0
- package/dist/extensions/mcp-sdk-compat.js +112 -0
- package/dist/extensions/mcp-sdk-compat.mjs +60 -0
- package/dist/extensions/posthog-events.d.ts +14 -0
- package/dist/extensions/posthog-events.d.ts.map +1 -0
- package/dist/extensions/posthog-events.js +143 -0
- package/dist/extensions/posthog-events.mjs +109 -0
- package/dist/extensions/sanitization.d.ts +10 -0
- package/dist/extensions/sanitization.d.ts.map +1 -0
- package/dist/extensions/sanitization.js +96 -0
- package/dist/extensions/sanitization.mjs +62 -0
- package/dist/extensions/session.d.ts +20 -0
- package/dist/extensions/session.d.ts.map +1 -0
- package/dist/extensions/session.js +113 -0
- package/dist/extensions/session.mjs +67 -0
- package/dist/extensions/sink.d.ts +44 -0
- package/dist/extensions/sink.d.ts.map +1 -0
- package/dist/extensions/sink.js +102 -0
- package/dist/extensions/sink.mjs +65 -0
- package/dist/extensions/tools.d.ts +9 -0
- package/dist/extensions/tools.d.ts.map +1 -0
- package/dist/extensions/tools.js +79 -0
- package/dist/extensions/tools.mjs +39 -0
- package/dist/extensions/tracing-helpers.d.ts +29 -0
- package/dist/extensions/tracing-helpers.d.ts.map +1 -0
- package/dist/extensions/tracing-helpers.js +59 -0
- package/dist/extensions/tracing-helpers.mjs +16 -0
- package/dist/extensions/truncation.d.ts +25 -0
- package/dist/extensions/truncation.d.ts.map +1 -0
- package/dist/extensions/truncation.js +277 -0
- package/dist/extensions/truncation.mjs +228 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.mjs +83 -2929
- package/dist/types.d.ts +220 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +18 -0
- package/dist/types.mjs +0 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +36 -0
- package/dist/version.mjs +2 -0
- package/package.json +55 -87
- package/src/extensions/capture.ts +68 -0
- package/src/extensions/compatibility.ts +138 -0
- package/src/extensions/constants.ts +48 -0
- package/src/extensions/context-parameters.ts +119 -0
- package/src/extensions/conversation-id.ts +177 -0
- package/src/extensions/event-types.ts +21 -0
- package/src/extensions/exceptions.ts +83 -0
- package/src/extensions/ids.ts +32 -0
- package/src/extensions/instrument-highlevel.ts +297 -0
- package/src/extensions/instrument-lowlevel.ts +83 -0
- package/src/extensions/instrumentation.ts +415 -0
- package/src/extensions/intent.ts +78 -0
- package/src/extensions/internal.ts +193 -0
- package/src/extensions/logger.ts +27 -0
- package/src/extensions/mcp-payloads.ts +98 -0
- package/src/extensions/mcp-sdk-compat.ts +160 -0
- package/src/extensions/posthog-events.ts +212 -0
- package/src/extensions/sanitization.ts +121 -0
- package/src/extensions/session.ts +117 -0
- package/src/extensions/sink.ts +130 -0
- package/src/extensions/tools.ts +50 -0
- package/src/extensions/tracing-helpers.ts +51 -0
- package/src/extensions/truncation.ts +453 -0
- package/src/index.ts +174 -0
- package/src/types.ts +244 -0
- package/src/version.ts +1 -0
- package/dist/index.cjs +0 -2937
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -264
- package/dist/index.d.mts +0 -263
- 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.17'
|