@posthog/mcp 0.15.0 → 0.16.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.
Files changed (59) hide show
  1. package/README.md +64 -0
  2. package/dist/extensions/constants.d.ts +9 -0
  3. package/dist/extensions/constants.d.ts.map +1 -1
  4. package/dist/extensions/constants.js +9 -0
  5. package/dist/extensions/constants.mjs +9 -0
  6. package/dist/extensions/event-types.d.ts +1 -0
  7. package/dist/extensions/event-types.d.ts.map +1 -1
  8. package/dist/extensions/event-types.js +1 -0
  9. package/dist/extensions/event-types.mjs +1 -0
  10. package/dist/extensions/feedback.d.ts +41 -0
  11. package/dist/extensions/feedback.d.ts.map +1 -0
  12. package/dist/extensions/feedback.js +259 -0
  13. package/dist/extensions/feedback.mjs +200 -0
  14. package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
  15. package/dist/extensions/instrument-highlevel.js +19 -1
  16. package/dist/extensions/instrument-highlevel.mjs +20 -2
  17. package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
  18. package/dist/extensions/instrument-lowlevel.js +19 -1
  19. package/dist/extensions/instrument-lowlevel.mjs +20 -2
  20. package/dist/extensions/instrumentation.d.ts +30 -13
  21. package/dist/extensions/instrumentation.d.ts.map +1 -1
  22. package/dist/extensions/instrumentation.js +27 -7
  23. package/dist/extensions/instrumentation.mjs +27 -7
  24. package/dist/extensions/mcp-payloads.d.ts +9 -3
  25. package/dist/extensions/mcp-payloads.d.ts.map +1 -1
  26. package/dist/extensions/mcp-payloads.js +16 -7
  27. package/dist/extensions/mcp-payloads.mjs +11 -5
  28. package/dist/extensions/posthog-events.d.ts.map +1 -1
  29. package/dist/extensions/posthog-events.js +1 -0
  30. package/dist/extensions/posthog-events.mjs +1 -0
  31. package/dist/extensions/posthog-mcp.d.ts +23 -3
  32. package/dist/extensions/posthog-mcp.d.ts.map +1 -1
  33. package/dist/extensions/posthog-mcp.js +27 -1
  34. package/dist/extensions/posthog-mcp.mjs +27 -1
  35. package/dist/extensions/sanitization.js +1 -1
  36. package/dist/extensions/sanitization.mjs +2 -2
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +10 -0
  40. package/dist/index.mjs +5 -1
  41. package/dist/types.d.ts +113 -0
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/version.d.ts +1 -1
  44. package/dist/version.js +1 -1
  45. package/dist/version.mjs +1 -1
  46. package/package.json +4 -4
  47. package/src/extensions/constants.ts +9 -0
  48. package/src/extensions/event-types.ts +1 -0
  49. package/src/extensions/feedback.ts +349 -0
  50. package/src/extensions/instrument-highlevel.ts +39 -2
  51. package/src/extensions/instrument-lowlevel.ts +39 -2
  52. package/src/extensions/instrumentation.ts +65 -17
  53. package/src/extensions/mcp-payloads.ts +19 -6
  54. package/src/extensions/posthog-events.ts +1 -0
  55. package/src/extensions/posthog-mcp.ts +74 -3
  56. package/src/extensions/sanitization.ts +3 -3
  57. package/src/index.ts +21 -0
  58. package/src/types.ts +119 -0
  59. package/src/version.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  type JsonRecord = Record<string, unknown>;
2
2
  /**
3
- * Sanitizes the agent-narrated intent: structured PII on top of the passes every
4
- * captured string gets.
3
+ * Sanitizes agent-narrated free text (`$mcp_intent`, the `send_feedback`
4
+ * fields): structured PII on top of the passes every captured string gets.
5
5
  *
6
6
  * Every step of the order is load-bearing. The binary gate reads the value as it
7
7
  * arrived, because splicing `[redacted]` into a blob — a Luhn-valid run inside
@@ -11,7 +11,7 @@ type JsonRecord = Record<string, unknown>;
11
11
  * URL pass, because the URL rewrite percent-encodes the `@` that the email
12
12
  * pattern anchors on.
13
13
  */
14
- export declare function sanitizeIntent(value: string): string;
14
+ export declare function sanitizeFreeText(value: string): string;
15
15
  /**
16
16
  * Redacts structured personal identifiers (emails, IP addresses, credit-card
17
17
  * numbers, US SSNs, and phone numbers) from a free-text string. Intended for the
@@ -23,6 +23,12 @@ export declare function sanitizeIntent(value: string): string;
23
23
  */
24
24
  export declare function redactPii(value: string): string;
25
25
  export declare function sanitizeCapturedValue(value: unknown): unknown;
26
+ /**
27
+ * {@link sanitizeCapturedValue} with the intent-grade string pass
28
+ * ({@link sanitizeFreeText}) on every string leaf, so nested agent-narrated
29
+ * values get structured-PII redaction in the load-bearing order too.
30
+ */
31
+ export declare function sanitizeFreeTextValue(value: unknown): unknown;
26
32
  export declare function buildCapturedMcpParameters(request: unknown): JsonRecord;
27
33
  export {};
28
34
  //# sourceMappingURL=mcp-payloads.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp-payloads.d.ts","sourceRoot":"","sources":["../../src/extensions/mcp-payloads.ts"],"names":[],"mappings":"AAoHA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAyYzC;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AA6DD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA0B7D;AA6BD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAiBvE"}
1
+ {"version":3,"file":"mcp-payloads.d.ts","sourceRoot":"","sources":["../../src/extensions/mcp-payloads.ts"],"names":[],"mappings":"AAoHA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAyYzC;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKtD;AA6DD;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU/C;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE7D;AAyDD,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAiBvE"}
@@ -262,7 +262,7 @@ function redactUrls(value) {
262
262
  function sanitizeString(value) {
263
263
  return isBinaryBlob(value) ? BINARY_REDACTED_VALUE : redactUrls(redactCredentials(value));
264
264
  }
265
- function sanitizeIntent(value) {
265
+ function sanitizeFreeText(value) {
266
266
  if (isBinaryBlob(value)) return BINARY_REDACTED_VALUE;
267
267
  return redactUrls(redactPii(redactCredentials(value)));
268
268
  }
@@ -319,13 +319,19 @@ function redactPii(value) {
319
319
  return result;
320
320
  }
321
321
  function sanitizeCapturedValue(value) {
322
+ return sanitizeValueWith(value, sanitizeString);
323
+ }
324
+ function sanitizeFreeTextValue(value) {
325
+ return sanitizeValueWith(value, sanitizeFreeText);
326
+ }
327
+ function sanitizeValueWith(value, sanitizeStringFn) {
322
328
  if (null == value) return value;
323
- if ('string' == typeof value) return sanitizeString(value);
324
- if (Array.isArray(value)) return value.map(sanitizeCapturedValue);
329
+ if ('string' == typeof value) return sanitizeStringFn(value);
330
+ if (Array.isArray(value)) return value.map((item)=>sanitizeValueWith(item, sanitizeStringFn));
325
331
  if (value instanceof Date) return value;
326
332
  if ('object' != typeof value) return value;
327
333
  const result = {};
328
- for (const [key, nestedValue] of Object.entries(value))result[key] = shouldRedactKey(key) ? REDACTED_VALUE : sanitizeCapturedValue(nestedValue);
334
+ for (const [key, nestedValue] of Object.entries(value))result[key] = shouldRedactKey(key) ? REDACTED_VALUE : sanitizeValueWith(nestedValue, sanitizeStringFn);
329
335
  return result;
330
336
  }
331
337
  function buildCapturedMcpArguments(argumentsValue) {
@@ -359,17 +365,20 @@ __webpack_require__.d(__webpack_exports__, {
359
365
  buildCapturedMcpParameters: ()=>buildCapturedMcpParameters,
360
366
  redactPii: ()=>redactPii,
361
367
  sanitizeCapturedValue: ()=>sanitizeCapturedValue,
362
- sanitizeIntent: ()=>sanitizeIntent
368
+ sanitizeFreeText: ()=>sanitizeFreeText,
369
+ sanitizeFreeTextValue: ()=>sanitizeFreeTextValue
363
370
  });
364
371
  exports.buildCapturedMcpParameters = __webpack_exports__.buildCapturedMcpParameters;
365
372
  exports.redactPii = __webpack_exports__.redactPii;
366
373
  exports.sanitizeCapturedValue = __webpack_exports__.sanitizeCapturedValue;
367
- exports.sanitizeIntent = __webpack_exports__.sanitizeIntent;
374
+ exports.sanitizeFreeText = __webpack_exports__.sanitizeFreeText;
375
+ exports.sanitizeFreeTextValue = __webpack_exports__.sanitizeFreeTextValue;
368
376
  for(var __rspack_i in __webpack_exports__)if (-1 === [
369
377
  "buildCapturedMcpParameters",
370
378
  "redactPii",
371
379
  "sanitizeCapturedValue",
372
- "sanitizeIntent"
380
+ "sanitizeFreeText",
381
+ "sanitizeFreeTextValue"
373
382
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
374
383
  Object.defineProperty(exports, '__esModule', {
375
384
  value: true
@@ -233,7 +233,7 @@ function redactUrls(value) {
233
233
  function sanitizeString(value) {
234
234
  return isBinaryBlob(value) ? BINARY_REDACTED_VALUE : redactUrls(redactCredentials(value));
235
235
  }
236
- function sanitizeIntent(value) {
236
+ function sanitizeFreeText(value) {
237
237
  if (isBinaryBlob(value)) return BINARY_REDACTED_VALUE;
238
238
  return redactUrls(redactPii(redactCredentials(value)));
239
239
  }
@@ -290,13 +290,19 @@ function redactPii(value) {
290
290
  return result;
291
291
  }
292
292
  function sanitizeCapturedValue(value) {
293
+ return sanitizeValueWith(value, sanitizeString);
294
+ }
295
+ function sanitizeFreeTextValue(value) {
296
+ return sanitizeValueWith(value, sanitizeFreeText);
297
+ }
298
+ function sanitizeValueWith(value, sanitizeStringFn) {
293
299
  if (null == value) return value;
294
- if ('string' == typeof value) return sanitizeString(value);
295
- if (Array.isArray(value)) return value.map(sanitizeCapturedValue);
300
+ if ('string' == typeof value) return sanitizeStringFn(value);
301
+ if (Array.isArray(value)) return value.map((item)=>sanitizeValueWith(item, sanitizeStringFn));
296
302
  if (value instanceof Date) return value;
297
303
  if ('object' != typeof value) return value;
298
304
  const result = {};
299
- for (const [key, nestedValue] of Object.entries(value))result[key] = shouldRedactKey(key) ? REDACTED_VALUE : sanitizeCapturedValue(nestedValue);
305
+ for (const [key, nestedValue] of Object.entries(value))result[key] = shouldRedactKey(key) ? REDACTED_VALUE : sanitizeValueWith(nestedValue, sanitizeStringFn);
300
306
  return result;
301
307
  }
302
308
  function buildCapturedMcpArguments(argumentsValue) {
@@ -326,4 +332,4 @@ function buildCapturedMcpParameters(request) {
326
332
  request: capturedRequest
327
333
  };
328
334
  }
329
- export { buildCapturedMcpParameters, redactPii, sanitizeCapturedValue, sanitizeIntent };
335
+ export { buildCapturedMcpParameters, redactPii, sanitizeCapturedValue, sanitizeFreeText, sanitizeFreeTextValue };
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-events.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-events.ts"],"names":[],"mappings":"AAKA,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"}
1
+ {"version":3,"file":"posthog-events.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-events.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AA0BrC,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"}
@@ -35,6 +35,7 @@ const external_event_types_js_namespaceObject = require("./event-types.js");
35
35
  const BUILT_IN_EVENT_NAME_BY_TYPE = {
36
36
  [external_event_types_js_namespaceObject.MCPAnalyticsEventType.custom]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Custom,
37
37
  [external_event_types_js_namespaceObject.MCPAnalyticsEventType.identify]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Identify,
38
+ [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpFeedback]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Feedback,
38
39
  [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpMissingCapability]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.MissingCapability,
39
40
  [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpInitialize]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.Initialize,
40
41
  [external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpPromptsGet]: external_constants_js_namespaceObject.PostHogMCPAnalyticsEvent.PromptGet,
@@ -3,6 +3,7 @@ import { MCPAnalyticsEventType } from "./event-types.mjs";
3
3
  const BUILT_IN_EVENT_NAME_BY_TYPE = {
4
4
  [MCPAnalyticsEventType.custom]: PostHogMCPAnalyticsEvent.Custom,
5
5
  [MCPAnalyticsEventType.identify]: PostHogMCPAnalyticsEvent.Identify,
6
+ [MCPAnalyticsEventType.mcpFeedback]: PostHogMCPAnalyticsEvent.Feedback,
6
7
  [MCPAnalyticsEventType.mcpMissingCapability]: PostHogMCPAnalyticsEvent.MissingCapability,
7
8
  [MCPAnalyticsEventType.mcpInitialize]: PostHogMCPAnalyticsEvent.Initialize,
8
9
  [MCPAnalyticsEventType.mcpPromptsGet]: PostHogMCPAnalyticsEvent.PromptGet,
@@ -1,5 +1,5 @@
1
1
  import { PostHog, type PostHogOptions } from 'posthog-node';
2
- import type { InitializeCaptureData, MCPAnalyticsOptions, MissingCapabilityCaptureData, PreparedToolCall, PrepareToolCallOptions, PrepareToolListOptions, ToolCallCaptureData, ToolsListCaptureData } from '../types';
2
+ import type { FeedbackCaptureData, CollectFeedbackConfig, InitializeCaptureData, MCPAnalyticsOptions, MissingCapabilityCaptureData, PreparedToolCall, PrepareToolCallOptions, PrepareToolListOptions, ToolCallCaptureData, ToolsListCaptureData } from '../types';
3
3
  import { type ContextInjectableTool } from './context-parameters';
4
4
  /**
5
5
  * Options for {@link PostHogMCP}. A superset of `posthog-node`'s options, plus
@@ -13,6 +13,17 @@ export interface PostHogMCPOptions extends PostHogOptions {
13
13
  * can't drift. Defaults to `get_more_tools`.
14
14
  */
15
15
  missingCapabilityToolName?: string;
16
+ /**
17
+ * Enable + configure the `send_feedback` virtual tool: injected by
18
+ * {@link PostHogMCP.prepareToolList} (when its `collectFeedback` toggle is on)
19
+ * and detected by {@link PostHogMCP.prepareToolCall}. Set once here so
20
+ * injection and detection can't drift — without this option, `prepareToolCall`
21
+ * never flags a call as feedback, so a real tool that uses the name is not
22
+ * shadowed. Pick a `toolName` no real tool uses. `onFeedback` is ignored on
23
+ * this path — the host dispatcher routes reports itself via
24
+ * {@link PreparedToolCall.feedbackReport}.
25
+ */
26
+ collectFeedback?: CollectFeedbackConfig;
16
27
  /**
17
28
  * Capture the calling model from recognized client metadata, with an injected
18
29
  * `llm_model` argument as fallback. Off by default.
@@ -73,8 +84,9 @@ export declare class PostHogMCP extends PostHog {
73
84
  * Decorate your `tools/list` response with PostHog's analytics affordances:
74
85
  * injects the `context` argument into every tool (so agents state their intent,
75
86
  * captured as `$mcp_intent`), injects `llm_model` when the constructor's
76
- * `captureModel` option is enabled, and appends `get_more_tools` when
77
- * `reportMissing` is on. Returns a new array; your tools are untouched.
87
+ * `captureModel` option is enabled, appends `get_more_tools` when
88
+ * `reportMissing` is on, and appends `send_feedback` when `collectFeedback` is
89
+ * on. Returns a new array; your tools are untouched.
78
90
  *
79
91
  * The appended `get_more_tools` descriptor carries only the base MCP tool fields
80
92
  * (name, description, input schema) — not any framework-specific fields your
@@ -128,5 +140,13 @@ export declare class PostHogMCP extends PostHog {
128
140
  * to the agent with `getMoreToolsResult()`.
129
141
  */
130
142
  captureMissingCapability(data: MissingCapabilityCaptureData): void;
143
+ /**
144
+ * Capture a `send_feedback` call as an agent-feedback report. Emits
145
+ * `$mcp_feedback` with the report's `$mcp_feedback_*` properties and its
146
+ * summary/details as `$mcp_intent`. Reply to the agent with
147
+ * `sendFeedbackResult()` (or a custom text) after routing the report to your
148
+ * own feedback backend.
149
+ */
150
+ captureFeedback(data: FeedbackCaptureData): void;
131
151
  }
132
152
  //# sourceMappingURL=posthog-mcp.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-mcp.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,KAAK,EACV,qBAAqB,EAErB,mBAAmB,EAGnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,UAAU,CAAA;AAEjB,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAA;AAgB7B;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC;;;OAGG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAA;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,UAAW,SAAQ,OAAO;;gBASzB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAO3D,8FAA8F;IAC9F,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAkBhD,iEAAiE;IACjE,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAUpD;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAclD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,eAAe,CAAC,KAAK,SAAS,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,GAAE,sBAA2B,GAAG,KAAK,EAAE;IAiCnH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,sBAA2B,GACnC,gBAAgB;IA4BnB;;;;OAIG;IACH,wBAAwB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI;CAmBnE"}
1
+ {"version":3,"file":"posthog-mcp.d.ts","sourceRoot":"","sources":["../../src/extensions/posthog-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,KAAK,EACV,mBAAmB,EAEnB,qBAAqB,EACrB,qBAAqB,EAErB,mBAAmB,EAGnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,UAAU,CAAA;AAUjB,OAAO,EAIL,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAA;AAgB7B;;;GAGG;AACH,MAAM,WAAW,iBAAkB,SAAQ,cAAc;IACvD;;;;;OAKG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAClC;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAA;IACvC;;;OAGG;IACH,YAAY,CAAC,EAAE,mBAAmB,CAAC,cAAc,CAAC,CAAA;CACnD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,qBAAa,UAAW,SAAQ,OAAO;;gBAazB,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,iBAAsB;IAoB3D,8FAA8F;IAC9F,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;IAkBhD,iEAAiE;IACjE,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,IAAI;IAUpD;;;;;OAKG;IACH,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAclD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,eAAe,CAAC,KAAK,SAAS,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,OAAO,GAAE,sBAA2B,GAAG,KAAK,EAAE;IAyCnH;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACH,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,sBAA2B,GACnC,gBAAgB;IA+BnB;;;;OAIG;IACH,wBAAwB,CAAC,IAAI,EAAE,4BAA4B,GAAG,IAAI;IASlE;;;;;;OAMG;IACH,eAAe,CAAC,IAAI,EAAE,mBAAmB,GAAG,IAAI;CAuBjD"}
@@ -31,6 +31,7 @@ __webpack_require__.d(__webpack_exports__, {
31
31
  PostHogMCP: ()=>PostHogMCP
32
32
  });
33
33
  const external_posthog_node_namespaceObject = require("posthog-node");
34
+ const external_feedback_js_namespaceObject = require("./feedback.js");
34
35
  const external_analytics_parameters_js_namespaceObject = require("./analytics-parameters.js");
35
36
  const external_context_parameters_js_namespaceObject = require("./context-parameters.js");
36
37
  const external_event_types_js_namespaceObject = require("./event-types.js");
@@ -44,14 +45,21 @@ const external_tools_js_namespaceObject = require("./tools.js");
44
45
  class PostHogMCP extends external_posthog_node_namespaceObject.PostHog {
45
46
  #sink;
46
47
  #missingCapabilityToolName;
48
+ #feedbackOptions;
47
49
  #captureModel;
48
50
  #modelParameterOwnership;
49
51
  constructor(apiKey, options = {}){
50
52
  super(apiKey, options), this.#sink = new external_sink_js_namespaceObject.McpEventSink(this), this.#modelParameterOwnership = new Map();
51
53
  this.#missingCapabilityToolName = options.missingCapabilityToolName ?? external_tools_js_namespaceObject.GET_MORE_TOOLS_NAME;
54
+ this.#feedbackOptions = (0, external_feedback_js_namespaceObject.resolveCollectFeedbackOptions)(options.collectFeedback);
55
+ (0, external_feedback_js_namespaceObject.getFeedbackToolDescriptor)(this.#feedbackOptions);
56
+ if (this.#feedbackOptions?.onFeedback) (0, external_logger_js_namespaceObject.log)('Warning: collectFeedback.onFeedback is ignored on the PostHogMCP path - route reports from your dispatcher via prepareToolCall().feedbackReport instead.');
52
57
  this.#captureModel = options.captureModel;
53
58
  (0, external_lib_identity_js_namespaceObject.applyMcpLibIdentity)(this);
54
59
  }
60
+ get #feedbackToolName() {
61
+ return this.#feedbackOptions?.toolName ?? external_feedback_js_namespaceObject.SEND_FEEDBACK_TOOL_NAME;
62
+ }
55
63
  captureToolCall(data) {
56
64
  const event = baseEvent(external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpToolsCall, data);
57
65
  event.resourceName = data.toolName;
@@ -96,6 +104,10 @@ class PostHogMCP extends external_posthog_node_namespaceObject.PostHog {
96
104
  ...prepared,
97
105
  (0, external_tools_js_namespaceObject.getReportMissingToolDescriptor)(this.#missingCapabilityToolName)
98
106
  ];
107
+ if (options.collectFeedback && void 0 !== this.#feedbackOptions && !prepared.some((tool)=>tool?.name === this.#feedbackToolName)) prepared = [
108
+ ...prepared,
109
+ (0, external_feedback_js_namespaceObject.getFeedbackToolDescriptor)(this.#feedbackOptions)
110
+ ];
99
111
  if ((0, external_model_parameters_js_namespaceObject.isCaptureModelEnabled)(this.#captureModel)) {
100
112
  this.#modelParameterOwnership.clear();
101
113
  const ownershipByName = new Map();
@@ -121,6 +133,7 @@ class PostHogMCP extends external_posthog_node_namespaceObject.PostHog {
121
133
  }
122
134
  }, ownsModel) : void 0;
123
135
  const strippedArgs = stripContext(args);
136
+ const isFeedback = void 0 !== this.#feedbackOptions && name === this.#feedbackToolName;
124
137
  return {
125
138
  intent,
126
139
  intentSource: intent ? 'context_parameter' : void 0,
@@ -131,7 +144,9 @@ class PostHogMCP extends external_posthog_node_namespaceObject.PostHog {
131
144
  conversationId: false,
132
145
  llmModel: true
133
146
  }) : strippedArgs,
134
- isMissingCapability: name === this.#missingCapabilityToolName
147
+ isMissingCapability: name === this.#missingCapabilityToolName,
148
+ isFeedback,
149
+ feedbackReport: isFeedback ? (0, external_feedback_js_namespaceObject.parseFeedbackReport)(args, this.#feedbackOptions) : void 0
135
150
  };
136
151
  }
137
152
  captureMissingCapability(data) {
@@ -142,6 +157,17 @@ class PostHogMCP extends external_posthog_node_namespaceObject.PostHog {
142
157
  (0, external_model_parameters_js_namespaceObject.setEventModel)(event, data.llmModel, data.llmModelSource);
143
158
  this.#emit(event);
144
159
  }
160
+ captureFeedback(data) {
161
+ const event = baseEvent(external_event_types_js_namespaceObject.MCPAnalyticsEventType.mcpFeedback, data);
162
+ event.resourceName = this.#feedbackToolName;
163
+ event.properties = {
164
+ ...event.properties,
165
+ ...(0, external_feedback_js_namespaceObject.buildFeedbackEventProperties)(data.report)
166
+ };
167
+ applyIntent(event, (0, external_feedback_js_namespaceObject.buildFeedbackIntent)(data.report), 'context_parameter');
168
+ (0, external_model_parameters_js_namespaceObject.setEventModel)(event, data.llmModel, data.llmModelSource);
169
+ this.#emit(event);
170
+ }
145
171
  #emit(event) {
146
172
  this.#sink.capture(event, {
147
173
  enableExceptionAutocapture: this.options.enableExceptionAutocapture ?? true
@@ -1,4 +1,5 @@
1
1
  import { PostHog } from "posthog-node";
2
+ import { SEND_FEEDBACK_TOOL_NAME, buildFeedbackEventProperties, buildFeedbackIntent, getFeedbackToolDescriptor, parseFeedbackReport, resolveCollectFeedbackOptions } from "./feedback.mjs";
2
3
  import { analyticsOwnsParameter, stripOwnedAnalyticsArguments } from "./analytics-parameters.mjs";
3
4
  import { addContextParameterToTools, getContextDescription, isContextEnabled } from "./context-parameters.mjs";
4
5
  import { MCPAnalyticsEventType } from "./event-types.mjs";
@@ -12,14 +13,21 @@ import { GET_MORE_TOOLS_NAME, getReportMissingToolDescriptor } from "./tools.mjs
12
13
  class PostHogMCP extends PostHog {
13
14
  #sink;
14
15
  #missingCapabilityToolName;
16
+ #feedbackOptions;
15
17
  #captureModel;
16
18
  #modelParameterOwnership;
17
19
  constructor(apiKey, options = {}){
18
20
  super(apiKey, options), this.#sink = new McpEventSink(this), this.#modelParameterOwnership = new Map();
19
21
  this.#missingCapabilityToolName = options.missingCapabilityToolName ?? GET_MORE_TOOLS_NAME;
22
+ this.#feedbackOptions = resolveCollectFeedbackOptions(options.collectFeedback);
23
+ getFeedbackToolDescriptor(this.#feedbackOptions);
24
+ if (this.#feedbackOptions?.onFeedback) log('Warning: collectFeedback.onFeedback is ignored on the PostHogMCP path - route reports from your dispatcher via prepareToolCall().feedbackReport instead.');
20
25
  this.#captureModel = options.captureModel;
21
26
  applyMcpLibIdentity(this);
22
27
  }
28
+ get #feedbackToolName() {
29
+ return this.#feedbackOptions?.toolName ?? SEND_FEEDBACK_TOOL_NAME;
30
+ }
23
31
  captureToolCall(data) {
24
32
  const event = baseEvent(MCPAnalyticsEventType.mcpToolsCall, data);
25
33
  event.resourceName = data.toolName;
@@ -64,6 +72,10 @@ class PostHogMCP extends PostHog {
64
72
  ...prepared,
65
73
  getReportMissingToolDescriptor(this.#missingCapabilityToolName)
66
74
  ];
75
+ if (options.collectFeedback && void 0 !== this.#feedbackOptions && !prepared.some((tool)=>tool?.name === this.#feedbackToolName)) prepared = [
76
+ ...prepared,
77
+ getFeedbackToolDescriptor(this.#feedbackOptions)
78
+ ];
67
79
  if (isCaptureModelEnabled(this.#captureModel)) {
68
80
  this.#modelParameterOwnership.clear();
69
81
  const ownershipByName = new Map();
@@ -89,6 +101,7 @@ class PostHogMCP extends PostHog {
89
101
  }
90
102
  }, ownsModel) : void 0;
91
103
  const strippedArgs = stripContext(args);
104
+ const isFeedback = void 0 !== this.#feedbackOptions && name === this.#feedbackToolName;
92
105
  return {
93
106
  intent,
94
107
  intentSource: intent ? 'context_parameter' : void 0,
@@ -99,7 +112,9 @@ class PostHogMCP extends PostHog {
99
112
  conversationId: false,
100
113
  llmModel: true
101
114
  }) : strippedArgs,
102
- isMissingCapability: name === this.#missingCapabilityToolName
115
+ isMissingCapability: name === this.#missingCapabilityToolName,
116
+ isFeedback,
117
+ feedbackReport: isFeedback ? parseFeedbackReport(args, this.#feedbackOptions) : void 0
103
118
  };
104
119
  }
105
120
  captureMissingCapability(data) {
@@ -110,6 +125,17 @@ class PostHogMCP extends PostHog {
110
125
  setEventModel(event, data.llmModel, data.llmModelSource);
111
126
  this.#emit(event);
112
127
  }
128
+ captureFeedback(data) {
129
+ const event = baseEvent(MCPAnalyticsEventType.mcpFeedback, data);
130
+ event.resourceName = this.#feedbackToolName;
131
+ event.properties = {
132
+ ...event.properties,
133
+ ...buildFeedbackEventProperties(data.report)
134
+ };
135
+ applyIntent(event, buildFeedbackIntent(data.report), 'context_parameter');
136
+ setEventModel(event, data.llmModel, data.llmModelSource);
137
+ this.#emit(event);
138
+ }
113
139
  #emit(event) {
114
140
  this.#sink.capture(event, {
115
141
  enableExceptionAutocapture: this.options.enableExceptionAutocapture ?? true
@@ -41,7 +41,7 @@ function sanitizeEvent(event) {
41
41
  if (null != result.response) result.response = sanitizeResponse(result.response);
42
42
  if (null != result.parameters) result.parameters = sanitizeParameters(result.parameters);
43
43
  if (null != result.resourceName) result.resourceName = (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(result.resourceName);
44
- if (null != result.userIntent) result.userIntent = (0, external_mcp_payloads_js_namespaceObject.sanitizeIntent)(result.userIntent);
44
+ if (null != result.userIntent) result.userIntent = (0, external_mcp_payloads_js_namespaceObject.sanitizeFreeText)(result.userIntent);
45
45
  if (null != result.llmModel) result.llmModel = (0, external_mcp_payloads_js_namespaceObject.sanitizeCapturedValue)(result.llmModel);
46
46
  if (null != result.error) result.error = sanitizeExceptionValues(result.error);
47
47
  return result;
@@ -1,4 +1,4 @@
1
- import { sanitizeCapturedValue, sanitizeIntent } from "./mcp-payloads.mjs";
1
+ import { sanitizeCapturedValue, sanitizeFreeText } from "./mcp-payloads.mjs";
2
2
  function isRecord(value) {
3
3
  return !!value && 'object' == typeof value && !Array.isArray(value);
4
4
  }
@@ -9,7 +9,7 @@ function sanitizeEvent(event) {
9
9
  if (null != result.response) result.response = sanitizeResponse(result.response);
10
10
  if (null != result.parameters) result.parameters = sanitizeParameters(result.parameters);
11
11
  if (null != result.resourceName) result.resourceName = sanitizeCapturedValue(result.resourceName);
12
- if (null != result.userIntent) result.userIntent = sanitizeIntent(result.userIntent);
12
+ if (null != result.userIntent) result.userIntent = sanitizeFreeText(result.userIntent);
13
13
  if (null != result.llmModel) result.llmModel = sanitizeCapturedValue(result.llmModel);
14
14
  if (null != result.error) result.error = sanitizeExceptionValues(result.error);
15
15
  return result;
package/dist/index.d.ts CHANGED
@@ -53,9 +53,10 @@ export { POSTHOG_MCP_ANALYTICS_SOURCE, PostHogMCPAnalyticsEvent, PostHogMCPAnaly
53
53
  export { getRequestHeaders } from './extensions/request-headers';
54
54
  export { PostHogMCP, type PostHogMCPOptions } from './extensions/posthog-mcp';
55
55
  export { getMoreToolsResult } from './extensions/tools';
56
+ export { sendFeedbackResult, SEND_FEEDBACK_TOOL_NAME } from './extensions/feedback';
56
57
  export { setLogger } from './extensions/logger';
57
58
  export { PostHog, type PostHogOptions } from 'posthog-node';
58
- export type { BeforeSendFn, CaptureEventData, InitializeCaptureData, McpAnalytics, McpCaptureCommon, MCPAnalyticsContextOptions, MCPAnalyticsIntentSource, MCPAnalyticsModelOptions, MCPAnalyticsModelSource, MCPAnalyticsOptions, MissingCapabilityCaptureData, PreparedToolCall, PrepareToolCallOptions, PrepareToolListOptions, RequestHeaderBag, ToolCallCaptureData, ToolsListCaptureData, UserIdentity, } from './types';
59
+ export type { FeedbackCaptureData, FeedbackExtraPropertySchema, CollectFeedbackOptions, FeedbackReport, FeedbackSentiment, FeedbackType, BeforeSendFn, CaptureEventData, CollectFeedbackConfig, InitializeCaptureData, McpAnalytics, McpCaptureCommon, MCPAnalyticsContextOptions, MCPAnalyticsIntentSource, MCPAnalyticsModelOptions, MCPAnalyticsModelSource, MCPAnalyticsOptions, MissingCapabilityCaptureData, PreparedToolCall, PrepareToolCallOptions, PrepareToolListOptions, RequestHeaderBag, ToolCallCaptureData, ToolsListCaptureData, UserIdentity, } from './types';
59
60
  export type IdentifyFunction = MCPAnalyticsOptions['identify'];
60
61
  export { instrument, instrumentMutator };
61
62
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAQ3C,OAAO,EAAE,6BAA6B,EAAkB,YAAY,EAAE,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,CAiCtG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAKjH;AAuFD,OAAO,EAAE,6BAA6B,EAAE,YAAY,EAAE,CAAA;AAItD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,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,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAQ3C,OAAO,EAAE,6BAA6B,EAAkB,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAIlG,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,CA4CtG;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,iBAAS,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAKjH;AAwFD,OAAO,EAAE,6BAA6B,EAAE,YAAY,EAAE,CAAA;AAItD,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,mBAAmB,GACzB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,4BAA4B,EAC5B,wBAAwB,EACxB,2BAA2B,GAC5B,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAA;AACnF,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAI/C,OAAO,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAC3D,YAAY,EACV,mBAAmB,EACnB,2BAA2B,EAC3B,sBAAsB,EACtB,cAAc,EACd,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,EACZ,gBAAgB,EAChB,0BAA0B,EAC1B,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,mBAAmB,EACnB,4BAA4B,EAC5B,gBAAgB,EAChB,sBAAsB,EACtB,sBAAsB,EACtB,gBAAgB,EAChB,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
@@ -34,6 +34,7 @@ __webpack_require__.d(__webpack_exports__, {
34
34
  PostHogMCP: ()=>posthog_mcp_js_namespaceObject.PostHogMCP,
35
35
  PostHogMCPAnalyticsEvent: ()=>constants_js_namespaceObject.PostHogMCPAnalyticsEvent,
36
36
  PostHogMCPAnalyticsProperty: ()=>constants_js_namespaceObject.PostHogMCPAnalyticsProperty,
37
+ SEND_FEEDBACK_TOOL_NAME: ()=>feedback_js_namespaceObject.SEND_FEEDBACK_TOOL_NAME,
37
38
  decodeSessionId: ()=>session_token_js_namespaceObject.decodeSessionId,
38
39
  deriveSessionIdFromMCPSession: ()=>session_js_namespaceObject.deriveSessionIdFromMCPSession,
39
40
  encodeSessionId: ()=>session_token_js_namespaceObject.encodeSessionId,
@@ -42,6 +43,7 @@ __webpack_require__.d(__webpack_exports__, {
42
43
  instrument: ()=>instrument,
43
44
  instrumentMutator: ()=>instrumentMutator,
44
45
  newSessionId: ()=>session_js_namespaceObject.newSessionId,
46
+ sendFeedbackResult: ()=>feedback_js_namespaceObject.sendFeedbackResult,
45
47
  setLogger: ()=>logger_js_namespaceObject.setLogger
46
48
  });
47
49
  const compatibility_js_namespaceObject = require("./extensions/compatibility.js");
@@ -54,6 +56,7 @@ const lib_identity_js_namespaceObject = require("./extensions/lib-identity.js");
54
56
  const session_js_namespaceObject = require("./extensions/session.js");
55
57
  const instrument_lowlevel_js_namespaceObject = require("./extensions/instrument-lowlevel.js");
56
58
  const instrument_highlevel_js_namespaceObject = require("./extensions/instrument-highlevel.js");
59
+ const feedback_js_namespaceObject = require("./extensions/feedback.js");
57
60
  const session_token_js_namespaceObject = require("./extensions/session-token.js");
58
61
  const constants_js_namespaceObject = require("./extensions/constants.js");
59
62
  const request_headers_js_namespaceObject = require("./extensions/request-headers.js");
@@ -62,6 +65,8 @@ const tools_js_namespaceObject = require("./extensions/tools.js");
62
65
  const external_posthog_node_namespaceObject = require("posthog-node");
63
66
  function instrument(server, posthog, options = {}) {
64
67
  const logger = (0, logger_js_namespaceObject.createLogger)(options?.logger);
68
+ const feedbackOptions = (0, feedback_js_namespaceObject.resolveCollectFeedbackOptions)(options?.collectFeedback);
69
+ if (feedbackOptions) (0, feedback_js_namespaceObject.getFeedbackToolDescriptor)(feedbackOptions);
65
70
  try {
66
71
  if (!posthog) logger('Warning: No PostHog client passed to instrument(). Events will not be sent anywhere.');
67
72
  const validatedServer = (0, compatibility_js_namespaceObject.isCompatibleServerType)(server, logger);
@@ -100,6 +105,7 @@ function getLowLevelServer(server) {
100
105
  }
101
106
  const DEFAULT_OPTIONS = {
102
107
  reportMissing: false,
108
+ collectFeedback: false,
103
109
  enableConversationId: false
104
110
  };
105
111
  function buildTrackingData(lowLevelServer, options, sink, logger) {
@@ -152,6 +158,7 @@ exports.PostHog = __webpack_exports__.PostHog;
152
158
  exports.PostHogMCP = __webpack_exports__.PostHogMCP;
153
159
  exports.PostHogMCPAnalyticsEvent = __webpack_exports__.PostHogMCPAnalyticsEvent;
154
160
  exports.PostHogMCPAnalyticsProperty = __webpack_exports__.PostHogMCPAnalyticsProperty;
161
+ exports.SEND_FEEDBACK_TOOL_NAME = __webpack_exports__.SEND_FEEDBACK_TOOL_NAME;
155
162
  exports.decodeSessionId = __webpack_exports__.decodeSessionId;
156
163
  exports.deriveSessionIdFromMCPSession = __webpack_exports__.deriveSessionIdFromMCPSession;
157
164
  exports.encodeSessionId = __webpack_exports__.encodeSessionId;
@@ -160,6 +167,7 @@ exports.getRequestHeaders = __webpack_exports__.getRequestHeaders;
160
167
  exports.instrument = __webpack_exports__.instrument;
161
168
  exports.instrumentMutator = __webpack_exports__.instrumentMutator;
162
169
  exports.newSessionId = __webpack_exports__.newSessionId;
170
+ exports.sendFeedbackResult = __webpack_exports__.sendFeedbackResult;
163
171
  exports.setLogger = __webpack_exports__.setLogger;
164
172
  for(var __rspack_i in __webpack_exports__)if (-1 === [
165
173
  "MCP_SESSION_HEADER",
@@ -168,6 +176,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
168
176
  "PostHogMCP",
169
177
  "PostHogMCPAnalyticsEvent",
170
178
  "PostHogMCPAnalyticsProperty",
179
+ "SEND_FEEDBACK_TOOL_NAME",
171
180
  "decodeSessionId",
172
181
  "deriveSessionIdFromMCPSession",
173
182
  "encodeSessionId",
@@ -176,6 +185,7 @@ for(var __rspack_i in __webpack_exports__)if (-1 === [
176
185
  "instrument",
177
186
  "instrumentMutator",
178
187
  "newSessionId",
188
+ "sendFeedbackResult",
179
189
  "setLogger"
180
190
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
181
191
  Object.defineProperty(exports, '__esModule', {
package/dist/index.mjs CHANGED
@@ -8,8 +8,11 @@ import { applyMcpLibIdentity } from "./extensions/lib-identity.mjs";
8
8
  import { deriveSessionIdFromMCPSession, getSessionInfo, newSessionId } from "./extensions/session.mjs";
9
9
  import { instrumentLowLevelServer } from "./extensions/instrument-lowlevel.mjs";
10
10
  import { instrumentHighLevelServer } from "./extensions/instrument-highlevel.mjs";
11
+ import { SEND_FEEDBACK_TOOL_NAME, getFeedbackToolDescriptor, resolveCollectFeedbackOptions, sendFeedbackResult } from "./extensions/feedback.mjs";
11
12
  function instrument(server, posthog, options = {}) {
12
13
  const logger = createLogger(options?.logger);
14
+ const feedbackOptions = resolveCollectFeedbackOptions(options?.collectFeedback);
15
+ if (feedbackOptions) getFeedbackToolDescriptor(feedbackOptions);
13
16
  try {
14
17
  if (!posthog) logger('Warning: No PostHog client passed to instrument(). Events will not be sent anywhere.');
15
18
  const validatedServer = isCompatibleServerType(server, logger);
@@ -48,6 +51,7 @@ function getLowLevelServer(server) {
48
51
  }
49
52
  const DEFAULT_OPTIONS = {
50
53
  reportMissing: false,
54
+ collectFeedback: false,
51
55
  enableConversationId: false
52
56
  };
53
57
  function buildTrackingData(lowLevelServer, options, sink, logger) {
@@ -100,4 +104,4 @@ export { getRequestHeaders } from "./extensions/request-headers.mjs";
100
104
  export { PostHogMCP } from "./extensions/posthog-mcp.mjs";
101
105
  export { getMoreToolsResult } from "./extensions/tools.mjs";
102
106
  export { PostHog } from "posthog-node";
103
- export { deriveSessionIdFromMCPSession, instrument, instrumentMutator, newSessionId, setLogger };
107
+ export { SEND_FEEDBACK_TOOL_NAME, deriveSessionIdFromMCPSession, instrument, instrumentMutator, newSessionId, sendFeedbackResult, setLogger };