@digital-science-dsl/dimensions-analytics-mcp 1.1.0 → 1.3.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 (104) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/http-main.js +2 -0
  3. package/dist/http-main.js.map +1 -1
  4. package/dist/main.d.ts +0 -5
  5. package/dist/main.d.ts.map +1 -1
  6. package/dist/main.js +3 -1
  7. package/dist/main.js.map +1 -1
  8. package/dist/mcp/auto-update.d.ts +63 -0
  9. package/dist/mcp/auto-update.d.ts.map +1 -0
  10. package/dist/mcp/auto-update.js +295 -0
  11. package/dist/mcp/auto-update.js.map +1 -0
  12. package/dist/mcp/examples/dsl-examples.d.ts +2 -2
  13. package/dist/mcp/examples/dsl-examples.d.ts.map +1 -1
  14. package/dist/mcp/examples/dsl-examples.js +5 -1
  15. package/dist/mcp/examples/dsl-examples.js.map +1 -1
  16. package/dist/mcp/examples/usage-scenarios.d.ts.map +1 -1
  17. package/dist/mcp/examples/usage-scenarios.js +38 -0
  18. package/dist/mcp/examples/usage-scenarios.js.map +1 -1
  19. package/dist/mcp/http-server.js +3 -3
  20. package/dist/mcp/http-server.js.map +1 -1
  21. package/dist/mcp/middleware/field-aliases.d.ts +1 -1
  22. package/dist/mcp/middleware/field-aliases.d.ts.map +1 -1
  23. package/dist/mcp/middleware/field-aliases.js +0 -6
  24. package/dist/mcp/middleware/field-aliases.js.map +1 -1
  25. package/dist/mcp/resources/schema.d.ts +1 -1
  26. package/dist/mcp/resources/schema.d.ts.map +1 -1
  27. package/dist/mcp/resources/schema.js +11 -11
  28. package/dist/mcp/resources/schema.js.map +1 -1
  29. package/dist/mcp/server.d.ts +2 -2
  30. package/dist/mcp/server.d.ts.map +1 -1
  31. package/dist/mcp/server.js +8 -4
  32. package/dist/mcp/server.js.map +1 -1
  33. package/dist/mcp/tools/analytics.d.ts +1 -1
  34. package/dist/mcp/tools/analytics.d.ts.map +1 -1
  35. package/dist/mcp/tools/analytics.js +21 -21
  36. package/dist/mcp/tools/analytics.js.map +1 -1
  37. package/dist/mcp/tools/fetch-search-pages.d.ts +1 -1
  38. package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -1
  39. package/dist/mcp/tools/fetch-search-pages.js +4 -9
  40. package/dist/mcp/tools/fetch-search-pages.js.map +1 -1
  41. package/dist/mcp/tools/functions.d.ts +1 -1
  42. package/dist/mcp/tools/functions.d.ts.map +1 -1
  43. package/dist/mcp/tools/functions.js +8 -13
  44. package/dist/mcp/tools/functions.js.map +1 -1
  45. package/dist/mcp/tools/lookup.d.ts +1 -1
  46. package/dist/mcp/tools/lookup.d.ts.map +1 -1
  47. package/dist/mcp/tools/lookup.js +12 -17
  48. package/dist/mcp/tools/lookup.js.map +1 -1
  49. package/dist/mcp/tools/query.d.ts +1 -1
  50. package/dist/mcp/tools/query.d.ts.map +1 -1
  51. package/dist/mcp/tools/query.js +4 -9
  52. package/dist/mcp/tools/query.js.map +1 -1
  53. package/dist/mcp/tools/schema.d.ts +1 -1
  54. package/dist/mcp/tools/schema.d.ts.map +1 -1
  55. package/dist/mcp/tools/schema.js +7 -11
  56. package/dist/mcp/tools/schema.js.map +1 -1
  57. package/dist/mcp/tools/search.d.ts +1 -1
  58. package/dist/mcp/tools/search.d.ts.map +1 -1
  59. package/dist/mcp/tools/search.js +4 -9
  60. package/dist/mcp/tools/search.js.map +1 -1
  61. package/dist/mcp/tools/similar-documents.d.ts +26 -0
  62. package/dist/mcp/tools/similar-documents.d.ts.map +1 -0
  63. package/dist/mcp/tools/similar-documents.js +166 -0
  64. package/dist/mcp/tools/similar-documents.js.map +1 -0
  65. package/dist/mcp/usage-tracking.d.ts +1 -1
  66. package/dist/mcp/usage-tracking.d.ts.map +1 -1
  67. package/dist/mcp/utils.d.ts +1 -2
  68. package/dist/mcp/utils.d.ts.map +1 -1
  69. package/dist/mcp/utils.js +0 -4
  70. package/dist/mcp/utils.js.map +1 -1
  71. package/package.json +6 -2
  72. package/src/http-main.ts +3 -0
  73. package/src/main.ts +4 -2
  74. package/src/mcp/auto-update.ts +379 -0
  75. package/src/mcp/examples/dsl-examples.ts +5 -1
  76. package/src/mcp/examples/usage-scenarios.ts +38 -0
  77. package/src/mcp/http-server.ts +3 -3
  78. package/src/mcp/middleware/field-aliases.ts +1 -2
  79. package/src/mcp/resources/schema.ts +12 -12
  80. package/src/mcp/server.ts +9 -5
  81. package/src/mcp/tools/analytics.ts +26 -26
  82. package/src/mcp/tools/fetch-search-pages.ts +5 -6
  83. package/src/mcp/tools/functions.ts +9 -10
  84. package/src/mcp/tools/lookup.ts +13 -14
  85. package/src/mcp/tools/query.ts +5 -6
  86. package/src/mcp/tools/schema.ts +8 -9
  87. package/src/mcp/tools/search.ts +5 -6
  88. package/src/mcp/tools/similar-documents.ts +231 -0
  89. package/src/mcp/usage-tracking.ts +1 -1
  90. package/src/mcp/utils.ts +1 -3
  91. package/test/examples/dsl-examples.test.ts +8 -0
  92. package/test/examples/usage-scenarios.test.ts +5 -3
  93. package/test/integration/harness.ts +1 -3
  94. package/test/integration/hosted-client.ts +1 -3
  95. package/test/integration/hosted.e2e.test.ts +1 -1
  96. package/test/integration/suites/index.ts +2 -0
  97. package/test/integration/suites/similar-documents.integration.ts +51 -0
  98. package/test/integration/verify-usage-scenarios.ts +1 -3
  99. package/test/mcp/auto-update.test.ts +347 -0
  100. package/test/middleware/field-aliases.test.ts +1 -1
  101. package/test/resources/schema.test.ts +5 -1
  102. package/test/server.test.ts +17 -3
  103. package/test/tools/similar-documents.test.ts +173 -0
  104. package/tsconfig.tsbuildinfo +1 -1
@@ -0,0 +1,166 @@
1
+ import { z } from "zod";
2
+ import { applyFilters, ExtendedWhereFilterSchema, parseEntityResponse, resolveSkipAndLimit, SCHEMA_LIMITS, searchResultKey, validateSearchPaginationPolicy, } from "../../dsl/index.js";
3
+ import { withFieldAliases } from "../middleware/field-aliases.js";
4
+ import { registerTrackedTool } from "../usage-tracking.js";
5
+ import { formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, withSearchPagination, } from "../utils.js";
6
+ import { PAGINATION_INPUT_SCHEMA, PAGINATION_OUTPUT_SCHEMA } from "./search-input.js";
7
+ /** Entity types that support the DSL similar_documents() search function. */
8
+ export const SIMILAR_DOCUMENTS_ENTITY_TYPES = ["publications", "grants"];
9
+ /** Year filter field per entity (publications use year; grants use start_year). */
10
+ const YEAR_FIELD = {
11
+ publications: "year",
12
+ grants: "start_year",
13
+ };
14
+ /**
15
+ * Builds DSL for a similar_documents search from tool arguments.
16
+ * @param client - Dimensions client
17
+ * @param entityType - publications or grants
18
+ * @param args - Tool arguments (after field-alias resolution)
19
+ * @returns DSL query string
20
+ */
21
+ export function buildSimilarDocumentsDsl(client, entityType, args) {
22
+ const text = String(args.text ?? "");
23
+ const builder = client.createQueryBuilder().search(entityType).forSimilar(text);
24
+ const yearField = YEAR_FIELD[entityType];
25
+ if (typeof args.yearFrom === "number") {
26
+ builder.where(yearField, ">=", args.yearFrom);
27
+ }
28
+ if (typeof args.yearTo === "number") {
29
+ builder.where(yearField, "<=", args.yearTo);
30
+ }
31
+ const filters = args.filters;
32
+ if (filters?.length) {
33
+ applyFilters(builder, filters);
34
+ }
35
+ const fields = args.fields;
36
+ if (fields?.length) {
37
+ builder.fields(fields);
38
+ }
39
+ const sortBy = typeof args.sortBy === "string" ? args.sortBy : "score";
40
+ builder.sort(sortBy, "desc");
41
+ // Default to 20 for similarity (top-N relevance), not the search_* default of 100.
42
+ const { skip, limit } = resolveSkipAndLimit({
43
+ skip: args.skip,
44
+ page: args.page,
45
+ limit: args.limit ?? 20,
46
+ pageSize: args.pageSize,
47
+ });
48
+ builder.limit(limit);
49
+ if (skip > 0) {
50
+ builder.skip(skip);
51
+ }
52
+ return builder.build();
53
+ }
54
+ /**
55
+ * Registers the similar_documents tool with the MCP server.
56
+ * @param server - MCP server instance
57
+ * @param client - Dimensions client instance
58
+ */
59
+ export function registerSimilarDocumentsTool(server, client) {
60
+ registerTrackedTool(server, "similar_documents", {
61
+ description: "Find publications or grants with similar research topics based on abstract/description text. " +
62
+ "Uses Dimensions concept extraction and weighted concepts search (not vector embeddings). " +
63
+ "Prefer this over execute_dsl for similarity. For a known record: get_by_id / get_by_doi first, " +
64
+ "then pass its abstract/description as text. Supported entityType: publications, grants only.",
65
+ inputSchema: z.object({
66
+ entityType: z
67
+ .enum(SIMILAR_DOCUMENTS_ENTITY_TYPES)
68
+ .describe("Entity type to search (publications or grants)"),
69
+ text: z
70
+ .string()
71
+ .min(1)
72
+ .describe("Abstract, description, or other prose to find similar documents for. " +
73
+ "Longer topical text works better than short keywords."),
74
+ limit: z
75
+ .number()
76
+ .int()
77
+ .min(1)
78
+ .max(SCHEMA_LIMITS.maxLimit)
79
+ .default(20)
80
+ .describe(`Maximum results to return (max ${SCHEMA_LIMITS.maxLimit}, default 20)`),
81
+ ...PAGINATION_INPUT_SCHEMA,
82
+ fields: z
83
+ .array(z.string())
84
+ .optional()
85
+ .describe("Fields to return. Accepts aliases or DSL names. Use dimensions://fields/{entity} for the full list."),
86
+ filters: z
87
+ .array(ExtendedWhereFilterSchema)
88
+ .optional()
89
+ .describe("Additional where-clause filters"),
90
+ yearFrom: z
91
+ .number()
92
+ .int()
93
+ .optional()
94
+ .describe("Filter from this year inclusive (publications: year; grants: start_year)"),
95
+ yearTo: z
96
+ .number()
97
+ .int()
98
+ .optional()
99
+ .describe("Filter up to this year inclusive (publications: year; grants: start_year)"),
100
+ sortBy: z
101
+ .string()
102
+ .optional()
103
+ .describe("Sort field (default: score for relevance). Examples: score, times_cited, year, start_year."),
104
+ confirmLargeFetch: z
105
+ .boolean()
106
+ .optional()
107
+ .default(false)
108
+ .describe("Required when skip≥5000, page≥5, or limit=1000 with skip>0. See dimensions://schema/policy."),
109
+ }),
110
+ outputSchema: z.object({
111
+ entityType: z.enum(SIMILAR_DOCUMENTS_ENTITY_TYPES).describe("Entity type searched"),
112
+ totalCount: z.number().describe("Total matching records"),
113
+ returnedCount: z.number().describe("Records returned in this response"),
114
+ truncated: z.boolean().optional().describe("True when more results exist beyond this page"),
115
+ truncationWarning: z.string().optional().describe("Warning message when truncated"),
116
+ ...PAGINATION_OUTPUT_SCHEMA,
117
+ publications: z
118
+ .array(z.record(z.string(), z.unknown()))
119
+ .optional()
120
+ .describe("Matching publications (when entityType is publications)"),
121
+ grants: z
122
+ .array(z.record(z.string(), z.unknown()))
123
+ .optional()
124
+ .describe("Matching grants (when entityType is grants)"),
125
+ }),
126
+ annotations: READ_ONLY_API_ANNOTATIONS,
127
+ }, withFieldAliases({
128
+ entitySource: { kind: "dynamic", argName: "entityType" },
129
+ fieldArrayArgs: ["fields"],
130
+ fieldStringArgs: ["sortBy"],
131
+ filterArrayArgs: ["filters"],
132
+ }, async (args) => {
133
+ try {
134
+ const entityType = args.entityType;
135
+ const record = args;
136
+ const { skip, limit } = resolveSkipAndLimit({
137
+ skip: record.skip,
138
+ page: record.page,
139
+ limit: record.limit ?? 20,
140
+ });
141
+ validateSearchPaginationPolicy({
142
+ skip,
143
+ limit,
144
+ confirmLargeFetch: record.confirmLargeFetch,
145
+ });
146
+ const dsl = buildSimilarDocumentsDsl(client, entityType, {
147
+ ...record,
148
+ limit,
149
+ });
150
+ const response = (await client.rawQuery(dsl));
151
+ const parsed = parseEntityResponse(response, entityType);
152
+ const rows = parsed.data;
153
+ const resultKey = searchResultKey(entityType);
154
+ return formatToolResult(withSearchPagination({
155
+ entityType,
156
+ totalCount: parsed.totalCount,
157
+ returnedCount: rows.length,
158
+ [resultKey]: rows,
159
+ }, parsed.totalCount, rows.length, skip, limit));
160
+ }
161
+ catch (error) {
162
+ return formatErrorResult(error);
163
+ }
164
+ }));
165
+ }
166
+ //# sourceMappingURL=similar-documents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"similar-documents.js","sourceRoot":"","sources":["../../../src/mcp/tools/similar-documents.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * MCP tool usage tracking helpers.
3
3
  * @module mcp/usage-tracking
4
4
  */
5
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ import type { McpServer } from "@modelcontextprotocol/server";
6
6
  import { type McpDeploymentMode } from "../client/usage-context.js";
7
7
  export interface McpUsageTrackingOptions {
8
8
  readonly deployment: McpDeploymentMode;
@@ -1 +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"}
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,8BAA8B,CAAC;AAE9D,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"}
@@ -2,8 +2,7 @@
2
2
  * Utility functions for MCP tools.
3
3
  * @module mcp/utils
4
4
  */
5
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
6
- import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
5
+ import type { McpServer, ToolAnnotations } from "@modelcontextprotocol/server";
7
6
  import { type PaginationMetadata } from "../dsl/index.js";
8
7
  /** Annotations for read-only tools that call external APIs. */
9
8
  export declare const READ_ONLY_API_ANNOTATIONS: ToolAnnotations;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/mcp/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,iBAAiB,CAAC;AAEzB,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,eAK9B,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAEtE;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAU1D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc1E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAU5D;AAED,uDAAuD;AACvD,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,CAAC,GAAG,sBAAsB,CA2B5B;AAED,sEAAsE;AACtE,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,GACP,WAAW,CAAC;AAEhB;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAMN"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/mcp/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/E,OAAO,EAIL,KAAK,kBAAkB,EAExB,MAAM,iBAAiB,CAAC;AAEzB,+DAA+D;AAC/D,eAAO,MAAM,yBAAyB,EAAE,eAK9B,CAAC;AAEX;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAEtE;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IACvB,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAU1D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAc1E;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAU5D;AAED,uDAAuD;AACvD,MAAM,MAAM,sBAAsB,GAAG;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACpE,IAAI,EAAE,CAAC,EACP,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,MAAM,EACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,CAAC,GAAG,sBAAsB,CA2B5B;AAED,sEAAsE;AACtE,MAAM,MAAM,WAAW,GACnB,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,UAAU,GACV,OAAO,GACP,WAAW,CAAC;AAEhB;;;;;;GAMG;AACH,wBAAgB,MAAM,CACpB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,EAClB,IAAI,EAAE,OAAO,EACb,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAMN"}
package/dist/mcp/utils.js CHANGED
@@ -1,7 +1,3 @@
1
- /**
2
- * Utility functions for MCP tools.
3
- * @module mcp/utils
4
- */
5
1
  import { buildPaginationMetadata, DimensionsError, largeResultWarning, POLICY_NOTICE, } from "../dsl/index.js";
6
2
  /** Annotations for read-only tools that call external APIs. */
7
3
  export const READ_ONLY_API_ANNOTATIONS = {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/mcp/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/mcp/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@digital-science-dsl/dimensions-analytics-mcp",
3
- "version": "1.1.0",
3
+ "version": "1.3.0",
4
4
  "description": "Dimensions Analytics MCP server for Dimensions DSL querying",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -16,10 +16,14 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
- "@modelcontextprotocol/sdk": "^1.27.0",
19
+ "@modelcontextprotocol/express": "^2.0.0",
20
+ "@modelcontextprotocol/node": "^2.0.0",
21
+ "@modelcontextprotocol/server": "^2.0.0",
22
+ "express": "^5.0.0",
20
23
  "zod": "4.3.6"
21
24
  },
22
25
  "devDependencies": {
26
+ "@modelcontextprotocol/client": "^2.0.0",
23
27
  "@types/express": "^5.0.0",
24
28
  "fast-check": "^4.6.0",
25
29
  "typescript": "^5.9.3"
package/src/http-main.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import { loadDeploymentConfig } from "./client/deployment-config.js";
8
+ import { maybeWarnStaleHostedVersion } from "./mcp/auto-update.js";
8
9
  import { startHostedHttpServer } from "./mcp/http-server.js";
9
10
 
10
11
  const deployment = loadDeploymentConfig();
@@ -13,6 +14,8 @@ if (deployment.deploymentMode !== "hosted") {
13
14
  process.exit(1);
14
15
  }
15
16
 
17
+ maybeWarnStaleHostedVersion();
18
+
16
19
  const { close, ready } = startHostedHttpServer({
17
20
  hosted: deployment,
18
21
  port: deployment.httpPort,
package/src/main.ts CHANGED
@@ -4,10 +4,12 @@
4
4
  * Starts the Dimensions Analytics MCP server with stdio transport.
5
5
  * @module main
6
6
  */
7
-
8
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
+ import { StdioServerTransport } from "@modelcontextprotocol/server/stdio";
8
+ import { maybeAutoUpdateAndReexec } from "./mcp/auto-update.js";
9
9
  import { createMcpServerAsync } from "./mcp/server.js";
10
10
 
11
+ maybeAutoUpdateAndReexec();
12
+
11
13
  let close: () => Promise<void>;
12
14
 
13
15
  try {
@@ -0,0 +1,379 @@
1
+ /**
2
+ * Best-effort version check and prefix-only auto-update for stdio installs.
3
+ * @module mcp/auto-update
4
+ */
5
+
6
+ import { spawnSync } from "node:child_process";
7
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
+ import { homedir, tmpdir } from "node:os";
9
+ import { dirname, join } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+
12
+ export const NPM_PACKAGE = "@digital-science-dsl/dimensions-analytics-mcp";
13
+ export const UPDATING_DOCS_URL =
14
+ "https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md#updating";
15
+ export const DEFAULT_UPDATE_INTERVAL_MS = 86_400_000;
16
+ export const NPM_VIEW_TIMEOUT_MS = 3_000;
17
+ export const NPM_INSTALL_TIMEOUT_MS = 12_000;
18
+ export const PREFIX_DIR_NAME = ".dimensions-analytics-mcp";
19
+
20
+ const REGISTRY = "https://registry.npmjs.org";
21
+ const INSTALL_SH = `bash -c "$(curl -fsSL https://raw.githubusercontent.com/digital-science/dimensions-analytics-mcp/main/scripts/install.sh)"`;
22
+ const INSTALL_PS1 =
23
+ "irm https://raw.githubusercontent.com/digital-science/dimensions-analytics-mcp/main/scripts/install.ps1 | iex";
24
+
25
+ export type InstallLayout = "prefix" | "npx" | "global" | "source" | "hosted";
26
+ export type VersionRelation =
27
+ | "same"
28
+ | "older"
29
+ | "newer-same-major"
30
+ | "newer-major"
31
+ | "incomparable";
32
+ export type UpdateCheckResult = "skipped" | "current" | "warned" | "updated";
33
+
34
+ export interface UpdateStamp {
35
+ readonly checkedAt: number;
36
+ readonly from?: string;
37
+ readonly to?: string;
38
+ readonly skippedReason?: string;
39
+ }
40
+
41
+ export interface AutoUpdateIo {
42
+ readonly now: () => number;
43
+ readonly env: NodeJS.ProcessEnv;
44
+ readonly layout: InstallLayout;
45
+ readonly currentVersion: string;
46
+ readonly allowInstall: boolean;
47
+ readonly stampPath: string;
48
+ readonly readStamp: (path: string) => UpdateStamp | undefined;
49
+ readonly writeStamp: (path: string, stamp: UpdateStamp) => void;
50
+ readonly npmView: () => string | undefined;
51
+ readonly npmInstall: (version: string) => boolean;
52
+ readonly log: (message: string) => void;
53
+ readonly reexec: () => void;
54
+ }
55
+
56
+ export function envFlagOff(value: string | undefined): boolean {
57
+ if (value == null) return false;
58
+ return ["0", "false", "off", "no"].includes(value.trim().toLowerCase());
59
+ }
60
+
61
+ export function resolvePackageRoot(moduleUrl: string = import.meta.url): string {
62
+ return join(dirname(fileURLToPath(moduleUrl)), "..", "..");
63
+ }
64
+
65
+ export function readCurrentVersion(packageRoot: string): string {
66
+ const raw = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8")) as {
67
+ version?: unknown;
68
+ };
69
+ if (typeof raw.version !== "string" || raw.version.length === 0) {
70
+ throw new Error(`Missing version in ${join(packageRoot, "package.json")}`);
71
+ }
72
+ return raw.version;
73
+ }
74
+
75
+ export function normalizePath(path: string): string {
76
+ return path.replace(/\\/g, "/");
77
+ }
78
+
79
+ export function detectInstallLayout(
80
+ packageRoot: string,
81
+ homeDir: string,
82
+ ): Exclude<InstallLayout, "hosted"> {
83
+ const root = normalizePath(packageRoot);
84
+ const prefixRoot = normalizePath(
85
+ join(
86
+ homeDir,
87
+ PREFIX_DIR_NAME,
88
+ "node_modules",
89
+ "@digital-science-dsl",
90
+ "dimensions-analytics-mcp",
91
+ ),
92
+ );
93
+ if (root === prefixRoot || root.startsWith(`${prefixRoot}/`)) return "prefix";
94
+ if (root.includes("/_npx/") || root.includes("/_npx")) return "npx";
95
+ if (root.includes("/node_modules/@digital-science-dsl/dimensions-analytics-mcp")) return "global";
96
+ return "source";
97
+ }
98
+
99
+ export function parseSemver(
100
+ version: string,
101
+ ): { major: number; minor: number; patch: number } | undefined {
102
+ const match = version
103
+ .trim()
104
+ .replace(/^v/i, "")
105
+ .match(/^(\d+)\.(\d+)\.(\d+)/);
106
+ if (!match) return undefined;
107
+ return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]) };
108
+ }
109
+
110
+ export function versionRelation(current: string, latest: string): VersionRelation {
111
+ const a = parseSemver(current);
112
+ const b = parseSemver(latest);
113
+ if (!a || !b) return "incomparable";
114
+ if (a.major === b.major && a.minor === b.minor && a.patch === b.patch) return "same";
115
+ const cmp =
116
+ a.major !== b.major
117
+ ? a.major - b.major
118
+ : a.minor !== b.minor
119
+ ? a.minor - b.minor
120
+ : a.patch - b.patch;
121
+ if (cmp > 0) return "older";
122
+ if (b.major > a.major) return "newer-major";
123
+ return "newer-same-major";
124
+ }
125
+
126
+ export function upgradeGuidance(
127
+ layout: InstallLayout,
128
+ current: string,
129
+ latest: string,
130
+ options: { major?: boolean; installFailed?: boolean } = {},
131
+ ): string {
132
+ const lines = [`Dimensions Analytics MCP ${current} is behind npm ${latest}.`];
133
+ if (options.major) {
134
+ lines.push("This is a new major version; auto-update will not apply it.");
135
+ }
136
+ if (options.installFailed) {
137
+ lines.push("Automatic update failed; install the new version manually.");
138
+ }
139
+ lines.push(upgradeRecipe(layout));
140
+ lines.push(`See ${UPDATING_DOCS_URL}`);
141
+ return lines.join("\n");
142
+ }
143
+
144
+ export function upgradeRecipe(layout: InstallLayout): string {
145
+ switch (layout) {
146
+ case "prefix":
147
+ return [
148
+ "Update with the installer, then restart your AI app:",
149
+ ` Mac/Linux: ${INSTALL_SH}`,
150
+ ` Windows PowerShell: ${INSTALL_PS1}`,
151
+ ` Or: npm install ${NPM_PACKAGE}@latest --prefix ~/${PREFIX_DIR_NAME}`,
152
+ ].join("\n");
153
+ case "npx":
154
+ return [
155
+ `Set MCP args to ["-y", "${NPM_PACKAGE}@latest"] (or clear the npx cache) and restart.`,
156
+ "Without @latest, npx keeps the cached tarball.",
157
+ ].join("\n");
158
+ case "global":
159
+ return `Run: npm install -g ${NPM_PACKAGE}@latest\nThen restart your AI app.`;
160
+ case "source":
161
+ return "Run: git pull && pnpm install && pnpm run build";
162
+ case "hosted":
163
+ return "Bump the deployed image / npm pin and redeploy. Do not run the stdio installer on the host.";
164
+ }
165
+ }
166
+
167
+ export function resolveNpmBin(
168
+ execPath: string = process.execPath,
169
+ platform: NodeJS.Platform = process.platform,
170
+ exists: (path: string) => boolean = existsSync,
171
+ ): string {
172
+ const dir = dirname(execPath);
173
+ const names = platform === "win32" ? ["npm.cmd", "npm.exe", "npm"] : ["npm"];
174
+ for (const name of names) {
175
+ const candidate = join(dir, name);
176
+ if (exists(candidate)) return candidate;
177
+ }
178
+ return platform === "win32" ? "npm.cmd" : "npm";
179
+ }
180
+
181
+ export function stampPathFor(layout: InstallLayout, homeDir: string, tmpDir: string): string {
182
+ if (layout === "hosted") {
183
+ return join(tmpDir, "dimensions-analytics-mcp-auto-update.json");
184
+ }
185
+ return join(homeDir, PREFIX_DIR_NAME, ".auto-update.json");
186
+ }
187
+
188
+ export function readStampFile(path: string): UpdateStamp | undefined {
189
+ try {
190
+ const raw = JSON.parse(readFileSync(path, "utf8")) as Partial<UpdateStamp>;
191
+ if (typeof raw.checkedAt !== "number") return undefined;
192
+ return {
193
+ checkedAt: raw.checkedAt,
194
+ ...(typeof raw.from === "string" ? { from: raw.from } : {}),
195
+ ...(typeof raw.to === "string" ? { to: raw.to } : {}),
196
+ ...(typeof raw.skippedReason === "string" ? { skippedReason: raw.skippedReason } : {}),
197
+ };
198
+ } catch {
199
+ return undefined;
200
+ }
201
+ }
202
+
203
+ export function writeStampFile(path: string, stamp: UpdateStamp): void {
204
+ mkdirSync(dirname(path), { recursive: true });
205
+ writeFileSync(path, `${JSON.stringify(stamp)}\n`, "utf8");
206
+ }
207
+
208
+ function updateIntervalMs(env: NodeJS.ProcessEnv): number {
209
+ const raw = env.DIMENSIONS_MCP_AUTO_UPDATE_INTERVAL_MS;
210
+ if (raw == null || raw.trim() === "") return DEFAULT_UPDATE_INTERVAL_MS;
211
+ const parsed = Number(raw);
212
+ return Number.isFinite(parsed) && parsed >= 0 ? parsed : DEFAULT_UPDATE_INTERVAL_MS;
213
+ }
214
+
215
+ export function runUpdateCheck(io: AutoUpdateIo): UpdateCheckResult {
216
+ if (io.env.DIMENSIONS_MCP_UPDATED === "1") return "skipped";
217
+ if (envFlagOff(io.env.DIMENSIONS_MCP_UPDATE_CHECK)) return "skipped";
218
+
219
+ const stamp = io.readStamp(io.stampPath);
220
+ if (stamp && io.now() - stamp.checkedAt < updateIntervalMs(io.env)) {
221
+ return "skipped";
222
+ }
223
+
224
+ const latest = io.npmView();
225
+ if (latest == null) {
226
+ io.writeStamp(io.stampPath, {
227
+ checkedAt: io.now(),
228
+ from: io.currentVersion,
229
+ skippedReason: "view-failed",
230
+ });
231
+ return "current";
232
+ }
233
+
234
+ const relation = versionRelation(io.currentVersion, latest);
235
+ if (relation === "same" || relation === "older" || relation === "incomparable") {
236
+ io.writeStamp(io.stampPath, { checkedAt: io.now(), from: io.currentVersion, to: latest });
237
+ return "current";
238
+ }
239
+
240
+ const canInstall =
241
+ io.allowInstall &&
242
+ io.layout === "prefix" &&
243
+ !envFlagOff(io.env.DIMENSIONS_MCP_AUTO_UPDATE) &&
244
+ relation === "newer-same-major";
245
+
246
+ if (canInstall) {
247
+ const ok = io.npmInstall(latest);
248
+ if (ok) {
249
+ io.writeStamp(io.stampPath, { checkedAt: io.now(), from: io.currentVersion, to: latest });
250
+ io.reexec();
251
+ return "updated";
252
+ }
253
+ io.log(
254
+ upgradeGuidance(io.layout, io.currentVersion, latest, {
255
+ installFailed: true,
256
+ major: false,
257
+ }),
258
+ );
259
+ io.writeStamp(io.stampPath, {
260
+ checkedAt: io.now(),
261
+ from: io.currentVersion,
262
+ to: latest,
263
+ skippedReason: "install-failed",
264
+ });
265
+ return "warned";
266
+ }
267
+
268
+ io.log(
269
+ upgradeGuidance(io.layout, io.currentVersion, latest, {
270
+ major: relation === "newer-major",
271
+ }),
272
+ );
273
+ io.writeStamp(io.stampPath, {
274
+ checkedAt: io.now(),
275
+ from: io.currentVersion,
276
+ to: latest,
277
+ skippedReason: relation === "newer-major" ? "major" : "manual",
278
+ });
279
+ return "warned";
280
+ }
281
+
282
+ function spawnNpm(
283
+ args: string[],
284
+ timeout: number,
285
+ ): { status: number | null; stdout: string; stderr: string } {
286
+ const npmBin = resolveNpmBin();
287
+ const result = spawnSync(npmBin, args, {
288
+ encoding: "utf8",
289
+ timeout,
290
+ windowsHide: true,
291
+ shell: process.platform === "win32",
292
+ });
293
+ return {
294
+ status: result.status,
295
+ stdout: result.stdout ?? "",
296
+ stderr: result.stderr ?? "",
297
+ };
298
+ }
299
+
300
+ function npmViewLatest(): string | undefined {
301
+ const result = spawnNpm(
302
+ ["view", NPM_PACKAGE, "version", "--registry", REGISTRY],
303
+ NPM_VIEW_TIMEOUT_MS,
304
+ );
305
+ if (result.status !== 0) return undefined;
306
+ const version = result.stdout.trim().replace(/^"+|"+$/g, "");
307
+ return parseSemver(version) ? version : undefined;
308
+ }
309
+
310
+ function npmInstallVersion(version: string, prefix: string): boolean {
311
+ const result = spawnNpm(
312
+ [
313
+ "install",
314
+ `${NPM_PACKAGE}@${version}`,
315
+ "--prefix",
316
+ prefix,
317
+ "--registry",
318
+ REGISTRY,
319
+ "--no-fund",
320
+ "--no-audit",
321
+ ],
322
+ NPM_INSTALL_TIMEOUT_MS,
323
+ );
324
+ return result.status === 0;
325
+ }
326
+
327
+ function reexecCurrentProcess(): void {
328
+ const result = spawnSync(process.execPath, process.argv.slice(1), {
329
+ env: { ...process.env, DIMENSIONS_MCP_UPDATED: "1" },
330
+ stdio: "inherit",
331
+ windowsHide: true,
332
+ });
333
+ process.exit(result.status ?? 1);
334
+ }
335
+
336
+ function createIo(options: { allowInstall: boolean; layout?: InstallLayout }): AutoUpdateIo {
337
+ const home = homedir();
338
+ const packageRoot = resolvePackageRoot();
339
+ const layout = options.layout ?? detectInstallLayout(packageRoot, home);
340
+ const prefix = join(home, PREFIX_DIR_NAME);
341
+ return {
342
+ now: () => Date.now(),
343
+ env: process.env,
344
+ layout,
345
+ currentVersion: readCurrentVersion(packageRoot),
346
+ allowInstall: options.allowInstall,
347
+ stampPath: stampPathFor(layout, home, tmpdir()),
348
+ readStamp: readStampFile,
349
+ writeStamp: writeStampFile,
350
+ npmView: npmViewLatest,
351
+ npmInstall: (version) => npmInstallVersion(version, prefix),
352
+ log: (message) => console.error(message),
353
+ reexec: reexecCurrentProcess,
354
+ };
355
+ }
356
+
357
+ /**
358
+ * Stdio entry: may install + re-exec for prefix layouts.
359
+ */
360
+ export function maybeAutoUpdateAndReexec(): void {
361
+ try {
362
+ runUpdateCheck(createIo({ allowInstall: true }));
363
+ } catch (error: unknown) {
364
+ const message = error instanceof Error ? error.message : String(error);
365
+ console.error(`Dimensions Analytics MCP update check failed: ${message}`);
366
+ }
367
+ }
368
+
369
+ /**
370
+ * Hosted HTTP entry: version warning only, never install or re-exec.
371
+ */
372
+ export function maybeWarnStaleHostedVersion(): void {
373
+ try {
374
+ runUpdateCheck(createIo({ allowInstall: false, layout: "hosted" }));
375
+ } catch (error: unknown) {
376
+ const message = error instanceof Error ? error.message : String(error);
377
+ console.error(`Dimensions Analytics MCP update check failed: ${message}`);
378
+ }
379
+ }