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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (722) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/README.md +152 -0
  3. package/bin/dimensions-analytics-mcp-http.js +2 -0
  4. package/bin/dimensions-analytics-mcp.js +2 -0
  5. package/dist/client/auth/config-loaders.d.ts +22 -0
  6. package/dist/client/auth/config-loaders.d.ts.map +1 -0
  7. package/dist/client/auth/config-loaders.js +68 -0
  8. package/dist/client/auth/config-loaders.js.map +1 -0
  9. package/dist/client/auth/decorators/index.d.ts +7 -0
  10. package/dist/client/auth/decorators/index.d.ts.map +1 -0
  11. package/dist/client/auth/decorators/index.js +6 -0
  12. package/dist/client/auth/decorators/index.js.map +1 -0
  13. package/dist/client/auth/decorators/with-caching.d.ts +81 -0
  14. package/dist/client/auth/decorators/with-caching.d.ts.map +1 -0
  15. package/dist/client/auth/decorators/with-caching.js +168 -0
  16. package/dist/client/auth/decorators/with-caching.js.map +1 -0
  17. package/dist/client/auth/factory.d.ts +13 -0
  18. package/dist/client/auth/factory.d.ts.map +1 -0
  19. package/dist/client/auth/factory.js +29 -0
  20. package/dist/client/auth/factory.js.map +1 -0
  21. package/dist/client/auth/index.d.ts +7 -0
  22. package/dist/client/auth/index.d.ts.map +1 -0
  23. package/dist/client/auth/index.js +6 -0
  24. package/dist/client/auth/index.js.map +1 -0
  25. package/dist/client/auth/jwt-utils.d.ts +17 -0
  26. package/dist/client/auth/jwt-utils.d.ts.map +1 -0
  27. package/dist/client/auth/jwt-utils.js +33 -0
  28. package/dist/client/auth/jwt-utils.js.map +1 -0
  29. package/dist/client/auth/node.d.ts +16 -0
  30. package/dist/client/auth/node.d.ts.map +1 -0
  31. package/dist/client/auth/node.js +15 -0
  32. package/dist/client/auth/node.js.map +1 -0
  33. package/dist/client/auth/providers/index.d.ts +2 -0
  34. package/dist/client/auth/providers/index.d.ts.map +1 -0
  35. package/dist/client/auth/providers/index.js +2 -0
  36. package/dist/client/auth/providers/index.js.map +1 -0
  37. package/dist/client/auth/providers/jwt-auth-provider.d.ts +70 -0
  38. package/dist/client/auth/providers/jwt-auth-provider.d.ts.map +1 -0
  39. package/dist/client/auth/providers/jwt-auth-provider.js +134 -0
  40. package/dist/client/auth/providers/jwt-auth-provider.js.map +1 -0
  41. package/dist/client/auth/schemas.d.ts +19 -0
  42. package/dist/client/auth/schemas.d.ts.map +1 -0
  43. package/dist/client/auth/schemas.js +23 -0
  44. package/dist/client/auth/schemas.js.map +1 -0
  45. package/dist/client/auth/types.d.ts +25 -0
  46. package/dist/client/auth/types.d.ts.map +1 -0
  47. package/dist/client/auth/types.js +9 -0
  48. package/dist/client/auth/types.js.map +1 -0
  49. package/dist/client/command.d.ts +44 -0
  50. package/dist/client/command.d.ts.map +1 -0
  51. package/dist/client/command.js +23 -0
  52. package/dist/client/command.js.map +1 -0
  53. package/dist/client/config/index.d.ts +11 -0
  54. package/dist/client/config/index.d.ts.map +1 -0
  55. package/dist/client/config/index.js +8 -0
  56. package/dist/client/config/index.js.map +1 -0
  57. package/dist/client/config/loader.d.ts +27 -0
  58. package/dist/client/config/loader.d.ts.map +1 -0
  59. package/dist/client/config/loader.js +128 -0
  60. package/dist/client/config/loader.js.map +1 -0
  61. package/dist/client/config/node.d.ts +18 -0
  62. package/dist/client/config/node.d.ts.map +1 -0
  63. package/dist/client/config/node.js +17 -0
  64. package/dist/client/config/node.js.map +1 -0
  65. package/dist/client/config/schemas.d.ts +23 -0
  66. package/dist/client/config/schemas.d.ts.map +1 -0
  67. package/dist/client/config/schemas.js +24 -0
  68. package/dist/client/config/schemas.js.map +1 -0
  69. package/dist/client/config/types.d.ts +37 -0
  70. package/dist/client/config/types.d.ts.map +1 -0
  71. package/dist/client/config/types.js +6 -0
  72. package/dist/client/config/types.js.map +1 -0
  73. package/dist/client/config/unified-loader.d.ts +41 -0
  74. package/dist/client/config/unified-loader.d.ts.map +1 -0
  75. package/dist/client/config/unified-loader.js +86 -0
  76. package/dist/client/config/unified-loader.js.map +1 -0
  77. package/dist/client/config.d.ts +43 -0
  78. package/dist/client/config.d.ts.map +1 -0
  79. package/dist/client/config.js +56 -0
  80. package/dist/client/config.js.map +1 -0
  81. package/dist/client/deployment-config.d.ts +36 -0
  82. package/dist/client/deployment-config.d.ts.map +1 -0
  83. package/dist/client/deployment-config.js +79 -0
  84. package/dist/client/deployment-config.js.map +1 -0
  85. package/dist/client/errors.d.ts +180 -0
  86. package/dist/client/errors.d.ts.map +1 -0
  87. package/dist/client/errors.js +253 -0
  88. package/dist/client/errors.js.map +1 -0
  89. package/dist/client/http-client.d.ts +215 -0
  90. package/dist/client/http-client.d.ts.map +1 -0
  91. package/dist/client/http-client.js +419 -0
  92. package/dist/client/http-client.js.map +1 -0
  93. package/dist/client/index.d.ts +28 -0
  94. package/dist/client/index.d.ts.map +1 -0
  95. package/dist/client/index.js +18 -0
  96. package/dist/client/index.js.map +1 -0
  97. package/dist/client/internal-dsl-client.d.ts +30 -0
  98. package/dist/client/internal-dsl-client.d.ts.map +1 -0
  99. package/dist/client/internal-dsl-client.js +101 -0
  100. package/dist/client/internal-dsl-client.js.map +1 -0
  101. package/dist/client/rate-limiter.d.ts +79 -0
  102. package/dist/client/rate-limiter.d.ts.map +1 -0
  103. package/dist/client/rate-limiter.js +118 -0
  104. package/dist/client/rate-limiter.js.map +1 -0
  105. package/dist/client/resolve-api-key-user.d.ts +24 -0
  106. package/dist/client/resolve-api-key-user.d.ts.map +1 -0
  107. package/dist/client/resolve-api-key-user.js +80 -0
  108. package/dist/client/resolve-api-key-user.js.map +1 -0
  109. package/dist/client/types.d.ts +44 -0
  110. package/dist/client/types.d.ts.map +1 -0
  111. package/dist/client/types.js +10 -0
  112. package/dist/client/types.js.map +1 -0
  113. package/dist/dsl/client.d.ts +330 -0
  114. package/dist/dsl/client.d.ts.map +1 -0
  115. package/dist/dsl/client.js +433 -0
  116. package/dist/dsl/client.js.map +1 -0
  117. package/dist/dsl/commands/apply-filters.d.ts +15 -0
  118. package/dist/dsl/commands/apply-filters.d.ts.map +1 -0
  119. package/dist/dsl/commands/apply-filters.js +29 -0
  120. package/dist/dsl/commands/apply-filters.js.map +1 -0
  121. package/dist/dsl/commands/facet/index.d.ts +6 -0
  122. package/dist/dsl/commands/facet/index.d.ts.map +1 -0
  123. package/dist/dsl/commands/facet/index.js +6 -0
  124. package/dist/dsl/commands/facet/index.js.map +1 -0
  125. package/dist/dsl/commands/facet/schemas.d.ts +71 -0
  126. package/dist/dsl/commands/facet/schemas.d.ts.map +1 -0
  127. package/dist/dsl/commands/facet/schemas.js +84 -0
  128. package/dist/dsl/commands/facet/schemas.js.map +1 -0
  129. package/dist/dsl/commands/functions/ClassifyCommand.d.ts +96 -0
  130. package/dist/dsl/commands/functions/ClassifyCommand.d.ts.map +1 -0
  131. package/dist/dsl/commands/functions/ClassifyCommand.js +95 -0
  132. package/dist/dsl/commands/functions/ClassifyCommand.js.map +1 -0
  133. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts +86 -0
  134. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.d.ts.map +1 -0
  135. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js +131 -0
  136. package/dist/dsl/commands/functions/ExtractAffiliationsCommand.js.map +1 -0
  137. package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts +73 -0
  138. package/dist/dsl/commands/functions/ExtractConceptsCommand.d.ts.map +1 -0
  139. package/dist/dsl/commands/functions/ExtractConceptsCommand.js +110 -0
  140. package/dist/dsl/commands/functions/ExtractConceptsCommand.js.map +1 -0
  141. package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts +66 -0
  142. package/dist/dsl/commands/functions/ExtractGrantsCommand.d.ts.map +1 -0
  143. package/dist/dsl/commands/functions/ExtractGrantsCommand.js +87 -0
  144. package/dist/dsl/commands/functions/ExtractGrantsCommand.js.map +1 -0
  145. package/dist/dsl/commands/functions/index.d.ts +10 -0
  146. package/dist/dsl/commands/functions/index.d.ts.map +1 -0
  147. package/dist/dsl/commands/functions/index.js +10 -0
  148. package/dist/dsl/commands/functions/index.js.map +1 -0
  149. package/dist/dsl/commands/index.d.ts +8 -0
  150. package/dist/dsl/commands/index.d.ts.map +1 -0
  151. package/dist/dsl/commands/index.js +7 -0
  152. package/dist/dsl/commands/index.js.map +1 -0
  153. package/dist/dsl/commands/validate-input.d.ts +18 -0
  154. package/dist/dsl/commands/validate-input.d.ts.map +1 -0
  155. package/dist/dsl/commands/validate-input.js +27 -0
  156. package/dist/dsl/commands/validate-input.js.map +1 -0
  157. package/dist/dsl/create-client.d.ts +32 -0
  158. package/dist/dsl/create-client.d.ts.map +1 -0
  159. package/dist/dsl/create-client.js +58 -0
  160. package/dist/dsl/create-client.js.map +1 -0
  161. package/dist/dsl/fluent-query-builder.d.ts +439 -0
  162. package/dist/dsl/fluent-query-builder.d.ts.map +1 -0
  163. package/dist/dsl/fluent-query-builder.js +534 -0
  164. package/dist/dsl/fluent-query-builder.js.map +1 -0
  165. package/dist/dsl/index.d.ts +32 -0
  166. package/dist/dsl/index.d.ts.map +1 -0
  167. package/dist/dsl/index.js +31 -0
  168. package/dist/dsl/index.js.map +1 -0
  169. package/dist/dsl/pagination.d.ts +82 -0
  170. package/dist/dsl/pagination.d.ts.map +1 -0
  171. package/dist/dsl/pagination.js +135 -0
  172. package/dist/dsl/pagination.js.map +1 -0
  173. package/dist/dsl/query-builder.d.ts +456 -0
  174. package/dist/dsl/query-builder.d.ts.map +1 -0
  175. package/dist/dsl/query-builder.js +994 -0
  176. package/dist/dsl/query-builder.js.map +1 -0
  177. package/dist/dsl/response-parser.d.ts +111 -0
  178. package/dist/dsl/response-parser.d.ts.map +1 -0
  179. package/dist/dsl/response-parser.js +210 -0
  180. package/dist/dsl/response-parser.js.map +1 -0
  181. package/dist/dsl/schema/cache.d.ts +52 -0
  182. package/dist/dsl/schema/cache.d.ts.map +1 -0
  183. package/dist/dsl/schema/cache.js +97 -0
  184. package/dist/dsl/schema/cache.js.map +1 -0
  185. package/dist/dsl/schema/extract.d.ts +18 -0
  186. package/dist/dsl/schema/extract.d.ts.map +1 -0
  187. package/dist/dsl/schema/extract.js +41 -0
  188. package/dist/dsl/schema/extract.js.map +1 -0
  189. package/dist/dsl/schema/index.d.ts +13 -0
  190. package/dist/dsl/schema/index.d.ts.map +1 -0
  191. package/dist/dsl/schema/index.js +12 -0
  192. package/dist/dsl/schema/index.js.map +1 -0
  193. package/dist/dsl/schema/load.d.ts +41 -0
  194. package/dist/dsl/schema/load.d.ts.map +1 -0
  195. package/dist/dsl/schema/load.js +119 -0
  196. package/dist/dsl/schema/load.js.map +1 -0
  197. package/dist/dsl/schema/store.d.ts +137 -0
  198. package/dist/dsl/schema/store.d.ts.map +1 -0
  199. package/dist/dsl/schema/store.js +204 -0
  200. package/dist/dsl/schema/store.js.map +1 -0
  201. package/dist/dsl/schema/structured-entities.d.ts +21 -0
  202. package/dist/dsl/schema/structured-entities.d.ts.map +1 -0
  203. package/dist/dsl/schema/structured-entities.js +39 -0
  204. package/dist/dsl/schema/structured-entities.js.map +1 -0
  205. package/dist/dsl/schema/summary.d.ts +51 -0
  206. package/dist/dsl/schema/summary.d.ts.map +1 -0
  207. package/dist/dsl/schema/summary.js +61 -0
  208. package/dist/dsl/schema/summary.js.map +1 -0
  209. package/dist/dsl/schema/types.d.ts +36 -0
  210. package/dist/dsl/schema/types.d.ts.map +1 -0
  211. package/dist/dsl/schema/types.js +6 -0
  212. package/dist/dsl/schema/types.js.map +1 -0
  213. package/dist/dsl/schema/validation.d.ts +21 -0
  214. package/dist/dsl/schema/validation.d.ts.map +1 -0
  215. package/dist/dsl/schema/validation.js +44 -0
  216. package/dist/dsl/schema/validation.js.map +1 -0
  217. package/dist/dsl/types/buckets.d.ts +18 -0
  218. package/dist/dsl/types/buckets.d.ts.map +1 -0
  219. package/dist/dsl/types/buckets.js +6 -0
  220. package/dist/dsl/types/buckets.js.map +1 -0
  221. package/dist/dsl/types/common.d.ts +91 -0
  222. package/dist/dsl/types/common.d.ts.map +1 -0
  223. package/dist/dsl/types/common.js +6 -0
  224. package/dist/dsl/types/common.js.map +1 -0
  225. package/dist/dsl/types/entities.d.ts +35 -0
  226. package/dist/dsl/types/entities.d.ts.map +1 -0
  227. package/dist/dsl/types/entities.js +11 -0
  228. package/dist/dsl/types/entities.js.map +1 -0
  229. package/dist/dsl/types/index.d.ts +12 -0
  230. package/dist/dsl/types/index.d.ts.map +1 -0
  231. package/dist/dsl/types/index.js +7 -0
  232. package/dist/dsl/types/index.js.map +1 -0
  233. package/dist/dsl/types/return-clauses.d.ts +107 -0
  234. package/dist/dsl/types/return-clauses.d.ts.map +1 -0
  235. package/dist/dsl/types/return-clauses.js +22 -0
  236. package/dist/dsl/types/return-clauses.js.map +1 -0
  237. package/dist/dsl/types/special-functions.d.ts +175 -0
  238. package/dist/dsl/types/special-functions.d.ts.map +1 -0
  239. package/dist/dsl/types/special-functions.js +25 -0
  240. package/dist/dsl/types/special-functions.js.map +1 -0
  241. package/dist/dsl/types/vocabulary.d.ts +21 -0
  242. package/dist/dsl/types/vocabulary.d.ts.map +1 -0
  243. package/dist/dsl/types/vocabulary.js +44 -0
  244. package/dist/dsl/types/vocabulary.js.map +1 -0
  245. package/dist/dsl/usage-policy.d.ts +87 -0
  246. package/dist/dsl/usage-policy.d.ts.map +1 -0
  247. package/dist/dsl/usage-policy.js +133 -0
  248. package/dist/dsl/usage-policy.js.map +1 -0
  249. package/dist/dsl/utils/escape.d.ts +24 -0
  250. package/dist/dsl/utils/escape.d.ts.map +1 -0
  251. package/dist/dsl/utils/escape.js +124 -0
  252. package/dist/dsl/utils/escape.js.map +1 -0
  253. package/dist/dsl/utils/sanitize.d.ts +13 -0
  254. package/dist/dsl/utils/sanitize.d.ts.map +1 -0
  255. package/dist/dsl/utils/sanitize.js +19 -0
  256. package/dist/dsl/utils/sanitize.js.map +1 -0
  257. package/dist/dsl/utils/string-utils.d.ts +35 -0
  258. package/dist/dsl/utils/string-utils.d.ts.map +1 -0
  259. package/dist/dsl/utils/string-utils.js +145 -0
  260. package/dist/dsl/utils/string-utils.js.map +1 -0
  261. package/dist/dsl/utils/validate-field-name.d.ts +11 -0
  262. package/dist/dsl/utils/validate-field-name.d.ts.map +1 -0
  263. package/dist/dsl/utils/validate-field-name.js +18 -0
  264. package/dist/dsl/utils/validate-field-name.js.map +1 -0
  265. package/dist/examples/dsl-examples.d.ts +11 -0
  266. package/dist/examples/dsl-examples.d.ts.map +1 -0
  267. package/dist/examples/dsl-examples.js +49 -0
  268. package/dist/examples/dsl-examples.js.map +1 -0
  269. package/dist/examples/usage-scenarios.d.ts +22 -0
  270. package/dist/examples/usage-scenarios.d.ts.map +1 -0
  271. package/dist/examples/usage-scenarios.js +173 -0
  272. package/dist/examples/usage-scenarios.js.map +1 -0
  273. package/dist/funder-org-names.d.ts +12 -0
  274. package/dist/funder-org-names.d.ts.map +1 -0
  275. package/dist/funder-org-names.js +30 -0
  276. package/dist/funder-org-names.js.map +1 -0
  277. package/dist/http-main.d.ts +7 -0
  278. package/dist/http-main.d.ts.map +1 -0
  279. package/dist/http-main.js +36 -0
  280. package/dist/http-main.js.map +1 -0
  281. package/dist/http.d.ts +29 -0
  282. package/dist/http.d.ts.map +1 -0
  283. package/dist/http.js +173 -0
  284. package/dist/http.js.map +1 -0
  285. package/dist/index.d.ts +9 -0
  286. package/dist/index.d.ts.map +1 -0
  287. package/dist/index.js +7 -0
  288. package/dist/index.js.map +1 -0
  289. package/dist/kwq/build-query.d.ts +26 -0
  290. package/dist/kwq/build-query.d.ts.map +1 -0
  291. package/dist/kwq/build-query.js +37 -0
  292. package/dist/kwq/build-query.js.map +1 -0
  293. package/dist/kwq/concept-groups.d.ts +49 -0
  294. package/dist/kwq/concept-groups.d.ts.map +1 -0
  295. package/dist/kwq/concept-groups.js +55 -0
  296. package/dist/kwq/concept-groups.js.map +1 -0
  297. package/dist/kwq/dsl-assembler.d.ts +28 -0
  298. package/dist/kwq/dsl-assembler.d.ts.map +1 -0
  299. package/dist/kwq/dsl-assembler.js +124 -0
  300. package/dist/kwq/dsl-assembler.js.map +1 -0
  301. package/dist/kwq/ensemble.d.ts +38 -0
  302. package/dist/kwq/ensemble.d.ts.map +1 -0
  303. package/dist/kwq/ensemble.js +107 -0
  304. package/dist/kwq/ensemble.js.map +1 -0
  305. package/dist/kwq/index.d.ts +16 -0
  306. package/dist/kwq/index.d.ts.map +1 -0
  307. package/dist/kwq/index.js +14 -0
  308. package/dist/kwq/index.js.map +1 -0
  309. package/dist/kwq/types.d.ts +120 -0
  310. package/dist/kwq/types.d.ts.map +1 -0
  311. package/dist/kwq/types.js +11 -0
  312. package/dist/kwq/types.js.map +1 -0
  313. package/dist/lambda.d.ts +10 -0
  314. package/dist/lambda.d.ts.map +1 -0
  315. package/dist/lambda.js +4 -0
  316. package/dist/lambda.js.map +1 -0
  317. package/dist/main.d.ts +8 -0
  318. package/dist/main.d.ts.map +1 -0
  319. package/dist/main.js +33 -0
  320. package/dist/main.js.map +1 -0
  321. package/dist/mcp/batch-fetch.d.ts +89 -0
  322. package/dist/mcp/batch-fetch.d.ts.map +1 -0
  323. package/dist/mcp/batch-fetch.js +178 -0
  324. package/dist/mcp/batch-fetch.js.map +1 -0
  325. package/dist/mcp/examples/dsl-examples.d.ts +21 -0
  326. package/dist/mcp/examples/dsl-examples.d.ts.map +1 -0
  327. package/dist/mcp/examples/dsl-examples.js +61 -0
  328. package/dist/mcp/examples/dsl-examples.js.map +1 -0
  329. package/dist/mcp/examples/usage-scenarios.d.ts +20 -0
  330. package/dist/mcp/examples/usage-scenarios.d.ts.map +1 -0
  331. package/dist/mcp/examples/usage-scenarios.js +169 -0
  332. package/dist/mcp/examples/usage-scenarios.js.map +1 -0
  333. package/dist/mcp/export-format.d.ts +43 -0
  334. package/dist/mcp/export-format.d.ts.map +1 -0
  335. package/dist/mcp/export-format.js +92 -0
  336. package/dist/mcp/export-format.js.map +1 -0
  337. package/dist/mcp/funder-org-names.d.ts +12 -0
  338. package/dist/mcp/funder-org-names.d.ts.map +1 -0
  339. package/dist/mcp/funder-org-names.js +30 -0
  340. package/dist/mcp/funder-org-names.js.map +1 -0
  341. package/dist/mcp/http-server.d.ts +20 -0
  342. package/dist/mcp/http-server.d.ts.map +1 -0
  343. package/dist/mcp/http-server.js +118 -0
  344. package/dist/mcp/http-server.js.map +1 -0
  345. package/dist/mcp/middleware/field-aliases.d.ts +97 -0
  346. package/dist/mcp/middleware/field-aliases.d.ts.map +1 -0
  347. package/dist/mcp/middleware/field-aliases.js +208 -0
  348. package/dist/mcp/middleware/field-aliases.js.map +1 -0
  349. package/dist/mcp/resources/schema.d.ts +13 -0
  350. package/dist/mcp/resources/schema.d.ts.map +1 -0
  351. package/dist/mcp/resources/schema.js +262 -0
  352. package/dist/mcp/resources/schema.js.map +1 -0
  353. package/dist/mcp/schema/context.d.ts +10 -0
  354. package/dist/mcp/schema/context.d.ts.map +1 -0
  355. package/dist/mcp/schema/context.js +6 -0
  356. package/dist/mcp/schema/context.js.map +1 -0
  357. package/dist/mcp/schema/index.d.ts +8 -0
  358. package/dist/mcp/schema/index.d.ts.map +1 -0
  359. package/dist/mcp/schema/index.js +6 -0
  360. package/dist/mcp/schema/index.js.map +1 -0
  361. package/dist/mcp/server.d.ts +56 -0
  362. package/dist/mcp/server.d.ts.map +1 -0
  363. package/dist/mcp/server.js +168 -0
  364. package/dist/mcp/server.js.map +1 -0
  365. package/dist/mcp/shared-schema.d.ts +13 -0
  366. package/dist/mcp/shared-schema.d.ts.map +1 -0
  367. package/dist/mcp/shared-schema.js +28 -0
  368. package/dist/mcp/shared-schema.js.map +1 -0
  369. package/dist/mcp/tools/analytics-filters.d.ts +18 -0
  370. package/dist/mcp/tools/analytics-filters.d.ts.map +1 -0
  371. package/dist/mcp/tools/analytics-filters.js +35 -0
  372. package/dist/mcp/tools/analytics-filters.js.map +1 -0
  373. package/dist/mcp/tools/analytics.d.ts +16 -0
  374. package/dist/mcp/tools/analytics.d.ts.map +1 -0
  375. package/dist/mcp/tools/analytics.js +381 -0
  376. package/dist/mcp/tools/analytics.js.map +1 -0
  377. package/dist/mcp/tools/concept-profile.d.ts +14 -0
  378. package/dist/mcp/tools/concept-profile.d.ts.map +1 -0
  379. package/dist/mcp/tools/concept-profile.js +130 -0
  380. package/dist/mcp/tools/concept-profile.js.map +1 -0
  381. package/dist/mcp/tools/dataset-profile.d.ts +15 -0
  382. package/dist/mcp/tools/dataset-profile.d.ts.map +1 -0
  383. package/dist/mcp/tools/dataset-profile.js +194 -0
  384. package/dist/mcp/tools/dataset-profile.js.map +1 -0
  385. package/dist/mcp/tools/fetch-search-pages.d.ts +15 -0
  386. package/dist/mcp/tools/fetch-search-pages.d.ts.map +1 -0
  387. package/dist/mcp/tools/fetch-search-pages.js +237 -0
  388. package/dist/mcp/tools/fetch-search-pages.js.map +1 -0
  389. package/dist/mcp/tools/functions.d.ts +14 -0
  390. package/dist/mcp/tools/functions.d.ts.map +1 -0
  391. package/dist/mcp/tools/functions.js +87 -0
  392. package/dist/mcp/tools/functions.js.map +1 -0
  393. package/dist/mcp/tools/impact-chain.d.ts +15 -0
  394. package/dist/mcp/tools/impact-chain.d.ts.map +1 -0
  395. package/dist/mcp/tools/impact-chain.js +96 -0
  396. package/dist/mcp/tools/impact-chain.js.map +1 -0
  397. package/dist/mcp/tools/kwq.d.ts +19 -0
  398. package/dist/mcp/tools/kwq.d.ts.map +1 -0
  399. package/dist/mcp/tools/kwq.js +156 -0
  400. package/dist/mcp/tools/kwq.js.map +1 -0
  401. package/dist/mcp/tools/lookup.d.ts +14 -0
  402. package/dist/mcp/tools/lookup.d.ts.map +1 -0
  403. package/dist/mcp/tools/lookup.js +146 -0
  404. package/dist/mcp/tools/lookup.js.map +1 -0
  405. package/dist/mcp/tools/policy-profile.d.ts +15 -0
  406. package/dist/mcp/tools/policy-profile.d.ts.map +1 -0
  407. package/dist/mcp/tools/policy-profile.js +174 -0
  408. package/dist/mcp/tools/policy-profile.js.map +1 -0
  409. package/dist/mcp/tools/profile.d.ts +14 -0
  410. package/dist/mcp/tools/profile.d.ts.map +1 -0
  411. package/dist/mcp/tools/profile.js +349 -0
  412. package/dist/mcp/tools/profile.js.map +1 -0
  413. package/dist/mcp/tools/query.d.ts +16 -0
  414. package/dist/mcp/tools/query.d.ts.map +1 -0
  415. package/dist/mcp/tools/query.js +75 -0
  416. package/dist/mcp/tools/query.js.map +1 -0
  417. package/dist/mcp/tools/schema.d.ts +23 -0
  418. package/dist/mcp/tools/schema.d.ts.map +1 -0
  419. package/dist/mcp/tools/schema.js +124 -0
  420. package/dist/mcp/tools/schema.js.map +1 -0
  421. package/dist/mcp/tools/search-entity-metadata.d.ts +18 -0
  422. package/dist/mcp/tools/search-entity-metadata.d.ts.map +1 -0
  423. package/dist/mcp/tools/search-entity-metadata.js +221 -0
  424. package/dist/mcp/tools/search-entity-metadata.js.map +1 -0
  425. package/dist/mcp/tools/search-input.d.ts +58 -0
  426. package/dist/mcp/tools/search-input.d.ts.map +1 -0
  427. package/dist/mcp/tools/search-input.js +76 -0
  428. package/dist/mcp/tools/search-input.js.map +1 -0
  429. package/dist/mcp/tools/search.d.ts +24 -0
  430. package/dist/mcp/tools/search.d.ts.map +1 -0
  431. package/dist/mcp/tools/search.js +115 -0
  432. package/dist/mcp/tools/search.js.map +1 -0
  433. package/dist/mcp/utils.d.ts +82 -0
  434. package/dist/mcp/utils.d.ts.map +1 -0
  435. package/dist/mcp/utils.js +126 -0
  436. package/dist/mcp/utils.js.map +1 -0
  437. package/dist/middleware/field-aliases.d.ts +97 -0
  438. package/dist/middleware/field-aliases.d.ts.map +1 -0
  439. package/dist/middleware/field-aliases.js +208 -0
  440. package/dist/middleware/field-aliases.js.map +1 -0
  441. package/dist/resources/schema.d.ts +13 -0
  442. package/dist/resources/schema.d.ts.map +1 -0
  443. package/dist/resources/schema.js +204 -0
  444. package/dist/resources/schema.js.map +1 -0
  445. package/dist/schema/context.d.ts +10 -0
  446. package/dist/schema/context.d.ts.map +1 -0
  447. package/dist/schema/context.js +6 -0
  448. package/dist/schema/context.js.map +1 -0
  449. package/dist/schema/index.d.ts +9 -0
  450. package/dist/schema/index.d.ts.map +1 -0
  451. package/dist/schema/index.js +6 -0
  452. package/dist/schema/index.js.map +1 -0
  453. package/dist/schema/load.d.ts +43 -0
  454. package/dist/schema/load.d.ts.map +1 -0
  455. package/dist/schema/load.js +139 -0
  456. package/dist/schema/load.js.map +1 -0
  457. package/dist/schema/store.d.ts +112 -0
  458. package/dist/schema/store.d.ts.map +1 -0
  459. package/dist/schema/store.js +173 -0
  460. package/dist/schema/store.js.map +1 -0
  461. package/dist/schema/structured-entities.d.ts +21 -0
  462. package/dist/schema/structured-entities.d.ts.map +1 -0
  463. package/dist/schema/structured-entities.js +39 -0
  464. package/dist/schema/structured-entities.js.map +1 -0
  465. package/dist/schema/types.d.ts +36 -0
  466. package/dist/schema/types.d.ts.map +1 -0
  467. package/dist/schema/types.js +6 -0
  468. package/dist/schema/types.js.map +1 -0
  469. package/dist/server.d.ts +57 -0
  470. package/dist/server.d.ts.map +1 -0
  471. package/dist/server.js +144 -0
  472. package/dist/server.js.map +1 -0
  473. package/dist/telemetry.d.ts +172 -0
  474. package/dist/telemetry.d.ts.map +1 -0
  475. package/dist/telemetry.js +233 -0
  476. package/dist/telemetry.js.map +1 -0
  477. package/dist/tools/analytics-filters.d.ts +18 -0
  478. package/dist/tools/analytics-filters.d.ts.map +1 -0
  479. package/dist/tools/analytics-filters.js +35 -0
  480. package/dist/tools/analytics-filters.js.map +1 -0
  481. package/dist/tools/analytics.d.ts +16 -0
  482. package/dist/tools/analytics.d.ts.map +1 -0
  483. package/dist/tools/analytics.js +381 -0
  484. package/dist/tools/analytics.js.map +1 -0
  485. package/dist/tools/concept-profile.d.ts +14 -0
  486. package/dist/tools/concept-profile.d.ts.map +1 -0
  487. package/dist/tools/concept-profile.js +130 -0
  488. package/dist/tools/concept-profile.js.map +1 -0
  489. package/dist/tools/dataset-profile.d.ts +15 -0
  490. package/dist/tools/dataset-profile.d.ts.map +1 -0
  491. package/dist/tools/dataset-profile.js +194 -0
  492. package/dist/tools/dataset-profile.js.map +1 -0
  493. package/dist/tools/functions.d.ts +14 -0
  494. package/dist/tools/functions.d.ts.map +1 -0
  495. package/dist/tools/functions.js +294 -0
  496. package/dist/tools/functions.js.map +1 -0
  497. package/dist/tools/impact-chain.d.ts +15 -0
  498. package/dist/tools/impact-chain.d.ts.map +1 -0
  499. package/dist/tools/impact-chain.js +96 -0
  500. package/dist/tools/impact-chain.js.map +1 -0
  501. package/dist/tools/kwq.d.ts +19 -0
  502. package/dist/tools/kwq.d.ts.map +1 -0
  503. package/dist/tools/kwq.js +156 -0
  504. package/dist/tools/kwq.js.map +1 -0
  505. package/dist/tools/lookup.d.ts +14 -0
  506. package/dist/tools/lookup.d.ts.map +1 -0
  507. package/dist/tools/lookup.js +213 -0
  508. package/dist/tools/lookup.js.map +1 -0
  509. package/dist/tools/policy-profile.d.ts +15 -0
  510. package/dist/tools/policy-profile.d.ts.map +1 -0
  511. package/dist/tools/policy-profile.js +174 -0
  512. package/dist/tools/policy-profile.js.map +1 -0
  513. package/dist/tools/profile.d.ts +14 -0
  514. package/dist/tools/profile.d.ts.map +1 -0
  515. package/dist/tools/profile.js +349 -0
  516. package/dist/tools/profile.js.map +1 -0
  517. package/dist/tools/query.d.ts +16 -0
  518. package/dist/tools/query.d.ts.map +1 -0
  519. package/dist/tools/query.js +53 -0
  520. package/dist/tools/query.js.map +1 -0
  521. package/dist/tools/schema.d.ts +23 -0
  522. package/dist/tools/schema.d.ts.map +1 -0
  523. package/dist/tools/schema.js +124 -0
  524. package/dist/tools/schema.js.map +1 -0
  525. package/dist/tools/search-entity-metadata.d.ts +18 -0
  526. package/dist/tools/search-entity-metadata.d.ts.map +1 -0
  527. package/dist/tools/search-entity-metadata.js +221 -0
  528. package/dist/tools/search-entity-metadata.js.map +1 -0
  529. package/dist/tools/search.d.ts +23 -0
  530. package/dist/tools/search.d.ts.map +1 -0
  531. package/dist/tools/search.js +110 -0
  532. package/dist/tools/search.js.map +1 -0
  533. package/dist/tools/solr-fields.d.ts +39 -0
  534. package/dist/tools/solr-fields.d.ts.map +1 -0
  535. package/dist/tools/solr-fields.js +40 -0
  536. package/dist/tools/solr-fields.js.map +1 -0
  537. package/dist/utils.d.ts +70 -0
  538. package/dist/utils.d.ts.map +1 -0
  539. package/dist/utils.js +104 -0
  540. package/dist/utils.js.map +1 -0
  541. package/package.json +41 -0
  542. package/src/client/auth/config-loaders.ts +81 -0
  543. package/src/client/auth/decorators/index.ts +7 -0
  544. package/src/client/auth/decorators/with-caching.ts +237 -0
  545. package/src/client/auth/factory.ts +34 -0
  546. package/src/client/auth/index.ts +6 -0
  547. package/src/client/auth/jwt-utils.ts +36 -0
  548. package/src/client/auth/node.ts +16 -0
  549. package/src/client/auth/providers/index.ts +1 -0
  550. package/src/client/auth/providers/jwt-auth-provider.ts +153 -0
  551. package/src/client/auth/schemas.ts +25 -0
  552. package/src/client/auth/types.ts +30 -0
  553. package/src/client/command.ts +54 -0
  554. package/src/client/config/index.ts +15 -0
  555. package/src/client/config/loader.ts +155 -0
  556. package/src/client/config/node.ts +22 -0
  557. package/src/client/config/schemas.ts +28 -0
  558. package/src/client/config/types.ts +39 -0
  559. package/src/client/config/unified-loader.ts +118 -0
  560. package/src/client/config.ts +69 -0
  561. package/src/client/deployment-config.ts +98 -0
  562. package/src/client/errors.ts +295 -0
  563. package/src/client/http-client.ts +577 -0
  564. package/src/client/index.ts +68 -0
  565. package/src/client/internal-dsl-client.ts +128 -0
  566. package/src/client/rate-limiter.ts +139 -0
  567. package/src/client/resolve-api-key-user.ts +99 -0
  568. package/src/client/types.ts +44 -0
  569. package/src/dsl/client.ts +538 -0
  570. package/src/dsl/commands/apply-filters.ts +35 -0
  571. package/src/dsl/commands/facet/index.ts +12 -0
  572. package/src/dsl/commands/facet/schemas.ts +101 -0
  573. package/src/dsl/commands/functions/ClassifyCommand.ts +129 -0
  574. package/src/dsl/commands/functions/ExtractAffiliationsCommand.ts +163 -0
  575. package/src/dsl/commands/functions/ExtractConceptsCommand.ts +141 -0
  576. package/src/dsl/commands/functions/ExtractGrantsCommand.ts +112 -0
  577. package/src/dsl/commands/functions/index.ts +31 -0
  578. package/src/dsl/commands/index.ts +29 -0
  579. package/src/dsl/commands/validate-input.ts +29 -0
  580. package/src/dsl/create-client.ts +80 -0
  581. package/src/dsl/fluent-query-builder.ts +684 -0
  582. package/src/dsl/index.ts +206 -0
  583. package/src/dsl/pagination.ts +202 -0
  584. package/src/dsl/query-builder.ts +1120 -0
  585. package/src/dsl/response-parser.ts +299 -0
  586. package/src/dsl/schema/cache.ts +124 -0
  587. package/src/dsl/schema/extract.ts +44 -0
  588. package/src/dsl/schema/index.ts +50 -0
  589. package/src/dsl/schema/load.ts +160 -0
  590. package/src/dsl/schema/store.ts +253 -0
  591. package/src/dsl/schema/structured-entities.ts +44 -0
  592. package/src/dsl/schema/summary.ts +94 -0
  593. package/src/dsl/schema/types.ts +40 -0
  594. package/src/dsl/schema/validation.ts +56 -0
  595. package/src/dsl/types/buckets.ts +22 -0
  596. package/src/dsl/types/common.ts +99 -0
  597. package/src/dsl/types/entities.ts +43 -0
  598. package/src/dsl/types/index.ts +63 -0
  599. package/src/dsl/types/return-clauses.ts +147 -0
  600. package/src/dsl/types/special-functions.ts +220 -0
  601. package/src/dsl/types/vocabulary.ts +82 -0
  602. package/src/dsl/usage-policy.ts +219 -0
  603. package/src/dsl/utils/escape.ts +123 -0
  604. package/src/dsl/utils/sanitize.ts +21 -0
  605. package/src/dsl/utils/string-utils.ts +147 -0
  606. package/src/dsl/utils/validate-field-name.ts +19 -0
  607. package/src/http-main.ts +41 -0
  608. package/src/index.ts +14 -0
  609. package/src/main.ts +40 -0
  610. package/src/mcp/batch-fetch.ts +255 -0
  611. package/src/mcp/examples/dsl-examples.ts +66 -0
  612. package/src/mcp/examples/usage-scenarios.ts +185 -0
  613. package/src/mcp/export-format.ts +113 -0
  614. package/src/mcp/funder-org-names.ts +30 -0
  615. package/src/mcp/http-server.ts +148 -0
  616. package/src/mcp/middleware/field-aliases.ts +274 -0
  617. package/src/mcp/resources/schema.ts +364 -0
  618. package/src/mcp/schema/context.ts +11 -0
  619. package/src/mcp/schema/index.ts +38 -0
  620. package/src/mcp/server.ts +247 -0
  621. package/src/mcp/shared-schema.ts +34 -0
  622. package/src/mcp/tools/analytics-filters.ts +46 -0
  623. package/src/mcp/tools/analytics.ts +453 -0
  624. package/src/mcp/tools/fetch-search-pages.ts +329 -0
  625. package/src/mcp/tools/functions.ts +105 -0
  626. package/src/mcp/tools/lookup.ts +182 -0
  627. package/src/mcp/tools/query.ts +91 -0
  628. package/src/mcp/tools/schema.ts +147 -0
  629. package/src/mcp/tools/search-entity-metadata.ts +253 -0
  630. package/src/mcp/tools/search-input.ts +87 -0
  631. package/src/mcp/tools/search.ts +168 -0
  632. package/src/mcp/utils.ts +199 -0
  633. package/test/client/auth/config-loaders.test.ts +92 -0
  634. package/test/client/auth/decorators/with-caching.test.ts +482 -0
  635. package/test/client/auth/factory.test.ts +68 -0
  636. package/test/client/auth/providers/jwt-auth-provider.test.ts +398 -0
  637. package/test/client/auth/types.test.ts +18 -0
  638. package/test/client/command.test.ts +163 -0
  639. package/test/client/config/loader.test.ts +377 -0
  640. package/test/client/config/unified-loader.test.ts +136 -0
  641. package/test/client/deployment-config.test.ts +69 -0
  642. package/test/client/errors/index.test.ts +408 -0
  643. package/test/client/helpers/mock-fetch.ts +42 -0
  644. package/test/client/http-client.test.ts +1148 -0
  645. package/test/client/integration/auth-providers.integration.test.ts +186 -0
  646. package/test/client/internal-dsl-client.test.ts +76 -0
  647. package/test/client/rate-limiter.test.ts +204 -0
  648. package/test/client/resolve-api-key-user.test.ts +87 -0
  649. package/test/dsl/client.special-functions.test.ts +387 -0
  650. package/test/dsl/client.test.ts +457 -0
  651. package/test/dsl/commands/apply-filters.test.ts +147 -0
  652. package/test/dsl/commands/functions/ClassifyCommand.test.ts +170 -0
  653. package/test/dsl/commands/functions/ExtractAffiliationsCommand.test.ts +306 -0
  654. package/test/dsl/commands/functions/ExtractConceptsCommand.test.ts +136 -0
  655. package/test/dsl/commands/functions/ExtractGrantsCommand.test.ts +202 -0
  656. package/test/dsl/commands/search/filters.test.ts +42 -0
  657. package/test/dsl/fluent-query-builder.test.ts +865 -0
  658. package/test/dsl/integration/client.integration.test.ts +294 -0
  659. package/test/dsl/integration/facet-api.integration.test.ts +276 -0
  660. package/test/dsl/integration/field-existence.integration.test.ts +148 -0
  661. package/test/dsl/integration/fluent-api-docs-examples.integration.test.ts +988 -0
  662. package/test/dsl/integration/fluent-api.integration.test.ts +615 -0
  663. package/test/dsl/integration/search-helpers.ts +27 -0
  664. package/test/dsl/integration/special-functions.integration.test.ts +224 -0
  665. package/test/dsl/integration/test-config.ts +52 -0
  666. package/test/dsl/pagination.test.ts +86 -0
  667. package/test/dsl/query-builder.test.ts +1775 -0
  668. package/test/dsl/response-parser.test.ts +520 -0
  669. package/test/dsl/schema/cache.test.ts +53 -0
  670. package/test/dsl/schema/load.test.ts +165 -0
  671. package/test/dsl/schema/summary.test.ts +61 -0
  672. package/test/dsl/schema/validation.test.ts +46 -0
  673. package/test/dsl/time-series.test.ts +135 -0
  674. package/test/dsl/unnest.test.ts +151 -0
  675. package/test/dsl/usage-policy.test.ts +100 -0
  676. package/test/dsl/utils/escape.property.test.ts +109 -0
  677. package/test/dsl/utils/escape.test.ts +140 -0
  678. package/test/dsl/utils/validate-field-name.property.test.ts +99 -0
  679. package/test/dsl/utils/validate-field-name.test.ts +55 -0
  680. package/test/examples/dsl-examples.test.ts +29 -0
  681. package/test/examples/usage-scenarios.test.ts +90 -0
  682. package/test/fixtures/describe-schema.json +4000 -0
  683. package/test/funder-org-names.test.ts +20 -0
  684. package/test/helpers/schema-fixture.ts +18 -0
  685. package/test/helpers/tool-test-harness.ts +114 -0
  686. package/test/integration/assertions.ts +263 -0
  687. package/test/integration/env.ts +108 -0
  688. package/test/integration/harness.ts +307 -0
  689. package/test/integration/hosted-client.ts +56 -0
  690. package/test/integration/hosted-mocks.ts +81 -0
  691. package/test/integration/hosted-run.ts +86 -0
  692. package/test/integration/hosted.e2e.test.ts +101 -0
  693. package/test/integration/reporter.ts +100 -0
  694. package/test/integration/run.ts +74 -0
  695. package/test/integration/suites/analytics.integration.ts +72 -0
  696. package/test/integration/suites/functions.integration.ts +37 -0
  697. package/test/integration/suites/hosted-smoke.integration.ts +38 -0
  698. package/test/integration/suites/index.ts +22 -0
  699. package/test/integration/suites/lookup.integration.ts +57 -0
  700. package/test/integration/suites/query.integration.ts +49 -0
  701. package/test/integration/suites/resources.integration.ts +68 -0
  702. package/test/integration/suites/search.integration.ts +80 -0
  703. package/test/integration/types.ts +92 -0
  704. package/test/integration/verify-usage-scenarios.ts +162 -0
  705. package/test/mcp/export-format.test.ts +67 -0
  706. package/test/mcp/http-server.test.ts +80 -0
  707. package/test/middleware/field-aliases.test.ts +287 -0
  708. package/test/resources/schema.test.ts +28 -0
  709. package/test/schema/describe-contract.test.ts +24 -0
  710. package/test/schema/store.test.ts +45 -0
  711. package/test/server.test.ts +170 -0
  712. package/test/tools/analytics-filters.test.ts +35 -0
  713. package/test/tools/analytics.test.ts +419 -0
  714. package/test/tools/fetch-search-pages.test.ts +200 -0
  715. package/test/tools/functions.test.ts +153 -0
  716. package/test/tools/lookup.test.ts +296 -0
  717. package/test/tools/query.test.ts +100 -0
  718. package/test/tools/schema.test.ts +37 -0
  719. package/test/tools/search.test.ts +415 -0
  720. package/test/utils.test.ts +45 -0
  721. package/tsconfig.json +9 -0
  722. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,307 @@
1
+ /**
2
+ * MCP eval harness runner.
3
+ *
4
+ * Creates a real MCP server with live API credentials, connects an MCP Client
5
+ * via in-memory transport, and executes eval suites against it.
6
+ * @module test/integration/harness
7
+ */
8
+
9
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
+ import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js";
11
+ import { createMcpServerAsync, type McpServerConfig } from "../../src/mcp/server.js";
12
+ import { missingEnvVars } from "./env.js";
13
+ import type {
14
+ AssertionResult,
15
+ CaseResult,
16
+ EvalCase,
17
+ EvalRunResult,
18
+ EvalSuite,
19
+ SuiteResult,
20
+ } from "./types.js";
21
+
22
+ const DEFAULT_TIMEOUT = 30_000;
23
+
24
+ /**
25
+ * Configuration for the eval harness.
26
+ */
27
+ export interface EvalHarnessConfig {
28
+ /** MCP server config (API keys, URLs). Defaults to env vars. */
29
+ readonly serverConfig?: McpServerConfig;
30
+ /** Only run suites whose names match these (empty = all). */
31
+ readonly suiteFilter?: readonly string[];
32
+ /** Only run cases tagged with one of these (empty = all). */
33
+ readonly tagFilter?: readonly string[];
34
+ /** Exclude cases tagged with one of these. */
35
+ readonly tagExclude?: readonly string[];
36
+ /** Max concurrent cases per suite (default: 1 — sequential). */
37
+ readonly concurrency?: number;
38
+ }
39
+
40
+ /**
41
+ * Parses the JSON text from an MCP tool call result.
42
+ * @param result - Raw MCP callTool result
43
+ * @returns Parsed JSON data
44
+ */
45
+ function parseResult(result: { content: Array<{ type: string; text?: string }> }): unknown {
46
+ const textContent = result.content.find((c) => c.type === "text" && c.text);
47
+ if (!textContent || !("text" in textContent) || !textContent.text) {
48
+ throw new Error("Tool result has no text content");
49
+ }
50
+ return JSON.parse(textContent.text);
51
+ }
52
+
53
+ /**
54
+ * Reads a resource via the MCP client and returns it as a tool-like result.
55
+ * @param client - Connected MCP client
56
+ * @param uri - Resource URI
57
+ * @returns Parsed resource content
58
+ */
59
+ async function readResource(client: Client, uri: string): Promise<unknown> {
60
+ const result = await client.readResource({ uri });
61
+ const textContent = result.contents.find((c) => c.mimeType === "application/json" || c.text);
62
+ if (!textContent || !("text" in textContent) || !textContent.text) {
63
+ throw new Error("Resource has no text content");
64
+ }
65
+ return JSON.parse(textContent.text as string);
66
+ }
67
+
68
+ /**
69
+ * Runs a single eval case against the MCP client.
70
+ * @param client - Connected MCP client
71
+ * @param suiteName - Parent suite name
72
+ * @param evalCase - The case to run
73
+ * @returns Case result
74
+ */
75
+ async function runCase(client: Client, suiteName: string, evalCase: EvalCase): Promise<CaseResult> {
76
+ const start = performance.now();
77
+ const timeout = evalCase.timeout ?? DEFAULT_TIMEOUT;
78
+
79
+ try {
80
+ // Handle resource reads (sentinel tool name)
81
+ if (evalCase.tool === "__resource__") {
82
+ const uri = evalCase.args.uri as string;
83
+ const data = await Promise.race([
84
+ readResource(client, uri),
85
+ new Promise<never>((_, reject) =>
86
+ setTimeout(() => reject(new Error(`Timeout after ${timeout}ms`)), timeout),
87
+ ),
88
+ ]);
89
+ const assertions: AssertionResult[] = evalCase.assertions.map((assertion) => {
90
+ try {
91
+ const checkResult = assertion.check(data);
92
+ return checkResult === true
93
+ ? { label: assertion.label, passed: true }
94
+ : { label: assertion.label, passed: false, error: checkResult };
95
+ } catch (err) {
96
+ return {
97
+ label: assertion.label,
98
+ passed: false,
99
+ error: `Assertion threw: ${err instanceof Error ? err.message : String(err)}`,
100
+ };
101
+ }
102
+ });
103
+ return {
104
+ suiteName,
105
+ caseName: evalCase.name,
106
+ tool: `resource:${uri}`,
107
+ passed: assertions.every((a) => a.passed),
108
+ assertions,
109
+ durationMs: performance.now() - start,
110
+ };
111
+ }
112
+
113
+ const result = await Promise.race([
114
+ client.callTool({ name: evalCase.tool, arguments: evalCase.args }),
115
+ new Promise<never>((_, reject) =>
116
+ setTimeout(() => reject(new Error(`Timeout after ${timeout}ms`)), timeout),
117
+ ),
118
+ ]);
119
+
120
+ // Check if the tool returned an error
121
+ if ("isError" in result && result.isError) {
122
+ const parsed = parseResult(result as { content: Array<{ type: string; text?: string }> });
123
+ const errorMsg =
124
+ parsed && typeof parsed === "object" && "error" in parsed
125
+ ? String((parsed as Record<string, unknown>).error)
126
+ : "Unknown tool error";
127
+ return {
128
+ suiteName,
129
+ caseName: evalCase.name,
130
+ tool: evalCase.tool,
131
+ passed: false,
132
+ assertions: [],
133
+ durationMs: performance.now() - start,
134
+ toolError: errorMsg,
135
+ };
136
+ }
137
+
138
+ const data = parseResult(result as { content: Array<{ type: string; text?: string }> });
139
+
140
+ // Run assertions
141
+ const assertions: AssertionResult[] = evalCase.assertions.map((assertion) => {
142
+ try {
143
+ const checkResult = assertion.check(data);
144
+ return checkResult === true
145
+ ? { label: assertion.label, passed: true }
146
+ : { label: assertion.label, passed: false, error: checkResult };
147
+ } catch (err) {
148
+ return {
149
+ label: assertion.label,
150
+ passed: false,
151
+ error: `Assertion threw: ${err instanceof Error ? err.message : String(err)}`,
152
+ };
153
+ }
154
+ });
155
+
156
+ return {
157
+ suiteName,
158
+ caseName: evalCase.name,
159
+ tool: evalCase.tool,
160
+ passed: assertions.every((a) => a.passed),
161
+ assertions,
162
+ durationMs: performance.now() - start,
163
+ };
164
+ } catch (err) {
165
+ return {
166
+ suiteName,
167
+ caseName: evalCase.name,
168
+ tool: evalCase.tool,
169
+ passed: false,
170
+ assertions: [],
171
+ durationMs: performance.now() - start,
172
+ toolError: err instanceof Error ? err.message : String(err),
173
+ };
174
+ }
175
+ }
176
+
177
+ /** Checks whether required credentials for a suite are present. */
178
+ function missingCredentials(suite: EvalSuite, serverConfig?: McpServerConfig): string[] {
179
+ if (!suite.requiredEnvVars) return [];
180
+ return missingEnvVars(suite.requiredEnvVars).filter((v) => {
181
+ if (v === "DIMENSIONS_API_KEY") {
182
+ return !(process.env.DIMENSIONS_API_KEY ?? serverConfig?.apiKey);
183
+ }
184
+ return true;
185
+ });
186
+ }
187
+
188
+ /**
189
+ * Filters cases by tag include/exclude rules.
190
+ * @param cases - All cases in a suite
191
+ * @param config - Harness config with tag filters
192
+ * @returns Filtered cases
193
+ */
194
+ function filterCases(cases: readonly EvalCase[], config: EvalHarnessConfig): readonly EvalCase[] {
195
+ let filtered = [...cases];
196
+
197
+ if (config.tagFilter && config.tagFilter.length > 0) {
198
+ filtered = filtered.filter((c) => c.tags?.some((t) => config.tagFilter?.includes(t)));
199
+ }
200
+
201
+ if (config.tagExclude && config.tagExclude.length > 0) {
202
+ filtered = filtered.filter(
203
+ (c) => !c.tags || !c.tags.some((t) => config.tagExclude?.includes(t)),
204
+ );
205
+ }
206
+
207
+ return filtered;
208
+ }
209
+
210
+ /**
211
+ * Runs all eval suites against an already-connected MCP client.
212
+ * @param client - Connected MCP client
213
+ * @param suites - Array of eval suites to run
214
+ * @param config - Harness configuration
215
+ * @returns Full eval run result
216
+ */
217
+ export async function runEvalsWithClient(
218
+ client: Client,
219
+ suites: readonly EvalSuite[],
220
+ config: EvalHarnessConfig = {},
221
+ ): Promise<EvalRunResult> {
222
+ const runStart = performance.now();
223
+
224
+ const activeSuites =
225
+ config.suiteFilter && config.suiteFilter.length > 0
226
+ ? suites.filter((s) => config.suiteFilter?.includes(s.name))
227
+ : [...suites];
228
+
229
+ const suiteResults: SuiteResult[] = [];
230
+
231
+ for (const suite of activeSuites) {
232
+ const suiteStart = performance.now();
233
+
234
+ const missing = missingCredentials(suite, config.serverConfig);
235
+ if (missing.length > 0) {
236
+ const skippedCases: CaseResult[] = suite.cases.map((c) => ({
237
+ suiteName: suite.name,
238
+ caseName: c.name,
239
+ tool: c.tool,
240
+ passed: false,
241
+ assertions: [],
242
+ durationMs: 0,
243
+ skipped: true,
244
+ skipReason: `Missing env vars: ${missing.join(", ")}`,
245
+ }));
246
+ suiteResults.push({
247
+ name: suite.name,
248
+ cases: skippedCases,
249
+ passed: 0,
250
+ failed: 0,
251
+ skipped: skippedCases.length,
252
+ durationMs: 0,
253
+ });
254
+ continue;
255
+ }
256
+
257
+ const cases = filterCases(suite.cases, config);
258
+ const caseResults: CaseResult[] = [];
259
+
260
+ for (const evalCase of cases) {
261
+ const result = await runCase(client, suite.name, evalCase);
262
+ caseResults.push(result);
263
+ }
264
+
265
+ suiteResults.push({
266
+ name: suite.name,
267
+ cases: caseResults,
268
+ passed: caseResults.filter((c) => c.passed).length,
269
+ failed: caseResults.filter((c) => !c.passed && !c.skipped).length,
270
+ skipped: caseResults.filter((c) => c.skipped).length,
271
+ durationMs: performance.now() - suiteStart,
272
+ });
273
+ }
274
+
275
+ return {
276
+ suites: suiteResults,
277
+ totalPassed: suiteResults.reduce((sum, s) => sum + s.passed, 0),
278
+ totalFailed: suiteResults.reduce((sum, s) => sum + s.failed, 0),
279
+ totalSkipped: suiteResults.reduce((sum, s) => sum + s.skipped, 0),
280
+ durationMs: performance.now() - runStart,
281
+ };
282
+ }
283
+
284
+ /**
285
+ * Runs all eval suites and returns aggregate results.
286
+ * @param suites - Array of eval suites to run
287
+ * @param config - Harness configuration
288
+ * @returns Full eval run result
289
+ */
290
+ export async function runEvals(
291
+ suites: readonly EvalSuite[],
292
+ config: EvalHarnessConfig = {},
293
+ ): Promise<EvalRunResult> {
294
+ const { server } = await createMcpServerAsync(config.serverConfig ?? {});
295
+ const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
296
+ const client = new Client({ name: "eval-harness", version: "1.0.0" });
297
+
298
+ await server.connect(serverTransport);
299
+ await client.connect(clientTransport);
300
+
301
+ const result = await runEvalsWithClient(client, suites, config);
302
+
303
+ await client.close();
304
+ await server.close();
305
+
306
+ return result;
307
+ }
@@ -0,0 +1,56 @@
1
+ /**
2
+ * MCP client helpers for hosted Streamable HTTP transport.
3
+ * @module test/integration/hosted-client
4
+ */
5
+
6
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
7
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
8
+ import { hostedMcpEndpoint } from "./env.js";
9
+
10
+ export interface HostedMcpSession {
11
+ readonly client: Client;
12
+ readonly transport: StreamableHTTPClientTransport;
13
+ readonly close: () => Promise<void>;
14
+ }
15
+
16
+ export interface ConnectHostedMcpClientOptions {
17
+ /** Server base URL (with or without `/mcp` suffix). */
18
+ readonly baseUrl: string;
19
+ /** User API key sent as `Authorization: Bearer`. */
20
+ readonly apiKey: string;
21
+ }
22
+
23
+ /**
24
+ * Connects an MCP client to a hosted HTTP server via Streamable HTTP.
25
+ */
26
+ export async function connectHostedMcpClient(
27
+ options: ConnectHostedMcpClientOptions,
28
+ ): Promise<HostedMcpSession> {
29
+ const url = new URL(hostedMcpEndpoint(options.baseUrl));
30
+ const client = new Client({ name: "hosted-integration", version: "1.0.0" });
31
+ const transport = new StreamableHTTPClientTransport(url, {
32
+ requestInit: {
33
+ headers: {
34
+ Authorization: `Bearer ${options.apiKey}`,
35
+ },
36
+ },
37
+ });
38
+
39
+ await client.connect(transport);
40
+
41
+ return {
42
+ client,
43
+ transport,
44
+ close: async () => {
45
+ await transport.close();
46
+ },
47
+ };
48
+ }
49
+
50
+ /**
51
+ * Performs a GET /health check against a hosted MCP server base URL.
52
+ */
53
+ export async function checkHostedHealth(baseUrl: string): Promise<Response> {
54
+ const root = baseUrl.replace(/\/mcp\/?$/, "").replace(/\/$/, "");
55
+ return fetch(`${root}/health`);
56
+ }
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Mock fetch handlers for hosted MCP e2e tests (auth.json + dsl-service).
3
+ * @module test/integration/hosted-mocks
4
+ */
5
+
6
+ import describeFixture from "../fixtures/describe-schema.json";
7
+
8
+ export interface HostedServiceMocksOptions {
9
+ readonly authUrl: string;
10
+ readonly dslServiceUrl: string;
11
+ /** API keys accepted by mock auth (default: any non-empty key). */
12
+ readonly validApiKeys?: readonly string[];
13
+ readonly userEmail?: string;
14
+ }
15
+
16
+ function jwtWithSub(sub: string): string {
17
+ const header = Buffer.from(JSON.stringify({ alg: "HS256" })).toString("base64url");
18
+ const payload = Buffer.from(JSON.stringify({ sub })).toString("base64url");
19
+ return `${header}.${payload}.signature`;
20
+ }
21
+
22
+ function resolveUrl(input: RequestInfo | URL): string {
23
+ if (typeof input === "string") return input;
24
+ if (input instanceof URL) return input.href;
25
+ return input.url;
26
+ }
27
+
28
+ function mockSearchPublicationsResponse(): Record<string, unknown> {
29
+ return {
30
+ publications: [{ id: "pub.test.1", title: "Mock CRISPR publication" }],
31
+ _stats: { total_count: 42 },
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Installs global fetch mocks for Radar auth and dsl-service.
37
+ * @returns Function that restores the original fetch implementation
38
+ */
39
+ export function installHostedServiceMocks(options: HostedServiceMocksOptions): () => void {
40
+ const originalFetch = globalThis.fetch;
41
+ const authBase = options.authUrl.replace(/\/$/, "");
42
+ const dslBase = options.dslServiceUrl.replace(/\/$/, "");
43
+ const userEmail = options.userEmail ?? "user@example.com";
44
+
45
+ globalThis.fetch = (async (input: RequestInfo | URL, init?: RequestInit) => {
46
+ const url = resolveUrl(input);
47
+
48
+ if (url.startsWith(`${authBase}/api/auth.json`) || url.endsWith("/api/auth.json")) {
49
+ const body = init?.body ? JSON.parse(String(init.body)) : {};
50
+ const key = body.key as string | undefined;
51
+ if (!key?.trim()) {
52
+ return Response.json({ error: "Invalid or revoked API key." }, { status: 401 });
53
+ }
54
+ if (options.validApiKeys && !options.validApiKeys.includes(key)) {
55
+ return Response.json({ error: "Invalid or revoked API key." }, { status: 401 });
56
+ }
57
+ return Response.json({ token: jwtWithSub(userEmail) });
58
+ }
59
+
60
+ if (url.startsWith(`${dslBase}/query`)) {
61
+ const body = init?.body ? JSON.parse(String(init.body)) : {};
62
+ const query = String(body.query ?? "");
63
+ if (query.includes("describe schema")) {
64
+ return Response.json(describeFixture);
65
+ }
66
+ if (query.includes("describe version")) {
67
+ return Response.json({ version: "2.15.0" });
68
+ }
69
+ if (query.includes("search publications")) {
70
+ return Response.json(mockSearchPublicationsResponse());
71
+ }
72
+ return Response.json({ error: `Unhandled mock query: ${query}` }, { status: 400 });
73
+ }
74
+
75
+ return originalFetch(input, init);
76
+ }) as typeof fetch;
77
+
78
+ return () => {
79
+ globalThis.fetch = originalFetch;
80
+ };
81
+ }
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Live hosted MCP integration smoke test runner.
4
+ *
5
+ * Starts an in-process HTTP server (unless HOSTED_MCP_BASE_URL is set) and
6
+ * exercises hosted MCP over Streamable HTTP with a real API key and backends.
7
+ *
8
+ * Usage:
9
+ * node --import tsx apps/mcp/test/integration/hosted-run.ts
10
+ *
11
+ * @module test/integration/hosted-run
12
+ */
13
+
14
+ import type { HostedHttpServerHandle } from "../../src/mcp/http-server.js";
15
+ import { startHostedHttpServer } from "../../src/mcp/http-server.js";
16
+ import { HOSTED_INTEGRATION_ENV_VARS, loadHostedIntegrationConfig } from "./env.js";
17
+ import { runEvalsWithClient } from "./harness.js";
18
+ import { checkHostedHealth, connectHostedMcpClient } from "./hosted-client.js";
19
+ import { exitCode, printReport } from "./reporter.js";
20
+ import { hostedSmokeSuite } from "./suites/hosted-smoke.integration.js";
21
+
22
+ async function resolveServerBaseUrl(
23
+ config: NonNullable<ReturnType<typeof loadHostedIntegrationConfig>>,
24
+ ): Promise<{ baseUrl: string; close?: () => Promise<void> }> {
25
+ if (config.remoteBaseUrl) {
26
+ console.error(`Using remote hosted MCP at ${config.remoteBaseUrl}`);
27
+ return { baseUrl: config.remoteBaseUrl };
28
+ }
29
+
30
+ const handle: HostedHttpServerHandle = startHostedHttpServer({
31
+ hosted: config.hosted,
32
+ port: 0,
33
+ bindHost: "127.0.0.1",
34
+ });
35
+ const port = await handle.ready;
36
+ const baseUrl = `http://127.0.0.1:${port}`;
37
+ console.error(`Started in-process hosted MCP at ${baseUrl}`);
38
+ return {
39
+ baseUrl,
40
+ close: () => handle.close(),
41
+ };
42
+ }
43
+
44
+ const config = loadHostedIntegrationConfig();
45
+ if (!config) {
46
+ console.error(
47
+ `Hosted integration smoke requires env vars: ${HOSTED_INTEGRATION_ENV_VARS.join(", ")}`,
48
+ );
49
+ process.exit(1);
50
+ }
51
+
52
+ let serverClose: (() => Promise<void>) | undefined;
53
+ let status = 1;
54
+
55
+ try {
56
+ const { baseUrl, close } = await resolveServerBaseUrl(config);
57
+ serverClose = close;
58
+
59
+ const health = await checkHostedHealth(baseUrl);
60
+ if (!health.ok) {
61
+ throw new Error(`Health check failed: GET /health returned ${health.status}`);
62
+ }
63
+
64
+ const session = await connectHostedMcpClient({
65
+ baseUrl,
66
+ apiKey: config.apiKey,
67
+ });
68
+
69
+ try {
70
+ console.error("Running hosted MCP smoke suite...\n");
71
+ const result = await runEvalsWithClient(session.client, [hostedSmokeSuite]);
72
+ printReport(result);
73
+ status = exitCode(result);
74
+ } finally {
75
+ await session.close();
76
+ }
77
+ } catch (error) {
78
+ console.error(error instanceof Error ? error.message : error);
79
+ status = 1;
80
+ } finally {
81
+ if (serverClose) {
82
+ await serverClose();
83
+ }
84
+ }
85
+
86
+ process.exit(status);
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Hosted MCP end-to-end tests with mocked auth and dsl-service backends.
3
+ * Runs in default CI without secrets.
4
+ * @module test/integration/hosted.e2e
5
+ */
6
+
7
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
8
+ import type { HostedEnvConfig } from "../../src/client/deployment-config.js";
9
+ import { clearSchemaCache } from "../../src/dsl/schema/index.js";
10
+ import type { HostedHttpServerHandle } from "../../src/mcp/http-server.js";
11
+ import { startHostedHttpServer } from "../../src/mcp/http-server.js";
12
+ import { clearSharedSchemaStore } from "../../src/mcp/shared-schema.js";
13
+ import { runEvalsWithClient } from "./harness.js";
14
+ import { checkHostedHealth, connectHostedMcpClient } from "./hosted-client.js";
15
+ import { installHostedServiceMocks } from "./hosted-mocks.js";
16
+ import { hostedSmokeSuite } from "./suites/hosted-smoke.integration.js";
17
+
18
+ const MOCK_HOSTED: HostedEnvConfig = {
19
+ deploymentMode: "hosted",
20
+ radarAuthUrl: "https://app.test.example",
21
+ internal: {
22
+ serviceUrl: "https://dsl.test.example",
23
+ username: "svc-user",
24
+ password: "svc-pass",
25
+ dslSchema: "external",
26
+ host: "app.test.example",
27
+ variant: "standard",
28
+ },
29
+ httpPort: 8080,
30
+ };
31
+
32
+ const TEST_API_KEY = "test-hosted-api-key";
33
+
34
+ describe("Hosted MCP e2e (mocked backends)", () => {
35
+ let restoreFetch: (() => void) | undefined;
36
+ let server: HostedHttpServerHandle | undefined;
37
+ let baseUrl: string;
38
+
39
+ beforeEach(async () => {
40
+ clearSharedSchemaStore();
41
+ clearSchemaCache();
42
+
43
+ restoreFetch = installHostedServiceMocks({
44
+ authUrl: MOCK_HOSTED.radarAuthUrl,
45
+ dslServiceUrl: MOCK_HOSTED.internal.serviceUrl,
46
+ validApiKeys: [TEST_API_KEY],
47
+ userEmail: "user@test.example",
48
+ });
49
+
50
+ server = startHostedHttpServer({
51
+ hosted: MOCK_HOSTED,
52
+ port: 0,
53
+ bindHost: "127.0.0.1",
54
+ });
55
+ const port = await server.ready;
56
+ baseUrl = `http://127.0.0.1:${port}`;
57
+ });
58
+
59
+ afterEach(async () => {
60
+ await server?.close();
61
+ restoreFetch?.();
62
+ });
63
+
64
+ it("responds to GET /health", async () => {
65
+ const response = await checkHostedHealth(baseUrl);
66
+ expect(response.status).toBe(200);
67
+ expect(await response.json()).toEqual({ status: "ok" });
68
+ });
69
+
70
+ it("returns 401 for POST /mcp without Authorization", async () => {
71
+ const response = await fetch(`${baseUrl}/mcp`, {
72
+ method: "POST",
73
+ headers: { "Content-Type": "application/json" },
74
+ body: JSON.stringify({ jsonrpc: "2.0", method: "initialize", id: 1, params: {} }),
75
+ });
76
+ expect(response.status).toBe(401);
77
+ });
78
+
79
+ it("omits fetch_search_pages from the hosted tool surface", async () => {
80
+ const session = await connectHostedMcpClient({ baseUrl, apiKey: TEST_API_KEY });
81
+ try {
82
+ const tools = await session.client.listTools();
83
+ const names = tools.tools.map((tool) => tool.name);
84
+ expect(names).not.toContain("fetch_search_pages");
85
+ expect(names).toContain("search_publications");
86
+ } finally {
87
+ await session.close();
88
+ }
89
+ });
90
+
91
+ it("runs hosted smoke eval cases over Streamable HTTP", async () => {
92
+ const session = await connectHostedMcpClient({ baseUrl, apiKey: TEST_API_KEY });
93
+ try {
94
+ const result = await runEvalsWithClient(session.client, [hostedSmokeSuite]);
95
+ expect(result.totalFailed).toBe(0);
96
+ expect(result.totalPassed).toBe(hostedSmokeSuite.cases.length);
97
+ } finally {
98
+ await session.close();
99
+ }
100
+ });
101
+ });