@posthog/mcp 0.4.3 → 0.5.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/extensions/sink.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,kBAAkB,CAAA;AAKtF,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,EAAE,OAAO,CAAA;IACnC,kFAAkF;IAClF,UAAU,CAAC,EAAE,YAAY,CAAA;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA2BnE;AA4BD;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAE7C;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CA0B1E"}
1
+ {"version":3,"file":"sink.d.ts","sourceRoot":"","sources":["../../src/extensions/sink.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,EAAE,KAAK,mBAAmB,EAA6B,MAAM,kBAAkB,CAAA;AAKtF,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,0BAA0B,EAAE,OAAO,CAAA;IACnC,kFAAkF;IAClF,UAAU,CAAC,EAAE,YAAY,CAAA;CAC1B;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,QAAQ,EACf,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,mBAAmB,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CA2BnE;AA4BD;;;;;;;;GAQG;AACH,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,OAAO;IAE7C;;;;OAIG;IACG,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;CAmC1E"}
@@ -78,13 +78,19 @@ class McpEventSink {
78
78
  if (!result) return;
79
79
  const { event: fullEvent, captures } = result;
80
80
  try {
81
- for (const captureEvent of captures)this.posthog.capture({
82
- distinctId: captureEvent.distinct_id,
83
- event: captureEvent.event,
84
- properties: captureEvent.properties,
85
- timestamp: new Date(captureEvent.timestamp),
86
- uuid: (0, core_namespaceObject.uuidv7)()
87
- });
81
+ for (const captureEvent of captures){
82
+ const groups = captureEvent.properties.$groups;
83
+ this.posthog.capture({
84
+ distinctId: captureEvent.distinct_id,
85
+ event: captureEvent.event,
86
+ properties: captureEvent.properties,
87
+ ...groups ? {
88
+ groups
89
+ } : {},
90
+ timestamp: new Date(captureEvent.timestamp),
91
+ uuid: (0, core_namespaceObject.uuidv7)()
92
+ });
93
+ }
88
94
  (0, external_logger_js_namespaceObject.log)(`Captured PostHog event ${fullEvent.id} | ${fullEvent.eventType} | ${fullEvent.duration} ms | ${fullEvent.identifyActorGivenId || 'anonymous'}`);
89
95
  } catch (err) {
90
96
  (0, external_logger_js_namespaceObject.log)(`Failed to capture PostHog event ${fullEvent.id}: ${err}`);
@@ -49,13 +49,19 @@ class McpEventSink {
49
49
  if (!result) return;
50
50
  const { event: fullEvent, captures } = result;
51
51
  try {
52
- for (const captureEvent of captures)this.posthog.capture({
53
- distinctId: captureEvent.distinct_id,
54
- event: captureEvent.event,
55
- properties: captureEvent.properties,
56
- timestamp: new Date(captureEvent.timestamp),
57
- uuid: uuidv7()
58
- });
52
+ for (const captureEvent of captures){
53
+ const groups = captureEvent.properties.$groups;
54
+ this.posthog.capture({
55
+ distinctId: captureEvent.distinct_id,
56
+ event: captureEvent.event,
57
+ properties: captureEvent.properties,
58
+ ...groups ? {
59
+ groups
60
+ } : {},
61
+ timestamp: new Date(captureEvent.timestamp),
62
+ uuid: uuidv7()
63
+ });
64
+ }
59
65
  log(`Captured PostHog event ${fullEvent.id} | ${fullEvent.eventType} | ${fullEvent.duration} ms | ${fullEvent.identifyActorGivenId || 'anonymous'}`);
60
66
  } catch (err) {
61
67
  log(`Failed to capture PostHog event ${fullEvent.id}: ${err}`);
package/dist/index.d.ts CHANGED
@@ -28,6 +28,25 @@ import type { McpAnalytics, MCPAnalyticsOptions } from './types';
28
28
  * ```
29
29
  */
30
30
  declare function instrument(server: unknown, posthog: PostHog, options?: MCPAnalyticsOptions): McpAnalytics;
31
+ /**
32
+ * A point-free `(server) => server` helper for framework server-mutation hooks (e.g.
33
+ * `@rekog/mcp-nest`'s `serverMutator`). It instruments the server and returns it, so you
34
+ * don't trip over {@link instrument} returning the analytics handle rather than the server —
35
+ * the bare `(s) => instrument(s, posthog)` would replace the server with the handle.
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * McpModule.forRoot({ serverMutator: instrumentMutator(posthog) })
40
+ * ```
41
+ *
42
+ * Need the handle for custom events? Call {@link instrument} directly inside your own mutator
43
+ * and return the server. See https://posthog.com/docs/mcp-analytics/installation.
44
+ *
45
+ * @param posthog - A `posthog-node` client you construct and own.
46
+ * @param options - Optional configuration. See `MCPAnalyticsOptions`.
47
+ * @returns A `(server) => server` mutator that instruments the server and returns it.
48
+ */
49
+ declare function instrumentMutator<TServer>(posthog: PostHog, options?: MCPAnalyticsOptions): (server: TServer) => TServer;
31
50
  export { deriveSessionIdFromMCPSession };
32
51
  export { POSTHOG_MCP_ANALYTICS_SOURCE, PostHogMCPAnalyticsEvent, PostHogMCPAnalyticsProperty, } from './extensions/constants';
33
52
  export { PostHogMCP, type PostHogMCPOptions } from './extensions/posthog-mcp';
@@ -36,5 +55,5 @@ export { setLogger } from './extensions/logger';
36
55
  export { PostHog, type PostHogOptions } from 'posthog-node';
37
56
  export type { BeforeSendFn, CaptureEventData, InitializeCaptureData, McpAnalytics, McpCaptureCommon, MCPAnalyticsContextOptions, MCPAnalyticsIntentSource, MCPAnalyticsOptions, MissingCapabilityCaptureData, PreparedToolCall, PrepareToolListOptions, ToolCallCaptureData, ToolsListCaptureData, UserIdentity, } from './types';
38
57
  export type IdentifyFunction = MCPAnalyticsOptions['identify'];
39
- export { instrument };
58
+ export { instrument, instrumentMutator };
40
59
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAO3C,OAAO,EAAE,6BAA6B,EAAgC,MAAM,sBAAsB,CAAA;AAGlG,OAAO,KAAK,EAGV,YAAY,EAEZ,mBAAmB,EAGpB,MAAM,SAAS,CAAA;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CA6BtG;AAmFD,OAAO,EAAE,6BAA6B,EAAE,CAAA;AACxC,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAI/C,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC3D,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,GACb,MAAM,SAAS,CAAA;AAChB,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAO3C,OAAO,EAAE,6BAA6B,EAAgC,MAAM,sBAAsB,CAAA;AAGlG,OAAO,KAAK,EAGV,YAAY,EAEZ,mBAAmB,EAGpB,MAAM,SAAS,CAAA;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,iBAAS,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAE,mBAAwB,GAAG,YAAY,CA6BtG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAKjH;AAmFD,OAAO,EAAE,6BAA6B,EAAE,CAAA;AACxC,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAI/C,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC3D,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,YAAY,GACb,MAAM,SAAS,CAAA;AAChB,MAAM,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAA;AAC9D,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAA"}
package/dist/index.js CHANGED
@@ -29,6 +29,7 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  deriveSessionIdFromMCPSession: ()=>session_js_namespaceObject.deriveSessionIdFromMCPSession,
30
30
  POSTHOG_MCP_ANALYTICS_SOURCE: ()=>constants_js_namespaceObject.POSTHOG_MCP_ANALYTICS_SOURCE,
31
31
  instrument: ()=>instrument,
32
+ instrumentMutator: ()=>instrumentMutator,
32
33
  setLogger: ()=>logger_js_namespaceObject.setLogger,
33
34
  PostHogMCPAnalyticsEvent: ()=>constants_js_namespaceObject.PostHogMCPAnalyticsEvent,
34
35
  getMoreToolsResult: ()=>tools_js_namespaceObject.getMoreToolsResult,
@@ -69,6 +70,12 @@ function instrument(server, posthog, options = {}) {
69
70
  };
70
71
  }
71
72
  }
73
+ function instrumentMutator(posthog, options) {
74
+ return (server)=>{
75
+ instrument(server, posthog, options);
76
+ return server;
77
+ };
78
+ }
72
79
  function createAnalyticsHandle(lowLevelServer) {
73
80
  return {
74
81
  capture: (eventData)=>captureCustomEvent(lowLevelServer, eventData)
@@ -131,6 +138,7 @@ exports.PostHogMCPAnalyticsProperty = __webpack_exports__.PostHogMCPAnalyticsPro
131
138
  exports.deriveSessionIdFromMCPSession = __webpack_exports__.deriveSessionIdFromMCPSession;
132
139
  exports.getMoreToolsResult = __webpack_exports__.getMoreToolsResult;
133
140
  exports.instrument = __webpack_exports__.instrument;
141
+ exports.instrumentMutator = __webpack_exports__.instrumentMutator;
134
142
  exports.setLogger = __webpack_exports__.setLogger;
135
143
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
136
144
  "POSTHOG_MCP_ANALYTICS_SOURCE",
@@ -141,6 +149,7 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
141
149
  "deriveSessionIdFromMCPSession",
142
150
  "getMoreToolsResult",
143
151
  "instrument",
152
+ "instrumentMutator",
144
153
  "setLogger"
145
154
  ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
146
155
  Object.defineProperty(exports, '__esModule', {
package/dist/index.mjs CHANGED
@@ -33,6 +33,12 @@ function instrument(server, posthog, options = {}) {
33
33
  };
34
34
  }
35
35
  }
36
+ function instrumentMutator(posthog, options) {
37
+ return (server)=>{
38
+ instrument(server, posthog, options);
39
+ return server;
40
+ };
41
+ }
36
42
  function createAnalyticsHandle(lowLevelServer) {
37
43
  return {
38
44
  capture: (eventData)=>captureCustomEvent(lowLevelServer, eventData)
@@ -87,4 +93,4 @@ async function captureCustomEvent(lowLevelServer, eventData) {
87
93
  await captureEvent(lowLevelServer, event);
88
94
  log(`Captured event "${eventData.event}" for session ${trackingData.sessionId}`);
89
95
  }
90
- export { POSTHOG_MCP_ANALYTICS_SOURCE, PostHog, PostHogMCP, PostHogMCPAnalyticsEvent, PostHogMCPAnalyticsProperty, deriveSessionIdFromMCPSession, getMoreToolsResult, instrument, setLogger };
96
+ export { POSTHOG_MCP_ANALYTICS_SOURCE, PostHog, PostHogMCP, PostHogMCPAnalyticsEvent, PostHogMCPAnalyticsProperty, deriveSessionIdFromMCPSession, getMoreToolsResult, instrument, instrumentMutator, setLogger };
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "0.4.3";
1
+ export declare const version = "0.5.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -26,7 +26,7 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  version: ()=>version
28
28
  });
29
- const version = '0.4.3';
29
+ const version = '0.5.0';
30
30
  exports.version = __webpack_exports__.version;
31
31
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
32
32
  "version"
package/dist/version.mjs CHANGED
@@ -1,2 +1,2 @@
1
- const version = '0.4.3';
1
+ const version = '0.5.0';
2
2
  export { version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/mcp",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "bugs": {
5
5
  "url": "https://github.com/PostHog/posthog-js/issues"
6
6
  },
@@ -39,7 +39,7 @@
39
39
  "@types/node": "^20.0.0",
40
40
  "jest": "29.7.0",
41
41
  "zod": "^3.25.0",
42
- "posthog-node": "^5.38.5",
42
+ "posthog-node": "^5.38.6",
43
43
  "@posthog-tooling/tsconfig-base": "1.1.1"
44
44
  },
45
45
  "peerDependencies": {
@@ -114,10 +114,19 @@ export class McpEventSink {
114
114
  const { event: fullEvent, captures } = result
115
115
  try {
116
116
  for (const captureEvent of captures) {
117
+ // `$groups` is written into `properties` by `buildPostHogCaptureEvents`,
118
+ // but posthog-node's `prepareEventMessage` overwrites the outgoing
119
+ // `$groups` property with the top-level `groups` field
120
+ // (`$groups: eventMessage.groups || groups`). Without passing `groups`
121
+ // here the group association would be silently dropped. See
122
+ // https://github.com/PostHog/posthog-js/issues/3888.
123
+ const groups = captureEvent.properties.$groups as Record<string, string> | undefined
124
+
117
125
  this.posthog.capture({
118
126
  distinctId: captureEvent.distinct_id,
119
127
  event: captureEvent.event,
120
128
  properties: captureEvent.properties,
129
+ ...(groups ? { groups } : {}),
121
130
  timestamp: new Date(captureEvent.timestamp),
122
131
  uuid: uuidv7(),
123
132
  })
package/src/index.ts CHANGED
@@ -79,6 +79,31 @@ function instrument(server: unknown, posthog: PostHog, options: MCPAnalyticsOpti
79
79
  }
80
80
  }
81
81
 
82
+ /**
83
+ * A point-free `(server) => server` helper for framework server-mutation hooks (e.g.
84
+ * `@rekog/mcp-nest`'s `serverMutator`). It instruments the server and returns it, so you
85
+ * don't trip over {@link instrument} returning the analytics handle rather than the server —
86
+ * the bare `(s) => instrument(s, posthog)` would replace the server with the handle.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * McpModule.forRoot({ serverMutator: instrumentMutator(posthog) })
91
+ * ```
92
+ *
93
+ * Need the handle for custom events? Call {@link instrument} directly inside your own mutator
94
+ * and return the server. See https://posthog.com/docs/mcp-analytics/installation.
95
+ *
96
+ * @param posthog - A `posthog-node` client you construct and own.
97
+ * @param options - Optional configuration. See `MCPAnalyticsOptions`.
98
+ * @returns A `(server) => server` mutator that instruments the server and returns it.
99
+ */
100
+ function instrumentMutator<TServer>(posthog: PostHog, options?: MCPAnalyticsOptions): (server: TServer) => TServer {
101
+ return (server: TServer): TServer => {
102
+ instrument(server, posthog, options)
103
+ return server
104
+ }
105
+ }
106
+
82
107
  function createAnalyticsHandle(lowLevelServer: MCPServerLike): McpAnalytics {
83
108
  return {
84
109
  capture: (eventData) => captureCustomEvent(lowLevelServer, eventData),
@@ -190,4 +215,4 @@ export type {
190
215
  UserIdentity,
191
216
  } from './types'
192
217
  export type IdentifyFunction = MCPAnalyticsOptions['identify']
193
- export { instrument }
218
+ export { instrument, instrumentMutator }
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = '0.4.3'
1
+ export const version = '0.5.0'