@digital-science-dsl/dimensions-analytics-mcp 1.0.3 → 1.0.4
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/CHANGELOG.md +6 -0
- package/dist/client/deployment-config.d.ts +3 -17
- package/dist/client/deployment-config.d.ts.map +1 -1
- package/dist/client/deployment-config.js +3 -23
- package/dist/client/deployment-config.js.map +1 -1
- package/dist/client/http-client.d.ts +4 -26
- package/dist/client/http-client.d.ts.map +1 -1
- package/dist/client/http-client.js +26 -79
- package/dist/client/http-client.js.map +1 -1
- package/dist/client/internal-dsl-client.d.ts +15 -3
- package/dist/client/internal-dsl-client.d.ts.map +1 -1
- package/dist/client/internal-dsl-client.js +32 -4
- package/dist/client/internal-dsl-client.js.map +1 -1
- package/dist/client/request-retry.d.ts +39 -0
- package/dist/client/request-retry.d.ts.map +1 -0
- package/dist/client/request-retry.js +85 -0
- package/dist/client/request-retry.js.map +1 -0
- package/dist/client/usage-context.d.ts +29 -0
- package/dist/client/usage-context.d.ts.map +1 -0
- package/dist/client/usage-context.js +33 -0
- package/dist/client/usage-context.js.map +1 -0
- package/dist/client/usage-headers.d.ts +19 -0
- package/dist/client/usage-headers.d.ts.map +1 -0
- package/dist/client/usage-headers.js +39 -0
- package/dist/client/usage-headers.js.map +1 -0
- package/dist/dsl/client.d.ts.map +1 -1
- package/dist/dsl/client.js +7 -4
- package/dist/dsl/client.js.map +1 -1
- package/dist/mcp/http-server.d.ts.map +1 -1
- package/dist/mcp/http-server.js +6 -0
- package/dist/mcp/http-server.js.map +1 -1
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +7 -0
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/analytics.d.ts.map +1 -1
- package/dist/mcp/tools/analytics.js +5 -4
- package/dist/mcp/tools/analytics.js.map +1 -1
- package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -1
- package/dist/mcp/tools/fetch-search-pages.js +2 -1
- package/dist/mcp/tools/fetch-search-pages.js.map +1 -1
- package/dist/mcp/tools/functions.d.ts.map +1 -1
- package/dist/mcp/tools/functions.js +3 -2
- package/dist/mcp/tools/functions.js.map +1 -1
- package/dist/mcp/tools/lookup.d.ts.map +1 -1
- package/dist/mcp/tools/lookup.js +4 -3
- package/dist/mcp/tools/lookup.js.map +1 -1
- package/dist/mcp/tools/query.d.ts.map +1 -1
- package/dist/mcp/tools/query.js +2 -1
- package/dist/mcp/tools/query.js.map +1 -1
- package/dist/mcp/tools/schema.d.ts.map +1 -1
- package/dist/mcp/tools/schema.js +3 -2
- package/dist/mcp/tools/schema.js.map +1 -1
- package/dist/mcp/tools/search.d.ts.map +1 -1
- package/dist/mcp/tools/search.js +2 -1
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/usage-tracking.d.ts +28 -0
- package/dist/mcp/usage-tracking.d.ts.map +1 -0
- package/dist/mcp/usage-tracking.js +52 -0
- package/dist/mcp/usage-tracking.js.map +1 -0
- package/package.json +1 -1
- package/src/client/deployment-config.ts +3 -36
- package/src/client/http-client.ts +27 -93
- package/src/client/internal-dsl-client.ts +48 -4
- package/src/client/request-retry.ts +115 -0
- package/src/client/usage-context.ts +53 -0
- package/src/client/usage-headers.ts +45 -0
- package/src/dsl/client.ts +7 -4
- package/src/mcp/http-server.ts +9 -0
- package/src/mcp/server.ts +12 -0
- package/src/mcp/tools/analytics.ts +9 -4
- package/src/mcp/tools/fetch-search-pages.ts +3 -1
- package/src/mcp/tools/functions.ts +5 -2
- package/src/mcp/tools/lookup.ts +7 -3
- package/src/mcp/tools/query.ts +3 -1
- package/src/mcp/tools/schema.ts +5 -2
- package/src/mcp/tools/search.ts +3 -1
- package/src/mcp/usage-tracking.ts +72 -0
- package/test/client/deployment-config.test.ts +1 -25
- package/test/client/http-client.test.ts +17 -17
- package/test/client/internal-dsl-client.test.ts +73 -10
- package/test/client/request-retry.test.ts +55 -0
- package/test/client/usage-headers.test.ts +45 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../src/mcp/tools/lookup.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAyB,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAC1F,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,MAAwB;IAC7E,yBAAyB;IACzB,
|
|
1
|
+
{"version":3,"file":"lookup.js","sourceRoot":"","sources":["../../../src/mcp/tools/lookup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EAEL,KAAK,gBAAgB,EAEtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAItD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,GACvB,IAAI,CAiEN"}
|
package/dist/mcp/tools/query.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { buildExecuteDslPolicyHints, validateExecuteDslPolicy, } from "../../dsl/index.js";
|
|
8
|
+
import { registerTrackedTool } from "../usage-tracking.js";
|
|
8
9
|
import { formatErrorResult, formatToolResult } from "../utils.js";
|
|
9
10
|
/**
|
|
10
11
|
* Registers the raw DSL query tool with the MCP server.
|
|
@@ -14,7 +15,7 @@ import { formatErrorResult, formatToolResult } from "../utils.js";
|
|
|
14
15
|
*/
|
|
15
16
|
export function registerQueryTools(server, client, schemaStore) {
|
|
16
17
|
const sources = schemaStore.structuredEntityTypes().join(", ");
|
|
17
|
-
server
|
|
18
|
+
registerTrackedTool(server, "execute_dsl", {
|
|
18
19
|
description: `Execute a raw Dimensions DSL query. Read dimensions://schema/policy and dimensions://examples first. Official docs: https://docs.dimensions.ai/dsl/
|
|
19
20
|
|
|
20
21
|
Prefer search_* tools for keyword search with yearFrom/yearTo and sortBy — they build valid DSL automatically.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/mcp/tools/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,0BAA0B,EAE1B,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAwB,EACxB,WAAwB;IAExB,MAAM,OAAO,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/mcp/tools/query.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,0BAA0B,EAE1B,wBAAwB,GACzB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAElE;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAAiB,EACjB,MAAwB,EACxB,WAAwB;IAExB,MAAM,OAAO,GAAG,WAAW,CAAC,qBAAqB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,mBAAmB,CACjB,MAAM,EACN,aAAa,EACb;QACE,WAAW,EAAE;;;;;;;;;;;;;;;2BAeQ,OAAO,EAAE;QAC9B,WAAW,EAAE;YACX,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;YAChE,iBAAiB,EAAE,CAAC;iBACjB,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,kFAAkF,CACnF;SACJ;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YAC5E,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;YACvE,kBAAkB,EAAE,CAAC;iBAClB,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yCAAyC,CAAC;YACtD,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;SAC9D;QACD,WAAW,EAAE;YACX,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,KAAK;YACtB,cAAc,EAAE,KAAK;YACrB,aAAa,EAAE,IAAI;SACpB;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,wBAAwB,CAAC;gBACvB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;aAC1C,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAA4B,CAAC;YAC9E,MAAM,KAAK,GAAG,0BAA0B,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YAC7D,OAAO,gBAAgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;QAC1D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIlE;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,aAAa,GACrB,IAAI,CAwGN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAYnE"}
|
package/dist/mcp/tools/schema.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
import { buildReverseAliasMap } from "../middleware/field-aliases.js";
|
|
7
7
|
import { loadSchema } from "../schema/index.js";
|
|
8
|
+
import { registerTrackedTool } from "../usage-tracking.js";
|
|
8
9
|
import { formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS } from "../utils.js";
|
|
9
10
|
/**
|
|
10
11
|
* Registers schema introspection and validation tools.
|
|
@@ -13,7 +14,7 @@ import { formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS } from "
|
|
|
13
14
|
* @param context - Mutable schema context shared with refresh
|
|
14
15
|
*/
|
|
15
16
|
export function registerSchemaTools(server, client, context) {
|
|
16
|
-
server
|
|
17
|
+
registerTrackedTool(server, "describe_schema", {
|
|
17
18
|
description: "Return Dimensions DSL schema metadata loaded at server startup. " +
|
|
18
19
|
"Default: compact summary with source/entity counts and resource URIs. " +
|
|
19
20
|
"Use full=true or dimensions://schema for the complete describe payload. " +
|
|
@@ -84,7 +85,7 @@ export function registerSchemaTools(server, client, context) {
|
|
|
84
85
|
return formatErrorResult(error);
|
|
85
86
|
}
|
|
86
87
|
});
|
|
87
|
-
server
|
|
88
|
+
registerTrackedTool(server, "refresh_schema", {
|
|
88
89
|
description: "Re-fetch describe schema from the Dimensions API, rebuild in-memory schema, and re-register MCP resources.",
|
|
89
90
|
inputSchema: {},
|
|
90
91
|
outputSchema: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/mcp/tools/schema.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAEtE,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7F;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,MAAwB,EACxB,OAAsB;IAEtB,
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/mcp/tools/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAI1B,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EAI1B,MAAM,oBAAoB,CAAC;AAgB5B;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,oBAAoB,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,MAAM,CAoCR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,MAAM,EAAE,gBAAgB,EACxB,WAAW,EAAE,WAAW,GACvB,IAAI,CA2EN"}
|
package/dist/mcp/tools/search.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
import { applyFilters, parseEntityResponse, resolveSkipAndLimit, searchResultKey, searchToolName, validateSearchPaginationPolicy, } from "../../dsl/index.js";
|
|
8
8
|
import { withFieldAliases } from "../middleware/field-aliases.js";
|
|
9
|
+
import { registerTrackedTool } from "../usage-tracking.js";
|
|
9
10
|
import { formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, withSearchPagination, } from "../utils.js";
|
|
10
11
|
import { SEARCH_ENTITY_METADATA } from "./search-entity-metadata.js";
|
|
11
12
|
import { PAGINATION_OUTPUT_SCHEMA, SHARED_SEARCH_INPUT } from "./search-input.js";
|
|
@@ -60,7 +61,7 @@ export function registerSearchTools(server, client, schemaStore) {
|
|
|
60
61
|
continue;
|
|
61
62
|
const resultKey = searchResultKey(source);
|
|
62
63
|
const toolName = searchToolName(source);
|
|
63
|
-
server
|
|
64
|
+
registerTrackedTool(server, toolName, {
|
|
64
65
|
description: meta.description,
|
|
65
66
|
inputSchema: {
|
|
66
67
|
...SHARED_SEARCH_INPUT,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,YAAY,EAEZ,mBAAmB,EACnB,mBAAmB,EAGnB,eAAe,EACf,cAAc,EACd,8BAA8B,GAC/B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAElF,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,sBAAsB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAU,CAAC,CACnE,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAwB,EACxB,MAA4B,EAC5B,IAA6B;IAE7B,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAE3D,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAE7C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAiD,CAAC;IACvE,IAAI,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAA8B,CAAC;IACnD,IAAI,MAAM,EAAE,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC;QAC1C,IAAI,EAAE,IAAI,CAAC,IAA0B;QACrC,IAAI,EAAE,IAAI,CAAC,IAA0B;QACrC,KAAK,EAAE,IAAI,CAAC,KAA2B;QACvC,QAAQ,EAAE,IAAI,CAAC,QAA8B;KAC9C,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,MAAwB,EACxB,WAAwB;IAExB,KAAK,MAAM,MAAM,IAAI,WAAW,CAAC,qBAAqB,EAAE,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,IAAI;YAAE,SAAS;QAEpB,MAAM,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAExC,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../src/mcp/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool usage tracking helpers.
|
|
3
|
+
* @module mcp/usage-tracking
|
|
4
|
+
*/
|
|
5
|
+
import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
6
|
+
import { type McpDeploymentMode } from "../client/usage-context.js";
|
|
7
|
+
export interface McpUsageTrackingOptions {
|
|
8
|
+
readonly deployment: McpDeploymentMode;
|
|
9
|
+
readonly client?: string;
|
|
10
|
+
readonly sessionId?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Initializes session-level MCP usage metadata for a server instance.
|
|
14
|
+
*/
|
|
15
|
+
export declare function initMcpUsageTracking(options: McpUsageTrackingOptions): void;
|
|
16
|
+
/**
|
|
17
|
+
* Wraps a tool handler so the active tool name is available for usage headers.
|
|
18
|
+
*/
|
|
19
|
+
export declare function withMcpUsageTracking<TArgs, TResult>(toolName: string, handler: (args: TArgs) => TResult | Promise<TResult>): (args: TArgs) => Promise<TResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Registers an MCP tool with usage tracking for dsl-service headers.
|
|
22
|
+
*/
|
|
23
|
+
export declare function registerTrackedTool(server: McpServer, toolName: string, config: Record<string, unknown>, handler: (args: any) => any): void;
|
|
24
|
+
/**
|
|
25
|
+
* Derives a coarse MCP client label from an HTTP User-Agent header.
|
|
26
|
+
*/
|
|
27
|
+
export declare function mcpClientFromUserAgent(userAgent: string | undefined): string;
|
|
28
|
+
//# sourceMappingURL=usage-tracking.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-tracking.d.ts","sourceRoot":"","sources":["../../src/mcp/usage-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI,CAO3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,EACjD,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GACnD,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAEnC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE/B,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,GAC1B,IAAI,CAMN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAS5E"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP tool usage tracking helpers.
|
|
3
|
+
* @module mcp/usage-tracking
|
|
4
|
+
*/
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import pkg from "../../package.json" with { type: "json" };
|
|
7
|
+
import { runWithMcpTool, setMcpUsageSession, } from "../client/usage-context.js";
|
|
8
|
+
/**
|
|
9
|
+
* Initializes session-level MCP usage metadata for a server instance.
|
|
10
|
+
*/
|
|
11
|
+
export function initMcpUsageTracking(options) {
|
|
12
|
+
setMcpUsageSession({
|
|
13
|
+
sessionId: options.sessionId ?? randomUUID(),
|
|
14
|
+
deployment: options.deployment,
|
|
15
|
+
client: options.client ?? "unknown",
|
|
16
|
+
version: pkg.version,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wraps a tool handler so the active tool name is available for usage headers.
|
|
21
|
+
*/
|
|
22
|
+
export function withMcpUsageTracking(toolName, handler) {
|
|
23
|
+
return async (args) => runWithMcpTool(toolName, () => handler(args));
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Registers an MCP tool with usage tracking for dsl-service headers.
|
|
27
|
+
*/
|
|
28
|
+
export function registerTrackedTool(server, toolName, config,
|
|
29
|
+
// biome-ignore lint/suspicious/noExplicitAny: preserve MCP SDK tool handler inference
|
|
30
|
+
handler) {
|
|
31
|
+
server.registerTool(toolName, config, withMcpUsageTracking(toolName, handler));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Derives a coarse MCP client label from an HTTP User-Agent header.
|
|
35
|
+
*/
|
|
36
|
+
export function mcpClientFromUserAgent(userAgent) {
|
|
37
|
+
if (!userAgent)
|
|
38
|
+
return "unknown";
|
|
39
|
+
const ua = userAgent.toLowerCase();
|
|
40
|
+
if (ua.includes("cursor"))
|
|
41
|
+
return "cursor";
|
|
42
|
+
if (ua.includes("claude"))
|
|
43
|
+
return "claude-desktop";
|
|
44
|
+
if (ua.includes("vscode") || ua.includes("visual studio code"))
|
|
45
|
+
return "vscode";
|
|
46
|
+
if (ua.includes("windsurf"))
|
|
47
|
+
return "windsurf";
|
|
48
|
+
if (ua.includes("copilot"))
|
|
49
|
+
return "copilot";
|
|
50
|
+
return "unknown";
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=usage-tracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage-tracking.js","sourceRoot":"","sources":["../../src/mcp/usage-tracking.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3D,OAAO,EAEL,cAAc,EACd,kBAAkB,GACnB,MAAM,4BAA4B,CAAC;AAQpC;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgC;IACnE,kBAAkB,CAAC;QACjB,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,UAAU,EAAE;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS;QACnC,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,QAAgB,EAChB,OAAoD;IAEpD,OAAO,KAAK,EAAE,IAAW,EAAE,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAiB,EACjB,QAAgB,EAChB,MAA+B;AAC/B,sFAAsF;AACtF,OAA2B;IAE3B,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR,MAAM,EACN,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAA6C,CACpF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,SAA6B;IAClE,IAAI,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACjC,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACnD,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChF,IAAI,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC/C,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAC7C,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Deployment mode and hosted backend configuration from environment.
|
|
3
|
+
*
|
|
4
|
+
* Hosted usage tracking: MCP sends X-Dimensions-* headers on dsl-service requests
|
|
5
|
+
* (see usage-headers.ts). dsl-service derives channel/user fields server-side.
|
|
3
6
|
* @module client/deployment-config
|
|
4
7
|
*/
|
|
5
8
|
|
|
@@ -51,42 +54,6 @@ export function hostedBootstrapUser(host: string): string {
|
|
|
51
54
|
return `mcp@${host}`;
|
|
52
55
|
}
|
|
53
56
|
|
|
54
|
-
/**
|
|
55
|
-
* MCP-prefixed user label for dsl usage logs (reversible plus-addressing).
|
|
56
|
-
*/
|
|
57
|
-
export function mcpTrackingUser(dimensionsUser: string): string {
|
|
58
|
-
const at = dimensionsUser.indexOf("@");
|
|
59
|
-
if (at <= 0) return `mcp+${dimensionsUser}`;
|
|
60
|
-
return `mcp+${dimensionsUser.slice(0, at)}${dimensionsUser.slice(at)}`;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface HostedDslLoggingInfo {
|
|
64
|
-
user: string;
|
|
65
|
-
dimensions_user: string;
|
|
66
|
-
channel: "mcp";
|
|
67
|
-
mcp_user: string;
|
|
68
|
-
product_variant: string;
|
|
69
|
-
source: "dimensions-analytics-mcp-hosted";
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* `additional_logging_info` for hosted dsl-service queries.
|
|
74
|
-
* `X-DIMENSIONS-USER` stays the canonical Dimensions user; channel fields tag MCP traffic.
|
|
75
|
-
*/
|
|
76
|
-
export function buildHostedDslLoggingInfo(
|
|
77
|
-
dimensionsUser: string,
|
|
78
|
-
variant: string,
|
|
79
|
-
): HostedDslLoggingInfo {
|
|
80
|
-
return {
|
|
81
|
-
user: dimensionsUser,
|
|
82
|
-
dimensions_user: dimensionsUser,
|
|
83
|
-
channel: "mcp",
|
|
84
|
-
mcp_user: mcpTrackingUser(dimensionsUser),
|
|
85
|
-
product_variant: variant,
|
|
86
|
-
source: "dimensions-analytics-mcp-hosted",
|
|
87
|
-
};
|
|
88
|
-
}
|
|
89
|
-
|
|
90
57
|
/**
|
|
91
58
|
* Loads deployment configuration from environment variables.
|
|
92
59
|
* @throws {Error} When hosted mode is enabled but required vars are missing
|
|
@@ -18,6 +18,9 @@ import {
|
|
|
18
18
|
UnprocessableEntityError,
|
|
19
19
|
} from "./errors.js";
|
|
20
20
|
import type { RateLimiter } from "./rate-limiter.js";
|
|
21
|
+
import { executeRequestWithRetry } from "./request-retry.js";
|
|
22
|
+
import { getMcpUsageSession } from "./usage-context.js";
|
|
23
|
+
import { buildMcpUsageHeaders, buildMcpUserAgent } from "./usage-headers.js";
|
|
21
24
|
|
|
22
25
|
/**
|
|
23
26
|
* Configuration options for the HTTP client.
|
|
@@ -145,10 +148,24 @@ export class HttpClient {
|
|
|
145
148
|
dsl: string,
|
|
146
149
|
options?: RequestOptions,
|
|
147
150
|
): Promise<DimensionsResponse> {
|
|
151
|
+
const sessionHeaders: Record<string, string> = {};
|
|
152
|
+
const usageHeaders = buildMcpUsageHeaders();
|
|
153
|
+
if (Object.keys(usageHeaders).length > 0) {
|
|
154
|
+
Object.assign(sessionHeaders, usageHeaders);
|
|
155
|
+
const session = getMcpUsageSession();
|
|
156
|
+
if (session) {
|
|
157
|
+
sessionHeaders["User-Agent"] = buildMcpUserAgent(session.version, session.client);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
148
161
|
return this.wrapFetch<DimensionsResponse>({
|
|
149
162
|
url,
|
|
150
163
|
method: "POST",
|
|
151
|
-
headers: {
|
|
164
|
+
headers: {
|
|
165
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
166
|
+
...sessionHeaders,
|
|
167
|
+
...options?.headers,
|
|
168
|
+
},
|
|
152
169
|
body: dsl,
|
|
153
170
|
timeoutMs: options?.timeout ?? this.timeout,
|
|
154
171
|
signal: options?.signal,
|
|
@@ -301,41 +318,16 @@ export class HttpClient {
|
|
|
301
318
|
}
|
|
302
319
|
|
|
303
320
|
/**
|
|
304
|
-
*
|
|
305
|
-
* @param
|
|
306
|
-
* @returns
|
|
307
|
-
*/
|
|
308
|
-
private isRetryable(error: unknown): boolean {
|
|
309
|
-
// Retry rate limit errors
|
|
310
|
-
if (error instanceof RateLimitError) {
|
|
311
|
-
return true;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
// Retry server errors (5xx)
|
|
315
|
-
if (error instanceof ServerError) {
|
|
316
|
-
return true;
|
|
317
|
-
}
|
|
318
|
-
|
|
319
|
-
// Retry network errors
|
|
320
|
-
if (error instanceof NetworkError) {
|
|
321
|
-
return true;
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
// Retry timeout errors
|
|
325
|
-
if (error instanceof TimeoutError) {
|
|
326
|
-
return true;
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// Don't retry other errors (400, 401, 403, etc.)
|
|
330
|
-
return false;
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
/**
|
|
334
|
-
* Delays execution for the specified time.
|
|
335
|
-
* @param ms - Delay in milliseconds
|
|
321
|
+
* Executes a request with retry logic.
|
|
322
|
+
* @param requestFn - Function that executes the request
|
|
323
|
+
* @returns Response from successful request
|
|
336
324
|
*/
|
|
337
|
-
private
|
|
338
|
-
return
|
|
325
|
+
private async executeWithRetry<T>(requestFn: () => Promise<T>): Promise<T> {
|
|
326
|
+
return executeRequestWithRetry(requestFn, {
|
|
327
|
+
maxRetries: this.maxRetries,
|
|
328
|
+
retryDelay: this.retryDelay,
|
|
329
|
+
rateLimiter: this.rateLimiter,
|
|
330
|
+
});
|
|
339
331
|
}
|
|
340
332
|
|
|
341
333
|
/**
|
|
@@ -394,64 +386,6 @@ export class HttpClient {
|
|
|
394
386
|
});
|
|
395
387
|
}
|
|
396
388
|
|
|
397
|
-
/**
|
|
398
|
-
* Calculates the delay before the next retry attempt.
|
|
399
|
-
* For rate-limit errors, uses the client rate limiter's slot timing.
|
|
400
|
-
* For other transient errors, uses exponential backoff with jitter.
|
|
401
|
-
* The result is capped at 60 seconds.
|
|
402
|
-
* @param error - The error that triggered the retry
|
|
403
|
-
* @param attempt - The current attempt number (0-based)
|
|
404
|
-
* @returns Delay in milliseconds
|
|
405
|
-
*/
|
|
406
|
-
private calculateRetryDelay(error: unknown, attempt: number): number {
|
|
407
|
-
const MAX_DELAY = 60_000;
|
|
408
|
-
|
|
409
|
-
if (error instanceof RateLimitError) {
|
|
410
|
-
const delay =
|
|
411
|
-
error.clientRateLimit?.retryAfterMs ??
|
|
412
|
-
this.rateLimiter?.getRetryDelayMs() ??
|
|
413
|
-
2000 * 2 ** attempt;
|
|
414
|
-
return Math.min(delay, MAX_DELAY);
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
const backoff = this.retryDelay * 2 ** attempt * (0.5 + Math.random() * 0.5);
|
|
418
|
-
return Math.min(backoff, MAX_DELAY);
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
/**
|
|
422
|
-
* Executes a request with retry logic.
|
|
423
|
-
* Uses client-side throttling before each attempt and exponential backoff for transient errors.
|
|
424
|
-
* @param requestFn - Function that executes the request
|
|
425
|
-
* @returns Response from successful request
|
|
426
|
-
*/
|
|
427
|
-
private async executeWithRetry<T>(requestFn: () => Promise<T>): Promise<T> {
|
|
428
|
-
let lastError: Error | null = null;
|
|
429
|
-
|
|
430
|
-
for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
|
|
431
|
-
await this.rateLimiter?.waitIfNeeded();
|
|
432
|
-
try {
|
|
433
|
-
const result = await requestFn();
|
|
434
|
-
this.rateLimiter?.recordRequest();
|
|
435
|
-
return result;
|
|
436
|
-
} catch (error) {
|
|
437
|
-
lastError = error as Error;
|
|
438
|
-
|
|
439
|
-
if (!this.isRetryable(error)) {
|
|
440
|
-
throw error;
|
|
441
|
-
}
|
|
442
|
-
|
|
443
|
-
if (attempt >= this.maxRetries) {
|
|
444
|
-
throw error;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
const retryDelay = this.calculateRetryDelay(error, attempt);
|
|
448
|
-
await this.delay(retryDelay);
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
throw lastError ?? new NetworkError("Unknown error occurred");
|
|
453
|
-
}
|
|
454
|
-
|
|
455
389
|
/**
|
|
456
390
|
* Sends a POST request with JSON body.
|
|
457
391
|
* @param path - URL path (appended to baseUrl)
|
|
@@ -1,27 +1,39 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* dsl-service adapter for hosted deployment (POST /query
|
|
2
|
+
* dsl-service adapter for hosted deployment (POST /query).
|
|
3
|
+
* Usage metadata is sent via X-Dimensions-* headers (see usage-headers.ts), not JSON body.
|
|
3
4
|
* @module client/internal-dsl-client
|
|
4
5
|
*/
|
|
5
6
|
|
|
6
|
-
import {
|
|
7
|
+
import type { InternalDslEnvConfig } from "./deployment-config.js";
|
|
7
8
|
import {
|
|
8
9
|
AuthenticationError,
|
|
9
10
|
DimensionsError,
|
|
10
11
|
NetworkError,
|
|
11
12
|
QuerySyntaxError,
|
|
13
|
+
RateLimitError,
|
|
12
14
|
ServerError,
|
|
13
15
|
sanitizeErrorMessage,
|
|
14
16
|
TimeoutError,
|
|
15
17
|
} from "./errors.js";
|
|
18
|
+
import type { RateLimiter } from "./rate-limiter.js";
|
|
19
|
+
import { executeRequestWithRetry } from "./request-retry.js";
|
|
16
20
|
import type { DslResponse, QueryExecutorOptions } from "./types.js";
|
|
21
|
+
import { getMcpUsageSession } from "./usage-context.js";
|
|
22
|
+
import { buildMcpUsageHeaders, buildMcpUserAgent } from "./usage-headers.js";
|
|
17
23
|
|
|
18
24
|
export interface InternalDslClientOptions {
|
|
19
25
|
readonly config: InternalDslEnvConfig;
|
|
20
26
|
/** User email for X-DIMENSIONS-USER (required by dsl-service) */
|
|
21
27
|
readonly userEmail: string;
|
|
22
|
-
/**
|
|
28
|
+
/**
|
|
29
|
+
* End-user IP forwarded as X-Forwarded-For for dsl-service per-IP throttling.
|
|
30
|
+
* Set from the inbound MCP HTTP request (see mcp/http-server.ts).
|
|
31
|
+
*/
|
|
23
32
|
readonly clientIp?: string;
|
|
24
33
|
readonly timeout?: number;
|
|
34
|
+
readonly maxRetries?: number;
|
|
35
|
+
readonly retryDelay?: number;
|
|
36
|
+
readonly rateLimiter?: RateLimiter;
|
|
25
37
|
}
|
|
26
38
|
|
|
27
39
|
/**
|
|
@@ -32,29 +44,51 @@ export class InternalDslClient {
|
|
|
32
44
|
private readonly userEmail: string;
|
|
33
45
|
private readonly clientIp?: string;
|
|
34
46
|
private readonly timeout: number;
|
|
47
|
+
private readonly maxRetries: number;
|
|
48
|
+
private readonly retryDelay: number;
|
|
49
|
+
private readonly rateLimiter?: RateLimiter;
|
|
35
50
|
|
|
36
51
|
constructor(options: InternalDslClientOptions) {
|
|
37
52
|
this.config = options.config;
|
|
38
53
|
this.userEmail = options.userEmail;
|
|
39
54
|
this.clientIp = options.clientIp;
|
|
40
55
|
this.timeout = options.timeout ?? 30_000;
|
|
56
|
+
this.maxRetries = options.maxRetries ?? 3;
|
|
57
|
+
this.retryDelay = options.retryDelay ?? 1000;
|
|
58
|
+
this.rateLimiter = options.rateLimiter;
|
|
41
59
|
}
|
|
42
60
|
|
|
43
61
|
/**
|
|
44
62
|
* Runs a DSL query through dsl-service POST /query.
|
|
45
63
|
*/
|
|
46
64
|
async query(dsl: string, options?: QueryExecutorOptions): Promise<DslResponse> {
|
|
65
|
+
return executeRequestWithRetry(() => this.executeQuery(dsl, options), {
|
|
66
|
+
maxRetries: this.maxRetries,
|
|
67
|
+
retryDelay: this.retryDelay,
|
|
68
|
+
rateLimiter: this.rateLimiter,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private async executeQuery(dsl: string, options?: QueryExecutorOptions): Promise<DslResponse> {
|
|
47
73
|
const url = `${this.config.serviceUrl.replace(/\/$/, "")}/query`;
|
|
48
74
|
const controller = new AbortController();
|
|
49
75
|
const timeoutMs = options?.timeout ?? this.timeout;
|
|
50
76
|
const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
|
|
51
77
|
|
|
78
|
+
const session = getMcpUsageSession();
|
|
79
|
+
const usageHeaders = buildMcpUsageHeaders();
|
|
80
|
+
|
|
52
81
|
const headers: Record<string, string> = {
|
|
53
82
|
"Content-Type": "application/json",
|
|
54
83
|
"X-DIMENSIONS-USER": this.userEmail,
|
|
55
84
|
Authorization: `Basic ${Buffer.from(`${this.config.username}:${this.config.password}`).toString("base64")}`,
|
|
85
|
+
...usageHeaders,
|
|
56
86
|
};
|
|
57
87
|
|
|
88
|
+
if (session) {
|
|
89
|
+
headers["User-Agent"] = buildMcpUserAgent(session.version, session.client);
|
|
90
|
+
}
|
|
91
|
+
|
|
58
92
|
if (this.clientIp) {
|
|
59
93
|
headers["X-Forwarded-For"] = this.clientIp;
|
|
60
94
|
}
|
|
@@ -64,7 +98,6 @@ export class InternalDslClient {
|
|
|
64
98
|
dsl_schema: this.config.dslSchema,
|
|
65
99
|
host: this.config.host,
|
|
66
100
|
variant: this.config.variant,
|
|
67
|
-
additional_logging_info: buildHostedDslLoggingInfo(this.userEmail, this.config.variant),
|
|
68
101
|
};
|
|
69
102
|
|
|
70
103
|
try {
|
|
@@ -114,6 +147,17 @@ export class InternalDslClient {
|
|
|
114
147
|
return new AuthenticationError(message);
|
|
115
148
|
case 400:
|
|
116
149
|
return new QuerySyntaxError(message);
|
|
150
|
+
case 429: {
|
|
151
|
+
const retryAfterMs = this.rateLimiter?.getRetryDelayMs() ?? 2000;
|
|
152
|
+
return new RateLimitError(
|
|
153
|
+
"Rate limit exceeded — wait before retrying",
|
|
154
|
+
Math.ceil(retryAfterMs / 1000),
|
|
155
|
+
{
|
|
156
|
+
remaining: this.rateLimiter?.getRemainingRequests() ?? 0,
|
|
157
|
+
retryAfterMs,
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
}
|
|
117
161
|
default:
|
|
118
162
|
if (response.status >= 500) {
|
|
119
163
|
return new ServerError(message, response.status);
|