@posthog/mcp 0.15.0 → 0.16.1
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/README.md +69 -0
- package/dist/extensions/constants.d.ts +9 -0
- package/dist/extensions/constants.d.ts.map +1 -1
- package/dist/extensions/constants.js +9 -0
- package/dist/extensions/constants.mjs +9 -0
- package/dist/extensions/event-types.d.ts +1 -0
- package/dist/extensions/event-types.d.ts.map +1 -1
- package/dist/extensions/event-types.js +1 -0
- package/dist/extensions/event-types.mjs +1 -0
- package/dist/extensions/feedback.d.ts +41 -0
- package/dist/extensions/feedback.d.ts.map +1 -0
- package/dist/extensions/feedback.js +261 -0
- package/dist/extensions/feedback.mjs +202 -0
- package/dist/extensions/instrument-highlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-highlevel.js +19 -1
- package/dist/extensions/instrument-highlevel.mjs +20 -2
- package/dist/extensions/instrument-lowlevel.d.ts.map +1 -1
- package/dist/extensions/instrument-lowlevel.js +19 -1
- package/dist/extensions/instrument-lowlevel.mjs +20 -2
- package/dist/extensions/instrumentation.d.ts +30 -13
- package/dist/extensions/instrumentation.d.ts.map +1 -1
- package/dist/extensions/instrumentation.js +27 -7
- package/dist/extensions/instrumentation.mjs +27 -7
- package/dist/extensions/mcp-payloads.d.ts +9 -3
- package/dist/extensions/mcp-payloads.d.ts.map +1 -1
- package/dist/extensions/mcp-payloads.js +16 -7
- package/dist/extensions/mcp-payloads.mjs +11 -5
- package/dist/extensions/posthog-events.d.ts.map +1 -1
- package/dist/extensions/posthog-events.js +1 -0
- package/dist/extensions/posthog-events.mjs +1 -0
- package/dist/extensions/posthog-mcp.d.ts +28 -4
- package/dist/extensions/posthog-mcp.d.ts.map +1 -1
- package/dist/extensions/posthog-mcp.js +27 -1
- package/dist/extensions/posthog-mcp.mjs +27 -1
- package/dist/extensions/sanitization.js +1 -1
- package/dist/extensions/sanitization.mjs +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -0
- package/dist/index.mjs +5 -1
- package/dist/types.d.ts +119 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/version.mjs +1 -1
- package/package.json +3 -3
- package/src/extensions/constants.ts +9 -0
- package/src/extensions/event-types.ts +1 -0
- package/src/extensions/feedback.ts +357 -0
- package/src/extensions/instrument-highlevel.ts +39 -2
- package/src/extensions/instrument-lowlevel.ts +39 -2
- package/src/extensions/instrumentation.ts +65 -17
- package/src/extensions/mcp-payloads.ts +19 -6
- package/src/extensions/posthog-events.ts +1 -0
- package/src/extensions/posthog-mcp.ts +85 -4
- package/src/extensions/sanitization.ts +3 -3
- package/src/index.ts +21 -0
- package/src/types.ts +125 -1
- package/src/version.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
type JsonRecord = Record<string, unknown>;
|
|
2
2
|
/**
|
|
3
|
-
* Sanitizes
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
324
|
-
if (Array.isArray(value)) return value.map(
|
|
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 :
|
|
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
|
-
|
|
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.
|
|
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
|
-
"
|
|
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
|
|
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
|
|
295
|
-
if (Array.isArray(value)) return value.map(
|
|
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 :
|
|
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,
|
|
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;
|
|
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,
|
|
77
|
-
* `reportMissing` is on
|
|
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
|
|
@@ -111,8 +123,12 @@ export declare class PostHogMCP extends PostHog {
|
|
|
111
123
|
*
|
|
112
124
|
* @example
|
|
113
125
|
* ```ts
|
|
126
|
+
* const originalTool = myTools.find((tool) => tool.name === name)
|
|
114
127
|
* const { intent, intentSource, llmModel, llmModelSource, args, isMissingCapability } =
|
|
115
|
-
* posthog.prepareToolCall(name, rawArgs, {
|
|
128
|
+
* posthog.prepareToolCall(name, rawArgs, {
|
|
129
|
+
* originalTool,
|
|
130
|
+
* requestMeta: request.params?._meta,
|
|
131
|
+
* })
|
|
116
132
|
* if (isMissingCapability) {
|
|
117
133
|
* posthog.captureMissingCapability({ context: intent, llmModel, llmModelSource, ...identity })
|
|
118
134
|
* return getMoreToolsResult()
|
|
@@ -128,5 +144,13 @@ export declare class PostHogMCP extends PostHog {
|
|
|
128
144
|
* to the agent with `getMoreToolsResult()`.
|
|
129
145
|
*/
|
|
130
146
|
captureMissingCapability(data: MissingCapabilityCaptureData): void;
|
|
147
|
+
/**
|
|
148
|
+
* Capture a `send_feedback` call as an agent-feedback report. Emits
|
|
149
|
+
* `$mcp_feedback` with the report's `$mcp_feedback_*` properties and its
|
|
150
|
+
* summary/details as `$mcp_intent`. Reply to the agent with
|
|
151
|
+
* `sendFeedbackResult()` (or a custom text) after routing the report to your
|
|
152
|
+
* own feedback backend.
|
|
153
|
+
*/
|
|
154
|
+
captureFeedback(data: FeedbackCaptureData): void;
|
|
131
155
|
}
|
|
132
156
|
//# 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;
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;IACH,eAAe,CACb,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,GAAE,sBAA2B,GACnC,gBAAgB;IAqCnB;;;;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 && null == options.originalTool;
|
|
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 && null == options.originalTool;
|
|
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.
|
|
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,
|
|
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 =
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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 };
|