@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/CHANGELOG.md ADDED
@@ -0,0 +1,61 @@
1
+ # Changelog
2
+
3
+ ## 0.5.3
4
+
5
+ Republish on public npm after package unpublish (0.5.2 cannot be re-used).
6
+
7
+ ## 0.5.2
8
+
9
+ ### Packaging
10
+
11
+ - Resolve `catalog:` dependencies in published npm manifest (use `pnpm pack` + `npm publish` tarball)
12
+
13
+ ## 0.5.1
14
+
15
+ ### Packaging
16
+
17
+ - Fix npm publish stripping CLI `bin` entries (wrappers under `bin/` per npm 11)
18
+
19
+ ## 0.5.0
20
+
21
+ ### Tool surface
22
+
23
+ - Remove dedicated MCP tools: KWQ (`build_query`, `ensemble_queries`), NLP (`classify_text`, `extract_concepts`), similarity search, profile lookup, `recent_high_impact`
24
+ - Keep `extract_affiliations`, `extract_grants`; classify/extract/similar remain available via **`execute_dsl`**
25
+
26
+ ### Packaging & install
27
+
28
+ - Rename npm package to `@digital-science-dsl/dimensions-analytics-mcp` (was `@digital-science/dsl-mcp`)
29
+ - Rename CLIs to `dimensions-analytics-mcp` and `dimensions-analytics-mcp-http`
30
+ - Publish to public npm; guided installer no longer requires a GitHub token
31
+ - Add `docs/IDENTIFIERS.md` mapping product name to technical names
32
+
33
+ ### Hosted deployment
34
+
35
+ - Add Streamable HTTP entrypoint (`dimensions-analytics-mcp-http`) at `POST /mcp` with `GET /health`
36
+ - Add dsl-service adapter (`POST /query`, JSON body, service basic-auth, `X-DIMENSIONS-USER`)
37
+ - Add Bearer API key validation via Radar `POST /api/auth.json`
38
+ - Omit `fetch_search_pages` on hosted (local disk export)
39
+ - Schema warmup uses derived identity `mcp@<DSL_HOST>` (no bootstrap env var)
40
+ - Docker image (`apps/mcp/Dockerfile`) and Kubernetes example (`deploy/kubernetes/dsl-mcp.yaml`) — **moved to `dimensions-analytics-mcp-deploy` repo**
41
+
42
+ ### Testing & CI
43
+
44
+ - Mock hosted e2e tests (default CI, no secrets)
45
+ - Nightly/manual integration workflow for live stdio and hosted smoke
46
+ - Docker build/push workflow — **`dimensions-analytics-mcp-deploy` repo**
47
+
48
+ ## 0.4.0
49
+
50
+ - Pagination on `search_*` (`skip`, `page`, metadata)
51
+ - `fetch_search_pages` tool: page, aggregate, and file export modes (JSONL + CSV)
52
+ - Reasonable-use policy guardrails (`dimensions://schema/policy`, `confirmLargeFetch`)
53
+ - Per-source example resources: `dimensions://examples/{source}`
54
+
55
+ ## 0.3.0
56
+
57
+ - Consolidate monorepo into single `@digital-science/dsl-mcp` package (`apps/mcp` only)
58
+
59
+ ## 0.1.0
60
+
61
+ Initial release from [digital-science/dimensions-analytics-mcp](https://github.com/digital-science/dimensions-analytics-mcp) as npm package `@digital-science/dsl-mcp`.
package/README.md ADDED
@@ -0,0 +1,152 @@
1
+ # Dimensions Analytics MCP
2
+
3
+ Model Context Protocol (MCP) server for the Dimensions Analytics API — enables AI assistants to search and analyze linked research data with the Dimensions DSL.
4
+
5
+ **Transport:** stdio (`dimensions-analytics-mcp`) for local use. A hosted remote option (URL + Bearer token) is **coming soon** — see [Installation — Hosted Dimensions Analytics MCP](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md#hosted-dimensions-analytics-mcp-coming-soon).
6
+
7
+ ## What It Does
8
+
9
+ Dimensions Analytics MCP provides access to Dimensions, the world's largest linked research information database with over 140M publications, grants, patents, clinical trials, and more. It enables Claude and other MCP-compatible AI assistants to search and analyze research data.
10
+
11
+ ## Available Tools
12
+
13
+ ### Search Tools
14
+
15
+ | Tool | Description |
16
+ | ---- | ----------- |
17
+ | `search_publications` | Search research articles, preprints, and books with citation metrics |
18
+ | `search_grants` | Search research grants and funding awards |
19
+ | `search_researchers` | Search researcher profiles with publication counts and affiliations |
20
+ | `search_patents` | Search patents with assignee and filing information |
21
+ | `search_clinical_trials` | Search clinical trials by phase, condition, or status |
22
+ | `search_datasets` | Search research datasets and repositories |
23
+ | `search_policy_documents` | Search policy briefs and government documents |
24
+ | `search_organizations` | Search universities, research institutes, and companies |
25
+ | `fetch_search_pages` | Paginated / batch search (page, aggregate, JSONL/CSV file export) — **local stdio only** |
26
+
27
+ ### Lookup Tools
28
+
29
+ | Tool | Description |
30
+ | ---- | ----------- |
31
+ | `get_by_doi` | Retrieve publication by DOI |
32
+ | `get_by_pmid` | Retrieve publication by PubMed ID |
33
+ | `get_by_id` | Retrieve any entity by Dimensions ID |
34
+
35
+ ### Analytics & Trend Tools
36
+
37
+ | Tool | Description |
38
+ | ---- | ----------- |
39
+ | `aggregate_query` | Numeric aggregation (sum/avg/count) over any entity with grouping |
40
+ | `facet_query` | Facet counts for top values of any field |
41
+ | `citation_trend` | Citation counts over time for a topic or entity |
42
+ | `funding_trend` | Funding awarded over time for a topic or entity |
43
+
44
+ ### Entity Resolution Tools
45
+
46
+ | Tool | Description |
47
+ | ---- | ----------- |
48
+ | `extract_affiliations` | Resolve organization affiliations to GRID/ROR identifiers |
49
+ | `extract_grants` | Resolve grant numbers to full grant records |
50
+ | `execute_dsl` | Execute raw Dimensions DSL queries (includes classify, extract concepts, similarity, etc.) |
51
+
52
+ ### Schema Tools
53
+
54
+ | Tool | Description |
55
+ | ---- | ----------- |
56
+ | `describe_schema` | Summarize live describe schema (sources, entities, limits) |
57
+ | `refresh_schema` | Reload describe schema from the API |
58
+
59
+ ### Removed in 0.5.0
60
+
61
+ Dedicated MCP tools for KWQ (`build_query`, `ensemble_queries`), NLP (`classify_text`, `extract_concepts`), similarity search, profile lookup, and `recent_high_impact` were removed. Use **`execute_dsl`** for those DSL capabilities.
62
+
63
+ ## Quick Start
64
+
65
+ **Easiest** — one-line install (no clone required):
66
+
67
+ ```bash
68
+ curl -fsSL https://raw.githubusercontent.com/digital-science/dimensions-analytics-mcp/main/scripts/install.sh | bash
69
+ ```
70
+
71
+ ```powershell
72
+ irm https://raw.githubusercontent.com/digital-science/dimensions-analytics-mcp/main/scripts/install.ps1 | iex
73
+ ```
74
+
75
+ See [Installation](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md) for manual setup.
76
+
77
+ ### Build from source (developers)
78
+
79
+ ```bash
80
+ pnpm install
81
+ pnpm run build
82
+ export DIMENSIONS_API_KEY=your-key
83
+ node apps/mcp/dist/main.js # stdio
84
+ ```
85
+
86
+ ### Claude Desktop (stdio)
87
+
88
+ ```json
89
+ {
90
+ "mcpServers": {
91
+ "dimensions": {
92
+ "command": "node",
93
+ "args": ["/path/to/dimensions-analytics-mcp/apps/mcp/dist/main.js"],
94
+ "env": {
95
+ "DIMENSIONS_API_KEY": "your-api-key"
96
+ }
97
+ }
98
+ }
99
+ }
100
+ ```
101
+
102
+ ### Hosted remote MCP (coming soon)
103
+
104
+ A hosted Dimensions Analytics MCP endpoint (URL + Bearer token, no local install) is **not available yet**. We will announce it in the near future. See [Installation — Hosted Dimensions Analytics MCP](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md#hosted-dimensions-analytics-mcp-coming-soon).
105
+
106
+ ## Examples and usage
107
+
108
+ **[Usage guide](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/USAGE.md)** — workflows, JSON tool examples, DSL snippets, and natural-language prompts.
109
+
110
+ Quick prompt examples:
111
+
112
+ ```text
113
+ Find the top 10 most-cited publications about CRISPR from the last 5 years
114
+ ```
115
+
116
+ ```text
117
+ Facet journals for "quantum computing" publications since 2020
118
+ ```
119
+
120
+ ## Documentation
121
+
122
+ **This package**
123
+
124
+ - [Usage guide](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/USAGE.md) — **start here** for examples
125
+ - [Deployment](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/DEPLOYMENT.md) — local stdio setup; hosted option (coming soon)
126
+ - [Configuration](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/CONFIGURATION.md) — env vars
127
+ - [MCP field aliases](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/MCP_FIELD_ALIASES.md) — alias reference for tool users
128
+
129
+ **Repository** ([dimensions-analytics-mcp](https://github.com/digital-science/dimensions-analytics-mcp))
130
+
131
+ - [Root README](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/README.md)
132
+ - [Installation](https://github.com/digital-science/dimensions-analytics-mcp/blob/main/docs/INSTALLATION.md)
133
+
134
+ **External**
135
+
136
+ - [Dimensions API Docs](https://docs.dimensions.ai/)
137
+ - [Model Context Protocol spec](https://modelcontextprotocol.io/)
138
+
139
+ ## Development
140
+
141
+ ```bash
142
+ pnpm install # from repo root
143
+ pnpm run build
144
+
145
+ pnpm run test # unit + mock hosted e2e
146
+ pnpm run integration:smoke # live stdio smoke (DIMENSIONS_API_KEY)
147
+ pnpm run typecheck
148
+ ```
149
+
150
+ ## License
151
+
152
+ MIT
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/http-main.js";
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ import "../dist/main.js";
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Configuration loaders for JWT AuthConfig.
3
+ * @module client/auth/config-loaders
4
+ */
5
+ import type { AuthConfig, JwtAuthConfig } from "./types.js";
6
+ /** Options for loading config from environment variables. */
7
+ export interface FromEnvOptions {
8
+ /** Env prefix (default `DIMENSIONS` → `DIMENSIONS_API_KEY`) */
9
+ prefix?: string;
10
+ }
11
+ /**
12
+ * Load JWT auth config from environment variables.
13
+ * @param type - Must be `"jwt"`
14
+ * @param options - Optional env prefix
15
+ * @returns Validated JwtAuthConfig
16
+ */
17
+ export declare function fromEnv(type: "jwt", options?: FromEnvOptions): JwtAuthConfig;
18
+ /** Load JWT auth config from a JSON file. */
19
+ export declare function fromPath(filePath: string): AuthConfig;
20
+ /** Validate and return JWT auth config from an object. */
21
+ export declare function fromObject(obj: unknown): AuthConfig;
22
+ //# sourceMappingURL=config-loaders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loaders.d.ts","sourceRoot":"","sources":["../../../src/client/auth/config-loaders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,aAAa,CAwB5E;AAED,6CAA6C;AAC7C,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAoBrD;AAED,0DAA0D;AAC1D,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAQnD"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Configuration loaders for JWT AuthConfig.
3
+ * @module client/auth/config-loaders
4
+ */
5
+ import { readFileSync } from "node:fs";
6
+ import { ValidationError } from "../errors.js";
7
+ import { JwtAuthConfigSchema } from "./schemas.js";
8
+ /**
9
+ * Load JWT auth config from environment variables.
10
+ * @param type - Must be `"jwt"`
11
+ * @param options - Optional env prefix
12
+ * @returns Validated JwtAuthConfig
13
+ */
14
+ export function fromEnv(type, options) {
15
+ if (type !== "jwt") {
16
+ throw new ValidationError("Only JWT auth is supported");
17
+ }
18
+ const envPrefix = options?.prefix ?? "DIMENSIONS";
19
+ const apiKey = process.env[`${envPrefix}_API_KEY`];
20
+ if (!apiKey) {
21
+ throw new ValidationError(`Missing required environment variable: ${envPrefix}_API_KEY`);
22
+ }
23
+ const authUrl = process.env[`${envPrefix}_AUTH_URL`];
24
+ const tokenCacheDuration = process.env[`${envPrefix}_TOKEN_CACHE_DURATION`];
25
+ const timeout = process.env[`${envPrefix}_TIMEOUT`];
26
+ return {
27
+ type: "jwt",
28
+ apiKey,
29
+ ...(authUrl && { authUrl }),
30
+ ...(tokenCacheDuration && {
31
+ tokenCacheDuration: Number.parseInt(tokenCacheDuration, 10),
32
+ }),
33
+ ...(timeout && { timeout: Number.parseInt(timeout, 10) }),
34
+ };
35
+ }
36
+ /** Load JWT auth config from a JSON file. */
37
+ export function fromPath(filePath) {
38
+ let fileContent;
39
+ try {
40
+ fileContent = readFileSync(filePath, "utf-8");
41
+ }
42
+ catch (error) {
43
+ throw new ValidationError(`Failed to read config file: ${filePath}`, {
44
+ cause: error instanceof Error ? error.message : String(error),
45
+ });
46
+ }
47
+ let parsed;
48
+ try {
49
+ parsed = JSON.parse(fileContent);
50
+ }
51
+ catch (error) {
52
+ throw new ValidationError(`Invalid JSON in config file: ${filePath}`, {
53
+ cause: error instanceof Error ? error.message : String(error),
54
+ });
55
+ }
56
+ return fromObject(parsed);
57
+ }
58
+ /** Validate and return JWT auth config from an object. */
59
+ export function fromObject(obj) {
60
+ const parseResult = JwtAuthConfigSchema.safeParse(obj);
61
+ if (!parseResult.success) {
62
+ throw new ValidationError(`Invalid auth configuration: ${parseResult.error.message}`, {
63
+ issues: parseResult.error.issues,
64
+ });
65
+ }
66
+ return parseResult.data;
67
+ }
68
+ //# sourceMappingURL=config-loaders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loaders.js","sourceRoot":"","sources":["../../../src/client/auth/config-loaders.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AASnD;;;;;GAKG;AACH,MAAM,UAAU,OAAO,CAAC,IAAW,EAAE,OAAwB;IAC3D,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,eAAe,CAAC,4BAA4B,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,MAAM,IAAI,YAAY,CAAC;IAClD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,eAAe,CAAC,0CAA0C,SAAS,UAAU,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,WAAW,CAAC,CAAC;IACrD,MAAM,kBAAkB,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,uBAAuB,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,SAAS,UAAU,CAAC,CAAC;IAEpD,OAAO;QACL,IAAI,EAAE,KAAK;QACX,MAAM;QACN,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,CAAC;QAC3B,GAAG,CAAC,kBAAkB,IAAI;YACxB,kBAAkB,EAAE,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC5D,CAAC;QACF,GAAG,CAAC,OAAO,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;KAC1D,CAAC;AACJ,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,QAAQ,CAAC,QAAgB;IACvC,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,WAAW,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,+BAA+B,QAAQ,EAAE,EAAE;YACnE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,eAAe,CAAC,gCAAgC,QAAQ,EAAE,EAAE;YACpE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC9D,CAAC,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,+BAA+B,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YACpF,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;SACjC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Auth provider decorators.
3
+ * @module core/auth/decorators
4
+ */
5
+ export type { CachingOptions } from "./with-caching.js";
6
+ export { withCaching } from "./with-caching.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/client/auth/decorators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Auth provider decorators.
3
+ * @module core/auth/decorators
4
+ */
5
+ export { withCaching } from "./with-caching.js";
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/client/auth/decorators/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Caching decorator for AuthProvider.
3
+ * @module core/auth/decorators/with-caching
4
+ */
5
+ import type { AuthProvider } from "../types.js";
6
+ /**
7
+ * Configuration options for the caching decorator.
8
+ */
9
+ export interface CachingOptions {
10
+ /**
11
+ * Cache duration in milliseconds.
12
+ * Headers will be refreshed after this time.
13
+ * @default 3600000 (1 hour)
14
+ */
15
+ cacheDurationMs?: number;
16
+ /**
17
+ * Buffer before expiry to trigger refresh, as a decimal (0-1).
18
+ * E.g., 0.1 means refresh when 90% of TTL has passed.
19
+ * @default 0.1
20
+ */
21
+ expiryBuffer?: number;
22
+ /**
23
+ * Initial backoff delay in milliseconds after a failed fetch.
24
+ * Grows exponentially on consecutive failures up to {@link failureBackoffMaxMs}.
25
+ * @default 1000
26
+ */
27
+ failureBackoffMs?: number;
28
+ /**
29
+ * Maximum backoff delay in milliseconds. Caps exponential growth.
30
+ * @default 60000
31
+ */
32
+ failureBackoffMaxMs?: number;
33
+ /**
34
+ * Multiplication factor applied to the base delay on each consecutive failure.
35
+ * Set to 1 for flat (non-exponential) backoff.
36
+ * @default 2
37
+ */
38
+ failureBackoffFactor?: number;
39
+ /**
40
+ * Jitter as a fraction of the computed delay (0–1), e.g. 0.1 = ±10%.
41
+ * Prevents thundering herd by spreading retry times across clients.
42
+ * Set to 0 for deterministic delays (useful in tests).
43
+ * @default 0.1
44
+ */
45
+ failureBackoffJitter?: number;
46
+ }
47
+ /**
48
+ * Wraps an AuthProvider with caching behavior.
49
+ *
50
+ * Features:
51
+ * - Caches getHeaders() results with configurable TTL
52
+ * - Deduplicates concurrent calls (reuses in-flight promise)
53
+ * - Calls underlying provider's getHeaders() when cache expires
54
+ * - Propagates errors (no stale fallback)
55
+ * - Implements exponential backoff with jitter after failures to prevent thundering herd
56
+ *
57
+ * @param provider - The AuthProvider to wrap
58
+ * @param options - Caching configuration
59
+ * @returns A new AuthProvider with caching behavior
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const baseProvider = new JwtAuthProvider(config);
64
+ * const cachedProvider = withCaching(baseProvider, {
65
+ * cacheDurationMs: 3600000, // 1 hour
66
+ * expiryBuffer: 0.1, // Refresh at 90% of TTL
67
+ * failureBackoffMs: 1000, // Initial backoff: 1s
68
+ * failureBackoffMaxMs: 60000, // Cap at 60s
69
+ * failureBackoffFactor: 2, // Double each failure: 1s, 2s, 4s, 8s...
70
+ * failureBackoffJitter: 0.1, // ±10% jitter
71
+ * });
72
+ *
73
+ * // First call fetches headers
74
+ * const headers1 = await cachedProvider.getHeaders();
75
+ *
76
+ * // Subsequent calls return cached value
77
+ * const headers2 = await cachedProvider.getHeaders();
78
+ * ```
79
+ */
80
+ export declare function withCaching(provider: AuthProvider, options?: CachingOptions): AuthProvider;
81
+ //# sourceMappingURL=with-caching.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-caching.d.ts","sourceRoot":"","sources":["../../../../src/client/auth/decorators/with-caching.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAE9B;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,YAAY,CAmI1F"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Caching decorator for AuthProvider.
3
+ * @module core/auth/decorators/with-caching
4
+ */
5
+ /** Default cache duration: 1 hour */
6
+ const DEFAULT_CACHE_DURATION_MS = 3600000;
7
+ /** Default expiry buffer: 10% */
8
+ const DEFAULT_EXPIRY_BUFFER = 0.1;
9
+ /** Default failure backoff: 1 second */
10
+ const DEFAULT_FAILURE_BACKOFF_MS = 1000;
11
+ /** Default max backoff delay: 60 seconds */
12
+ const DEFAULT_FAILURE_BACKOFF_MAX_MS = 60_000;
13
+ /** Default backoff multiplication factor */
14
+ const DEFAULT_FAILURE_BACKOFF_FACTOR = 2;
15
+ /** Default jitter fraction: ±10% */
16
+ const DEFAULT_FAILURE_BACKOFF_JITTER = 0.1;
17
+ /**
18
+ * Wraps an AuthProvider with caching behavior.
19
+ *
20
+ * Features:
21
+ * - Caches getHeaders() results with configurable TTL
22
+ * - Deduplicates concurrent calls (reuses in-flight promise)
23
+ * - Calls underlying provider's getHeaders() when cache expires
24
+ * - Propagates errors (no stale fallback)
25
+ * - Implements exponential backoff with jitter after failures to prevent thundering herd
26
+ *
27
+ * @param provider - The AuthProvider to wrap
28
+ * @param options - Caching configuration
29
+ * @returns A new AuthProvider with caching behavior
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * const baseProvider = new JwtAuthProvider(config);
34
+ * const cachedProvider = withCaching(baseProvider, {
35
+ * cacheDurationMs: 3600000, // 1 hour
36
+ * expiryBuffer: 0.1, // Refresh at 90% of TTL
37
+ * failureBackoffMs: 1000, // Initial backoff: 1s
38
+ * failureBackoffMaxMs: 60000, // Cap at 60s
39
+ * failureBackoffFactor: 2, // Double each failure: 1s, 2s, 4s, 8s...
40
+ * failureBackoffJitter: 0.1, // ±10% jitter
41
+ * });
42
+ *
43
+ * // First call fetches headers
44
+ * const headers1 = await cachedProvider.getHeaders();
45
+ *
46
+ * // Subsequent calls return cached value
47
+ * const headers2 = await cachedProvider.getHeaders();
48
+ * ```
49
+ */
50
+ export function withCaching(provider, options) {
51
+ const cacheDurationMs = options?.cacheDurationMs ?? DEFAULT_CACHE_DURATION_MS;
52
+ const expiryBuffer = options?.expiryBuffer ?? DEFAULT_EXPIRY_BUFFER;
53
+ const failureBackoffMs = options?.failureBackoffMs ?? DEFAULT_FAILURE_BACKOFF_MS;
54
+ const failureBackoffMaxMs = options?.failureBackoffMaxMs ?? DEFAULT_FAILURE_BACKOFF_MAX_MS;
55
+ const failureBackoffFactor = options?.failureBackoffFactor ?? DEFAULT_FAILURE_BACKOFF_FACTOR;
56
+ const failureBackoffJitter = options?.failureBackoffJitter ?? DEFAULT_FAILURE_BACKOFF_JITTER;
57
+ let cachedHeaders = null;
58
+ let cacheExpiry = 0;
59
+ let refreshPromise = null;
60
+ let failureCount = 0;
61
+ let backoffDeadline = 0;
62
+ /**
63
+ * Calculate the effective expiry time with buffer.
64
+ * @param durationMs - Full cache duration
65
+ * @returns Expiry timestamp with buffer applied
66
+ */
67
+ const calculateExpiry = (durationMs) => {
68
+ // Buffer is at least 1 minute, but never more than 90% of duration
69
+ const bufferMs = Math.min(Math.max(durationMs * expiryBuffer, 60000), durationMs * 0.9);
70
+ return Date.now() + durationMs - bufferMs;
71
+ };
72
+ /**
73
+ * Calculates the backoff delay for a given consecutive failure count.
74
+ * Uses exponential backoff with multiplicative jitter.
75
+ * @param count - Number of consecutive failures (must be >= 1)
76
+ * @returns Delay in milliseconds
77
+ */
78
+ const calculateBackoffDelay = (count) => {
79
+ const base = Math.min(failureBackoffMs * failureBackoffFactor ** (count - 1), failureBackoffMaxMs);
80
+ const jittered = base * (1 + (Math.random() - 0.5) * 2 * failureBackoffJitter);
81
+ return Math.max(0, jittered);
82
+ };
83
+ /**
84
+ * Check if we're in a backoff period after a failure.
85
+ * @returns True if still in backoff period
86
+ */
87
+ const isInBackoffPeriod = () => {
88
+ if (backoffDeadline === 0)
89
+ return false;
90
+ return Date.now() < backoffDeadline;
91
+ };
92
+ /**
93
+ * Fetch fresh headers from the underlying provider.
94
+ *
95
+ * Calls getHeaders() directly rather than refresh() + getHeaders().
96
+ * The provider's getHeaders() is self-sufficient (fetches a token when
97
+ * needed), so an explicit refresh() is unnecessary and creates a race
98
+ * window where invalidate() between the two calls triggers a redundant
99
+ * token fetch.
100
+ *
101
+ * @returns Fresh headers
102
+ */
103
+ const fetchHeaders = async () => {
104
+ try {
105
+ const headers = await provider.getHeaders();
106
+ cachedHeaders = headers;
107
+ cacheExpiry = calculateExpiry(cacheDurationMs);
108
+ failureCount = 0;
109
+ backoffDeadline = 0;
110
+ return headers;
111
+ }
112
+ catch (error) {
113
+ failureCount += 1;
114
+ backoffDeadline = Date.now() + calculateBackoffDelay(failureCount);
115
+ throw error;
116
+ }
117
+ };
118
+ const wrapper = {
119
+ get type() {
120
+ return provider.type;
121
+ },
122
+ async initialize() {
123
+ await provider.initialize();
124
+ },
125
+ async getHeaders() {
126
+ // Return cached headers if valid
127
+ if (cachedHeaders && Date.now() < cacheExpiry) {
128
+ return cachedHeaders;
129
+ }
130
+ // If already refreshing, wait for that promise
131
+ if (refreshPromise) {
132
+ return refreshPromise;
133
+ }
134
+ // Check backoff period - if in backoff, rethrow if no cache
135
+ if (isInBackoffPeriod()) {
136
+ if (cachedHeaders) {
137
+ // Return stale cache during backoff rather than failing
138
+ return cachedHeaders;
139
+ }
140
+ // No cache available and in backoff - we must try anyway
141
+ }
142
+ // Fetch new headers
143
+ refreshPromise = fetchHeaders();
144
+ try {
145
+ return await refreshPromise;
146
+ }
147
+ finally {
148
+ refreshPromise = null;
149
+ }
150
+ },
151
+ async refresh() {
152
+ cachedHeaders = null;
153
+ cacheExpiry = 0;
154
+ failureCount = 0;
155
+ backoffDeadline = 0;
156
+ await provider.refresh();
157
+ },
158
+ invalidate() {
159
+ cachedHeaders = null;
160
+ cacheExpiry = 0;
161
+ failureCount = 0;
162
+ backoffDeadline = 0;
163
+ provider.invalidate();
164
+ },
165
+ };
166
+ return wrapper;
167
+ }
168
+ //# sourceMappingURL=with-caching.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-caching.js","sourceRoot":"","sources":["../../../../src/client/auth/decorators/with-caching.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Factory function for creating JWT AuthProvider instances.
3
+ * @module client/auth/factory
4
+ */
5
+ import type { AuthProvider, JwtAuthConfig } from "./types.js";
6
+ /**
7
+ * Creates a JWT AuthProvider with token caching.
8
+ * @param config - JWT authentication configuration
9
+ * @returns Configured AuthProvider instance
10
+ * @throws {ValidationError} If the configuration is invalid
11
+ */
12
+ export declare function createAuthProvider(config: JwtAuthConfig): AuthProvider;
13
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../../src/client/auth/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAK9D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,YAAY,CAatE"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Factory function for creating JWT AuthProvider instances.
3
+ * @module client/auth/factory
4
+ */
5
+ import { ValidationError } from "../errors.js";
6
+ import { withCaching } from "./decorators/index.js";
7
+ import { JwtAuthProvider } from "./providers/jwt-auth-provider.js";
8
+ import { JwtAuthConfigSchema } from "./schemas.js";
9
+ /** Default token cache duration for JWT: 1 hour */
10
+ const DEFAULT_TOKEN_CACHE_DURATION_MS = 3600000;
11
+ /**
12
+ * Creates a JWT AuthProvider with token caching.
13
+ * @param config - JWT authentication configuration
14
+ * @returns Configured AuthProvider instance
15
+ * @throws {ValidationError} If the configuration is invalid
16
+ */
17
+ export function createAuthProvider(config) {
18
+ const parseResult = JwtAuthConfigSchema.safeParse(config);
19
+ if (!parseResult.success) {
20
+ throw new ValidationError(`Invalid auth configuration: ${parseResult.error.message}`, {
21
+ issues: parseResult.error.issues,
22
+ });
23
+ }
24
+ const validConfig = parseResult.data;
25
+ const jwtProvider = new JwtAuthProvider(validConfig);
26
+ const cacheDurationMs = (validConfig.tokenCacheDuration ?? 3600) * 1000 || DEFAULT_TOKEN_CACHE_DURATION_MS;
27
+ return withCaching(jwtProvider, { cacheDurationMs });
28
+ }
29
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/client/auth/factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAGnD,mDAAmD;AACnD,MAAM,+BAA+B,GAAG,OAAO,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAqB;IACtD,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,IAAI,eAAe,CAAC,+BAA+B,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE;YACpF,MAAM,EAAE,WAAW,CAAC,KAAK,CAAC,MAAM;SACjC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC;IACrC,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,eAAe,GACnB,CAAC,WAAW,CAAC,kBAAkB,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,+BAA+B,CAAC;IACrF,OAAO,WAAW,CAAC,WAAW,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;AACvD,CAAC"}