@digital-science-dsl/dimensions-analytics-mcp 0.5.3 → 1.0.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 (218) hide show
  1. package/CHANGELOG.md +2 -58
  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,194 +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 { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
8
- import { z } from "zod";
9
- import { asArray, formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, } from "../utils.js";
10
- /**
11
- * Registers the dataset_profile tool with the MCP server.
12
- * @param server - MCP server instance
13
- * @param client - Dimensions client instance
14
- */
15
- export function registerDatasetProfileTools(server, client) {
16
- server.registerTool("dataset_profile", {
17
- description: "Get a comprehensive profile for a research dataset including its associated publication, linked grants, and related publications. Uses structural links (associated_publication_id, associated_grant_ids) rather than free-text search.",
18
- inputSchema: {
19
- datasetId: z.string().optional().describe("Dimensions dataset ID"),
20
- query: z
21
- .string()
22
- .optional()
23
- .describe("Search term to find datasets (used when datasetId is not known)"),
24
- includeLinkedPublications: z
25
- .boolean()
26
- .default(true)
27
- .describe("Include the associated publication and related publications"),
28
- includeLinkedGrants: z.boolean().default(true).describe("Include associated grants"),
29
- publicationLimit: z
30
- .number()
31
- .int()
32
- .min(1)
33
- .max(50)
34
- .default(10)
35
- .describe("Max related publications to return"),
36
- },
37
- outputSchema: {
38
- found: z.boolean().describe("Whether the dataset was found"),
39
- profile: z
40
- .record(z.string(), z.unknown())
41
- .optional()
42
- .describe("Dataset profile with linked entities"),
43
- message: z.string().optional().describe("Message when not found"),
44
- },
45
- annotations: READ_ONLY_API_ANNOTATIONS,
46
- }, async (args) => {
47
- if (!args.datasetId && !args.query) {
48
- throw new McpError(ErrorCode.InvalidParams, "Must provide at least one of: datasetId or query");
49
- }
50
- try {
51
- // Step 1: Find the dataset
52
- let datasetDsl;
53
- if (args.datasetId) {
54
- datasetDsl = client
55
- .createQueryBuilder()
56
- .search("datasets")
57
- .where("id", "=", args.datasetId)
58
- .fields([
59
- "id",
60
- "title",
61
- "doi",
62
- "year",
63
- "repository",
64
- "description",
65
- "associated_publication_id",
66
- "associated_grant_ids",
67
- ])
68
- .limit(1)
69
- .build();
70
- }
71
- else {
72
- datasetDsl = client
73
- .createQueryBuilder()
74
- .search("datasets")
75
- .for(args.query)
76
- .fields([
77
- "id",
78
- "title",
79
- "doi",
80
- "year",
81
- "repository",
82
- "description",
83
- "associated_publication_id",
84
- "associated_grant_ids",
85
- ])
86
- .limit(5)
87
- .build();
88
- }
89
- const datasetResponse = await client.rawQuery(datasetDsl);
90
- const datasets = asArray(datasetResponse.datasets);
91
- if (datasets.length === 0) {
92
- return formatToolResult({
93
- found: false,
94
- message: args.datasetId
95
- ? `No dataset found with ID: ${args.datasetId}`
96
- : `No dataset found matching: ${args.query}`,
97
- });
98
- }
99
- const dataset = datasets[0];
100
- const profile = {
101
- dataset,
102
- matchCount: datasets.length,
103
- };
104
- // Extract structural link IDs
105
- const associatedPubId = typeof dataset.associated_publication_id === "string"
106
- ? dataset.associated_publication_id
107
- : undefined;
108
- const associatedGrantIds = Array.isArray(dataset.associated_grant_ids)
109
- ? dataset.associated_grant_ids
110
- : undefined;
111
- const datasetTitle = typeof dataset.title === "string" ? dataset.title : undefined;
112
- // Step 2: Concurrent linked entity fetches
113
- const queries = [];
114
- if (args.includeLinkedPublications !== false) {
115
- // Linked publication via structural ID
116
- if (associatedPubId) {
117
- queries.push((async () => {
118
- const pubDsl = client
119
- .createQueryBuilder()
120
- .search("publications")
121
- .where("id", "=", associatedPubId)
122
- .fields([
123
- "id",
124
- "title",
125
- "doi",
126
- "year",
127
- "times_cited",
128
- "journal",
129
- "authors",
130
- "research_orgs",
131
- ])
132
- .limit(1)
133
- .build();
134
- const pubResponse = await client.rawQuery(pubDsl);
135
- const pubs = asArray(pubResponse.publications);
136
- if (pubs.length > 0) {
137
- profile.linkedPublication = pubs[0];
138
- }
139
- })());
140
- }
141
- // Related publications on same topic
142
- if (datasetTitle) {
143
- queries.push((async () => {
144
- const relDsl = client
145
- .createQueryBuilder()
146
- .search("publications")
147
- .for(datasetTitle)
148
- .fields(["id", "title", "doi", "year", "times_cited", "journal"])
149
- .sort("times_cited", "desc")
150
- .limit(args.publicationLimit)
151
- .build();
152
- const relResponse = await client.rawQuery(relDsl);
153
- const relPubs = asArray(relResponse.publications);
154
- profile.relatedPublications = {
155
- totalCount: typeof relResponse._stats?.total_count === "number"
156
- ? relResponse._stats.total_count
157
- : relPubs.length,
158
- returnedCount: relPubs.length,
159
- items: relPubs,
160
- };
161
- })());
162
- }
163
- }
164
- if (args.includeLinkedGrants !== false &&
165
- associatedGrantIds &&
166
- associatedGrantIds.length > 0) {
167
- queries.push((async () => {
168
- const grantDsl = client
169
- .createQueryBuilder()
170
- .search("grants")
171
- .whereIn("id", associatedGrantIds)
172
- .fields(["id", "title", "funding_usd", "funder_org_name", "start_year"])
173
- .limit(10)
174
- .build();
175
- const grantResponse = await client.rawQuery(grantDsl);
176
- const grants = asArray(grantResponse.grants);
177
- profile.linkedGrants = {
178
- totalCount: grants.length,
179
- items: grants,
180
- };
181
- })());
182
- }
183
- await Promise.all(queries);
184
- return formatToolResult({
185
- found: true,
186
- profile,
187
- });
188
- }
189
- catch (error) {
190
- return formatErrorResult(error);
191
- }
192
- });
193
- }
194
- //# sourceMappingURL=dataset-profile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dataset-profile.js","sourceRoot":"","sources":["../../src/tools/dataset-profile.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- /**
2
- * Special function tools for the MCP server.
3
- * Provides tools for classify, extract_concepts, and similar documents search.
4
- * @module mcp/tools/functions
5
- */
6
- import { type DimensionsClient } from "@digital-science/dimensions-dsl";
7
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
8
- /**
9
- * Registers all special function tools with the MCP server.
10
- * @param server - MCP server instance
11
- * @param client - Dimensions client instance
12
- */
13
- export declare function registerFunctionTools(server: McpServer, client: DimensionsClient): void;
14
- //# sourceMappingURL=functions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"functions.d.ts","sourceRoot":"","sources":["../../src/tools/functions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CA2UvF"}
@@ -1,294 +0,0 @@
1
- /**
2
- * Special function tools for the MCP server.
3
- * Provides tools for classify, extract_concepts, and similar documents search.
4
- * @module mcp/tools/functions
5
- */
6
- import { CLASSIFICATION_SYSTEMS, } from "@digital-science/dimensions-dsl";
7
- import { ErrorCode, McpError } from "@modelcontextprotocol/sdk/types.js";
8
- import { z } from "zod";
9
- import { withFieldAliases } from "../middleware/field-aliases.js";
10
- import { formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS } from "../utils.js";
11
- /**
12
- * Registers all special function tools with the MCP server.
13
- * @param server - MCP server instance
14
- * @param client - Dimensions client instance
15
- */
16
- export function registerFunctionTools(server, client) {
17
- // Classify Text
18
- server.registerTool("classify_text", {
19
- description: "Classify text (title and/or abstract) using Dimensions classification systems. " +
20
- "Supports FOR (Fields of Research), SDG (Sustainable Development Goals), RCDC, " +
21
- "HRCS, and other research classification taxonomies. Returns classification codes with names.",
22
- inputSchema: {
23
- title: z
24
- .string()
25
- .optional()
26
- .describe("Document title for classification (at least title or abstract required)"),
27
- abstract: z
28
- .string()
29
- .optional()
30
- .describe("Document abstract for classification (at least title or abstract required)"),
31
- system: z
32
- .enum(CLASSIFICATION_SYSTEMS)
33
- .describe("Classification system to use: FOR (Fields of Research), FOR_2020, " +
34
- "SDG (Sustainable Development Goals), SDG_2021, RCDC, HRCS_HC, HRCS_RAC, " +
35
- "HRA, BRA, ICRP_CSO, ICRP_CT, UOA"),
36
- },
37
- outputSchema: {
38
- system: z.string().describe("Classification system used"),
39
- classifications: z
40
- .array(z.record(z.string(), z.unknown()))
41
- .describe("Classification results"),
42
- },
43
- annotations: READ_ONLY_API_ANNOTATIONS,
44
- }, async (args) => {
45
- if (!args.title && !args.abstract) {
46
- throw new McpError(ErrorCode.InvalidParams, "At least one of title or abstract must be provided");
47
- }
48
- try {
49
- const result = await client.classify({
50
- title: args.title,
51
- abstract: args.abstract,
52
- system: args.system,
53
- });
54
- return formatToolResult({
55
- system: args.system,
56
- classifications: result[args.system],
57
- });
58
- }
59
- catch (error) {
60
- return formatErrorResult(error);
61
- }
62
- });
63
- // Extract Concepts
64
- server.registerTool("extract_concepts", {
65
- description: "Extract research concepts from text using Dimensions natural language processing. " +
66
- "Identifies key scientific concepts, terms, and topics from abstracts or descriptions.",
67
- inputSchema: {
68
- text: z
69
- .string()
70
- .min(1)
71
- .describe("Text to extract concepts from (e.g., abstract, description)"),
72
- return_scores: z
73
- .boolean()
74
- .optional()
75
- .default(false)
76
- .describe("Include relevance scores for each concept (0-1 scale)"),
77
- },
78
- outputSchema: {
79
- concepts: z.array(z.record(z.string(), z.unknown())).describe("Extracted concepts"),
80
- returnedWithScores: z.boolean().describe("Whether relevance scores are included"),
81
- },
82
- annotations: READ_ONLY_API_ANNOTATIONS,
83
- }, async (args) => {
84
- try {
85
- const result = await client.extractConcepts(args.text, {
86
- returnScores: args.return_scores,
87
- });
88
- return formatToolResult({
89
- concepts: result.extracted_concepts,
90
- returnedWithScores: args.return_scores,
91
- });
92
- }
93
- catch (error) {
94
- return formatErrorResult(error);
95
- }
96
- });
97
- // Find Similar Publications
98
- server.registerTool("find_similar_publications", {
99
- description: "Find publications semantically similar to provided text. " +
100
- "Uses the similar_documents() function to match publications based on meaning, " +
101
- "not just keywords. Great for finding related research based on an abstract.",
102
- inputSchema: {
103
- text: z
104
- .string()
105
- .min(1)
106
- .describe("Abstract or description text to find similar publications for"),
107
- year_from: z
108
- .number()
109
- .int()
110
- .optional()
111
- .describe("Filter publications from this year (inclusive)"),
112
- year_to: z
113
- .number()
114
- .int()
115
- .optional()
116
- .describe("Filter publications up to this year (inclusive)"),
117
- limit: z
118
- .number()
119
- .int()
120
- .min(1)
121
- .max(1000)
122
- .default(10)
123
- .describe("Maximum results to return (max 1000)"),
124
- fields: z
125
- .array(z.string())
126
- .optional()
127
- .describe("Fields to return (e.g., ['id', 'title', 'doi', 'year', 'times_cited'])"),
128
- },
129
- outputSchema: {
130
- totalCount: z.number().describe("Total matching records"),
131
- returnedCount: z.number().describe("Records returned in this response"),
132
- publications: z.array(z.record(z.string(), z.unknown())).describe("Similar publications"),
133
- },
134
- annotations: READ_ONLY_API_ANNOTATIONS,
135
- }, withFieldAliases({ entitySource: { kind: "static", entity: "publications" }, fieldArrayArgs: ["fields"] }, async (args) => {
136
- try {
137
- let builder = client.publications().forSimilar(args.text);
138
- if (args.year_from !== undefined) {
139
- builder = builder.where("year", ">=", args.year_from);
140
- }
141
- if (args.year_to !== undefined) {
142
- builder = builder.where("year", "<=", args.year_to);
143
- }
144
- if (args.fields && args.fields.length > 0) {
145
- builder = builder.fields(args.fields);
146
- }
147
- const result = await builder.limit(args.limit).execute();
148
- return formatToolResult({
149
- totalCount: result.totalCount,
150
- returnedCount: result.data.length,
151
- publications: result.data,
152
- });
153
- }
154
- catch (error) {
155
- return formatErrorResult(error);
156
- }
157
- }));
158
- // Extract Affiliations
159
- server.registerTool("extract_affiliations", {
160
- description: "Resolve and disambiguate organization affiliations using Dimensions entity resolution. " +
161
- "Takes freetext affiliation strings or structured organization data and returns matched " +
162
- "organizations with GRID/ROR identifiers and confidence scores.",
163
- inputSchema: {
164
- affiliations: z
165
- .array(z.object({
166
- affiliation: z
167
- .string()
168
- .optional()
169
- .describe("Freetext affiliation string (e.g., 'University of Oxford, UK')"),
170
- name: z.string().optional().describe("Organization name"),
171
- city: z.string().optional().describe("City"),
172
- state: z.string().optional().describe("State/province"),
173
- country: z.string().optional().describe("Country"),
174
- }))
175
- .min(1)
176
- .describe("Array of affiliations to resolve. Each must have either 'affiliation' or 'name'"),
177
- },
178
- outputSchema: {
179
- matchCount: z.number().describe("Number of resolved affiliations"),
180
- affiliations: z.array(z.record(z.string(), z.unknown())).describe("Resolved affiliations"),
181
- },
182
- annotations: READ_ONLY_API_ANNOTATIONS,
183
- }, async (args) => {
184
- try {
185
- const result = await client.extractAffiliations(args.affiliations);
186
- return formatToolResult({
187
- matchCount: result.extracted_affiliations.length,
188
- affiliations: result.extracted_affiliations,
189
- });
190
- }
191
- catch (error) {
192
- return formatErrorResult(error);
193
- }
194
- });
195
- // Extract Grants
196
- server.registerTool("extract_grants", {
197
- description: "Resolve grant numbers to Dimensions grant records. " +
198
- "Takes a grant number and optional funder information to find matching grants " +
199
- "with full metadata including funding amounts, dates, and funder details.",
200
- inputSchema: {
201
- grant_number: z.string().min(1).describe("Grant number to look up (e.g., 'R01HL117329')"),
202
- fundref: z
203
- .string()
204
- .optional()
205
- .describe("FundRef ID of the funder (e.g., '100000050' for NIH)"),
206
- funder_name: z
207
- .string()
208
- .optional()
209
- .describe("Funder name as alternative to FundRef ID (e.g., 'NIH')"),
210
- },
211
- outputSchema: {
212
- matchCount: z.number().describe("Number of matched grants"),
213
- grants: z.array(z.record(z.string(), z.unknown())).describe("Matched grant records"),
214
- },
215
- annotations: READ_ONLY_API_ANNOTATIONS,
216
- }, async (args) => {
217
- try {
218
- const result = await client.extractGrants({
219
- grantNumber: args.grant_number,
220
- fundref: args.fundref,
221
- funderName: args.funder_name,
222
- });
223
- return formatToolResult({
224
- matchCount: result.grant_id ? 1 : 0,
225
- grants: result.grant_id ? [{ grant_id: result.grant_id }] : [],
226
- });
227
- }
228
- catch (error) {
229
- return formatErrorResult(error);
230
- }
231
- });
232
- // Find Similar Grants
233
- server.registerTool("find_similar_grants", {
234
- description: "Find grants semantically similar to provided text. " +
235
- "Uses the similar_documents() function to match grants based on meaning. " +
236
- "Useful for identifying similar funding opportunities or research projects.",
237
- inputSchema: {
238
- text: z
239
- .string()
240
- .min(1)
241
- .describe("Project description or abstract to find similar grants for"),
242
- start_year_from: z
243
- .number()
244
- .int()
245
- .optional()
246
- .describe("Filter grants starting from this year (inclusive)"),
247
- start_year_to: z
248
- .number()
249
- .int()
250
- .optional()
251
- .describe("Filter grants starting up to this year (inclusive)"),
252
- limit: z
253
- .number()
254
- .int()
255
- .min(1)
256
- .max(1000)
257
- .default(10)
258
- .describe("Maximum results to return (max 1000)"),
259
- fields: z
260
- .array(z.string())
261
- .optional()
262
- .describe("Fields to return (e.g., ['id', 'title', 'funder_org_name', 'funding_usd'])"),
263
- },
264
- outputSchema: {
265
- totalCount: z.number().describe("Total matching records"),
266
- returnedCount: z.number().describe("Records returned in this response"),
267
- grants: z.array(z.record(z.string(), z.unknown())).describe("Similar grants"),
268
- },
269
- annotations: READ_ONLY_API_ANNOTATIONS,
270
- }, withFieldAliases({ entitySource: { kind: "static", entity: "grants" }, fieldArrayArgs: ["fields"] }, async (args) => {
271
- try {
272
- let builder = client.grants().forSimilar(args.text);
273
- if (args.start_year_from !== undefined) {
274
- builder = builder.where("start_year", ">=", args.start_year_from);
275
- }
276
- if (args.start_year_to !== undefined) {
277
- builder = builder.where("start_year", "<=", args.start_year_to);
278
- }
279
- if (args.fields && args.fields.length > 0) {
280
- builder = builder.fields(args.fields);
281
- }
282
- const result = await builder.limit(args.limit).execute();
283
- return formatToolResult({
284
- totalCount: result.totalCount,
285
- returnedCount: result.data.length,
286
- grants: result.data,
287
- });
288
- }
289
- catch (error) {
290
- return formatErrorResult(error);
291
- }
292
- }));
293
- }
294
- //# sourceMappingURL=functions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"functions.js","sourceRoot":"","sources":["../../src/tools/functions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,sBAAsB,GAGvB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAE7F;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAiB,EAAE,MAAwB;IAC/E,gBAAgB;IAChB,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EACT,iFAAiF;YACjF,gFAAgF;YAChF,8FAA8F;QAChG,WAAW,EAAE;YACX,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,yEAAyE,CAAC;YACtF,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4EAA4E,CAAC;YACzF,MAAM,EAAE,CAAC;iBACN,IAAI,CAAC,sBAAsB,CAAC;iBAC5B,QAAQ,CACP,oEAAoE;gBAClE,0EAA0E;gBAC1E,kCAAkC,CACrC;SACJ;QACD,YAAY,EAAE;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACzD,eAAe,EAAE,CAAC;iBACf,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;iBACxC,QAAQ,CAAC,wBAAwB,CAAC;SACtC;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,oDAAoD,CACrD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC;gBACnC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,MAAM,EAAE,IAAI,CAAC,MAA8B;aAC5C,CAAC,CAAC;YAEH,OAAO,gBAAgB,CAAC;gBACtB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,MAA6B,CAAC;aAC5D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,mBAAmB;IACnB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EACT,oFAAoF;YACpF,uFAAuF;QACzF,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,6DAA6D,CAAC;YAC1E,aAAa,EAAE,CAAC;iBACb,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,YAAY,EAAE;YACZ,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;YACnF,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;SAClF;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE;gBACrD,YAAY,EAAE,IAAI,CAAC,aAAa;aACjC,CAAC,CAAC;YAEH,OAAO,gBAAgB,CAAC;gBACtB,QAAQ,EAAE,MAAM,CAAC,kBAAkB;gBACnC,kBAAkB,EAAE,IAAI,CAAC,aAAa;aACvC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,WAAW,EACT,2DAA2D;YAC3D,gFAAgF;YAChF,6EAA6E;QAC/E,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,+DAA+D,CAAC;YAC5E,SAAS,EAAE,CAAC;iBACT,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,iDAAiD,CAAC;YAC9D,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,IAAI,CAAC;iBACT,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,sCAAsC,CAAC;YACnD,MAAM,EAAE,CAAC;iBACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,wEAAwE,CAAC;SACtF;QACD,YAAY,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACvE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;SAC1F;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,gBAAgB,CACd,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,EACxF,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAE1D,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;gBACjC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACtD,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAEzD,OAAO,gBAAgB,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;gBACjC,YAAY,EAAE,MAAM,CAAC,IAAI;aAC1B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CACF,CAAC;IAEF,uBAAuB;IACvB,MAAM,CAAC,YAAY,CACjB,sBAAsB,EACtB;QACE,WAAW,EACT,yFAAyF;YACzF,yFAAyF;YACzF,gEAAgE;QAClE,WAAW,EAAE;YACX,YAAY,EAAE,CAAC;iBACZ,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,WAAW,EAAE,CAAC;qBACX,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,gEAAgE,CAAC;gBAC7E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBACzD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gBACvD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;aACnD,CAAC,CACH;iBACA,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CACP,iFAAiF,CAClF;SACJ;QACD,YAAY,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YAClE,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAC3F;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAEnE,OAAO,gBAAgB,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,sBAAsB,CAAC,MAAM;gBAChD,YAAY,EAAE,MAAM,CAAC,sBAAsB;aAC5C,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,iBAAiB;IACjB,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,WAAW,EACT,qDAAqD;YACrD,+EAA+E;YAC/E,0EAA0E;QAC5E,WAAW,EAAE;YACX,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YACzF,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YACnE,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,wDAAwD,CAAC;SACtE;QACD,YAAY,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAC3D,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SACrF;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;gBACxC,WAAW,EAAE,IAAI,CAAC,YAAY;gBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,UAAU,EAAE,IAAI,CAAC,WAAW;aAC7B,CAAC,CAAC;YAEH,OAAO,gBAAgB,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE;aAC/D,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,sBAAsB;IACtB,MAAM,CAAC,YAAY,CACjB,qBAAqB,EACrB;QACE,WAAW,EACT,qDAAqD;YACrD,0EAA0E;YAC1E,4EAA4E;QAC9E,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,4DAA4D,CAAC;YACzE,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,mDAAmD,CAAC;YAChE,aAAa,EAAE,CAAC;iBACb,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,oDAAoD,CAAC;YACjE,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,GAAG,CAAC,CAAC,CAAC;iBACN,GAAG,CAAC,IAAI,CAAC;iBACT,OAAO,CAAC,EAAE,CAAC;iBACX,QAAQ,CAAC,sCAAsC,CAAC;YACnD,MAAM,EAAE,CAAC;iBACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjB,QAAQ,EAAE;iBACV,QAAQ,CAAC,4EAA4E,CAAC;SAC1F;QACD,YAAY,EAAE;YACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wBAAwB,CAAC;YACzD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YACvE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,CAAC;SAC9E;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,gBAAgB,CACd,EAAE,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,CAAC,QAAQ,CAAC,EAAE,EAClF,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpD,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;gBACvC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;gBACrC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxC,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;YAEzD,OAAO,gBAAgB,CAAC;gBACtB,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;gBACjC,MAAM,EAAE,MAAM,CAAC,IAAI;aACpB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CACF,CAAC;AACJ,CAAC"}
@@ -1,15 +0,0 @@
1
- /**
2
- * Research impact chain tool for the MCP server.
3
- * Traces how a research topic flows from publications through patents,
4
- * clinical trials, and policy documents.
5
- * @module mcp/tools/impact-chain
6
- */
7
- import type { DimensionsClient } from "@digital-science/dimensions-dsl";
8
- import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
9
- /**
10
- * Registers the research_impact_chain tool with the MCP server.
11
- * @param server - MCP server instance
12
- * @param client - Dimensions client instance
13
- */
14
- export declare function registerImpactChainTools(server: McpServer, client: DimensionsClient): void;
15
- //# sourceMappingURL=impact-chain.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"impact-chain.d.ts","sourceRoot":"","sources":["../../src/tools/impact-chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiCzE;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAqE1F"}
@@ -1,96 +0,0 @@
1
- /**
2
- * Research impact chain tool for the MCP server.
3
- * Traces how a research topic flows from publications through patents,
4
- * clinical trials, and policy documents.
5
- * @module mcp/tools/impact-chain
6
- */
7
- import { z } from "zod";
8
- import { asArray, formatErrorResult, formatToolResult, READ_ONLY_API_ANNOTATIONS, } from "../utils.js";
9
- /** Impact chain stages in translation order. */
10
- const CHAIN_STAGES = [
11
- {
12
- entityType: "publications",
13
- fields: ["id", "title", "doi", "year", "times_cited", "journal"],
14
- sortField: "year",
15
- },
16
- {
17
- entityType: "patents",
18
- fields: ["id", "title", "year", "filing_date", "assignees"],
19
- sortField: "year",
20
- },
21
- {
22
- entityType: "clinical_trials",
23
- fields: ["id", "title", "phase", "overall_status", "conditions"],
24
- sortField: "date_inserted",
25
- },
26
- {
27
- entityType: "policy_documents",
28
- fields: ["id", "title", "year", "publisher_org"],
29
- sortField: "year",
30
- },
31
- ];
32
- /**
33
- * Registers the research_impact_chain tool with the MCP server.
34
- * @param server - MCP server instance
35
- * @param client - Dimensions client instance
36
- */
37
- export function registerImpactChainTools(server, client) {
38
- server.registerTool("research_impact_chain", {
39
- description: "Trace how a research topic translates from basic science through real-world impact. Shows publications, patents, clinical trials, and policy documents for a query.",
40
- inputSchema: {
41
- query: z.string().describe("Seed topic or concept (e.g., 'gene therapy', 'CRISPR')"),
42
- entityLimit: z.number().int().min(1).max(50).default(10).describe("Max entities per stage"),
43
- },
44
- outputSchema: {
45
- found: z.boolean().describe("Whether results were found"),
46
- query: z.string().optional().describe("The seed query"),
47
- profile: z
48
- .record(z.string(), z.unknown())
49
- .optional()
50
- .describe("Impact chain profile with stages"),
51
- },
52
- annotations: READ_ONLY_API_ANNOTATIONS,
53
- }, async (args) => {
54
- try {
55
- const profile = {};
56
- const stageResults = await Promise.all(CHAIN_STAGES.map(async (stage) => {
57
- const builder = client
58
- .createQueryBuilder()
59
- .search(stage.entityType)
60
- .for(args.query)
61
- .fields([...stage.fields])
62
- .sort(stage.sortField, "desc")
63
- .limit(args.entityLimit);
64
- const dsl = builder.build();
65
- const response = await client.rawQuery(dsl);
66
- const items = asArray(response[stage.entityType]);
67
- return {
68
- entityType: stage.entityType,
69
- totalCount: typeof response._stats?.total_count === "number"
70
- ? response._stats.total_count
71
- : items.length,
72
- returnedCount: items.length,
73
- items,
74
- };
75
- }));
76
- const stages = {};
77
- for (const result of stageResults) {
78
- stages[result.entityType] = {
79
- totalCount: result.totalCount,
80
- returnedCount: result.returnedCount,
81
- items: result.items,
82
- };
83
- }
84
- profile.stages = stages;
85
- return formatToolResult({
86
- found: true,
87
- query: args.query,
88
- profile,
89
- });
90
- }
91
- catch (error) {
92
- return formatErrorResult(error);
93
- }
94
- });
95
- }
96
- //# sourceMappingURL=impact-chain.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"impact-chain.js","sourceRoot":"","sources":["../../src/tools/impact-chain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,OAAO,EACP,iBAAiB,EACjB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,aAAa,CAAC;AAErB,gDAAgD;AAChD,MAAM,YAAY,GAAG;IACnB;QACE,UAAU,EAAE,cAAuB;QACnC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC;QAChE,SAAS,EAAE,MAAe;KAC3B;IACD;QACE,UAAU,EAAE,SAAkB;QAC9B,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,CAAC;QAC3D,SAAS,EAAE,MAAe;KAC3B;IACD;QACE,UAAU,EAAE,iBAA0B;QACtC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC;QAChE,SAAS,EAAE,eAAwB;KACpC;IACD;QACE,UAAU,EAAE,kBAA2B;QACvC,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,CAAC;QAChD,SAAS,EAAE,MAAe;KAC3B;CACO,CAAC;AAEX;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,MAAiB,EAAE,MAAwB;IAClF,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EACT,qKAAqK;QACvK,WAAW,EAAE;YACX,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YACpF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC;SAC5F;QACD,YAAY,EAAE;YACZ,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACzD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC;YACvD,OAAO,EAAE,CAAC;iBACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;iBAC/B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;SAChD;QACD,WAAW,EAAE,yBAAyB;KACvC,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,MAAM,OAAO,GAA4B,EAAE,CAAC;YAE5C,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,GAAG,CACpC,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC/B,MAAM,OAAO,GAAG,MAAM;qBACnB,kBAAkB,EAAE;qBACpB,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;qBACxB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;qBACf,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;qBACzB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC;qBAC7B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;gBAC5B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;gBAClD,OAAO;oBACL,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,UAAU,EACR,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,KAAK,QAAQ;wBAC9C,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW;wBAC7B,CAAC,CAAC,KAAK,CAAC,MAAM;oBAClB,aAAa,EAAE,KAAK,CAAC,MAAM;oBAC3B,KAAK;iBACN,CAAC;YACJ,CAAC,CAAC,CACH,CAAC;YAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;YAC3C,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE,CAAC;gBAClC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG;oBAC1B,UAAU,EAAE,MAAM,CAAC,UAAU;oBAC7B,aAAa,EAAE,MAAM,CAAC,aAAa;oBACnC,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC;YACJ,CAAC;YAED,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;YAExB,OAAO,gBAAgB,CAAC;gBACtB,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}