@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
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@digital-science-dsl/dimensions-analytics-mcp",
3
+ "version": "0.5.3",
4
+ "description": "Dimensions Analytics MCP server for Dimensions DSL querying",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "bin": {
9
+ "dimensions-analytics-mcp": "bin/dimensions-analytics-mcp.js",
10
+ "dimensions-analytics-mcp-http": "bin/dimensions-analytics-mcp-http.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "import": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ }
17
+ },
18
+ "dependencies": {
19
+ "@modelcontextprotocol/sdk": "^1.27.0",
20
+ "zod": "4.3.6"
21
+ },
22
+ "devDependencies": {
23
+ "@types/express": "^5.0.0",
24
+ "fast-check": "^4.6.0",
25
+ "typescript": "^5.9.3"
26
+ },
27
+ "publishConfig": {
28
+ "registry": "https://registry.npmjs.org",
29
+ "access": "public"
30
+ },
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/digital-science/dimensions-analytics-mcp.git",
34
+ "directory": "apps/mcp"
35
+ },
36
+ "license": "MIT",
37
+ "scripts": {
38
+ "build": "tsc && node -e \"const fs=require('fs');for (const f of ['dist/main.js','dist/http-main.js','bin/dimensions-analytics-mcp.js','bin/dimensions-analytics-mcp-http.js']) { if (!fs.existsSync(f)) continue; const c=fs.readFileSync(f,'utf8'); if (!c.startsWith('#!')) fs.writeFileSync(f,'#!/usr/bin/env node\\n'+c); }\" && chmod +x dist/main.js dist/http-main.js bin/dimensions-analytics-mcp.js bin/dimensions-analytics-mcp-http.js",
39
+ "typecheck": "tsc --noEmit"
40
+ }
41
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Configuration loaders for JWT AuthConfig.
3
+ * @module client/auth/config-loaders
4
+ */
5
+
6
+ import { readFileSync } from "node:fs";
7
+ import { ValidationError } from "../errors.js";
8
+ import { JwtAuthConfigSchema } from "./schemas.js";
9
+ import type { AuthConfig, JwtAuthConfig } from "./types.js";
10
+
11
+ /** Options for loading config from environment variables. */
12
+ export interface FromEnvOptions {
13
+ /** Env prefix (default `DIMENSIONS` → `DIMENSIONS_API_KEY`) */
14
+ prefix?: string;
15
+ }
16
+
17
+ /**
18
+ * Load JWT auth config from environment variables.
19
+ * @param type - Must be `"jwt"`
20
+ * @param options - Optional env prefix
21
+ * @returns Validated JwtAuthConfig
22
+ */
23
+ export function fromEnv(type: "jwt", options?: FromEnvOptions): JwtAuthConfig {
24
+ if (type !== "jwt") {
25
+ throw new ValidationError("Only JWT auth is supported");
26
+ }
27
+
28
+ const envPrefix = options?.prefix ?? "DIMENSIONS";
29
+ const apiKey = process.env[`${envPrefix}_API_KEY`];
30
+ if (!apiKey) {
31
+ throw new ValidationError(`Missing required environment variable: ${envPrefix}_API_KEY`);
32
+ }
33
+
34
+ const authUrl = process.env[`${envPrefix}_AUTH_URL`];
35
+ const tokenCacheDuration = process.env[`${envPrefix}_TOKEN_CACHE_DURATION`];
36
+ const timeout = process.env[`${envPrefix}_TIMEOUT`];
37
+
38
+ return {
39
+ type: "jwt",
40
+ apiKey,
41
+ ...(authUrl && { authUrl }),
42
+ ...(tokenCacheDuration && {
43
+ tokenCacheDuration: Number.parseInt(tokenCacheDuration, 10),
44
+ }),
45
+ ...(timeout && { timeout: Number.parseInt(timeout, 10) }),
46
+ };
47
+ }
48
+
49
+ /** Load JWT auth config from a JSON file. */
50
+ export function fromPath(filePath: string): AuthConfig {
51
+ let fileContent: string;
52
+ try {
53
+ fileContent = readFileSync(filePath, "utf-8");
54
+ } catch (error) {
55
+ throw new ValidationError(`Failed to read config file: ${filePath}`, {
56
+ cause: error instanceof Error ? error.message : String(error),
57
+ });
58
+ }
59
+
60
+ let parsed: unknown;
61
+ try {
62
+ parsed = JSON.parse(fileContent);
63
+ } catch (error) {
64
+ throw new ValidationError(`Invalid JSON in config file: ${filePath}`, {
65
+ cause: error instanceof Error ? error.message : String(error),
66
+ });
67
+ }
68
+
69
+ return fromObject(parsed);
70
+ }
71
+
72
+ /** Validate and return JWT auth config from an object. */
73
+ export function fromObject(obj: unknown): AuthConfig {
74
+ const parseResult = JwtAuthConfigSchema.safeParse(obj);
75
+ if (!parseResult.success) {
76
+ throw new ValidationError(`Invalid auth configuration: ${parseResult.error.message}`, {
77
+ issues: parseResult.error.issues,
78
+ });
79
+ }
80
+ return parseResult.data;
81
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Auth provider decorators.
3
+ * @module core/auth/decorators
4
+ */
5
+
6
+ export type { CachingOptions } from "./with-caching.js";
7
+ export { withCaching } from "./with-caching.js";
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Caching decorator for AuthProvider.
3
+ * @module core/auth/decorators/with-caching
4
+ */
5
+
6
+ import type { AuthConfig, AuthProvider } from "../types.js";
7
+
8
+ /**
9
+ * Configuration options for the caching decorator.
10
+ */
11
+ export interface CachingOptions {
12
+ /**
13
+ * Cache duration in milliseconds.
14
+ * Headers will be refreshed after this time.
15
+ * @default 3600000 (1 hour)
16
+ */
17
+ cacheDurationMs?: number;
18
+
19
+ /**
20
+ * Buffer before expiry to trigger refresh, as a decimal (0-1).
21
+ * E.g., 0.1 means refresh when 90% of TTL has passed.
22
+ * @default 0.1
23
+ */
24
+ expiryBuffer?: number;
25
+
26
+ /**
27
+ * Initial backoff delay in milliseconds after a failed fetch.
28
+ * Grows exponentially on consecutive failures up to {@link failureBackoffMaxMs}.
29
+ * @default 1000
30
+ */
31
+ failureBackoffMs?: number;
32
+
33
+ /**
34
+ * Maximum backoff delay in milliseconds. Caps exponential growth.
35
+ * @default 60000
36
+ */
37
+ failureBackoffMaxMs?: number;
38
+
39
+ /**
40
+ * Multiplication factor applied to the base delay on each consecutive failure.
41
+ * Set to 1 for flat (non-exponential) backoff.
42
+ * @default 2
43
+ */
44
+ failureBackoffFactor?: number;
45
+
46
+ /**
47
+ * Jitter as a fraction of the computed delay (0–1), e.g. 0.1 = ±10%.
48
+ * Prevents thundering herd by spreading retry times across clients.
49
+ * Set to 0 for deterministic delays (useful in tests).
50
+ * @default 0.1
51
+ */
52
+ failureBackoffJitter?: number;
53
+ }
54
+
55
+ /** Default cache duration: 1 hour */
56
+ const DEFAULT_CACHE_DURATION_MS = 3600000;
57
+
58
+ /** Default expiry buffer: 10% */
59
+ const DEFAULT_EXPIRY_BUFFER = 0.1;
60
+
61
+ /** Default failure backoff: 1 second */
62
+ const DEFAULT_FAILURE_BACKOFF_MS = 1000;
63
+
64
+ /** Default max backoff delay: 60 seconds */
65
+ const DEFAULT_FAILURE_BACKOFF_MAX_MS = 60_000;
66
+
67
+ /** Default backoff multiplication factor */
68
+ const DEFAULT_FAILURE_BACKOFF_FACTOR = 2;
69
+
70
+ /** Default jitter fraction: ±10% */
71
+ const DEFAULT_FAILURE_BACKOFF_JITTER = 0.1;
72
+
73
+ /**
74
+ * Wraps an AuthProvider with caching behavior.
75
+ *
76
+ * Features:
77
+ * - Caches getHeaders() results with configurable TTL
78
+ * - Deduplicates concurrent calls (reuses in-flight promise)
79
+ * - Calls underlying provider's getHeaders() when cache expires
80
+ * - Propagates errors (no stale fallback)
81
+ * - Implements exponential backoff with jitter after failures to prevent thundering herd
82
+ *
83
+ * @param provider - The AuthProvider to wrap
84
+ * @param options - Caching configuration
85
+ * @returns A new AuthProvider with caching behavior
86
+ *
87
+ * @example
88
+ * ```typescript
89
+ * const baseProvider = new JwtAuthProvider(config);
90
+ * const cachedProvider = withCaching(baseProvider, {
91
+ * cacheDurationMs: 3600000, // 1 hour
92
+ * expiryBuffer: 0.1, // Refresh at 90% of TTL
93
+ * failureBackoffMs: 1000, // Initial backoff: 1s
94
+ * failureBackoffMaxMs: 60000, // Cap at 60s
95
+ * failureBackoffFactor: 2, // Double each failure: 1s, 2s, 4s, 8s...
96
+ * failureBackoffJitter: 0.1, // ±10% jitter
97
+ * });
98
+ *
99
+ * // First call fetches headers
100
+ * const headers1 = await cachedProvider.getHeaders();
101
+ *
102
+ * // Subsequent calls return cached value
103
+ * const headers2 = await cachedProvider.getHeaders();
104
+ * ```
105
+ */
106
+ export function withCaching(provider: AuthProvider, options?: CachingOptions): AuthProvider {
107
+ const cacheDurationMs = options?.cacheDurationMs ?? DEFAULT_CACHE_DURATION_MS;
108
+ const expiryBuffer = options?.expiryBuffer ?? DEFAULT_EXPIRY_BUFFER;
109
+ const failureBackoffMs = options?.failureBackoffMs ?? DEFAULT_FAILURE_BACKOFF_MS;
110
+ const failureBackoffMaxMs = options?.failureBackoffMaxMs ?? DEFAULT_FAILURE_BACKOFF_MAX_MS;
111
+ const failureBackoffFactor = options?.failureBackoffFactor ?? DEFAULT_FAILURE_BACKOFF_FACTOR;
112
+ const failureBackoffJitter = options?.failureBackoffJitter ?? DEFAULT_FAILURE_BACKOFF_JITTER;
113
+
114
+ let cachedHeaders: Record<string, string> | null = null;
115
+ let cacheExpiry = 0;
116
+ let refreshPromise: Promise<Record<string, string>> | null = null;
117
+ let failureCount = 0;
118
+ let backoffDeadline = 0;
119
+
120
+ /**
121
+ * Calculate the effective expiry time with buffer.
122
+ * @param durationMs - Full cache duration
123
+ * @returns Expiry timestamp with buffer applied
124
+ */
125
+ const calculateExpiry = (durationMs: number): number => {
126
+ // Buffer is at least 1 minute, but never more than 90% of duration
127
+ const bufferMs = Math.min(Math.max(durationMs * expiryBuffer, 60000), durationMs * 0.9);
128
+ return Date.now() + durationMs - bufferMs;
129
+ };
130
+
131
+ /**
132
+ * Calculates the backoff delay for a given consecutive failure count.
133
+ * Uses exponential backoff with multiplicative jitter.
134
+ * @param count - Number of consecutive failures (must be >= 1)
135
+ * @returns Delay in milliseconds
136
+ */
137
+ const calculateBackoffDelay = (count: number): number => {
138
+ const base = Math.min(
139
+ failureBackoffMs * failureBackoffFactor ** (count - 1),
140
+ failureBackoffMaxMs,
141
+ );
142
+ const jittered = base * (1 + (Math.random() - 0.5) * 2 * failureBackoffJitter);
143
+ return Math.max(0, jittered);
144
+ };
145
+
146
+ /**
147
+ * Check if we're in a backoff period after a failure.
148
+ * @returns True if still in backoff period
149
+ */
150
+ const isInBackoffPeriod = (): boolean => {
151
+ if (backoffDeadline === 0) return false;
152
+ return Date.now() < backoffDeadline;
153
+ };
154
+
155
+ /**
156
+ * Fetch fresh headers from the underlying provider.
157
+ *
158
+ * Calls getHeaders() directly rather than refresh() + getHeaders().
159
+ * The provider's getHeaders() is self-sufficient (fetches a token when
160
+ * needed), so an explicit refresh() is unnecessary and creates a race
161
+ * window where invalidate() between the two calls triggers a redundant
162
+ * token fetch.
163
+ *
164
+ * @returns Fresh headers
165
+ */
166
+ const fetchHeaders = async (): Promise<Record<string, string>> => {
167
+ try {
168
+ const headers = await provider.getHeaders();
169
+ cachedHeaders = headers;
170
+ cacheExpiry = calculateExpiry(cacheDurationMs);
171
+ failureCount = 0;
172
+ backoffDeadline = 0;
173
+ return headers;
174
+ } catch (error) {
175
+ failureCount += 1;
176
+ backoffDeadline = Date.now() + calculateBackoffDelay(failureCount);
177
+ throw error;
178
+ }
179
+ };
180
+
181
+ const wrapper = {
182
+ get type(): AuthConfig["type"] {
183
+ return provider.type;
184
+ },
185
+
186
+ async initialize(): Promise<void> {
187
+ await provider.initialize();
188
+ },
189
+
190
+ async getHeaders(): Promise<Record<string, string>> {
191
+ // Return cached headers if valid
192
+ if (cachedHeaders && Date.now() < cacheExpiry) {
193
+ return cachedHeaders;
194
+ }
195
+
196
+ // If already refreshing, wait for that promise
197
+ if (refreshPromise) {
198
+ return refreshPromise;
199
+ }
200
+
201
+ // Check backoff period - if in backoff, rethrow if no cache
202
+ if (isInBackoffPeriod()) {
203
+ if (cachedHeaders) {
204
+ // Return stale cache during backoff rather than failing
205
+ return cachedHeaders;
206
+ }
207
+ // No cache available and in backoff - we must try anyway
208
+ }
209
+
210
+ // Fetch new headers
211
+ refreshPromise = fetchHeaders();
212
+ try {
213
+ return await refreshPromise;
214
+ } finally {
215
+ refreshPromise = null;
216
+ }
217
+ },
218
+
219
+ async refresh(): Promise<void> {
220
+ cachedHeaders = null;
221
+ cacheExpiry = 0;
222
+ failureCount = 0;
223
+ backoffDeadline = 0;
224
+ await provider.refresh();
225
+ },
226
+
227
+ invalidate(): void {
228
+ cachedHeaders = null;
229
+ cacheExpiry = 0;
230
+ failureCount = 0;
231
+ backoffDeadline = 0;
232
+ provider.invalidate();
233
+ },
234
+ };
235
+
236
+ return wrapper;
237
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Factory function for creating JWT AuthProvider instances.
3
+ * @module client/auth/factory
4
+ */
5
+
6
+ import { ValidationError } from "../errors.js";
7
+ import { withCaching } from "./decorators/index.js";
8
+ import { JwtAuthProvider } from "./providers/jwt-auth-provider.js";
9
+ import { JwtAuthConfigSchema } from "./schemas.js";
10
+ import type { AuthProvider, JwtAuthConfig } from "./types.js";
11
+
12
+ /** Default token cache duration for JWT: 1 hour */
13
+ const DEFAULT_TOKEN_CACHE_DURATION_MS = 3600000;
14
+
15
+ /**
16
+ * Creates a JWT AuthProvider with token caching.
17
+ * @param config - JWT authentication configuration
18
+ * @returns Configured AuthProvider instance
19
+ * @throws {ValidationError} If the configuration is invalid
20
+ */
21
+ export function createAuthProvider(config: JwtAuthConfig): AuthProvider {
22
+ const parseResult = JwtAuthConfigSchema.safeParse(config);
23
+ if (!parseResult.success) {
24
+ throw new ValidationError(`Invalid auth configuration: ${parseResult.error.message}`, {
25
+ issues: parseResult.error.issues,
26
+ });
27
+ }
28
+
29
+ const validConfig = parseResult.data;
30
+ const jwtProvider = new JwtAuthProvider(validConfig);
31
+ const cacheDurationMs =
32
+ (validConfig.tokenCacheDuration ?? 3600) * 1000 || DEFAULT_TOKEN_CACHE_DURATION_MS;
33
+ return withCaching(jwtProvider, { cacheDurationMs });
34
+ }
@@ -0,0 +1,6 @@
1
+ export { fromEnv, fromObject, fromPath } from "./config-loaders.js";
2
+ export { createAuthProvider } from "./factory.js";
3
+ export { JwtAuthProvider } from "./providers/jwt-auth-provider.js";
4
+ export { AuthResponseSchema, JwtAuthConfigSchema } from "./schemas.js";
5
+ export type { AuthConfig, AuthProvider, JwtAuthConfig } from "./types.js";
6
+ export { isJwtAuthConfig } from "./types.js";
@@ -0,0 +1,36 @@
1
+ /**
2
+ * JWT structure validation for Dimensions auth responses.
3
+ * @module client/auth/jwt-utils
4
+ */
5
+
6
+ import { AuthenticationError } from "../errors.js";
7
+
8
+ const JWT_SEGMENT = /^[A-Za-z0-9_-]+$/;
9
+
10
+ /**
11
+ * Validates a JWT has three base64url segments.
12
+ * @param token - Raw token from auth response
13
+ * @returns The token string
14
+ * @throws {AuthenticationError} When structure is invalid
15
+ */
16
+ export function validateJwtStructure(token: unknown): string {
17
+ if (typeof token !== "string") {
18
+ throw new AuthenticationError("Invalid token: expected string");
19
+ }
20
+ const parts = token.split(".");
21
+ if (parts.length !== 3 || parts.some((part) => !part || !JWT_SEGMENT.test(part))) {
22
+ throw new AuthenticationError("Invalid JWT structure");
23
+ }
24
+ return token;
25
+ }
26
+
27
+ /**
28
+ * Decodes the JWT payload (middle segment) without signature verification.
29
+ * Use only for tokens returned by a trusted auth.json endpoint.
30
+ */
31
+ export function decodeJwtPayload(token: string): Record<string, unknown> {
32
+ const validated = validateJwtStructure(token);
33
+ const payloadSegment = validated.split(".")[1];
34
+ const json = Buffer.from(payloadSegment, "base64url").toString("utf8");
35
+ return JSON.parse(json) as Record<string, unknown>;
36
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Node.js-only auth config loaders.
3
+ *
4
+ * These utilities read credentials from the filesystem and environment variables.
5
+ * They depend on `node:fs` and must not be imported in browser/edge contexts.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { fromEnv, fromPath } from "./node.js";
10
+ * ```
11
+ *
12
+ * @module core/auth/node
13
+ */
14
+
15
+ export type { FromEnvOptions } from "./config-loaders.js";
16
+ export { fromEnv, fromObject, fromPath } from "./config-loaders.js";
@@ -0,0 +1 @@
1
+ export { JwtAuthProvider } from "./jwt-auth-provider.js";
@@ -0,0 +1,153 @@
1
+ /**
2
+ * JWT authentication provider for Dimensions API.
3
+ * @module core/auth/providers/jwt-auth-provider
4
+ */
5
+
6
+ import { AuthenticationError, NetworkError, sanitizeErrorMessage } from "../../errors.js";
7
+ import { validateJwtStructure } from "../jwt-utils.js";
8
+ import { AuthResponseSchema } from "../schemas.js";
9
+ import type { AuthProvider, JwtAuthConfig } from "../types.js";
10
+
11
+ /** Default auth endpoint URL */
12
+ const DEFAULT_AUTH_URL = "https://app.dimensions.ai/api/auth.json";
13
+
14
+ /** Default request timeout in milliseconds */
15
+ const DEFAULT_TIMEOUT = 30000;
16
+
17
+ /**
18
+ * Authentication provider using JWT tokens from Dimensions API.
19
+ * Exchanges an API key for a short-lived JWT token.
20
+ *
21
+ * Note: This provider does NOT cache tokens internally. Use the withCaching()
22
+ * decorator if caching is needed.
23
+ *
24
+ * @example
25
+ * ```typescript
26
+ * import { JwtAuthProvider } from "../../index.js";
27
+ * import { withCaching } from "../../index.js";
28
+ *
29
+ * const provider = new JwtAuthProvider({
30
+ * type: 'jwt',
31
+ * apiKey: 'your-api-key'
32
+ * });
33
+ *
34
+ * // Wrap with caching for production use
35
+ * const cachedProvider = withCaching(provider, {
36
+ * cacheDurationMs: 3600000 // 1 hour
37
+ * });
38
+ *
39
+ * const headers = await cachedProvider.getHeaders();
40
+ * // { Authorization: 'JWT eyJ...' }
41
+ * ```
42
+ */
43
+ export class JwtAuthProvider implements AuthProvider {
44
+ readonly type = "jwt" as const;
45
+
46
+ private readonly apiKey: string;
47
+ private readonly authUrl: string;
48
+ private readonly timeout: number;
49
+
50
+ private currentToken: string | null = null;
51
+ private initialized = false;
52
+
53
+ /**
54
+ * Creates a new JwtAuthProvider.
55
+ * @param config - JWT auth configuration
56
+ */
57
+ constructor(config: JwtAuthConfig) {
58
+ this.apiKey = config.apiKey;
59
+ this.authUrl = config.authUrl ?? DEFAULT_AUTH_URL;
60
+ this.timeout = config.timeout ?? DEFAULT_TIMEOUT;
61
+ }
62
+
63
+ /**
64
+ * Initialize the provider by fetching an initial token.
65
+ * Called automatically on first getHeaders() if not called explicitly.
66
+ */
67
+ async initialize(): Promise<void> {
68
+ if (this.initialized) {
69
+ return;
70
+ }
71
+ await this.fetchToken();
72
+ this.initialized = true;
73
+ }
74
+
75
+ /**
76
+ * Get the Authorization header with JWT token.
77
+ * Fetches a new token if not initialized.
78
+ * @returns Headers object with Authorization header
79
+ */
80
+ async getHeaders(): Promise<Record<string, string>> {
81
+ if (!this.currentToken) {
82
+ await this.fetchToken();
83
+ }
84
+ return {
85
+ Authorization: `JWT ${this.currentToken}`,
86
+ };
87
+ }
88
+
89
+ /**
90
+ * Force refresh of the JWT token by fetching a new one.
91
+ */
92
+ async refresh(): Promise<void> {
93
+ await this.fetchToken();
94
+ }
95
+
96
+ /**
97
+ * Invalidate the current token, forcing a refresh on next getHeaders().
98
+ */
99
+ invalidate(): void {
100
+ this.currentToken = null;
101
+ this.initialized = false;
102
+ }
103
+
104
+ /**
105
+ * Fetches a new JWT token from the auth endpoint.
106
+ * @throws {AuthenticationError} If authentication fails
107
+ * @throws {NetworkError} If a network error occurs
108
+ */
109
+ private async fetchToken(): Promise<void> {
110
+ const controller = new AbortController();
111
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
112
+
113
+ try {
114
+ const response = await fetch(this.authUrl, {
115
+ method: "POST",
116
+ headers: {
117
+ "Content-Type": "application/json",
118
+ },
119
+ body: JSON.stringify({ key: this.apiKey }),
120
+ signal: controller.signal,
121
+ });
122
+
123
+ if (!response.ok) {
124
+ throw new AuthenticationError(
125
+ `Authentication failed: ${response.status} ${response.statusText}`,
126
+ );
127
+ }
128
+
129
+ const rawData: unknown = await response.json();
130
+ const parseResult = AuthResponseSchema.safeParse(rawData);
131
+
132
+ if (!parseResult.success) {
133
+ throw new AuthenticationError(
134
+ `Invalid authentication response: ${parseResult.error.message}`,
135
+ );
136
+ }
137
+
138
+ // Schema guarantees at least one non-empty token field
139
+ const rawToken = parseResult.data.token || parseResult.data.access_token;
140
+ this.currentToken = validateJwtStructure(rawToken);
141
+ } catch (error) {
142
+ if (error instanceof AuthenticationError) {
143
+ throw error;
144
+ }
145
+ if (error instanceof Error && error.name === "AbortError") {
146
+ throw new NetworkError("Authentication request timeout");
147
+ }
148
+ throw new NetworkError(`Authentication failed: ${sanitizeErrorMessage(error)}`);
149
+ } finally {
150
+ clearTimeout(timeoutId);
151
+ }
152
+ }
153
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Zod schemas for JWT authentication configuration.
3
+ * @module client/auth/schemas
4
+ */
5
+
6
+ import { z } from "zod";
7
+
8
+ /** Zod schema for JWT auth configuration. */
9
+ export const JwtAuthConfigSchema = z.object({
10
+ type: z.literal("jwt"),
11
+ apiKey: z.string().min(1, "API key is required"),
12
+ authUrl: z.string().url().optional(),
13
+ tokenCacheDuration: z.number().positive().optional(),
14
+ timeout: z.number().positive().optional(),
15
+ });
16
+
17
+ /** Zod schema for authentication API response. */
18
+ export const AuthResponseSchema = z
19
+ .object({
20
+ token: z.string().min(1, "token must be a non-empty string").optional(),
21
+ access_token: z.string().min(1, "access_token must be a non-empty string").optional(),
22
+ })
23
+ .refine((data) => data.token || data.access_token, {
24
+ message: "Either 'token' or 'access_token' field is required with a non-empty value",
25
+ });
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Authentication provider types for Dimensions API key → JWT exchange.
3
+ * @module client/auth/types
4
+ */
5
+
6
+ /** Base interface for authentication providers. */
7
+ export interface AuthProvider {
8
+ readonly type: AuthConfig["type"];
9
+ initialize(): Promise<void>;
10
+ getHeaders(): Promise<Record<string, string>>;
11
+ refresh(): Promise<void>;
12
+ invalidate(): void;
13
+ }
14
+
15
+ /** JWT auth configuration (Dimensions API key). */
16
+ export type AuthConfig = JwtAuthConfig;
17
+
18
+ /** Configuration for JWT-based authentication with Dimensions API. */
19
+ export interface JwtAuthConfig {
20
+ readonly type: "jwt";
21
+ readonly apiKey: string;
22
+ readonly authUrl?: string;
23
+ readonly tokenCacheDuration?: number;
24
+ readonly timeout?: number;
25
+ }
26
+
27
+ /** Type guard for JWT auth configuration. */
28
+ export function isJwtAuthConfig(config: AuthConfig): config is JwtAuthConfig {
29
+ return config.type === "jwt";
30
+ }