@digital-science-dsl/dimensions-analytics-mcp 0.5.3 → 1.0.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.
Files changed (218) hide show
  1. package/CHANGELOG.md +4 -56
  2. package/README.md +1 -5
  3. package/dist/client/deployment-config.d.ts +20 -2
  4. package/dist/client/deployment-config.d.ts.map +1 -1
  5. package/dist/client/deployment-config.js +26 -2
  6. package/dist/client/deployment-config.js.map +1 -1
  7. package/dist/client/internal-dsl-client.d.ts +1 -1
  8. package/dist/client/internal-dsl-client.d.ts.map +1 -1
  9. package/dist/client/internal-dsl-client.js +2 -5
  10. package/dist/client/internal-dsl-client.js.map +1 -1
  11. package/dist/dsl/create-client.d.ts +1 -1
  12. package/dist/dsl/create-client.js +1 -1
  13. package/dist/dsl/fluent-query-builder.d.ts +1 -1
  14. package/dist/dsl/fluent-query-builder.js +1 -1
  15. package/dist/dsl/schema/cache.d.ts +2 -2
  16. package/dist/dsl/schema/cache.d.ts.map +1 -1
  17. package/dist/dsl/schema/cache.js +8 -14
  18. package/dist/dsl/schema/cache.js.map +1 -1
  19. package/dist/dsl/schema/load.d.ts +0 -1
  20. package/dist/dsl/schema/load.d.ts.map +1 -1
  21. package/dist/dsl/schema/load.js +1 -3
  22. package/dist/dsl/schema/load.js.map +1 -1
  23. package/dist/mcp/tools/schema.d.ts +0 -2
  24. package/dist/mcp/tools/schema.d.ts.map +1 -1
  25. package/dist/mcp/tools/schema.js.map +1 -1
  26. package/dist/mcp/utils.d.ts +0 -4
  27. package/dist/mcp/utils.d.ts.map +1 -1
  28. package/dist/mcp/utils.js +0 -7
  29. package/dist/mcp/utils.js.map +1 -1
  30. package/package.json +1 -1
  31. package/src/client/deployment-config.ts +39 -2
  32. package/src/client/internal-dsl-client.ts +2 -6
  33. package/src/dsl/create-client.ts +1 -1
  34. package/src/dsl/fluent-query-builder.ts +1 -1
  35. package/src/dsl/schema/cache.ts +8 -13
  36. package/src/dsl/schema/load.ts +1 -4
  37. package/src/mcp/tools/schema.ts +0 -3
  38. package/src/mcp/utils.ts +0 -12
  39. package/test/client/deployment-config.test.ts +25 -1
  40. package/test/client/http-client.test.ts +2 -2
  41. package/test/client/internal-dsl-client.test.ts +3 -0
  42. package/test/dsl/schema/cache.test.ts +2 -4
  43. package/test/helpers/tool-test-harness.ts +2 -19
  44. package/test/middleware/field-aliases.test.ts +1 -1
  45. package/test/tools/analytics.test.ts +2 -2
  46. package/tsconfig.tsbuildinfo +1 -1
  47. package/dist/examples/dsl-examples.d.ts +0 -11
  48. package/dist/examples/dsl-examples.d.ts.map +0 -1
  49. package/dist/examples/dsl-examples.js +0 -49
  50. package/dist/examples/dsl-examples.js.map +0 -1
  51. package/dist/examples/usage-scenarios.d.ts +0 -22
  52. package/dist/examples/usage-scenarios.d.ts.map +0 -1
  53. package/dist/examples/usage-scenarios.js +0 -173
  54. package/dist/examples/usage-scenarios.js.map +0 -1
  55. package/dist/funder-org-names.d.ts +0 -12
  56. package/dist/funder-org-names.d.ts.map +0 -1
  57. package/dist/funder-org-names.js +0 -30
  58. package/dist/funder-org-names.js.map +0 -1
  59. package/dist/http.d.ts +0 -29
  60. package/dist/http.d.ts.map +0 -1
  61. package/dist/http.js +0 -173
  62. package/dist/http.js.map +0 -1
  63. package/dist/kwq/build-query.d.ts +0 -26
  64. package/dist/kwq/build-query.d.ts.map +0 -1
  65. package/dist/kwq/build-query.js +0 -37
  66. package/dist/kwq/build-query.js.map +0 -1
  67. package/dist/kwq/concept-groups.d.ts +0 -49
  68. package/dist/kwq/concept-groups.d.ts.map +0 -1
  69. package/dist/kwq/concept-groups.js +0 -55
  70. package/dist/kwq/concept-groups.js.map +0 -1
  71. package/dist/kwq/dsl-assembler.d.ts +0 -28
  72. package/dist/kwq/dsl-assembler.d.ts.map +0 -1
  73. package/dist/kwq/dsl-assembler.js +0 -124
  74. package/dist/kwq/dsl-assembler.js.map +0 -1
  75. package/dist/kwq/ensemble.d.ts +0 -38
  76. package/dist/kwq/ensemble.d.ts.map +0 -1
  77. package/dist/kwq/ensemble.js +0 -107
  78. package/dist/kwq/ensemble.js.map +0 -1
  79. package/dist/kwq/index.d.ts +0 -16
  80. package/dist/kwq/index.d.ts.map +0 -1
  81. package/dist/kwq/index.js +0 -14
  82. package/dist/kwq/index.js.map +0 -1
  83. package/dist/kwq/types.d.ts +0 -120
  84. package/dist/kwq/types.d.ts.map +0 -1
  85. package/dist/kwq/types.js +0 -11
  86. package/dist/kwq/types.js.map +0 -1
  87. package/dist/lambda.d.ts +0 -10
  88. package/dist/lambda.d.ts.map +0 -1
  89. package/dist/lambda.js +0 -4
  90. package/dist/lambda.js.map +0 -1
  91. package/dist/mcp/tools/concept-profile.d.ts +0 -14
  92. package/dist/mcp/tools/concept-profile.d.ts.map +0 -1
  93. package/dist/mcp/tools/concept-profile.js +0 -130
  94. package/dist/mcp/tools/concept-profile.js.map +0 -1
  95. package/dist/mcp/tools/dataset-profile.d.ts +0 -15
  96. package/dist/mcp/tools/dataset-profile.d.ts.map +0 -1
  97. package/dist/mcp/tools/dataset-profile.js +0 -194
  98. package/dist/mcp/tools/dataset-profile.js.map +0 -1
  99. package/dist/mcp/tools/impact-chain.d.ts +0 -15
  100. package/dist/mcp/tools/impact-chain.d.ts.map +0 -1
  101. package/dist/mcp/tools/impact-chain.js +0 -96
  102. package/dist/mcp/tools/impact-chain.js.map +0 -1
  103. package/dist/mcp/tools/kwq.d.ts +0 -19
  104. package/dist/mcp/tools/kwq.d.ts.map +0 -1
  105. package/dist/mcp/tools/kwq.js +0 -156
  106. package/dist/mcp/tools/kwq.js.map +0 -1
  107. package/dist/mcp/tools/policy-profile.d.ts +0 -15
  108. package/dist/mcp/tools/policy-profile.d.ts.map +0 -1
  109. package/dist/mcp/tools/policy-profile.js +0 -174
  110. package/dist/mcp/tools/policy-profile.js.map +0 -1
  111. package/dist/mcp/tools/profile.d.ts +0 -14
  112. package/dist/mcp/tools/profile.d.ts.map +0 -1
  113. package/dist/mcp/tools/profile.js +0 -349
  114. package/dist/mcp/tools/profile.js.map +0 -1
  115. package/dist/middleware/field-aliases.d.ts +0 -97
  116. package/dist/middleware/field-aliases.d.ts.map +0 -1
  117. package/dist/middleware/field-aliases.js +0 -208
  118. package/dist/middleware/field-aliases.js.map +0 -1
  119. package/dist/resources/schema.d.ts +0 -13
  120. package/dist/resources/schema.d.ts.map +0 -1
  121. package/dist/resources/schema.js +0 -204
  122. package/dist/resources/schema.js.map +0 -1
  123. package/dist/schema/context.d.ts +0 -10
  124. package/dist/schema/context.d.ts.map +0 -1
  125. package/dist/schema/context.js +0 -6
  126. package/dist/schema/context.js.map +0 -1
  127. package/dist/schema/index.d.ts +0 -9
  128. package/dist/schema/index.d.ts.map +0 -1
  129. package/dist/schema/index.js +0 -6
  130. package/dist/schema/index.js.map +0 -1
  131. package/dist/schema/load.d.ts +0 -43
  132. package/dist/schema/load.d.ts.map +0 -1
  133. package/dist/schema/load.js +0 -139
  134. package/dist/schema/load.js.map +0 -1
  135. package/dist/schema/store.d.ts +0 -112
  136. package/dist/schema/store.d.ts.map +0 -1
  137. package/dist/schema/store.js +0 -173
  138. package/dist/schema/store.js.map +0 -1
  139. package/dist/schema/structured-entities.d.ts +0 -21
  140. package/dist/schema/structured-entities.d.ts.map +0 -1
  141. package/dist/schema/structured-entities.js +0 -39
  142. package/dist/schema/structured-entities.js.map +0 -1
  143. package/dist/schema/types.d.ts +0 -36
  144. package/dist/schema/types.d.ts.map +0 -1
  145. package/dist/schema/types.js +0 -6
  146. package/dist/schema/types.js.map +0 -1
  147. package/dist/server.d.ts +0 -57
  148. package/dist/server.d.ts.map +0 -1
  149. package/dist/server.js +0 -144
  150. package/dist/server.js.map +0 -1
  151. package/dist/telemetry.d.ts +0 -172
  152. package/dist/telemetry.d.ts.map +0 -1
  153. package/dist/telemetry.js +0 -233
  154. package/dist/telemetry.js.map +0 -1
  155. package/dist/tools/analytics-filters.d.ts +0 -18
  156. package/dist/tools/analytics-filters.d.ts.map +0 -1
  157. package/dist/tools/analytics-filters.js +0 -35
  158. package/dist/tools/analytics-filters.js.map +0 -1
  159. package/dist/tools/analytics.d.ts +0 -16
  160. package/dist/tools/analytics.d.ts.map +0 -1
  161. package/dist/tools/analytics.js +0 -381
  162. package/dist/tools/analytics.js.map +0 -1
  163. package/dist/tools/concept-profile.d.ts +0 -14
  164. package/dist/tools/concept-profile.d.ts.map +0 -1
  165. package/dist/tools/concept-profile.js +0 -130
  166. package/dist/tools/concept-profile.js.map +0 -1
  167. package/dist/tools/dataset-profile.d.ts +0 -15
  168. package/dist/tools/dataset-profile.d.ts.map +0 -1
  169. package/dist/tools/dataset-profile.js +0 -194
  170. package/dist/tools/dataset-profile.js.map +0 -1
  171. package/dist/tools/functions.d.ts +0 -14
  172. package/dist/tools/functions.d.ts.map +0 -1
  173. package/dist/tools/functions.js +0 -294
  174. package/dist/tools/functions.js.map +0 -1
  175. package/dist/tools/impact-chain.d.ts +0 -15
  176. package/dist/tools/impact-chain.d.ts.map +0 -1
  177. package/dist/tools/impact-chain.js +0 -96
  178. package/dist/tools/impact-chain.js.map +0 -1
  179. package/dist/tools/kwq.d.ts +0 -19
  180. package/dist/tools/kwq.d.ts.map +0 -1
  181. package/dist/tools/kwq.js +0 -156
  182. package/dist/tools/kwq.js.map +0 -1
  183. package/dist/tools/lookup.d.ts +0 -14
  184. package/dist/tools/lookup.d.ts.map +0 -1
  185. package/dist/tools/lookup.js +0 -213
  186. package/dist/tools/lookup.js.map +0 -1
  187. package/dist/tools/policy-profile.d.ts +0 -15
  188. package/dist/tools/policy-profile.d.ts.map +0 -1
  189. package/dist/tools/policy-profile.js +0 -174
  190. package/dist/tools/policy-profile.js.map +0 -1
  191. package/dist/tools/profile.d.ts +0 -14
  192. package/dist/tools/profile.d.ts.map +0 -1
  193. package/dist/tools/profile.js +0 -349
  194. package/dist/tools/profile.js.map +0 -1
  195. package/dist/tools/query.d.ts +0 -16
  196. package/dist/tools/query.d.ts.map +0 -1
  197. package/dist/tools/query.js +0 -53
  198. package/dist/tools/query.js.map +0 -1
  199. package/dist/tools/schema.d.ts +0 -23
  200. package/dist/tools/schema.d.ts.map +0 -1
  201. package/dist/tools/schema.js +0 -124
  202. package/dist/tools/schema.js.map +0 -1
  203. package/dist/tools/search-entity-metadata.d.ts +0 -18
  204. package/dist/tools/search-entity-metadata.d.ts.map +0 -1
  205. package/dist/tools/search-entity-metadata.js +0 -221
  206. package/dist/tools/search-entity-metadata.js.map +0 -1
  207. package/dist/tools/search.d.ts +0 -23
  208. package/dist/tools/search.d.ts.map +0 -1
  209. package/dist/tools/search.js +0 -110
  210. package/dist/tools/search.js.map +0 -1
  211. package/dist/tools/solr-fields.d.ts +0 -39
  212. package/dist/tools/solr-fields.d.ts.map +0 -1
  213. package/dist/tools/solr-fields.js +0 -40
  214. package/dist/tools/solr-fields.js.map +0 -1
  215. package/dist/utils.d.ts +0 -70
  216. package/dist/utils.d.ts.map +0 -1
  217. package/dist/utils.js +0 -104
  218. package/dist/utils.js.map +0 -1
@@ -1,381 +0,0 @@
1
- /**
2
- * Analytics tools for the MCP server.
3
- * Provides tools for facet distribution analysis, metric aggregation, and time-series trends.
4
- * @module mcp/tools/analytics
5
- */
6
- import { ExtendedWhereFilterSchema, parseFacetResponse, SUPPORTED_CURRENCIES, } from "@digital-science/dimensions-dsl";
7
- import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
8
- import { z } from "zod";
9
- import { resolveFacetFieldName, withFieldAliases } from "../middleware/field-aliases.js";
10
- import { formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS } from "../utils.js";
11
- import { applyAnalyticsFilters } from "./analytics-filters.js";
12
- /** API may return year→value map or an array; normalize for MCP output schemas. */
13
- function normalizeYearSeries(data, valueKey) {
14
- if (Array.isArray(data)) {
15
- return data;
16
- }
17
- if (data && typeof data === "object") {
18
- return Object.entries(data)
19
- .map(([year, value]) => ({ year: Number(year), [valueKey]: value }))
20
- .sort((a, b) => a.year - b.year);
21
- }
22
- return [];
23
- }
24
- /**
25
- * Zod enum of structured entity types from the loaded schema.
26
- * @param schemaStore - Loaded describe schema
27
- * @returns Entity type enum for tool input schemas
28
- */
29
- function entityTypeEnum(schemaStore) {
30
- const types = schemaStore.structuredEntityTypes();
31
- if (types.length === 0) {
32
- return z.string().min(1).describe("Entity type (no sources loaded in schema)");
33
- }
34
- return z
35
- .enum(types)
36
- .describe("The entity type to analyze (e.g., 'publications', 'grants', 'patents')");
37
- }
38
- /**
39
- * Validates a facet field against describe schema.
40
- * @param schemaStore - Loaded schema
41
- * @param entity - Entity type
42
- * @param facetField - Facet field name
43
- */
44
- function assertFacetField(schemaStore, entity, facetField) {
45
- const valid = schemaStore.facetFields(entity);
46
- if (!valid.includes(facetField)) {
47
- throw new McpError(ErrorCode.InvalidParams, `Invalid facet field "${facetField}" for entity "${entity}". Valid fields: ${valid.join(", ") || "(none)"}`);
48
- }
49
- }
50
- /**
51
- * Validates aggregation indicators against describe schema.
52
- * @param schemaStore - Loaded schema
53
- * @param entity - Entity type
54
- * @param indicators - Metric names
55
- */
56
- function assertIndicators(schemaStore, entity, indicators) {
57
- const valid = new Set(schemaStore.metrics(entity));
58
- const invalid = indicators.filter((name) => !valid.has(name));
59
- if (invalid.length > 0) {
60
- throw new McpError(ErrorCode.InvalidParams, `Invalid indicator(s) for entity "${entity}": ${invalid.join(", ")}. Valid metrics: ${[...valid].join(", ") || "(none)"}`);
61
- }
62
- }
63
- /**
64
- * Builds facet field hint text from describe schema.
65
- * @param schemaStore - Loaded schema
66
- * @returns Description fragment
67
- */
68
- function facetFieldsDescription(schemaStore) {
69
- return schemaStore
70
- .structuredEntityTypes()
71
- .map((entity) => `${entity}: ${schemaStore.facetFieldsHint(entity)}`)
72
- .join(". ");
73
- }
74
- /**
75
- * Builds metrics hint text from describe schema.
76
- * @param schemaStore - Loaded schema
77
- * @returns Description fragment
78
- */
79
- function metricsDescription(schemaStore) {
80
- return schemaStore
81
- .structuredEntityTypes()
82
- .map((entity) => `${entity}: ${schemaStore.metricsHint(entity)}`)
83
- .join(". ");
84
- }
85
- /**
86
- * Registers all analytics tools with the MCP server.
87
- * @param server - MCP server instance
88
- * @param client - Dimensions client instance
89
- * @param schemaStore - Loaded describe schema
90
- */
91
- export function registerAnalyticsTools(server, client, schemaStore) {
92
- const facetHint = facetFieldsDescription(schemaStore);
93
- const metricsHint = metricsDescription(schemaStore);
94
- const entityTypeSchema = entityTypeEnum(schemaStore);
95
- // Facet Query
96
- server.registerTool("facet_query", {
97
- description: "Distribution analysis across entity dimensions. Returns facet buckets showing how records " +
98
- "are distributed across a categorical field. Example: 'What journals publish the most CRISPR research?'",
99
- inputSchema: {
100
- entityType: entityTypeSchema,
101
- facetField: z
102
- .string()
103
- .min(1)
104
- .describe(`Field to facet on. Valid fields by entity: ${facetHint}`),
105
- query: z
106
- .string()
107
- .min(1)
108
- .optional()
109
- .describe("Optional search query to filter records before faceting (e.g., 'CRISPR gene editing')"),
110
- limit: z
111
- .number()
112
- .int()
113
- .min(1)
114
- .max(100)
115
- .default(20)
116
- .describe("Maximum number of facet buckets to return (default 20, max 100)"),
117
- yearFrom: z
118
- .number()
119
- .int()
120
- .optional()
121
- .describe("Filter records from this year (publications: year; grants: start_year)"),
122
- yearTo: z
123
- .number()
124
- .int()
125
- .optional()
126
- .describe("Filter records up to this year (publications: year; grants: start_year)"),
127
- filters: z
128
- .array(ExtendedWhereFilterSchema)
129
- .optional()
130
- .describe("Additional where-clause filters before faceting"),
131
- },
132
- outputSchema: {
133
- entityType: z.string().describe("Entity type analyzed"),
134
- facetField: z.string().describe("Field faceted on"),
135
- totalBuckets: z.number().describe("Number of facet buckets returned"),
136
- buckets: z.array(z.record(z.string(), z.unknown())).describe("Facet bucket distribution"),
137
- },
138
- annotations: READ_ONLY_API_ANNOTATIONS,
139
- }, withFieldAliases({
140
- entitySource: { kind: "dynamic", argName: "entityType" },
141
- filterArrayArgs: ["filters"],
142
- }, async (args) => {
143
- try {
144
- const facetField = resolveFacetFieldName(args.entityType, args.facetField);
145
- assertFacetField(schemaStore, args.entityType, facetField);
146
- const builder = client.createQueryBuilder().search(args.entityType);
147
- if (args.query) {
148
- builder.for(args.query);
149
- }
150
- applyAnalyticsFilters(builder, args.entityType, args);
151
- builder.returnFacet(facetField, { limit: args.limit });
152
- const response = (await client.rawQuery(builder.build()));
153
- const facetConfigs = {
154
- [facetField]: {},
155
- };
156
- const parsed = parseFacetResponse(response, args.entityType, facetConfigs, {
157
- includeRaw: false,
158
- });
159
- const facets = parsed.facets[facetField];
160
- return formatToolResult({
161
- entityType: args.entityType,
162
- facetField,
163
- totalBuckets: facets.buckets.length,
164
- buckets: facets.buckets,
165
- });
166
- }
167
- catch (error) {
168
- return formatErrorResult(error);
169
- }
170
- }));
171
- // Aggregate Query
172
- server.registerTool("aggregate_query", {
173
- description: "Metric aggregation on facet buckets. Returns facet buckets enriched with aggregated indicator " +
174
- "values. Example: 'Which funders have the highest average citation ratio?'",
175
- inputSchema: {
176
- entityType: entityTypeSchema,
177
- facetField: z
178
- .string()
179
- .min(1)
180
- .describe(`Field to facet on. Valid fields by entity: ${facetHint}`),
181
- indicators: z
182
- .array(z.string().min(1))
183
- .min(1)
184
- .describe(`Aggregation indicators per bucket. Valid metrics by entity: ${metricsHint}`),
185
- query: z
186
- .string()
187
- .min(1)
188
- .optional()
189
- .describe("Optional search query to filter records before aggregating"),
190
- sortBy: z
191
- .string()
192
- .optional()
193
- .describe("Field to sort buckets by (must be 'count' or one of the specified indicators)"),
194
- sortOrder: z.enum(["asc", "desc"]).optional().describe("Sort direction — 'asc' or 'desc'"),
195
- limit: z
196
- .number()
197
- .int()
198
- .min(1)
199
- .default(20)
200
- .describe("Maximum number of facet buckets to return (default 20)"),
201
- yearFrom: z
202
- .number()
203
- .int()
204
- .optional()
205
- .describe("Filter records from this year (publications: year; grants: start_year)"),
206
- yearTo: z
207
- .number()
208
- .int()
209
- .optional()
210
- .describe("Filter records up to this year (publications: year; grants: start_year)"),
211
- filters: z
212
- .array(ExtendedWhereFilterSchema)
213
- .optional()
214
- .describe("Additional where-clause filters before aggregating"),
215
- },
216
- outputSchema: {
217
- entityType: z.string().describe("Entity type analyzed"),
218
- facetField: z.string().describe("Field faceted on"),
219
- indicators: z.array(z.string()).describe("Aggregation indicators computed"),
220
- totalBuckets: z.number().describe("Number of facet buckets returned"),
221
- buckets: z
222
- .array(z.record(z.string(), z.unknown()))
223
- .describe("Facet buckets with aggregated values"),
224
- },
225
- annotations: READ_ONLY_API_ANNOTATIONS,
226
- }, withFieldAliases({
227
- entitySource: { kind: "dynamic", argName: "entityType" },
228
- fieldStringArgs: ["sortBy"],
229
- fieldArrayArgs: ["indicators"],
230
- filterArrayArgs: ["filters"],
231
- }, async (args) => {
232
- try {
233
- const facetField = resolveFacetFieldName(args.entityType, args.facetField);
234
- assertFacetField(schemaStore, args.entityType, facetField);
235
- assertIndicators(schemaStore, args.entityType, args.indicators);
236
- const builder = client.createQueryBuilder().search(args.entityType);
237
- if (args.query) {
238
- builder.for(args.query);
239
- }
240
- applyAnalyticsFilters(builder, args.entityType, args);
241
- builder.returnAggregate(facetField, args.indicators, {
242
- sortBy: args.sortBy,
243
- sortOrder: args.sortOrder,
244
- limit: args.limit,
245
- });
246
- const response = (await client.rawQuery(builder.build()));
247
- const facetConfigs = {
248
- [facetField]: { indicators: args.indicators },
249
- };
250
- const parsed = parseFacetResponse(response, args.entityType, facetConfigs, {
251
- includeRaw: false,
252
- });
253
- const facets = parsed.facets[facetField];
254
- return formatToolResult({
255
- entityType: args.entityType,
256
- facetField,
257
- indicators: args.indicators,
258
- totalBuckets: facets.buckets.length,
259
- buckets: facets.buckets,
260
- });
261
- }
262
- catch (error) {
263
- return formatErrorResult(error);
264
- }
265
- }));
266
- // Citation Trend
267
- server.registerTool("citation_trend", {
268
- description: "Year-by-year citation counts for a topic. Returns annual citation totals for publications " +
269
- "matching the query over the specified year range.",
270
- inputSchema: {
271
- query: z
272
- .string()
273
- .min(1)
274
- .describe("Search query to identify publications (e.g., 'CRISPR gene editing')"),
275
- startYear: z
276
- .number()
277
- .int()
278
- .min(1900)
279
- .max(2100)
280
- .describe("First year of the time range (inclusive)"),
281
- endYear: z
282
- .number()
283
- .int()
284
- .min(1900)
285
- .max(2100)
286
- .describe("Last year of the time range (inclusive)"),
287
- },
288
- outputSchema: {
289
- query: z.string().describe("Search query used"),
290
- startYear: z.number().describe("First year of range"),
291
- endYear: z.number().describe("Last year of range"),
292
- citationsPerYear: z
293
- .array(z.record(z.string(), z.unknown()))
294
- .describe("Annual citation totals"),
295
- },
296
- annotations: READ_ONLY_API_ANNOTATIONS,
297
- }, async (args) => {
298
- try {
299
- if (args.startYear > args.endYear) {
300
- throw new McpError(ErrorCode.InvalidParams, `startYear (${args.startYear}) must be ≤ endYear (${args.endYear})`);
301
- }
302
- const dsl = client
303
- .createQueryBuilder()
304
- .search("publications")
305
- .for(args.query)
306
- .returnCitationsPerYear(args.startYear, args.endYear)
307
- .build();
308
- const response = await client.rawQuery(dsl);
309
- return formatToolResult({
310
- query: args.query,
311
- startYear: args.startYear,
312
- endYear: args.endYear,
313
- citationsPerYear: normalizeYearSeries(response.citations_per_year, "count"),
314
- });
315
- }
316
- catch (error) {
317
- return formatErrorResult(error);
318
- }
319
- });
320
- // Funding Trend
321
- server.registerTool("funding_trend", {
322
- description: "Year-by-year funding totals for a topic. Returns annual grant funding amounts for grants " +
323
- "matching the query over the specified year range.",
324
- inputSchema: {
325
- query: z
326
- .string()
327
- .min(1)
328
- .describe("Search query to identify grants (e.g., 'cancer immunotherapy')"),
329
- startYear: z
330
- .number()
331
- .int()
332
- .min(1900)
333
- .max(2100)
334
- .describe("First year of the time range (inclusive)"),
335
- endYear: z
336
- .number()
337
- .int()
338
- .min(1900)
339
- .max(2100)
340
- .describe("Last year of the time range (inclusive)"),
341
- currency: z
342
- .enum(SUPPORTED_CURRENCIES)
343
- .default("USD")
344
- .describe(`Currency for funding amounts (default USD). Supported: ${SUPPORTED_CURRENCIES.join(", ")}.`),
345
- },
346
- outputSchema: {
347
- query: z.string().describe("Search query used"),
348
- startYear: z.number().describe("First year of range"),
349
- endYear: z.number().describe("Last year of range"),
350
- currency: z.string().describe("Currency of funding amounts"),
351
- fundingPerYear: z
352
- .array(z.record(z.string(), z.unknown()))
353
- .describe("Annual funding totals"),
354
- },
355
- annotations: READ_ONLY_API_ANNOTATIONS,
356
- }, async (args) => {
357
- try {
358
- if (args.startYear > args.endYear) {
359
- throw new McpError(ErrorCode.InvalidParams, `startYear (${args.startYear}) must be ≤ endYear (${args.endYear})`);
360
- }
361
- const dsl = client
362
- .createQueryBuilder()
363
- .search("grants")
364
- .for(args.query)
365
- .returnFundingPerYear(args.startYear, args.endYear, args.currency)
366
- .build();
367
- const response = await client.rawQuery(dsl);
368
- return formatToolResult({
369
- query: args.query,
370
- startYear: args.startYear,
371
- endYear: args.endYear,
372
- currency: args.currency,
373
- fundingPerYear: normalizeYearSeries(response.funding_per_year, "funding"),
374
- });
375
- }
376
- catch (error) {
377
- return formatErrorResult(error);
378
- }
379
- });
380
- }
381
- //# sourceMappingURL=analytics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/tools/analytics.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Concept profile tool for the MCP server.
3
- * Provides multi-dimensional concept profiling across entity types via the Dimensions DSL.
4
- * @module mcp/tools/concept-profile
5
- */
6
- import type { DimensionsClient } from "@digital-science/dimensions-dsl";
7
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
- /**
9
- * Registers the concept_profile tool with the MCP server.
10
- * @param server - MCP server instance
11
- * @param client - Dimensions client instance
12
- */
13
- export declare function registerConceptProfileTools(server: McpServer, client: DimensionsClient): void;
14
- //# sourceMappingURL=concept-profile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"concept-profile.d.ts","sourceRoot":"","sources":["../../src/tools/concept-profile.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmBzE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAkI7F"}
@@ -1,130 +0,0 @@
1
- /**
2
- * Concept profile tool for the MCP server.
3
- * Provides multi-dimensional concept profiling across entity types via the Dimensions DSL.
4
- * @module mcp/tools/concept-profile
5
- */
6
- import { z } from "zod";
7
- import { asArray, formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, } from "../utils.js";
8
- /** Entity types used for entity footprint counts. */
9
- const FOOTPRINT_ENTITIES = [
10
- "publications",
11
- "grants",
12
- "patents",
13
- "clinical_trials",
14
- "datasets",
15
- "policy_documents",
16
- ];
17
- /**
18
- * Registers the concept_profile tool with the MCP server.
19
- * @param server - MCP server instance
20
- * @param client - Dimensions client instance
21
- */
22
- export function registerConceptProfileTools(server, client) {
23
- server.registerTool("concept_profile", {
24
- description: "Build a multi-dimensional profile for a research concept. Returns publication analytics (year trends, top orgs, journals, funders, field classification) and entity footprint across 6 entity types.",
25
- inputSchema: {
26
- concept: z.string().describe("The concept to profile (e.g., 'CRISPR', 'machine learning')"),
27
- includeAnalytics: z
28
- .boolean()
29
- .default(true)
30
- .describe("Include DSL facet analytics (year trends, top orgs, journals, funders, fields)"),
31
- includeEntityFootprint: z
32
- .boolean()
33
- .default(true)
34
- .describe("Include cross-entity type record counts"),
35
- facetLimit: z
36
- .number()
37
- .int()
38
- .min(1)
39
- .max(50)
40
- .default(10)
41
- .describe("Max buckets per facet in analytics"),
42
- },
43
- outputSchema: {
44
- found: z.boolean().describe("Whether results were found for the concept"),
45
- concept: z.string().optional().describe("The profiled concept"),
46
- profile: z
47
- .record(z.string(), z.unknown())
48
- .optional()
49
- .describe("Multi-dimensional concept profile"),
50
- },
51
- annotations: READ_ONLY_API_ANNOTATIONS,
52
- }, async (args) => {
53
- try {
54
- const profile = {};
55
- const phases = [];
56
- // Phase 1: DSL facet analytics
57
- if (args.includeAnalytics !== false) {
58
- phases.push((async () => {
59
- const facetFields = ["year", "research_orgs", "journal", "funders", "category_for"];
60
- const facetResults = await Promise.all(facetFields.map(async (field) => {
61
- const dsl = client
62
- .createQueryBuilder()
63
- .search("publications")
64
- .for(args.concept)
65
- .returnFacet(field, { limit: field === "year" ? 50 : args.facetLimit })
66
- .limit(0)
67
- .build();
68
- const response = await client.rawQuery(dsl);
69
- return { field, data: response };
70
- }));
71
- const analytics = {};
72
- for (const { field, data } of facetResults) {
73
- const buckets = asArray(data[field]);
74
- switch (field) {
75
- case "year":
76
- analytics.yearTrend = buckets;
77
- break;
78
- case "research_orgs":
79
- analytics.topOrgs = buckets;
80
- break;
81
- case "journal":
82
- analytics.topJournals = buckets;
83
- break;
84
- case "funders":
85
- analytics.topFunders = buckets;
86
- break;
87
- case "category_for":
88
- analytics.fieldClassification = buckets;
89
- break;
90
- }
91
- }
92
- profile.analytics = analytics;
93
- })());
94
- }
95
- // Phase 2: DSL entity footprint
96
- if (args.includeEntityFootprint !== false) {
97
- phases.push((async () => {
98
- const counts = await Promise.all(FOOTPRINT_ENTITIES.map(async (entityType) => {
99
- const dsl = client
100
- .createQueryBuilder()
101
- .search(entityType)
102
- .for(args.concept)
103
- .limit(1)
104
- .build();
105
- const response = await client.rawQuery(dsl);
106
- const total = typeof response._stats?.total_count === "number"
107
- ? response._stats.total_count
108
- : 0;
109
- return { entityType, count: total };
110
- }));
111
- const entityFootprint = {};
112
- for (const { entityType, count } of counts) {
113
- entityFootprint[entityType] = count;
114
- }
115
- profile.entityFootprint = entityFootprint;
116
- })());
117
- }
118
- await Promise.all(phases);
119
- return formatToolResult({
120
- found: true,
121
- concept: args.concept,
122
- profile,
123
- });
124
- }
125
- catch (error) {
126
- return formatErrorResult(error);
127
- }
128
- });
129
- }
130
- //# sourceMappingURL=concept-profile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"concept-profile.js","sourceRoot":"","sources":["../../src/tools/concept-profile.ts"],"names":[],"mappings":"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"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Dataset profile tool for the MCP server.
3
- * Provides deep profiling of Dimensions datasets including structural links
4
- * to associated publications and grants.
5
- * @module mcp/tools/dataset-profile
6
- */
7
- import type { DimensionsClient } from "@digital-science/dimensions-dsl";
8
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
- /**
10
- * Registers the dataset_profile tool with the MCP server.
11
- * @param server - MCP server instance
12
- * @param client - Dimensions client instance
13
- */
14
- export declare function registerDatasetProfileTools(server: McpServer, client: DimensionsClient): void;
15
- //# sourceMappingURL=dataset-profile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataset-profile.d.ts","sourceRoot":"","sources":["../../src/tools/dataset-profile.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA6M7F"}