@digital-science-dsl/dimensions-analytics-mcp 0.5.3

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 (722) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +152 -0
  3. package/bin/dimensions-analytics-mcp-http.js +2 -0
  4. package/bin/dimensions-analytics-mcp.js +2 -0
  5. package/dist/client/auth/config-loaders.d.ts +22 -0
  6. package/dist/client/auth/config-loaders.d.ts.map +1 -0
  7. package/dist/client/auth/config-loaders.js +68 -0
  8. package/dist/client/auth/config-loaders.js.map +1 -0
  9. package/dist/client/auth/decorators/index.d.ts +7 -0
  10. package/dist/client/auth/decorators/index.d.ts.map +1 -0
  11. package/dist/client/auth/decorators/index.js +6 -0
  12. package/dist/client/auth/decorators/index.js.map +1 -0
  13. package/dist/client/auth/decorators/with-caching.d.ts +81 -0
  14. package/dist/client/auth/decorators/with-caching.d.ts.map +1 -0
  15. package/dist/client/auth/decorators/with-caching.js +168 -0
  16. package/dist/client/auth/decorators/with-caching.js.map +1 -0
  17. package/dist/client/auth/factory.d.ts +13 -0
  18. package/dist/client/auth/factory.d.ts.map +1 -0
  19. package/dist/client/auth/factory.js +29 -0
  20. package/dist/client/auth/factory.js.map +1 -0
  21. package/dist/client/auth/index.d.ts +7 -0
  22. package/dist/client/auth/index.d.ts.map +1 -0
  23. package/dist/client/auth/index.js +6 -0
  24. package/dist/client/auth/index.js.map +1 -0
  25. package/dist/client/auth/jwt-utils.d.ts +17 -0
  26. package/dist/client/auth/jwt-utils.d.ts.map +1 -0
  27. package/dist/client/auth/jwt-utils.js +33 -0
  28. package/dist/client/auth/jwt-utils.js.map +1 -0
  29. package/dist/client/auth/node.d.ts +16 -0
  30. package/dist/client/auth/node.d.ts.map +1 -0
  31. package/dist/client/auth/node.js +15 -0
  32. package/dist/client/auth/node.js.map +1 -0
  33. package/dist/client/auth/providers/index.d.ts +2 -0
  34. package/dist/client/auth/providers/index.d.ts.map +1 -0
  35. package/dist/client/auth/providers/index.js +2 -0
  36. package/dist/client/auth/providers/index.js.map +1 -0
  37. package/dist/client/auth/providers/jwt-auth-provider.d.ts +70 -0
  38. package/dist/client/auth/providers/jwt-auth-provider.d.ts.map +1 -0
  39. package/dist/client/auth/providers/jwt-auth-provider.js +134 -0
  40. package/dist/client/auth/providers/jwt-auth-provider.js.map +1 -0
  41. package/dist/client/auth/schemas.d.ts +19 -0
  42. package/dist/client/auth/schemas.d.ts.map +1 -0
  43. package/dist/client/auth/schemas.js +23 -0
  44. package/dist/client/auth/schemas.js.map +1 -0
  45. package/dist/client/auth/types.d.ts +25 -0
  46. package/dist/client/auth/types.d.ts.map +1 -0
  47. package/dist/client/auth/types.js +9 -0
  48. package/dist/client/auth/types.js.map +1 -0
  49. package/dist/client/command.d.ts +44 -0
  50. package/dist/client/command.d.ts.map +1 -0
  51. package/dist/client/command.js +23 -0
  52. package/dist/client/command.js.map +1 -0
  53. package/dist/client/config/index.d.ts +11 -0
  54. package/dist/client/config/index.d.ts.map +1 -0
  55. package/dist/client/config/index.js +8 -0
  56. package/dist/client/config/index.js.map +1 -0
  57. package/dist/client/config/loader.d.ts +27 -0
  58. package/dist/client/config/loader.d.ts.map +1 -0
  59. package/dist/client/config/loader.js +128 -0
  60. package/dist/client/config/loader.js.map +1 -0
  61. package/dist/client/config/node.d.ts +18 -0
  62. package/dist/client/config/node.d.ts.map +1 -0
  63. package/dist/client/config/node.js +17 -0
  64. package/dist/client/config/node.js.map +1 -0
  65. package/dist/client/config/schemas.d.ts +23 -0
  66. package/dist/client/config/schemas.d.ts.map +1 -0
  67. package/dist/client/config/schemas.js +24 -0
  68. package/dist/client/config/schemas.js.map +1 -0
  69. package/dist/client/config/types.d.ts +37 -0
  70. package/dist/client/config/types.d.ts.map +1 -0
  71. package/dist/client/config/types.js +6 -0
  72. package/dist/client/config/types.js.map +1 -0
  73. package/dist/client/config/unified-loader.d.ts +41 -0
  74. package/dist/client/config/unified-loader.d.ts.map +1 -0
  75. package/dist/client/config/unified-loader.js +86 -0
  76. package/dist/client/config/unified-loader.js.map +1 -0
  77. package/dist/client/config.d.ts +43 -0
  78. package/dist/client/config.d.ts.map +1 -0
  79. package/dist/client/config.js +56 -0
  80. package/dist/client/config.js.map +1 -0
  81. package/dist/client/deployment-config.d.ts +36 -0
  82. package/dist/client/deployment-config.d.ts.map +1 -0
  83. package/dist/client/deployment-config.js +79 -0
  84. package/dist/client/deployment-config.js.map +1 -0
  85. package/dist/client/errors.d.ts +180 -0
  86. package/dist/client/errors.d.ts.map +1 -0
  87. package/dist/client/errors.js +253 -0
  88. package/dist/client/errors.js.map +1 -0
  89. package/dist/client/http-client.d.ts +215 -0
  90. package/dist/client/http-client.d.ts.map +1 -0
  91. package/dist/client/http-client.js +419 -0
  92. package/dist/client/http-client.js.map +1 -0
  93. package/dist/client/index.d.ts +28 -0
  94. package/dist/client/index.d.ts.map +1 -0
  95. package/dist/client/index.js +18 -0
  96. package/dist/client/index.js.map +1 -0
  97. package/dist/client/internal-dsl-client.d.ts +30 -0
  98. package/dist/client/internal-dsl-client.d.ts.map +1 -0
  99. package/dist/client/internal-dsl-client.js +101 -0
  100. package/dist/client/internal-dsl-client.js.map +1 -0
  101. package/dist/client/rate-limiter.d.ts +79 -0
  102. package/dist/client/rate-limiter.d.ts.map +1 -0
  103. package/dist/client/rate-limiter.js +118 -0
  104. package/dist/client/rate-limiter.js.map +1 -0
  105. package/dist/client/resolve-api-key-user.d.ts +24 -0
  106. package/dist/client/resolve-api-key-user.d.ts.map +1 -0
  107. package/dist/client/resolve-api-key-user.js +80 -0
  108. package/dist/client/resolve-api-key-user.js.map +1 -0
  109. package/dist/client/types.d.ts +44 -0
  110. package/dist/client/types.d.ts.map +1 -0
  111. package/dist/client/types.js +10 -0
  112. package/dist/client/types.js.map +1 -0
  113. package/dist/dsl/client.d.ts +330 -0
  114. package/dist/dsl/client.d.ts.map +1 -0
  115. package/dist/dsl/client.js +433 -0
  116. package/dist/dsl/client.js.map +1 -0
  117. package/dist/dsl/commands/apply-filters.d.ts +15 -0
  118. package/dist/dsl/commands/apply-filters.d.ts.map +1 -0
  119. package/dist/dsl/commands/apply-filters.js +29 -0
  120. package/dist/dsl/commands/apply-filters.js.map +1 -0
  121. package/dist/dsl/commands/facet/index.d.ts +6 -0
  122. package/dist/dsl/commands/facet/index.d.ts.map +1 -0
  123. package/dist/dsl/commands/facet/index.js +6 -0
  124. package/dist/dsl/commands/facet/index.js.map +1 -0
  125. package/dist/dsl/commands/facet/schemas.d.ts +71 -0
  126. package/dist/dsl/commands/facet/schemas.d.ts.map +1 -0
  127. package/dist/dsl/commands/facet/schemas.js +84 -0
  128. package/dist/dsl/commands/facet/schemas.js.map +1 -0
  129. package/dist/dsl/commands/functions/ClassifyCommand.d.ts +96 -0
  130. package/dist/dsl/commands/functions/ClassifyCommand.d.ts.map +1 -0
  131. package/dist/dsl/commands/functions/ClassifyCommand.js +95 -0
  132. package/dist/dsl/commands/functions/ClassifyCommand.js.map +1 -0
  133. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts +86 -0
  134. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts.map +1 -0
  135. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js +131 -0
  136. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js.map +1 -0
  137. package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts +73 -0
  138. package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts.map +1 -0
  139. package/dist/dsl/commands/functions/ExtractConceptsCommand.js +110 -0
  140. package/dist/dsl/commands/functions/ExtractConceptsCommand.js.map +1 -0
  141. package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts +66 -0
  142. package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts.map +1 -0
  143. package/dist/dsl/commands/functions/ExtractGrantsCommand.js +87 -0
  144. package/dist/dsl/commands/functions/ExtractGrantsCommand.js.map +1 -0
  145. package/dist/dsl/commands/functions/index.d.ts +10 -0
  146. package/dist/dsl/commands/functions/index.d.ts.map +1 -0
  147. package/dist/dsl/commands/functions/index.js +10 -0
  148. package/dist/dsl/commands/functions/index.js.map +1 -0
  149. package/dist/dsl/commands/index.d.ts +8 -0
  150. package/dist/dsl/commands/index.d.ts.map +1 -0
  151. package/dist/dsl/commands/index.js +7 -0
  152. package/dist/dsl/commands/index.js.map +1 -0
  153. package/dist/dsl/commands/validate-input.d.ts +18 -0
  154. package/dist/dsl/commands/validate-input.d.ts.map +1 -0
  155. package/dist/dsl/commands/validate-input.js +27 -0
  156. package/dist/dsl/commands/validate-input.js.map +1 -0
  157. package/dist/dsl/create-client.d.ts +32 -0
  158. package/dist/dsl/create-client.d.ts.map +1 -0
  159. package/dist/dsl/create-client.js +58 -0
  160. package/dist/dsl/create-client.js.map +1 -0
  161. package/dist/dsl/fluent-query-builder.d.ts +439 -0
  162. package/dist/dsl/fluent-query-builder.d.ts.map +1 -0
  163. package/dist/dsl/fluent-query-builder.js +534 -0
  164. package/dist/dsl/fluent-query-builder.js.map +1 -0
  165. package/dist/dsl/index.d.ts +32 -0
  166. package/dist/dsl/index.d.ts.map +1 -0
  167. package/dist/dsl/index.js +31 -0
  168. package/dist/dsl/index.js.map +1 -0
  169. package/dist/dsl/pagination.d.ts +82 -0
  170. package/dist/dsl/pagination.d.ts.map +1 -0
  171. package/dist/dsl/pagination.js +135 -0
  172. package/dist/dsl/pagination.js.map +1 -0
  173. package/dist/dsl/query-builder.d.ts +456 -0
  174. package/dist/dsl/query-builder.d.ts.map +1 -0
  175. package/dist/dsl/query-builder.js +994 -0
  176. package/dist/dsl/query-builder.js.map +1 -0
  177. package/dist/dsl/response-parser.d.ts +111 -0
  178. package/dist/dsl/response-parser.d.ts.map +1 -0
  179. package/dist/dsl/response-parser.js +210 -0
  180. package/dist/dsl/response-parser.js.map +1 -0
  181. package/dist/dsl/schema/cache.d.ts +52 -0
  182. package/dist/dsl/schema/cache.d.ts.map +1 -0
  183. package/dist/dsl/schema/cache.js +97 -0
  184. package/dist/dsl/schema/cache.js.map +1 -0
  185. package/dist/dsl/schema/extract.d.ts +18 -0
  186. package/dist/dsl/schema/extract.d.ts.map +1 -0
  187. package/dist/dsl/schema/extract.js +41 -0
  188. package/dist/dsl/schema/extract.js.map +1 -0
  189. package/dist/dsl/schema/index.d.ts +13 -0
  190. package/dist/dsl/schema/index.d.ts.map +1 -0
  191. package/dist/dsl/schema/index.js +12 -0
  192. package/dist/dsl/schema/index.js.map +1 -0
  193. package/dist/dsl/schema/load.d.ts +41 -0
  194. package/dist/dsl/schema/load.d.ts.map +1 -0
  195. package/dist/dsl/schema/load.js +119 -0
  196. package/dist/dsl/schema/load.js.map +1 -0
  197. package/dist/dsl/schema/store.d.ts +137 -0
  198. package/dist/dsl/schema/store.d.ts.map +1 -0
  199. package/dist/dsl/schema/store.js +204 -0
  200. package/dist/dsl/schema/store.js.map +1 -0
  201. package/dist/dsl/schema/structured-entities.d.ts +21 -0
  202. package/dist/dsl/schema/structured-entities.d.ts.map +1 -0
  203. package/dist/dsl/schema/structured-entities.js +39 -0
  204. package/dist/dsl/schema/structured-entities.js.map +1 -0
  205. package/dist/dsl/schema/summary.d.ts +51 -0
  206. package/dist/dsl/schema/summary.d.ts.map +1 -0
  207. package/dist/dsl/schema/summary.js +61 -0
  208. package/dist/dsl/schema/summary.js.map +1 -0
  209. package/dist/dsl/schema/types.d.ts +36 -0
  210. package/dist/dsl/schema/types.d.ts.map +1 -0
  211. package/dist/dsl/schema/types.js +6 -0
  212. package/dist/dsl/schema/types.js.map +1 -0
  213. package/dist/dsl/schema/validation.d.ts +21 -0
  214. package/dist/dsl/schema/validation.d.ts.map +1 -0
  215. package/dist/dsl/schema/validation.js +44 -0
  216. package/dist/dsl/schema/validation.js.map +1 -0
  217. package/dist/dsl/types/buckets.d.ts +18 -0
  218. package/dist/dsl/types/buckets.d.ts.map +1 -0
  219. package/dist/dsl/types/buckets.js +6 -0
  220. package/dist/dsl/types/buckets.js.map +1 -0
  221. package/dist/dsl/types/common.d.ts +91 -0
  222. package/dist/dsl/types/common.d.ts.map +1 -0
  223. package/dist/dsl/types/common.js +6 -0
  224. package/dist/dsl/types/common.js.map +1 -0
  225. package/dist/dsl/types/entities.d.ts +35 -0
  226. package/dist/dsl/types/entities.d.ts.map +1 -0
  227. package/dist/dsl/types/entities.js +11 -0
  228. package/dist/dsl/types/entities.js.map +1 -0
  229. package/dist/dsl/types/index.d.ts +12 -0
  230. package/dist/dsl/types/index.d.ts.map +1 -0
  231. package/dist/dsl/types/index.js +7 -0
  232. package/dist/dsl/types/index.js.map +1 -0
  233. package/dist/dsl/types/return-clauses.d.ts +107 -0
  234. package/dist/dsl/types/return-clauses.d.ts.map +1 -0
  235. package/dist/dsl/types/return-clauses.js +22 -0
  236. package/dist/dsl/types/return-clauses.js.map +1 -0
  237. package/dist/dsl/types/special-functions.d.ts +175 -0
  238. package/dist/dsl/types/special-functions.d.ts.map +1 -0
  239. package/dist/dsl/types/special-functions.js +25 -0
  240. package/dist/dsl/types/special-functions.js.map +1 -0
  241. package/dist/dsl/types/vocabulary.d.ts +21 -0
  242. package/dist/dsl/types/vocabulary.d.ts.map +1 -0
  243. package/dist/dsl/types/vocabulary.js +44 -0
  244. package/dist/dsl/types/vocabulary.js.map +1 -0
  245. package/dist/dsl/usage-policy.d.ts +87 -0
  246. package/dist/dsl/usage-policy.d.ts.map +1 -0
  247. package/dist/dsl/usage-policy.js +133 -0
  248. package/dist/dsl/usage-policy.js.map +1 -0
  249. package/dist/dsl/utils/escape.d.ts +24 -0
  250. package/dist/dsl/utils/escape.d.ts.map +1 -0
  251. package/dist/dsl/utils/escape.js +124 -0
  252. package/dist/dsl/utils/escape.js.map +1 -0
  253. package/dist/dsl/utils/sanitize.d.ts +13 -0
  254. package/dist/dsl/utils/sanitize.d.ts.map +1 -0
  255. package/dist/dsl/utils/sanitize.js +19 -0
  256. package/dist/dsl/utils/sanitize.js.map +1 -0
  257. package/dist/dsl/utils/string-utils.d.ts +35 -0
  258. package/dist/dsl/utils/string-utils.d.ts.map +1 -0
  259. package/dist/dsl/utils/string-utils.js +145 -0
  260. package/dist/dsl/utils/string-utils.js.map +1 -0
  261. package/dist/dsl/utils/validate-field-name.d.ts +11 -0
  262. package/dist/dsl/utils/validate-field-name.d.ts.map +1 -0
  263. package/dist/dsl/utils/validate-field-name.js +18 -0
  264. package/dist/dsl/utils/validate-field-name.js.map +1 -0
  265. package/dist/examples/dsl-examples.d.ts +11 -0
  266. package/dist/examples/dsl-examples.d.ts.map +1 -0
  267. package/dist/examples/dsl-examples.js +49 -0
  268. package/dist/examples/dsl-examples.js.map +1 -0
  269. package/dist/examples/usage-scenarios.d.ts +22 -0
  270. package/dist/examples/usage-scenarios.d.ts.map +1 -0
  271. package/dist/examples/usage-scenarios.js +173 -0
  272. package/dist/examples/usage-scenarios.js.map +1 -0
  273. package/dist/funder-org-names.d.ts +12 -0
  274. package/dist/funder-org-names.d.ts.map +1 -0
  275. package/dist/funder-org-names.js +30 -0
  276. package/dist/funder-org-names.js.map +1 -0
  277. package/dist/http-main.d.ts +7 -0
  278. package/dist/http-main.d.ts.map +1 -0
  279. package/dist/http-main.js +36 -0
  280. package/dist/http-main.js.map +1 -0
  281. package/dist/http.d.ts +29 -0
  282. package/dist/http.d.ts.map +1 -0
  283. package/dist/http.js +173 -0
  284. package/dist/http.js.map +1 -0
  285. package/dist/index.d.ts +9 -0
  286. package/dist/index.d.ts.map +1 -0
  287. package/dist/index.js +7 -0
  288. package/dist/index.js.map +1 -0
  289. package/dist/kwq/build-query.d.ts +26 -0
  290. package/dist/kwq/build-query.d.ts.map +1 -0
  291. package/dist/kwq/build-query.js +37 -0
  292. package/dist/kwq/build-query.js.map +1 -0
  293. package/dist/kwq/concept-groups.d.ts +49 -0
  294. package/dist/kwq/concept-groups.d.ts.map +1 -0
  295. package/dist/kwq/concept-groups.js +55 -0
  296. package/dist/kwq/concept-groups.js.map +1 -0
  297. package/dist/kwq/dsl-assembler.d.ts +28 -0
  298. package/dist/kwq/dsl-assembler.d.ts.map +1 -0
  299. package/dist/kwq/dsl-assembler.js +124 -0
  300. package/dist/kwq/dsl-assembler.js.map +1 -0
  301. package/dist/kwq/ensemble.d.ts +38 -0
  302. package/dist/kwq/ensemble.d.ts.map +1 -0
  303. package/dist/kwq/ensemble.js +107 -0
  304. package/dist/kwq/ensemble.js.map +1 -0
  305. package/dist/kwq/index.d.ts +16 -0
  306. package/dist/kwq/index.d.ts.map +1 -0
  307. package/dist/kwq/index.js +14 -0
  308. package/dist/kwq/index.js.map +1 -0
  309. package/dist/kwq/types.d.ts +120 -0
  310. package/dist/kwq/types.d.ts.map +1 -0
  311. package/dist/kwq/types.js +11 -0
  312. package/dist/kwq/types.js.map +1 -0
  313. package/dist/lambda.d.ts +10 -0
  314. package/dist/lambda.d.ts.map +1 -0
  315. package/dist/lambda.js +4 -0
  316. package/dist/lambda.js.map +1 -0
  317. package/dist/main.d.ts +8 -0
  318. package/dist/main.d.ts.map +1 -0
  319. package/dist/main.js +33 -0
  320. package/dist/main.js.map +1 -0
  321. package/dist/mcp/batch-fetch.d.ts +89 -0
  322. package/dist/mcp/batch-fetch.d.ts.map +1 -0
  323. package/dist/mcp/batch-fetch.js +178 -0
  324. package/dist/mcp/batch-fetch.js.map +1 -0
  325. package/dist/mcp/examples/dsl-examples.d.ts +21 -0
  326. package/dist/mcp/examples/dsl-examples.d.ts.map +1 -0
  327. package/dist/mcp/examples/dsl-examples.js +61 -0
  328. package/dist/mcp/examples/dsl-examples.js.map +1 -0
  329. package/dist/mcp/examples/usage-scenarios.d.ts +20 -0
  330. package/dist/mcp/examples/usage-scenarios.d.ts.map +1 -0
  331. package/dist/mcp/examples/usage-scenarios.js +169 -0
  332. package/dist/mcp/examples/usage-scenarios.js.map +1 -0
  333. package/dist/mcp/export-format.d.ts +43 -0
  334. package/dist/mcp/export-format.d.ts.map +1 -0
  335. package/dist/mcp/export-format.js +92 -0
  336. package/dist/mcp/export-format.js.map +1 -0
  337. package/dist/mcp/funder-org-names.d.ts +12 -0
  338. package/dist/mcp/funder-org-names.d.ts.map +1 -0
  339. package/dist/mcp/funder-org-names.js +30 -0
  340. package/dist/mcp/funder-org-names.js.map +1 -0
  341. package/dist/mcp/http-server.d.ts +20 -0
  342. package/dist/mcp/http-server.d.ts.map +1 -0
  343. package/dist/mcp/http-server.js +118 -0
  344. package/dist/mcp/http-server.js.map +1 -0
  345. package/dist/mcp/middleware/field-aliases.d.ts +97 -0
  346. package/dist/mcp/middleware/field-aliases.d.ts.map +1 -0
  347. package/dist/mcp/middleware/field-aliases.js +208 -0
  348. package/dist/mcp/middleware/field-aliases.js.map +1 -0
  349. package/dist/mcp/resources/schema.d.ts +13 -0
  350. package/dist/mcp/resources/schema.d.ts.map +1 -0
  351. package/dist/mcp/resources/schema.js +262 -0
  352. package/dist/mcp/resources/schema.js.map +1 -0
  353. package/dist/mcp/schema/context.d.ts +10 -0
  354. package/dist/mcp/schema/context.d.ts.map +1 -0
  355. package/dist/mcp/schema/context.js +6 -0
  356. package/dist/mcp/schema/context.js.map +1 -0
  357. package/dist/mcp/schema/index.d.ts +8 -0
  358. package/dist/mcp/schema/index.d.ts.map +1 -0
  359. package/dist/mcp/schema/index.js +6 -0
  360. package/dist/mcp/schema/index.js.map +1 -0
  361. package/dist/mcp/server.d.ts +56 -0
  362. package/dist/mcp/server.d.ts.map +1 -0
  363. package/dist/mcp/server.js +168 -0
  364. package/dist/mcp/server.js.map +1 -0
  365. package/dist/mcp/shared-schema.d.ts +13 -0
  366. package/dist/mcp/shared-schema.d.ts.map +1 -0
  367. package/dist/mcp/shared-schema.js +28 -0
  368. package/dist/mcp/shared-schema.js.map +1 -0
  369. package/dist/mcp/tools/analytics-filters.d.ts +18 -0
  370. package/dist/mcp/tools/analytics-filters.d.ts.map +1 -0
  371. package/dist/mcp/tools/analytics-filters.js +35 -0
  372. package/dist/mcp/tools/analytics-filters.js.map +1 -0
  373. package/dist/mcp/tools/analytics.d.ts +16 -0
  374. package/dist/mcp/tools/analytics.d.ts.map +1 -0
  375. package/dist/mcp/tools/analytics.js +381 -0
  376. package/dist/mcp/tools/analytics.js.map +1 -0
  377. package/dist/mcp/tools/concept-profile.d.ts +14 -0
  378. package/dist/mcp/tools/concept-profile.d.ts.map +1 -0
  379. package/dist/mcp/tools/concept-profile.js +130 -0
  380. package/dist/mcp/tools/concept-profile.js.map +1 -0
  381. package/dist/mcp/tools/dataset-profile.d.ts +15 -0
  382. package/dist/mcp/tools/dataset-profile.d.ts.map +1 -0
  383. package/dist/mcp/tools/dataset-profile.js +194 -0
  384. package/dist/mcp/tools/dataset-profile.js.map +1 -0
  385. package/dist/mcp/tools/fetch-search-pages.d.ts +15 -0
  386. package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -0
  387. package/dist/mcp/tools/fetch-search-pages.js +237 -0
  388. package/dist/mcp/tools/fetch-search-pages.js.map +1 -0
  389. package/dist/mcp/tools/functions.d.ts +14 -0
  390. package/dist/mcp/tools/functions.d.ts.map +1 -0
  391. package/dist/mcp/tools/functions.js +87 -0
  392. package/dist/mcp/tools/functions.js.map +1 -0
  393. package/dist/mcp/tools/impact-chain.d.ts +15 -0
  394. package/dist/mcp/tools/impact-chain.d.ts.map +1 -0
  395. package/dist/mcp/tools/impact-chain.js +96 -0
  396. package/dist/mcp/tools/impact-chain.js.map +1 -0
  397. package/dist/mcp/tools/kwq.d.ts +19 -0
  398. package/dist/mcp/tools/kwq.d.ts.map +1 -0
  399. package/dist/mcp/tools/kwq.js +156 -0
  400. package/dist/mcp/tools/kwq.js.map +1 -0
  401. package/dist/mcp/tools/lookup.d.ts +14 -0
  402. package/dist/mcp/tools/lookup.d.ts.map +1 -0
  403. package/dist/mcp/tools/lookup.js +146 -0
  404. package/dist/mcp/tools/lookup.js.map +1 -0
  405. package/dist/mcp/tools/policy-profile.d.ts +15 -0
  406. package/dist/mcp/tools/policy-profile.d.ts.map +1 -0
  407. package/dist/mcp/tools/policy-profile.js +174 -0
  408. package/dist/mcp/tools/policy-profile.js.map +1 -0
  409. package/dist/mcp/tools/profile.d.ts +14 -0
  410. package/dist/mcp/tools/profile.d.ts.map +1 -0
  411. package/dist/mcp/tools/profile.js +349 -0
  412. package/dist/mcp/tools/profile.js.map +1 -0
  413. package/dist/mcp/tools/query.d.ts +16 -0
  414. package/dist/mcp/tools/query.d.ts.map +1 -0
  415. package/dist/mcp/tools/query.js +75 -0
  416. package/dist/mcp/tools/query.js.map +1 -0
  417. package/dist/mcp/tools/schema.d.ts +23 -0
  418. package/dist/mcp/tools/schema.d.ts.map +1 -0
  419. package/dist/mcp/tools/schema.js +124 -0
  420. package/dist/mcp/tools/schema.js.map +1 -0
  421. package/dist/mcp/tools/search-entity-metadata.d.ts +18 -0
  422. package/dist/mcp/tools/search-entity-metadata.d.ts.map +1 -0
  423. package/dist/mcp/tools/search-entity-metadata.js +221 -0
  424. package/dist/mcp/tools/search-entity-metadata.js.map +1 -0
  425. package/dist/mcp/tools/search-input.d.ts +58 -0
  426. package/dist/mcp/tools/search-input.d.ts.map +1 -0
  427. package/dist/mcp/tools/search-input.js +76 -0
  428. package/dist/mcp/tools/search-input.js.map +1 -0
  429. package/dist/mcp/tools/search.d.ts +24 -0
  430. package/dist/mcp/tools/search.d.ts.map +1 -0
  431. package/dist/mcp/tools/search.js +115 -0
  432. package/dist/mcp/tools/search.js.map +1 -0
  433. package/dist/mcp/utils.d.ts +82 -0
  434. package/dist/mcp/utils.d.ts.map +1 -0
  435. package/dist/mcp/utils.js +126 -0
  436. package/dist/mcp/utils.js.map +1 -0
  437. package/dist/middleware/field-aliases.d.ts +97 -0
  438. package/dist/middleware/field-aliases.d.ts.map +1 -0
  439. package/dist/middleware/field-aliases.js +208 -0
  440. package/dist/middleware/field-aliases.js.map +1 -0
  441. package/dist/resources/schema.d.ts +13 -0
  442. package/dist/resources/schema.d.ts.map +1 -0
  443. package/dist/resources/schema.js +204 -0
  444. package/dist/resources/schema.js.map +1 -0
  445. package/dist/schema/context.d.ts +10 -0
  446. package/dist/schema/context.d.ts.map +1 -0
  447. package/dist/schema/context.js +6 -0
  448. package/dist/schema/context.js.map +1 -0
  449. package/dist/schema/index.d.ts +9 -0
  450. package/dist/schema/index.d.ts.map +1 -0
  451. package/dist/schema/index.js +6 -0
  452. package/dist/schema/index.js.map +1 -0
  453. package/dist/schema/load.d.ts +43 -0
  454. package/dist/schema/load.d.ts.map +1 -0
  455. package/dist/schema/load.js +139 -0
  456. package/dist/schema/load.js.map +1 -0
  457. package/dist/schema/store.d.ts +112 -0
  458. package/dist/schema/store.d.ts.map +1 -0
  459. package/dist/schema/store.js +173 -0
  460. package/dist/schema/store.js.map +1 -0
  461. package/dist/schema/structured-entities.d.ts +21 -0
  462. package/dist/schema/structured-entities.d.ts.map +1 -0
  463. package/dist/schema/structured-entities.js +39 -0
  464. package/dist/schema/structured-entities.js.map +1 -0
  465. package/dist/schema/types.d.ts +36 -0
  466. package/dist/schema/types.d.ts.map +1 -0
  467. package/dist/schema/types.js +6 -0
  468. package/dist/schema/types.js.map +1 -0
  469. package/dist/server.d.ts +57 -0
  470. package/dist/server.d.ts.map +1 -0
  471. package/dist/server.js +144 -0
  472. package/dist/server.js.map +1 -0
  473. package/dist/telemetry.d.ts +172 -0
  474. package/dist/telemetry.d.ts.map +1 -0
  475. package/dist/telemetry.js +233 -0
  476. package/dist/telemetry.js.map +1 -0
  477. package/dist/tools/analytics-filters.d.ts +18 -0
  478. package/dist/tools/analytics-filters.d.ts.map +1 -0
  479. package/dist/tools/analytics-filters.js +35 -0
  480. package/dist/tools/analytics-filters.js.map +1 -0
  481. package/dist/tools/analytics.d.ts +16 -0
  482. package/dist/tools/analytics.d.ts.map +1 -0
  483. package/dist/tools/analytics.js +381 -0
  484. package/dist/tools/analytics.js.map +1 -0
  485. package/dist/tools/concept-profile.d.ts +14 -0
  486. package/dist/tools/concept-profile.d.ts.map +1 -0
  487. package/dist/tools/concept-profile.js +130 -0
  488. package/dist/tools/concept-profile.js.map +1 -0
  489. package/dist/tools/dataset-profile.d.ts +15 -0
  490. package/dist/tools/dataset-profile.d.ts.map +1 -0
  491. package/dist/tools/dataset-profile.js +194 -0
  492. package/dist/tools/dataset-profile.js.map +1 -0
  493. package/dist/tools/functions.d.ts +14 -0
  494. package/dist/tools/functions.d.ts.map +1 -0
  495. package/dist/tools/functions.js +294 -0
  496. package/dist/tools/functions.js.map +1 -0
  497. package/dist/tools/impact-chain.d.ts +15 -0
  498. package/dist/tools/impact-chain.d.ts.map +1 -0
  499. package/dist/tools/impact-chain.js +96 -0
  500. package/dist/tools/impact-chain.js.map +1 -0
  501. package/dist/tools/kwq.d.ts +19 -0
  502. package/dist/tools/kwq.d.ts.map +1 -0
  503. package/dist/tools/kwq.js +156 -0
  504. package/dist/tools/kwq.js.map +1 -0
  505. package/dist/tools/lookup.d.ts +14 -0
  506. package/dist/tools/lookup.d.ts.map +1 -0
  507. package/dist/tools/lookup.js +213 -0
  508. package/dist/tools/lookup.js.map +1 -0
  509. package/dist/tools/policy-profile.d.ts +15 -0
  510. package/dist/tools/policy-profile.d.ts.map +1 -0
  511. package/dist/tools/policy-profile.js +174 -0
  512. package/dist/tools/policy-profile.js.map +1 -0
  513. package/dist/tools/profile.d.ts +14 -0
  514. package/dist/tools/profile.d.ts.map +1 -0
  515. package/dist/tools/profile.js +349 -0
  516. package/dist/tools/profile.js.map +1 -0
  517. package/dist/tools/query.d.ts +16 -0
  518. package/dist/tools/query.d.ts.map +1 -0
  519. package/dist/tools/query.js +53 -0
  520. package/dist/tools/query.js.map +1 -0
  521. package/dist/tools/schema.d.ts +23 -0
  522. package/dist/tools/schema.d.ts.map +1 -0
  523. package/dist/tools/schema.js +124 -0
  524. package/dist/tools/schema.js.map +1 -0
  525. package/dist/tools/search-entity-metadata.d.ts +18 -0
  526. package/dist/tools/search-entity-metadata.d.ts.map +1 -0
  527. package/dist/tools/search-entity-metadata.js +221 -0
  528. package/dist/tools/search-entity-metadata.js.map +1 -0
  529. package/dist/tools/search.d.ts +23 -0
  530. package/dist/tools/search.d.ts.map +1 -0
  531. package/dist/tools/search.js +110 -0
  532. package/dist/tools/search.js.map +1 -0
  533. package/dist/tools/solr-fields.d.ts +39 -0
  534. package/dist/tools/solr-fields.d.ts.map +1 -0
  535. package/dist/tools/solr-fields.js +40 -0
  536. package/dist/tools/solr-fields.js.map +1 -0
  537. package/dist/utils.d.ts +70 -0
  538. package/dist/utils.d.ts.map +1 -0
  539. package/dist/utils.js +104 -0
  540. package/dist/utils.js.map +1 -0
  541. package/package.json +41 -0
  542. package/src/client/auth/config-loaders.ts +81 -0
  543. package/src/client/auth/decorators/index.ts +7 -0
  544. package/src/client/auth/decorators/with-caching.ts +237 -0
  545. package/src/client/auth/factory.ts +34 -0
  546. package/src/client/auth/index.ts +6 -0
  547. package/src/client/auth/jwt-utils.ts +36 -0
  548. package/src/client/auth/node.ts +16 -0
  549. package/src/client/auth/providers/index.ts +1 -0
  550. package/src/client/auth/providers/jwt-auth-provider.ts +153 -0
  551. package/src/client/auth/schemas.ts +25 -0
  552. package/src/client/auth/types.ts +30 -0
  553. package/src/client/command.ts +54 -0
  554. package/src/client/config/index.ts +15 -0
  555. package/src/client/config/loader.ts +155 -0
  556. package/src/client/config/node.ts +22 -0
  557. package/src/client/config/schemas.ts +28 -0
  558. package/src/client/config/types.ts +39 -0
  559. package/src/client/config/unified-loader.ts +118 -0
  560. package/src/client/config.ts +69 -0
  561. package/src/client/deployment-config.ts +98 -0
  562. package/src/client/errors.ts +295 -0
  563. package/src/client/http-client.ts +577 -0
  564. package/src/client/index.ts +68 -0
  565. package/src/client/internal-dsl-client.ts +128 -0
  566. package/src/client/rate-limiter.ts +139 -0
  567. package/src/client/resolve-api-key-user.ts +99 -0
  568. package/src/client/types.ts +44 -0
  569. package/src/dsl/client.ts +538 -0
  570. package/src/dsl/commands/apply-filters.ts +35 -0
  571. package/src/dsl/commands/facet/index.ts +12 -0
  572. package/src/dsl/commands/facet/schemas.ts +101 -0
  573. package/src/dsl/commands/functions/ClassifyCommand.ts +129 -0
  574. package/src/dsl/commands/functions/ExtractAffiliationsCommand.ts +163 -0
  575. package/src/dsl/commands/functions/ExtractConceptsCommand.ts +141 -0
  576. package/src/dsl/commands/functions/ExtractGrantsCommand.ts +112 -0
  577. package/src/dsl/commands/functions/index.ts +31 -0
  578. package/src/dsl/commands/index.ts +29 -0
  579. package/src/dsl/commands/validate-input.ts +29 -0
  580. package/src/dsl/create-client.ts +80 -0
  581. package/src/dsl/fluent-query-builder.ts +684 -0
  582. package/src/dsl/index.ts +206 -0
  583. package/src/dsl/pagination.ts +202 -0
  584. package/src/dsl/query-builder.ts +1120 -0
  585. package/src/dsl/response-parser.ts +299 -0
  586. package/src/dsl/schema/cache.ts +124 -0
  587. package/src/dsl/schema/extract.ts +44 -0
  588. package/src/dsl/schema/index.ts +50 -0
  589. package/src/dsl/schema/load.ts +160 -0
  590. package/src/dsl/schema/store.ts +253 -0
  591. package/src/dsl/schema/structured-entities.ts +44 -0
  592. package/src/dsl/schema/summary.ts +94 -0
  593. package/src/dsl/schema/types.ts +40 -0
  594. package/src/dsl/schema/validation.ts +56 -0
  595. package/src/dsl/types/buckets.ts +22 -0
  596. package/src/dsl/types/common.ts +99 -0
  597. package/src/dsl/types/entities.ts +43 -0
  598. package/src/dsl/types/index.ts +63 -0
  599. package/src/dsl/types/return-clauses.ts +147 -0
  600. package/src/dsl/types/special-functions.ts +220 -0
  601. package/src/dsl/types/vocabulary.ts +82 -0
  602. package/src/dsl/usage-policy.ts +219 -0
  603. package/src/dsl/utils/escape.ts +123 -0
  604. package/src/dsl/utils/sanitize.ts +21 -0
  605. package/src/dsl/utils/string-utils.ts +147 -0
  606. package/src/dsl/utils/validate-field-name.ts +19 -0
  607. package/src/http-main.ts +41 -0
  608. package/src/index.ts +14 -0
  609. package/src/main.ts +40 -0
  610. package/src/mcp/batch-fetch.ts +255 -0
  611. package/src/mcp/examples/dsl-examples.ts +66 -0
  612. package/src/mcp/examples/usage-scenarios.ts +185 -0
  613. package/src/mcp/export-format.ts +113 -0
  614. package/src/mcp/funder-org-names.ts +30 -0
  615. package/src/mcp/http-server.ts +148 -0
  616. package/src/mcp/middleware/field-aliases.ts +274 -0
  617. package/src/mcp/resources/schema.ts +364 -0
  618. package/src/mcp/schema/context.ts +11 -0
  619. package/src/mcp/schema/index.ts +38 -0
  620. package/src/mcp/server.ts +247 -0
  621. package/src/mcp/shared-schema.ts +34 -0
  622. package/src/mcp/tools/analytics-filters.ts +46 -0
  623. package/src/mcp/tools/analytics.ts +453 -0
  624. package/src/mcp/tools/fetch-search-pages.ts +329 -0
  625. package/src/mcp/tools/functions.ts +105 -0
  626. package/src/mcp/tools/lookup.ts +182 -0
  627. package/src/mcp/tools/query.ts +91 -0
  628. package/src/mcp/tools/schema.ts +147 -0
  629. package/src/mcp/tools/search-entity-metadata.ts +253 -0
  630. package/src/mcp/tools/search-input.ts +87 -0
  631. package/src/mcp/tools/search.ts +168 -0
  632. package/src/mcp/utils.ts +199 -0
  633. package/test/client/auth/config-loaders.test.ts +92 -0
  634. package/test/client/auth/decorators/with-caching.test.ts +482 -0
  635. package/test/client/auth/factory.test.ts +68 -0
  636. package/test/client/auth/providers/jwt-auth-provider.test.ts +398 -0
  637. package/test/client/auth/types.test.ts +18 -0
  638. package/test/client/command.test.ts +163 -0
  639. package/test/client/config/loader.test.ts +377 -0
  640. package/test/client/config/unified-loader.test.ts +136 -0
  641. package/test/client/deployment-config.test.ts +69 -0
  642. package/test/client/errors/index.test.ts +408 -0
  643. package/test/client/helpers/mock-fetch.ts +42 -0
  644. package/test/client/http-client.test.ts +1148 -0
  645. package/test/client/integration/auth-providers.integration.test.ts +186 -0
  646. package/test/client/internal-dsl-client.test.ts +76 -0
  647. package/test/client/rate-limiter.test.ts +204 -0
  648. package/test/client/resolve-api-key-user.test.ts +87 -0
  649. package/test/dsl/client.special-functions.test.ts +387 -0
  650. package/test/dsl/client.test.ts +457 -0
  651. package/test/dsl/commands/apply-filters.test.ts +147 -0
  652. package/test/dsl/commands/functions/ClassifyCommand.test.ts +170 -0
  653. package/test/dsl/commands/functions/ExtractAffiliationsCommand.test.ts +306 -0
  654. package/test/dsl/commands/functions/ExtractConceptsCommand.test.ts +136 -0
  655. package/test/dsl/commands/functions/ExtractGrantsCommand.test.ts +202 -0
  656. package/test/dsl/commands/search/filters.test.ts +42 -0
  657. package/test/dsl/fluent-query-builder.test.ts +865 -0
  658. package/test/dsl/integration/client.integration.test.ts +294 -0
  659. package/test/dsl/integration/facet-api.integration.test.ts +276 -0
  660. package/test/dsl/integration/field-existence.integration.test.ts +148 -0
  661. package/test/dsl/integration/fluent-api-docs-examples.integration.test.ts +988 -0
  662. package/test/dsl/integration/fluent-api.integration.test.ts +615 -0
  663. package/test/dsl/integration/search-helpers.ts +27 -0
  664. package/test/dsl/integration/special-functions.integration.test.ts +224 -0
  665. package/test/dsl/integration/test-config.ts +52 -0
  666. package/test/dsl/pagination.test.ts +86 -0
  667. package/test/dsl/query-builder.test.ts +1775 -0
  668. package/test/dsl/response-parser.test.ts +520 -0
  669. package/test/dsl/schema/cache.test.ts +53 -0
  670. package/test/dsl/schema/load.test.ts +165 -0
  671. package/test/dsl/schema/summary.test.ts +61 -0
  672. package/test/dsl/schema/validation.test.ts +46 -0
  673. package/test/dsl/time-series.test.ts +135 -0
  674. package/test/dsl/unnest.test.ts +151 -0
  675. package/test/dsl/usage-policy.test.ts +100 -0
  676. package/test/dsl/utils/escape.property.test.ts +109 -0
  677. package/test/dsl/utils/escape.test.ts +140 -0
  678. package/test/dsl/utils/validate-field-name.property.test.ts +99 -0
  679. package/test/dsl/utils/validate-field-name.test.ts +55 -0
  680. package/test/examples/dsl-examples.test.ts +29 -0
  681. package/test/examples/usage-scenarios.test.ts +90 -0
  682. package/test/fixtures/describe-schema.json +4000 -0
  683. package/test/funder-org-names.test.ts +20 -0
  684. package/test/helpers/schema-fixture.ts +18 -0
  685. package/test/helpers/tool-test-harness.ts +114 -0
  686. package/test/integration/assertions.ts +263 -0
  687. package/test/integration/env.ts +108 -0
  688. package/test/integration/harness.ts +307 -0
  689. package/test/integration/hosted-client.ts +56 -0
  690. package/test/integration/hosted-mocks.ts +81 -0
  691. package/test/integration/hosted-run.ts +86 -0
  692. package/test/integration/hosted.e2e.test.ts +101 -0
  693. package/test/integration/reporter.ts +100 -0
  694. package/test/integration/run.ts +74 -0
  695. package/test/integration/suites/analytics.integration.ts +72 -0
  696. package/test/integration/suites/functions.integration.ts +37 -0
  697. package/test/integration/suites/hosted-smoke.integration.ts +38 -0
  698. package/test/integration/suites/index.ts +22 -0
  699. package/test/integration/suites/lookup.integration.ts +57 -0
  700. package/test/integration/suites/query.integration.ts +49 -0
  701. package/test/integration/suites/resources.integration.ts +68 -0
  702. package/test/integration/suites/search.integration.ts +80 -0
  703. package/test/integration/types.ts +92 -0
  704. package/test/integration/verify-usage-scenarios.ts +162 -0
  705. package/test/mcp/export-format.test.ts +67 -0
  706. package/test/mcp/http-server.test.ts +80 -0
  707. package/test/middleware/field-aliases.test.ts +287 -0
  708. package/test/resources/schema.test.ts +28 -0
  709. package/test/schema/describe-contract.test.ts +24 -0
  710. package/test/schema/store.test.ts +45 -0
  711. package/test/server.test.ts +170 -0
  712. package/test/tools/analytics-filters.test.ts +35 -0
  713. package/test/tools/analytics.test.ts +419 -0
  714. package/test/tools/fetch-search-pages.test.ts +200 -0
  715. package/test/tools/functions.test.ts +153 -0
  716. package/test/tools/lookup.test.ts +296 -0
  717. package/test/tools/query.test.ts +100 -0
  718. package/test/tools/schema.test.ts +37 -0
  719. package/test/tools/search.test.ts +415 -0
  720. package/test/utils.test.ts +45 -0
  721. package/tsconfig.json +9 -0
  722. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Dimensions reasonable-use policy guardrails for MCP tools.
3
+ * @see https://docs.dimensions.ai/dsl/usagepolicy.html
4
+ * @module dsl/usage-policy
5
+ */
6
+
7
+ import { ValidationError } from "../client/index.js";
8
+ import {
9
+ CONFIRM_LARGE_FETCH_PAGES,
10
+ CONFIRM_LARGE_FETCH_RECORDS,
11
+ LARGE_RESULT_THRESHOLD,
12
+ largeResultWarning,
13
+ validatePaginationBounds,
14
+ } from "./pagination.js";
15
+ import { SCHEMA_LIMITS } from "./schema/store.js";
16
+
17
+ /** Official Dimensions usage policy URL. */
18
+ export const USAGE_POLICY_URL = "https://docs.dimensions.ai/dsl/usagepolicy.html";
19
+
20
+ /** MCP resource URI for policy guidance. */
21
+ export const USAGE_POLICY_RESOURCE_URI = "dimensions://schema/policy";
22
+
23
+ /** Short notice included in guarded tool responses. */
24
+ export const POLICY_NOTICE =
25
+ "Dimensions API is for task-sized analytical queries, not bulk local copies or training data. " +
26
+ `See ${USAGE_POLICY_RESOURCE_URI} and ${USAGE_POLICY_URL}.`;
27
+
28
+ /** Parsed skip/limit modifiers from a DSL query string. */
29
+ export type DslPaginationModifiers = {
30
+ readonly limit?: number;
31
+ readonly skip?: number;
32
+ };
33
+
34
+ /** Payload for dimensions://schema/policy. */
35
+ export type UsagePolicyPayload = {
36
+ readonly source: string;
37
+ readonly purpose: string;
38
+ readonly limits: typeof SCHEMA_LIMITS;
39
+ readonly guardrails: {
40
+ readonly largeResultWarningThreshold: number;
41
+ readonly confirmLargeFetchRequiredWhen: {
42
+ readonly batchMaxPagesExceeds: number;
43
+ readonly batchRecordsExceeds: number;
44
+ readonly searchSkipAtLeast: number;
45
+ readonly searchPageAtLeast: number;
46
+ };
47
+ readonly clientRateLimitPerMinute: number;
48
+ };
49
+ readonly recommendations: readonly string[];
50
+ readonly notice: string;
51
+ };
52
+
53
+ /**
54
+ * Builds the usage policy payload for MCP resources and agent discovery.
55
+ * @returns Policy guidance object
56
+ */
57
+ export function buildUsagePolicy(): UsagePolicyPayload {
58
+ return {
59
+ source: USAGE_POLICY_URL,
60
+ purpose:
61
+ "Support complex analytical tasks — not local copies of Dimensions data, training corpora, or open-ended crawling.",
62
+ limits: SCHEMA_LIMITS,
63
+ guardrails: {
64
+ largeResultWarningThreshold: LARGE_RESULT_THRESHOLD,
65
+ confirmLargeFetchRequiredWhen: {
66
+ batchMaxPagesExceeds: CONFIRM_LARGE_FETCH_PAGES,
67
+ batchRecordsExceeds: CONFIRM_LARGE_FETCH_RECORDS,
68
+ searchSkipAtLeast: CONFIRM_LARGE_FETCH_RECORDS,
69
+ searchPageAtLeast: CONFIRM_LARGE_FETCH_PAGES,
70
+ },
71
+ clientRateLimitPerMinute: SCHEMA_LIMITS.requestsPerMinute,
72
+ },
73
+ recommendations: [
74
+ "Start with narrow filters and facet_query before paginating large sets",
75
+ "Use search_* with default limit 100 for discovery; raise only when needed",
76
+ "Use fetch_search_pages aggregate mode for ID lists and counts without full rows",
77
+ "Use fetch_search_pages file mode (JSONL or CSV) only with outputPath and confirmLargeFetch for large exports",
78
+ "Facets return at most 1000 buckets with no pagination — do not loop facet queries",
79
+ ],
80
+ notice: POLICY_NOTICE,
81
+ };
82
+ }
83
+
84
+ /**
85
+ * Extracts `limit` and `skip` modifiers from a DSL query string.
86
+ * @param dsl - Raw DSL query
87
+ * @returns Parsed modifiers (undefined when absent)
88
+ */
89
+ export function parseDslPagination(dsl: string): DslPaginationModifiers {
90
+ const limitMatch = dsl.match(/\blimit\s+(\d+)\b/i);
91
+ const skipMatch = dsl.match(/\bskip\s+(\d+)\b/i);
92
+ return {
93
+ ...(limitMatch ? { limit: Number.parseInt(limitMatch[1], 10) } : {}),
94
+ ...(skipMatch ? { skip: Number.parseInt(skipMatch[1], 10) } : {}),
95
+ };
96
+ }
97
+
98
+ /**
99
+ * Returns true when the DSL appears to be a facet-only query (no entity row pagination).
100
+ * @param dsl - Raw DSL query
101
+ * @returns Whether the query targets facets without entity records
102
+ */
103
+ export function isFacetOnlyQuery(dsl: string): boolean {
104
+ const hasFacetReturn =
105
+ /\breturn\s+(?:year|journal|funder|researcher|category|phase|source|repository|funder_orgs?)\b/i.test(
106
+ dsl,
107
+ ) ||
108
+ /\breturn\s+\w+\s+facet\b/i.test(dsl) ||
109
+ /\bfacet\s+\w+/i.test(dsl);
110
+ const hasEntityReturn =
111
+ /\breturn\s+(?:publications|grants|patents|clinical_trials|datasets|policy_documents|researchers|organizations)\b/i.test(
112
+ dsl,
113
+ );
114
+ const limitZero = /\blimit\s+0\b/i.test(dsl);
115
+ return hasFacetReturn && (!hasEntityReturn || limitZero);
116
+ }
117
+
118
+ /** Options for single-page search policy validation. */
119
+ export type SearchPolicyOptions = {
120
+ readonly skip: number;
121
+ readonly limit: number;
122
+ readonly confirmLargeFetch?: boolean;
123
+ };
124
+
125
+ /**
126
+ * Validates single-page search pagination against reasonable-use guardrails.
127
+ * @param options - Resolved skip/limit and optional confirmation flag
128
+ * @throws {ValidationError} When deep pagination lacks confirmation
129
+ */
130
+ export function validateSearchPaginationPolicy(options: SearchPolicyOptions): void {
131
+ const { skip, limit, confirmLargeFetch } = options;
132
+ const page = limit > 0 ? Math.floor(skip / limit) : 0;
133
+
134
+ const needsConfirm =
135
+ skip >= CONFIRM_LARGE_FETCH_RECORDS ||
136
+ page >= CONFIRM_LARGE_FETCH_PAGES ||
137
+ (limit === SCHEMA_LIMITS.maxLimit && skip > 0);
138
+
139
+ if (needsConfirm && !confirmLargeFetch) {
140
+ throw new ValidationError(
141
+ `Deep pagination requires confirmLargeFetch: true (skip=${skip}, limit=${limit}, page≈${page}). ` +
142
+ "Narrow filters first or use facet_query. See dimensions://schema/policy.",
143
+ { skip, limit, page, confirmLargeFetch, policyUri: USAGE_POLICY_RESOURCE_URI },
144
+ );
145
+ }
146
+ }
147
+
148
+ /** Options for raw DSL policy validation. */
149
+ export type ExecuteDslPolicyOptions = {
150
+ readonly dsl: string;
151
+ readonly confirmLargeFetch?: boolean;
152
+ };
153
+
154
+ /**
155
+ * Validates a raw DSL query against pagination and reasonable-use guardrails.
156
+ * @param options - DSL string and optional confirmation flag
157
+ * @throws {ValidationError} When the query violates policy bounds
158
+ */
159
+ export function validateExecuteDslPolicy(options: ExecuteDslPolicyOptions): void {
160
+ const { dsl, confirmLargeFetch } = options;
161
+ const { limit, skip } = parseDslPagination(dsl);
162
+
163
+ if (isFacetOnlyQuery(dsl) && skip !== undefined && skip > 0) {
164
+ throw new ValidationError(
165
+ "Facet queries cannot be paginated with skip — facets return at most 1000 buckets with no pagination.",
166
+ { skip, policyUri: USAGE_POLICY_RESOURCE_URI },
167
+ );
168
+ }
169
+
170
+ if (skip !== undefined || limit !== undefined) {
171
+ validatePaginationBounds(skip ?? 0, limit ?? SCHEMA_LIMITS.maxLimit);
172
+ validateSearchPaginationPolicy({
173
+ skip: skip ?? 0,
174
+ limit: limit ?? 100,
175
+ confirmLargeFetch,
176
+ });
177
+ }
178
+ }
179
+
180
+ /**
181
+ * Builds response-level policy hints for execute_dsl results.
182
+ * @param dsl - Executed DSL query
183
+ * @param response - Raw API response
184
+ * @returns Optional policy fields to merge into the tool result
185
+ */
186
+ export function buildExecuteDslPolicyHints(
187
+ dsl: string,
188
+ response: Record<string, unknown>,
189
+ ): {
190
+ policyNotice?: string;
191
+ largeResultWarning?: string;
192
+ paginationHint?: string;
193
+ } {
194
+ const stats = response._stats as { total_count?: number } | undefined;
195
+ const totalCount = stats?.total_count;
196
+ const hints: {
197
+ policyNotice?: string;
198
+ largeResultWarning?: string;
199
+ paginationHint?: string;
200
+ } = {};
201
+
202
+ const warning = totalCount !== undefined ? largeResultWarning(totalCount) : undefined;
203
+ if (warning) {
204
+ hints.largeResultWarning = warning;
205
+ hints.policyNotice = POLICY_NOTICE;
206
+ }
207
+
208
+ const { limit, skip } = parseDslPagination(dsl);
209
+ if (totalCount !== undefined && limit !== undefined && totalCount > (skip ?? 0) + limit) {
210
+ const pages = Math.ceil(totalCount / limit);
211
+ const minutes = Math.ceil(pages / SCHEMA_LIMITS.requestsPerMinute);
212
+ hints.paginationHint =
213
+ `${totalCount} total matches; this page returned up to ${limit}. ` +
214
+ `Full pagination ≈${pages} requests (~${minutes} min). Prefer search_* or fetch_search_pages.`;
215
+ hints.policyNotice ??= POLICY_NOTICE;
216
+ }
217
+
218
+ return hints;
219
+ }
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Escapes a string for safe inclusion in a DSL query.
3
+ *
4
+ * Handles backslashes, double quotes (including Unicode smart quotes),
5
+ * and control characters to prevent DSL injection attacks when
6
+ * user-supplied strings are interpolated into queries.
7
+ *
8
+ * Characters escaped via `\uXXXX` (ANTLR grammar-compatible):
9
+ * - Null byte and C0 controls (U+0000–U+001F) not covered by named escapes
10
+ * - DEL and C1 controls (U+007F–U+009F)
11
+ * - Smart single quotes (U+2018, U+2019)
12
+ * - Line and paragraph separators (U+2028, U+2029)
13
+ *
14
+ * @param text - The string to escape
15
+ * @returns The escaped string safe for DSL interpolation
16
+ */
17
+ export function escapeDslString(text: string): string {
18
+ let result = "";
19
+ for (let i = 0; i < text.length; i++) {
20
+ const ch = text[i];
21
+ switch (ch) {
22
+ case "\\":
23
+ result += "\\\\";
24
+ break;
25
+ case '"':
26
+ result += '\\"';
27
+ break;
28
+ case "\u201c":
29
+ result += "\\\u201c";
30
+ break;
31
+ case "\u201d":
32
+ result += "\\\u201d";
33
+ break;
34
+ case "\n":
35
+ result += "\\n";
36
+ break;
37
+ case "\t":
38
+ result += "\\t";
39
+ break;
40
+ case "\r":
41
+ result += "\\r";
42
+ break;
43
+ case "\b":
44
+ result += "\\b";
45
+ break;
46
+ case "\f":
47
+ result += "\\f";
48
+ break;
49
+ default: {
50
+ const code = ch.charCodeAt(0);
51
+ if (
52
+ code <= 0x001f ||
53
+ (code >= 0x007f && code <= 0x009f) ||
54
+ code === 0x2018 ||
55
+ code === 0x2019 ||
56
+ code === 0x2028 ||
57
+ code === 0x2029
58
+ ) {
59
+ result += `\\u${code.toString(16).padStart(4, "0")}`;
60
+ } else {
61
+ result += ch;
62
+ }
63
+ }
64
+ }
65
+ }
66
+ return result;
67
+ }
68
+
69
+ /**
70
+ * Unescapes DSL string literal content (inverse of {@link escapeDslString} for common sequences).
71
+ * @param text - Escaped string content without surrounding quotes
72
+ * @returns Unescaped string
73
+ */
74
+ export function unescapeDslString(text: string): string {
75
+ if (!text.includes("\\")) return text;
76
+
77
+ let result = "";
78
+ for (let i = 0; i < text.length; i++) {
79
+ if (text[i] === "\\" && i + 1 < text.length) {
80
+ const next = text[i + 1];
81
+ switch (next) {
82
+ case '"':
83
+ case "\\":
84
+ case "n":
85
+ result += next === "n" ? "\n" : next;
86
+ i++;
87
+ break;
88
+ case "t":
89
+ result += "\t";
90
+ i++;
91
+ break;
92
+ case "r":
93
+ result += "\r";
94
+ i++;
95
+ break;
96
+ case "b":
97
+ result += "\b";
98
+ i++;
99
+ break;
100
+ case "f":
101
+ result += "\f";
102
+ i++;
103
+ break;
104
+ case "u": {
105
+ const hex = text.slice(i + 2, i + 6);
106
+ if (hex.length === 4 && /^[0-9a-fA-F]{4}$/.test(hex)) {
107
+ result += String.fromCharCode(Number.parseInt(hex, 16));
108
+ i += 5;
109
+ } else {
110
+ result += "\\";
111
+ }
112
+ break;
113
+ }
114
+ default:
115
+ result += "\\";
116
+ break;
117
+ }
118
+ } else {
119
+ result += text[i];
120
+ }
121
+ }
122
+ return result;
123
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Input sanitization for DSL query construction.
3
+ * @module utils/sanitize
4
+ */
5
+
6
+ /** Maximum allowed length for search text within a `for "..."` clause. */
7
+ export const MAX_SEARCH_TEXT_LENGTH = 10_000;
8
+
9
+ const ZERO_WIDTH_RE = /[\u00AD\u180E\u200B-\u200F\u2028\u2029\uFEFF\u2060-\u2064]/g;
10
+
11
+ /**
12
+ * Normalizes user search text before embedding in DSL.
13
+ * @param text - Raw input text
14
+ * @returns Sanitized text
15
+ */
16
+ export function sanitizeInput(text: string): string {
17
+ return text
18
+ .normalize("NFC")
19
+ .replace(ZERO_WIDTH_RE, "")
20
+ .replace(/[\u201c\u201d]/g, '"');
21
+ }
@@ -0,0 +1,147 @@
1
+ /**
2
+ * String manipulation utilities for DSL quoting and escape sequences.
3
+ * @module utils/string-utils
4
+ */
5
+
6
+ /**
7
+ * Strips the first and last character from a quoted string token.
8
+ * @param text - The raw STRING token text including quotes
9
+ * @returns The unquoted string content
10
+ */
11
+ export function stripQuotes(text: string): string {
12
+ return unescapeString(text.slice(1, -1));
13
+ }
14
+
15
+ /**
16
+ * Strips triple quotes from a LONG_STRING token.
17
+ * @param text - The raw LONG_STRING token text including triple quotes
18
+ * @returns The unquoted string content
19
+ */
20
+ export function stripTripleQuotes(text: string): string {
21
+ return unescapeString(text.slice(3, -3));
22
+ }
23
+
24
+ /**
25
+ * Processes escape sequences in a DSL string.
26
+ * @param text - The string content (without outer quotes)
27
+ * @returns The unescaped string
28
+ */
29
+ export function unescapeString(text: string): string {
30
+ if (!text.includes("\\")) return text;
31
+
32
+ let result = "";
33
+ for (let i = 0; i < text.length; i++) {
34
+ if (text[i] === "\\" && i + 1 < text.length) {
35
+ const next = text[i + 1];
36
+ switch (next) {
37
+ case '"':
38
+ case "\u201c":
39
+ case "\u201d":
40
+ case "\\":
41
+ case "/":
42
+ case "^":
43
+ case "*":
44
+ case "?":
45
+ case ":":
46
+ case "~":
47
+ case "[":
48
+ case "]":
49
+ case "{":
50
+ case "}":
51
+ case "(":
52
+ case ")":
53
+ case "!":
54
+ case "|":
55
+ case "&":
56
+ case "+":
57
+ case "-":
58
+ result += next;
59
+ i++;
60
+ break;
61
+ case "n":
62
+ result += "\n";
63
+ i++;
64
+ break;
65
+ case "t":
66
+ result += "\t";
67
+ i++;
68
+ break;
69
+ case "r":
70
+ result += "\r";
71
+ i++;
72
+ break;
73
+ case "b":
74
+ result += "\b";
75
+ i++;
76
+ break;
77
+ case "f":
78
+ result += "\f";
79
+ i++;
80
+ break;
81
+ case "u": {
82
+ const hex = text.slice(i + 2, i + 6);
83
+ if (hex.length === 4 && /^[0-9a-fA-F]{4}$/.test(hex)) {
84
+ result += String.fromCharCode(Number.parseInt(hex, 16));
85
+ i += 5;
86
+ } else {
87
+ result += "\\";
88
+ }
89
+ break;
90
+ }
91
+ default:
92
+ result += "\\";
93
+ break;
94
+ }
95
+ } else {
96
+ result += text[i];
97
+ }
98
+ }
99
+ return result;
100
+ }
101
+
102
+ /**
103
+ * Escapes special characters in a string for DSL output.
104
+ * @param text - The raw string content
105
+ * @returns The escaped string (without surrounding quotes)
106
+ */
107
+ export function escapeString(text: string): string {
108
+ let result = "";
109
+ for (let i = 0; i < text.length; i++) {
110
+ const ch = text[i];
111
+ switch (ch) {
112
+ case "\\":
113
+ result += "\\\\";
114
+ break;
115
+ case '"':
116
+ result += '\\"';
117
+ break;
118
+ case "\n":
119
+ result += "\\n";
120
+ break;
121
+ case "\t":
122
+ result += "\\t";
123
+ break;
124
+ case "\r":
125
+ result += "\\r";
126
+ break;
127
+ case "\b":
128
+ result += "\\b";
129
+ break;
130
+ case "\f":
131
+ result += "\\f";
132
+ break;
133
+ default:
134
+ result += ch;
135
+ }
136
+ }
137
+ return result;
138
+ }
139
+
140
+ /**
141
+ * Wraps a string in double quotes after escaping special characters.
142
+ * @param text - The raw string content
143
+ * @returns The quoted and escaped string
144
+ */
145
+ export function quoteString(text: string): string {
146
+ return `"${escapeString(text)}"`;
147
+ }
@@ -0,0 +1,19 @@
1
+ import { ValidationError } from "../../client/index.js";
2
+
3
+ /** Regex for valid DSL field names: letters, digits, underscores, dots. */
4
+ const FIELD_NAME_RE = /^[a-z_][a-z0-9_.]*$/i;
5
+
6
+ /**
7
+ * Validates a DSL field name to prevent injection via field interpolation.
8
+ * Valid names start with a letter or underscore and contain only letters,
9
+ * digits, underscores, and dots (for nested fields like `authors.first_name`).
10
+ *
11
+ * @param field - The field name to validate
12
+ * @returns void
13
+ * @throws {ValidationError} If the field name contains invalid characters
14
+ */
15
+ export function validateFieldName(field: string): void {
16
+ if (!FIELD_NAME_RE.test(field)) {
17
+ throw new ValidationError(`Invalid field name: ${field}`);
18
+ }
19
+ }
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HTTP MCP server entry for hosted deployment (Streamable HTTP at /mcp).
4
+ * @module http-main
5
+ */
6
+
7
+ import { loadDeploymentConfig } from "./client/deployment-config.js";
8
+ import { startHostedHttpServer } from "./mcp/http-server.js";
9
+
10
+ const deployment = loadDeploymentConfig();
11
+ if (deployment.deploymentMode !== "hosted") {
12
+ console.error("http-main requires DEPLOYMENT_MODE=hosted");
13
+ process.exit(1);
14
+ }
15
+
16
+ const { close, ready } = startHostedHttpServer({
17
+ hosted: deployment,
18
+ port: deployment.httpPort,
19
+ });
20
+
21
+ ready
22
+ .then((port) => {
23
+ console.error(`Dimensions Analytics MCP HTTP server listening on port ${port}`);
24
+ })
25
+ .catch((error: unknown) => {
26
+ const message = error instanceof Error ? error.message : String(error);
27
+ console.error(`Failed to start HTTP server: ${message}`);
28
+ process.exit(1);
29
+ });
30
+
31
+ async function shutdown(): Promise<void> {
32
+ await close();
33
+ process.exit(0);
34
+ }
35
+
36
+ process.on("SIGTERM", () => {
37
+ void shutdown();
38
+ });
39
+ process.on("SIGINT", () => {
40
+ void shutdown();
41
+ });
package/src/index.ts ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @digital-science-dsl/dimensions-analytics-mcp - Dimensions Analytics MCP server for Dimensions Analytics API.
3
+ * @module @digital-science-dsl/dimensions-analytics-mcp
4
+ */
5
+
6
+ export type { SchemaStore } from "./dsl/schema/index.js";
7
+ export type { SchemaContext } from "./mcp/schema/context.js";
8
+ export {
9
+ createMcpServerAsync,
10
+ type McpServerConfig,
11
+ type McpServerHandle,
12
+ startMcpServer,
13
+ } from "./mcp/server.js";
14
+ export { type McpLogLevel, mcpLog } from "./mcp/utils.js";
package/src/main.ts ADDED
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * MCP server entry point.
4
+ * Starts the Dimensions Analytics MCP server with stdio transport.
5
+ * @module main
6
+ */
7
+
8
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
+ import { createMcpServerAsync } from "./mcp/server.js";
10
+
11
+ let close: () => Promise<void>;
12
+
13
+ try {
14
+ const { server } = await createMcpServerAsync();
15
+
16
+ const transport = new StdioServerTransport();
17
+
18
+ server.server.onerror = (error: Error) => console.error(`MCP server error: ${error.message}`);
19
+ server.server.onclose = () => {
20
+ process.exit(0);
21
+ };
22
+
23
+ await server.connect(transport);
24
+
25
+ close = async () => {
26
+ await server.close();
27
+ };
28
+ } catch (error: unknown) {
29
+ const message = error instanceof Error ? error.message : String(error);
30
+ console.error(`Failed to start MCP server: ${message}`);
31
+ process.exit(1);
32
+ }
33
+
34
+ const shutdown = async () => {
35
+ await close();
36
+ process.exit(0);
37
+ };
38
+
39
+ process.on("SIGTERM", shutdown);
40
+ process.on("SIGINT", shutdown);