@cyanheads/brapi-mcp-server 0.3.5

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 (238) hide show
  1. package/CLAUDE.md +391 -0
  2. package/Dockerfile +99 -0
  3. package/LICENSE +201 -0
  4. package/README.md +590 -0
  5. package/changelog/0.1.x/0.1.0.md +19 -0
  6. package/changelog/0.1.x/0.1.1.md +27 -0
  7. package/changelog/0.1.x/0.1.2.md +22 -0
  8. package/changelog/0.2.x/0.2.0.md +35 -0
  9. package/changelog/0.2.x/0.2.1.md +36 -0
  10. package/changelog/0.3.x/0.3.0.md +38 -0
  11. package/changelog/0.3.x/0.3.1.md +40 -0
  12. package/changelog/0.3.x/0.3.2.md +29 -0
  13. package/changelog/0.3.x/0.3.3.md +19 -0
  14. package/changelog/0.3.x/0.3.4.md +33 -0
  15. package/changelog/0.3.x/0.3.5.md +24 -0
  16. package/changelog/template.md +51 -0
  17. package/dist/config/alias-credentials.d.ts +82 -0
  18. package/dist/config/alias-credentials.d.ts.map +1 -0
  19. package/dist/config/alias-credentials.js +159 -0
  20. package/dist/config/alias-credentials.js.map +1 -0
  21. package/dist/config/server-config.d.ts +39 -0
  22. package/dist/config/server-config.d.ts.map +1 -0
  23. package/dist/config/server-config.js +128 -0
  24. package/dist/config/server-config.js.map +1 -0
  25. package/dist/index.d.ts +10 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +85 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.d.ts +14 -0
  30. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.d.ts.map +1 -0
  31. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +75 -0
  32. package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -0
  33. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.d.ts +16 -0
  34. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.d.ts.map +1 -0
  35. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +109 -0
  36. package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -0
  37. package/dist/mcp-server/resources/definitions/brapi-calls.resource.d.ts +11 -0
  38. package/dist/mcp-server/resources/definitions/brapi-calls.resource.d.ts.map +1 -0
  39. package/dist/mcp-server/resources/definitions/brapi-calls.resource.js +46 -0
  40. package/dist/mcp-server/resources/definitions/brapi-calls.resource.js.map +1 -0
  41. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +13 -0
  42. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +1 -0
  43. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +26 -0
  44. package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +1 -0
  45. package/dist/mcp-server/resources/definitions/brapi-filters.resource.d.ts +19 -0
  46. package/dist/mcp-server/resources/definitions/brapi-filters.resource.d.ts.map +1 -0
  47. package/dist/mcp-server/resources/definitions/brapi-filters.resource.js +45 -0
  48. package/dist/mcp-server/resources/definitions/brapi-filters.resource.js.map +1 -0
  49. package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.d.ts +18 -0
  50. package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.d.ts.map +1 -0
  51. package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.js +34 -0
  52. package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.js.map +1 -0
  53. package/dist/mcp-server/resources/definitions/brapi-server-info.resource.d.ts +11 -0
  54. package/dist/mcp-server/resources/definitions/brapi-server-info.resource.d.ts.map +1 -0
  55. package/dist/mcp-server/resources/definitions/brapi-server-info.resource.js +28 -0
  56. package/dist/mcp-server/resources/definitions/brapi-server-info.resource.js.map +1 -0
  57. package/dist/mcp-server/resources/definitions/brapi-study.resource.d.ts +18 -0
  58. package/dist/mcp-server/resources/definitions/brapi-study.resource.d.ts.map +1 -0
  59. package/dist/mcp-server/resources/definitions/brapi-study.resource.js +34 -0
  60. package/dist/mcp-server/resources/definitions/brapi-study.resource.js.map +1 -0
  61. package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts +82 -0
  62. package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts.map +1 -0
  63. package/dist/mcp-server/tools/definitions/brapi-connect.tool.js +106 -0
  64. package/dist/mcp-server/tools/definitions/brapi-connect.tool.js.map +1 -0
  65. package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.d.ts +41 -0
  66. package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.d.ts.map +1 -0
  67. package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.js +88 -0
  68. package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.js.map +1 -0
  69. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +74 -0
  70. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -0
  71. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +386 -0
  72. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -0
  73. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +72 -0
  74. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -0
  75. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +290 -0
  76. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -0
  77. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +65 -0
  78. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -0
  79. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +243 -0
  80. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -0
  81. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +63 -0
  82. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -0
  83. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +278 -0
  84. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -0
  85. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +74 -0
  86. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -0
  87. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +288 -0
  88. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -0
  89. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +69 -0
  90. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -0
  91. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +243 -0
  92. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -0
  93. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +86 -0
  94. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -0
  95. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +337 -0
  96. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -0
  97. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +59 -0
  98. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -0
  99. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +248 -0
  100. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -0
  101. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts +59 -0
  102. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts.map +1 -0
  103. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js +306 -0
  104. package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js.map +1 -0
  105. package/dist/mcp-server/tools/definitions/brapi-get-image.tool.d.ts +57 -0
  106. package/dist/mcp-server/tools/definitions/brapi-get-image.tool.d.ts.map +1 -0
  107. package/dist/mcp-server/tools/definitions/brapi-get-image.tool.js +291 -0
  108. package/dist/mcp-server/tools/definitions/brapi-get-image.tool.js.map +1 -0
  109. package/dist/mcp-server/tools/definitions/brapi-get-study.tool.d.ts +75 -0
  110. package/dist/mcp-server/tools/definitions/brapi-get-study.tool.d.ts.map +1 -0
  111. package/dist/mcp-server/tools/definitions/brapi-get-study.tool.js +323 -0
  112. package/dist/mcp-server/tools/definitions/brapi-get-study.tool.js.map +1 -0
  113. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +87 -0
  114. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +1 -0
  115. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +296 -0
  116. package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +1 -0
  117. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +35 -0
  118. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -0
  119. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +148 -0
  120. package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -0
  121. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +33 -0
  122. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -0
  123. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +126 -0
  124. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -0
  125. package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts +51 -0
  126. package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts.map +1 -0
  127. package/dist/mcp-server/tools/definitions/brapi-server-info.tool.js +41 -0
  128. package/dist/mcp-server/tools/definitions/brapi-server-info.tool.js.map +1 -0
  129. package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.d.ts +117 -0
  130. package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.d.ts.map +1 -0
  131. package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.js +574 -0
  132. package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.js.map +1 -0
  133. package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.d.ts +52 -0
  134. package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.d.ts.map +1 -0
  135. package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.js +420 -0
  136. package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.js.map +1 -0
  137. package/dist/mcp-server/tools/shared/connect-auth-schema.d.ts +29 -0
  138. package/dist/mcp-server/tools/shared/connect-auth-schema.d.ts.map +1 -0
  139. package/dist/mcp-server/tools/shared/connect-auth-schema.js +55 -0
  140. package/dist/mcp-server/tools/shared/connect-auth-schema.js.map +1 -0
  141. package/dist/mcp-server/tools/shared/find-helpers.d.ts +143 -0
  142. package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -0
  143. package/dist/mcp-server/tools/shared/find-helpers.js +319 -0
  144. package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -0
  145. package/dist/mcp-server/tools/shared/orientation-envelope.d.ts +97 -0
  146. package/dist/mcp-server/tools/shared/orientation-envelope.d.ts.map +1 -0
  147. package/dist/mcp-server/tools/shared/orientation-envelope.js +254 -0
  148. package/dist/mcp-server/tools/shared/orientation-envelope.js.map +1 -0
  149. package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts +10 -0
  150. package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -0
  151. package/dist/mcp-server/tools/shared/raw-routing-hints.js +46 -0
  152. package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -0
  153. package/dist/services/brapi-client/brapi-client.d.ts +76 -0
  154. package/dist/services/brapi-client/brapi-client.d.ts.map +1 -0
  155. package/dist/services/brapi-client/brapi-client.js +320 -0
  156. package/dist/services/brapi-client/brapi-client.js.map +1 -0
  157. package/dist/services/brapi-client/index.d.ts +9 -0
  158. package/dist/services/brapi-client/index.d.ts.map +1 -0
  159. package/dist/services/brapi-client/index.js +7 -0
  160. package/dist/services/brapi-client/index.js.map +1 -0
  161. package/dist/services/brapi-client/types.d.ts +82 -0
  162. package/dist/services/brapi-client/types.d.ts.map +1 -0
  163. package/dist/services/brapi-client/types.js +8 -0
  164. package/dist/services/brapi-client/types.js.map +1 -0
  165. package/dist/services/brapi-filters/catalog.d.ts +14 -0
  166. package/dist/services/brapi-filters/catalog.d.ts.map +1 -0
  167. package/dist/services/brapi-filters/catalog.js +490 -0
  168. package/dist/services/brapi-filters/catalog.js.map +1 -0
  169. package/dist/services/brapi-filters/index.d.ts +8 -0
  170. package/dist/services/brapi-filters/index.d.ts.map +1 -0
  171. package/dist/services/brapi-filters/index.js +7 -0
  172. package/dist/services/brapi-filters/index.js.map +1 -0
  173. package/dist/services/brapi-filters/types.d.ts +23 -0
  174. package/dist/services/brapi-filters/types.d.ts.map +1 -0
  175. package/dist/services/brapi-filters/types.js +9 -0
  176. package/dist/services/brapi-filters/types.js.map +1 -0
  177. package/dist/services/capability-registry/capability-registry.d.ts +51 -0
  178. package/dist/services/capability-registry/capability-registry.d.ts.map +1 -0
  179. package/dist/services/capability-registry/capability-registry.js +234 -0
  180. package/dist/services/capability-registry/capability-registry.js.map +1 -0
  181. package/dist/services/capability-registry/index.d.ts +9 -0
  182. package/dist/services/capability-registry/index.d.ts.map +1 -0
  183. package/dist/services/capability-registry/index.js +7 -0
  184. package/dist/services/capability-registry/index.js.map +1 -0
  185. package/dist/services/capability-registry/types.d.ts +67 -0
  186. package/dist/services/capability-registry/types.d.ts.map +1 -0
  187. package/dist/services/capability-registry/types.js +9 -0
  188. package/dist/services/capability-registry/types.js.map +1 -0
  189. package/dist/services/dataset-store/dataset-store.d.ts +35 -0
  190. package/dist/services/dataset-store/dataset-store.d.ts.map +1 -0
  191. package/dist/services/dataset-store/dataset-store.js +190 -0
  192. package/dist/services/dataset-store/dataset-store.js.map +1 -0
  193. package/dist/services/dataset-store/index.d.ts +8 -0
  194. package/dist/services/dataset-store/index.d.ts.map +1 -0
  195. package/dist/services/dataset-store/index.js +7 -0
  196. package/dist/services/dataset-store/index.js.map +1 -0
  197. package/dist/services/dataset-store/types.d.ts +65 -0
  198. package/dist/services/dataset-store/types.d.ts.map +1 -0
  199. package/dist/services/dataset-store/types.js +8 -0
  200. package/dist/services/dataset-store/types.js.map +1 -0
  201. package/dist/services/ontology-resolver/index.d.ts +8 -0
  202. package/dist/services/ontology-resolver/index.d.ts.map +1 -0
  203. package/dist/services/ontology-resolver/index.js +7 -0
  204. package/dist/services/ontology-resolver/index.js.map +1 -0
  205. package/dist/services/ontology-resolver/ontology-resolver.d.ts +49 -0
  206. package/dist/services/ontology-resolver/ontology-resolver.d.ts.map +1 -0
  207. package/dist/services/ontology-resolver/ontology-resolver.js +99 -0
  208. package/dist/services/ontology-resolver/ontology-resolver.js.map +1 -0
  209. package/dist/services/ontology-resolver/types.d.ts +38 -0
  210. package/dist/services/ontology-resolver/types.d.ts.map +1 -0
  211. package/dist/services/ontology-resolver/types.js +8 -0
  212. package/dist/services/ontology-resolver/types.js.map +1 -0
  213. package/dist/services/reference-data-cache/index.d.ts +9 -0
  214. package/dist/services/reference-data-cache/index.d.ts.map +1 -0
  215. package/dist/services/reference-data-cache/index.js +7 -0
  216. package/dist/services/reference-data-cache/index.js.map +1 -0
  217. package/dist/services/reference-data-cache/reference-data-cache.d.ts +31 -0
  218. package/dist/services/reference-data-cache/reference-data-cache.d.ts.map +1 -0
  219. package/dist/services/reference-data-cache/reference-data-cache.js +131 -0
  220. package/dist/services/reference-data-cache/reference-data-cache.js.map +1 -0
  221. package/dist/services/reference-data-cache/types.d.ts +42 -0
  222. package/dist/services/reference-data-cache/types.d.ts.map +1 -0
  223. package/dist/services/reference-data-cache/types.js +9 -0
  224. package/dist/services/reference-data-cache/types.js.map +1 -0
  225. package/dist/services/server-registry/index.d.ts +9 -0
  226. package/dist/services/server-registry/index.d.ts.map +1 -0
  227. package/dist/services/server-registry/index.js +7 -0
  228. package/dist/services/server-registry/index.js.map +1 -0
  229. package/dist/services/server-registry/server-registry.d.ts +57 -0
  230. package/dist/services/server-registry/server-registry.d.ts.map +1 -0
  231. package/dist/services/server-registry/server-registry.js +210 -0
  232. package/dist/services/server-registry/server-registry.js.map +1 -0
  233. package/dist/services/server-registry/types.d.ts +43 -0
  234. package/dist/services/server-registry/types.d.ts.map +1 -0
  235. package/dist/services/server-registry/types.js +10 -0
  236. package/dist/services/server-registry/types.js.map +1 -0
  237. package/package.json +86 -0
  238. package/server.json +99 -0
@@ -0,0 +1,288 @@
1
+ /**
2
+ * @fileoverview `brapi_find_observations` — pull observation records filtered
3
+ * by study, germplasm, variable, season, or observation unit. Matches the
4
+ * find_* pattern: paged single pull capped at loadLimit, distributions across
5
+ * variable/study/germplasm/level, dataset spillover when the upstream total
6
+ * exceeds loadLimit.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-find-observations.tool
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { getServerConfig } from '../../../config/server-config.js';
12
+ import { getBrapiClient } from '../../../services/brapi-client/index.js';
13
+ import { getCapabilityRegistry } from '../../../services/capability-registry/index.js';
14
+ import { getDatasetStore } from '../../../services/dataset-store/index.js';
15
+ import { DEFAULT_ALIAS, getServerRegistry } from '../../../services/server-registry/index.js';
16
+ import { AliasInput, asString, buildRefinementHint, computeDistribution, DatasetHandleSchema, ExtraFiltersInput, LoadLimitInput, loadInitialPage, maybeSpill, mergeFilters, renderDatasetHandle, renderDistributions, } from '../shared/find-helpers.js';
17
+ const ObservationRowSchema = z
18
+ .object({
19
+ observationDbId: z.string().optional().describe('Server-side identifier for the observation.'),
20
+ observationUnitDbId: z
21
+ .string()
22
+ .optional()
23
+ .describe('FK to the observation unit (plot / plant / sample) that carries the measurement.'),
24
+ observationUnitName: z.string().optional().describe('Display name of the observation unit.'),
25
+ observationVariableDbId: z
26
+ .string()
27
+ .optional()
28
+ .describe('FK to the observation variable (trait) measured.'),
29
+ observationVariableName: z
30
+ .string()
31
+ .optional()
32
+ .describe('Display name of the observation variable.'),
33
+ studyDbId: z.string().optional().describe('FK to the study the observation belongs to.'),
34
+ studyName: z.string().optional().describe('Display name of the study.'),
35
+ germplasmDbId: z
36
+ .string()
37
+ .optional()
38
+ .describe('FK to the germplasm the observation was taken on.'),
39
+ germplasmName: z.string().optional().describe('Display name of the germplasm.'),
40
+ observationLevel: z.string().optional().describe('Unit level — e.g. "plot", "plant", "field".'),
41
+ season: z
42
+ .union([
43
+ z.string().describe('Season identifier as a flat string (older BrAPI servers).'),
44
+ z
45
+ .object({
46
+ seasonDbId: z.string().optional().describe('Server-side season identifier.'),
47
+ year: z
48
+ .union([
49
+ z.string().describe('Calendar year as a string (e.g. "2024").'),
50
+ z.number().describe('Calendar year as an integer (e.g. 2024).'),
51
+ ])
52
+ .optional()
53
+ .describe('Calendar year — accepts string or numeric form depending on server.'),
54
+ season: z.string().optional().describe('Season label (e.g. "wet", "dry", "Q1").'),
55
+ seasonName: z
56
+ .string()
57
+ .optional()
58
+ .describe('Season display name (BrAPI v2.1 alternate field).'),
59
+ })
60
+ .passthrough()
61
+ .describe('Structured season block per BrAPI v2.1.'),
62
+ ])
63
+ .optional()
64
+ .describe('Season — either a flat string or a structured `{seasonDbId, year, season}` object depending on the server.'),
65
+ value: z
66
+ .string()
67
+ .optional()
68
+ .describe('Recorded measurement value (stringified per BrAPI spec).'),
69
+ observationTimeStamp: z.string().optional().describe('ISO 8601 timestamp of the observation.'),
70
+ collector: z.string().optional().describe('Name or ID of the person who collected the value.'),
71
+ uploadedBy: z.string().optional().describe('Name or ID of the user who uploaded the record.'),
72
+ })
73
+ .passthrough()
74
+ .describe('One BrAPI observation record.');
75
+ const OutputSchema = z.object({
76
+ alias: z.string().describe('Alias of the registered BrAPI connection the call used.'),
77
+ results: z
78
+ .array(ObservationRowSchema)
79
+ .describe('Observation rows returned in-context (up to loadLimit).'),
80
+ returnedCount: z.number().int().nonnegative().describe('Length of `results[]`.'),
81
+ totalCount: z.number().int().nonnegative().describe('Total rows reported by the server.'),
82
+ hasMore: z.boolean().describe('True when more rows exist beyond the returned set.'),
83
+ distributions: z
84
+ .object({
85
+ observationVariableName: z
86
+ .record(z.string(), z.number())
87
+ .describe('Variable name → count of observations for that trait.'),
88
+ studyName: z
89
+ .record(z.string(), z.number())
90
+ .describe('Study name → count of observations in that study.'),
91
+ germplasmName: z
92
+ .record(z.string(), z.number())
93
+ .describe('Germplasm name → count of observations on that germplasm.'),
94
+ observationLevel: z
95
+ .record(z.string(), z.number())
96
+ .describe('Unit level (plot / plant / field) → count of observations at that level.'),
97
+ season: z
98
+ .record(z.string(), z.number())
99
+ .describe('Season identifier → count of observations in that season.'),
100
+ })
101
+ .describe('Value frequency per field across the full result set.'),
102
+ refinementHint: z
103
+ .string()
104
+ .optional()
105
+ .describe('Suggested next-step query refinement when the result set is large.'),
106
+ dataset: DatasetHandleSchema.optional().describe('Dataset handle when the full result set was persisted to DatasetStore.'),
107
+ warnings: z
108
+ .array(z.string())
109
+ .describe('Advisory messages (filter overrides, partial data, capability gaps, etc.).'),
110
+ appliedFilters: z
111
+ .record(z.string(), z.unknown())
112
+ .describe('The final filter map sent to the server (named + extraFilters).'),
113
+ });
114
+ export const brapiFindObservations = tool('brapi_find_observations', {
115
+ description: 'Pull observation records filtered by study, germplasm, variable, season, or observation unit. Returns a dataset handle when the upstream total exceeds loadLimit.',
116
+ annotations: { readOnlyHint: true, openWorldHint: true },
117
+ input: z.object({
118
+ alias: AliasInput,
119
+ studies: z.array(z.string()).optional().describe('Filter by studyDbIds.'),
120
+ germplasm: z.array(z.string()).optional().describe('Filter by germplasmDbIds.'),
121
+ variables: z.array(z.string()).optional().describe('Filter by observationVariableDbIds.'),
122
+ observationUnits: z.array(z.string()).optional().describe('Filter by observationUnitDbIds.'),
123
+ observations: z.array(z.string()).optional().describe('Filter by observationDbIds.'),
124
+ seasons: z.array(z.string()).optional().describe('Filter by seasonDbIds (e.g. "2022").'),
125
+ programs: z.array(z.string()).optional().describe('Filter by programDbIds.'),
126
+ trials: z.array(z.string()).optional().describe('Filter by trialDbIds.'),
127
+ observationLevels: z
128
+ .array(z.string())
129
+ .optional()
130
+ .describe('Observation unit level (plot, plant, field, etc.).'),
131
+ timestampFrom: z.string().optional().describe('ISO 8601 start of the observation-time window.'),
132
+ timestampTo: z.string().optional().describe('ISO 8601 end of the observation-time window.'),
133
+ loadLimit: LoadLimitInput,
134
+ extraFilters: ExtraFiltersInput,
135
+ }),
136
+ output: OutputSchema,
137
+ async handler(input, ctx) {
138
+ const registry = getServerRegistry();
139
+ const capabilities = getCapabilityRegistry();
140
+ const client = getBrapiClient();
141
+ const datasetStore = getDatasetStore();
142
+ const config = getServerConfig();
143
+ const connection = await registry.get(ctx, input.alias ?? DEFAULT_ALIAS);
144
+ const capabilityLookup = {};
145
+ if (connection.resolvedAuth)
146
+ capabilityLookup.auth = connection.resolvedAuth;
147
+ await capabilities.ensure(connection.baseUrl, { service: 'observations', method: 'GET' }, ctx, capabilityLookup);
148
+ const warnings = [];
149
+ const filters = mergeFilters({
150
+ studyDbIds: input.studies,
151
+ germplasmDbIds: input.germplasm,
152
+ observationVariableDbIds: input.variables,
153
+ observationUnitDbIds: input.observationUnits,
154
+ observationDbIds: input.observations,
155
+ seasonDbIds: input.seasons,
156
+ programDbIds: input.programs,
157
+ trialDbIds: input.trials,
158
+ observationLevels: input.observationLevels,
159
+ observationTimeStampRangeStart: input.timestampFrom,
160
+ observationTimeStampRangeEnd: input.timestampTo,
161
+ }, input.extraFilters, warnings);
162
+ const loadLimit = input.loadLimit ?? config.loadLimit;
163
+ const firstPage = await loadInitialPage(client, connection, '/observations', filters, loadLimit, ctx);
164
+ const { fullRows, dataset: datasetMeta } = await maybeSpill({
165
+ firstPage,
166
+ client,
167
+ connection,
168
+ path: '/observations',
169
+ filters,
170
+ source: 'find_observations',
171
+ loadLimit,
172
+ ctx,
173
+ store: datasetStore,
174
+ });
175
+ const distributions = {
176
+ observationVariableName: computeDistribution(fullRows, (r) => asString(r.observationVariableName)),
177
+ studyName: computeDistribution(fullRows, (r) => asString(r.studyName)),
178
+ germplasmName: computeDistribution(fullRows, (r) => asString(r.germplasmName)),
179
+ observationLevel: computeDistribution(fullRows, (r) => asString(r.observationLevel)),
180
+ season: computeDistribution(fullRows, (r) => normalizeSeason(r.season)),
181
+ };
182
+ const totalCount = firstPage.totalCount ?? firstPage.rows.length;
183
+ const refinementHint = buildRefinementHint(totalCount, loadLimit, distributions);
184
+ const result = {
185
+ alias: connection.alias,
186
+ results: firstPage.rows,
187
+ returnedCount: firstPage.rows.length,
188
+ totalCount,
189
+ hasMore: firstPage.hasMore,
190
+ distributions,
191
+ warnings,
192
+ appliedFilters: filters,
193
+ };
194
+ if (refinementHint)
195
+ result.refinementHint = refinementHint;
196
+ if (datasetMeta)
197
+ result.dataset = datasetMeta;
198
+ return result;
199
+ },
200
+ format: (result) => {
201
+ const lines = [];
202
+ lines.push(`# ${result.returnedCount} of ${result.totalCount} observations — \`${result.alias}\``);
203
+ lines.push('');
204
+ if (result.hasMore) {
205
+ lines.push(`⚠ More rows exist beyond the returned set. ${result.dataset ? `Full set persisted as dataset \`${result.dataset.datasetId}\`.` : 'Narrow filters or raise loadLimit.'}`);
206
+ lines.push('');
207
+ }
208
+ if (result.refinementHint) {
209
+ lines.push(`**Refinement hint:** ${result.refinementHint}`);
210
+ lines.push('');
211
+ }
212
+ lines.push(`Applied filters: \`${JSON.stringify(result.appliedFilters)}\``);
213
+ lines.push('');
214
+ lines.push('## Distributions');
215
+ lines.push(renderDistributions(result.distributions) || '_No values to summarize._');
216
+ lines.push('');
217
+ lines.push('## Observations');
218
+ if (result.results.length === 0) {
219
+ lines.push('_No rows returned._');
220
+ }
221
+ else {
222
+ for (const o of result.results) {
223
+ const parts = [];
224
+ const label = o.observationVariableName ?? o.observationVariableDbId ?? '?';
225
+ parts.push(`**${label}**`);
226
+ if (o.observationVariableDbId)
227
+ parts.push(`varDbId=${o.observationVariableDbId}`);
228
+ if (o.value !== undefined)
229
+ parts.push(`= ${o.value}`);
230
+ if (o.observationDbId)
231
+ parts.push(`id=\`${o.observationDbId}\``);
232
+ if (o.observationUnitName)
233
+ parts.push(`unit=${o.observationUnitName}`);
234
+ if (o.observationUnitDbId)
235
+ parts.push(`unitDbId=${o.observationUnitDbId}`);
236
+ if (o.germplasmName)
237
+ parts.push(`germplasm=${o.germplasmName}`);
238
+ if (o.germplasmDbId)
239
+ parts.push(`germplasmDbId=${o.germplasmDbId}`);
240
+ if (o.studyName)
241
+ parts.push(`study=${o.studyName}`);
242
+ if (o.studyDbId)
243
+ parts.push(`studyDbId=${o.studyDbId}`);
244
+ if (o.observationLevel)
245
+ parts.push(`level=${o.observationLevel}`);
246
+ const seasonLabel = normalizeSeason(o.season);
247
+ if (seasonLabel)
248
+ parts.push(`season=${seasonLabel}`);
249
+ if (o.observationTimeStamp)
250
+ parts.push(`time=${o.observationTimeStamp}`);
251
+ if (o.collector)
252
+ parts.push(`collector=${o.collector}`);
253
+ if (o.uploadedBy)
254
+ parts.push(`uploadedBy=${o.uploadedBy}`);
255
+ lines.push(`- ${parts.join(' · ')}`);
256
+ }
257
+ }
258
+ if (result.dataset) {
259
+ lines.push('');
260
+ lines.push('## Dataset handle');
261
+ lines.push(...renderDatasetHandle(result.dataset));
262
+ }
263
+ if (result.warnings.length > 0) {
264
+ lines.push('');
265
+ lines.push('## Warnings');
266
+ for (const w of result.warnings)
267
+ lines.push(`- ${w}`);
268
+ }
269
+ return [{ type: 'text', text: lines.join('\n') }];
270
+ },
271
+ });
272
+ function normalizeSeason(value) {
273
+ const nonEmpty = (v) => typeof v === 'string' && v.length > 0 ? v : undefined;
274
+ if (typeof value === 'string')
275
+ return nonEmpty(value);
276
+ if (!value || typeof value !== 'object')
277
+ return;
278
+ const record = value;
279
+ const id = nonEmpty(record.seasonDbId);
280
+ if (id)
281
+ return id;
282
+ const label = nonEmpty(record.season) ?? nonEmpty(record.seasonName);
283
+ const year = nonEmpty(record.year) ?? (typeof record.year === 'number' ? String(record.year) : undefined);
284
+ if (label)
285
+ return year ? `${label} ${year}` : label;
286
+ return year;
287
+ }
288
+ //# sourceMappingURL=brapi-find-observations.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-find-observations.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-find-observations.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @fileoverview `brapi_find_studies` — locate studies matching crop / trial
3
+ * type / season / location / program filters. Pulls an initial page and, if
4
+ * the server reports more rows than loadLimit, spills the union into
5
+ * DatasetStore and returns a handle. Companion response: per-field
6
+ * distributions computed from the full row set plus a refinement hint.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-find-studies.tool
9
+ */
10
+ import { z } from '@cyanheads/mcp-ts-core';
11
+ export declare const brapiFindStudies: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
12
+ alias: z.ZodOptional<z.ZodString>;
13
+ crop: z.ZodOptional<z.ZodString>;
14
+ trialTypes: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ seasons: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ locations: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
+ programs: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ trials: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ studyNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
20
+ active: z.ZodOptional<z.ZodBoolean>;
21
+ text: z.ZodOptional<z.ZodString>;
22
+ loadLimit: z.ZodOptional<z.ZodNumber>;
23
+ extraFilters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
24
+ }, z.core.$strip>, z.ZodObject<{
25
+ alias: z.ZodString;
26
+ results: z.ZodArray<z.ZodObject<{
27
+ studyDbId: z.ZodString;
28
+ studyName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
29
+ studyType: z.ZodOptional<z.ZodNullable<z.ZodString>>;
30
+ studyDescription: z.ZodOptional<z.ZodNullable<z.ZodString>>;
31
+ programDbId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
32
+ programName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
33
+ trialDbId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
34
+ trialName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
35
+ locationDbId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
36
+ locationName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
37
+ commonCropName: z.ZodOptional<z.ZodNullable<z.ZodString>>;
38
+ seasons: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodString>>>;
39
+ active: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
40
+ startDate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
41
+ endDate: z.ZodOptional<z.ZodNullable<z.ZodString>>;
42
+ studyCode: z.ZodOptional<z.ZodNullable<z.ZodString>>;
43
+ studyPUI: z.ZodOptional<z.ZodNullable<z.ZodString>>;
44
+ }, z.core.$loose>>;
45
+ returnedCount: z.ZodNumber;
46
+ totalCount: z.ZodNumber;
47
+ hasMore: z.ZodBoolean;
48
+ distributions: z.ZodObject<{
49
+ programName: z.ZodRecord<z.ZodString, z.ZodNumber>;
50
+ studyType: z.ZodRecord<z.ZodString, z.ZodNumber>;
51
+ seasons: z.ZodRecord<z.ZodString, z.ZodNumber>;
52
+ locationName: z.ZodRecord<z.ZodString, z.ZodNumber>;
53
+ commonCropName: z.ZodRecord<z.ZodString, z.ZodNumber>;
54
+ }, z.core.$strip>;
55
+ refinementHint: z.ZodOptional<z.ZodString>;
56
+ dataset: z.ZodOptional<z.ZodObject<{
57
+ datasetId: z.ZodString;
58
+ rowCount: z.ZodNumber;
59
+ sizeBytes: z.ZodNumber;
60
+ columns: z.ZodArray<z.ZodString>;
61
+ createdAt: z.ZodString;
62
+ expiresAt: z.ZodString;
63
+ truncated: z.ZodOptional<z.ZodBoolean>;
64
+ maxRows: z.ZodOptional<z.ZodNumber>;
65
+ }, z.core.$strip>>;
66
+ warnings: z.ZodArray<z.ZodString>;
67
+ appliedFilters: z.ZodRecord<z.ZodString, z.ZodUnknown>;
68
+ }, z.core.$strip>, undefined>;
69
+ //# sourceMappingURL=brapi-find-studies.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-find-studies.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-find-studies.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AA0FjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BA6K3B,CAAC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * @fileoverview `brapi_find_studies` — locate studies matching crop / trial
3
+ * type / season / location / program filters. Pulls an initial page and, if
4
+ * the server reports more rows than loadLimit, spills the union into
5
+ * DatasetStore and returns a handle. Companion response: per-field
6
+ * distributions computed from the full row set plus a refinement hint.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-find-studies.tool
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { getServerConfig } from '../../../config/server-config.js';
12
+ import { getBrapiClient } from '../../../services/brapi-client/index.js';
13
+ import { getCapabilityRegistry } from '../../../services/capability-registry/index.js';
14
+ import { getDatasetStore } from '../../../services/dataset-store/index.js';
15
+ import { DEFAULT_ALIAS, getServerRegistry } from '../../../services/server-registry/index.js';
16
+ import { AliasInput, asString, asStringArray, buildRefinementHint, computeDistribution, DatasetHandleSchema, ExtraFiltersInput, LoadLimitInput, loadInitialPage, maybeSpill, mergeFilters, renderDatasetHandle, renderDistributions, } from '../shared/find-helpers.js';
17
+ const StudyRowSchema = z
18
+ .object({
19
+ studyDbId: z.string().describe('Server-side identifier for the study.'),
20
+ studyName: z.string().nullish().describe('Display name.'),
21
+ studyType: z.string().nullish().describe('E.g. "Yield Trial", "Phenotyping".'),
22
+ studyDescription: z.string().nullish().describe('Free-form description.'),
23
+ programDbId: z.string().nullish().describe('FK to program; resolve via `brapi_get_study`.'),
24
+ programName: z.string().nullish().describe('Display name of the owning program.'),
25
+ trialDbId: z.string().nullish().describe('FK to trial; resolve via `brapi_get_study`.'),
26
+ trialName: z.string().nullish().describe('Display name of the owning trial.'),
27
+ locationDbId: z.string().nullish().describe('FK to location; resolve via `brapi_get_study`.'),
28
+ locationName: z.string().nullish().describe('Display name of the study site.'),
29
+ commonCropName: z.string().nullish().describe('Common crop name (e.g. "Maize", "Wheat").'),
30
+ seasons: z
31
+ .array(z.string().describe('Season identifier — typically a year like "2022".'))
32
+ .nullish()
33
+ .describe('Season identifiers this study spans.'),
34
+ active: z.boolean().nullish().describe('True while the study is open for data capture.'),
35
+ startDate: z.string().nullish().describe('ISO 8601 start date.'),
36
+ endDate: z.string().nullish().describe('ISO 8601 end date.'),
37
+ studyCode: z.string().nullish().describe('Short code or alias for the study.'),
38
+ studyPUI: z.string().nullish().describe('Persistent unique identifier (URI).'),
39
+ })
40
+ .passthrough()
41
+ .describe('One BrAPI study record.');
42
+ const OutputSchema = z.object({
43
+ alias: z.string().describe('Alias of the registered BrAPI connection the call used.'),
44
+ results: z.array(StudyRowSchema).describe('Rows returned in-context (up to loadLimit).'),
45
+ returnedCount: z.number().int().nonnegative().describe('Length of results[].'),
46
+ totalCount: z.number().int().nonnegative().describe('Total rows reported by the server.'),
47
+ hasMore: z.boolean().describe('True when more rows exist beyond the returned set.'),
48
+ distributions: z
49
+ .object({
50
+ programName: z
51
+ .record(z.string(), z.number())
52
+ .describe('Program name → count of rows with that program.'),
53
+ studyType: z
54
+ .record(z.string(), z.number())
55
+ .describe('Study type → count of rows with that type.'),
56
+ seasons: z
57
+ .record(z.string(), z.number())
58
+ .describe('Season identifier → count of rows in that season.'),
59
+ locationName: z
60
+ .record(z.string(), z.number())
61
+ .describe('Location name → count of rows at that site.'),
62
+ commonCropName: z
63
+ .record(z.string(), z.number())
64
+ .describe('Common crop name → count of rows for that crop.'),
65
+ })
66
+ .describe('Value frequency per field across the full result set.'),
67
+ refinementHint: z
68
+ .string()
69
+ .optional()
70
+ .describe('Suggested next-step query refinement when the result set is large.'),
71
+ dataset: DatasetHandleSchema.optional().describe('Dataset handle when the full result set was persisted to DatasetStore.'),
72
+ warnings: z
73
+ .array(z.string())
74
+ .describe('Advisory messages (filter overrides, partial data, etc.).'),
75
+ appliedFilters: z
76
+ .record(z.string(), z.unknown())
77
+ .describe('The final filter map sent to the server (named + extraFilters).'),
78
+ });
79
+ export const brapiFindStudies = tool('brapi_find_studies', {
80
+ description: 'Locate studies matching crop, trial type, season, location, program, or free-text criteria. Results are enriched with program/trial/location context in one call. Returns a dataset handle when the upstream total exceeds loadLimit.',
81
+ annotations: { readOnlyHint: true, openWorldHint: true },
82
+ input: z.object({
83
+ alias: AliasInput,
84
+ crop: z.string().optional().describe('Filter by common crop name (single value).'),
85
+ trialTypes: z.array(z.string()).optional().describe('Filter by study types.'),
86
+ seasons: z.array(z.string()).optional().describe('Filter by seasons (e.g. "2022").'),
87
+ locations: z
88
+ .array(z.string())
89
+ .optional()
90
+ .describe('Filter by locationDbIds (server-side identifiers, not display names).'),
91
+ programs: z.array(z.string()).optional().describe('Filter by programDbIds.'),
92
+ trials: z.array(z.string()).optional().describe('Filter by trialDbIds.'),
93
+ studyNames: z.array(z.string()).optional().describe('Filter by study display name.'),
94
+ active: z.boolean().optional().describe('Restrict to active / inactive studies.'),
95
+ text: z
96
+ .string()
97
+ .optional()
98
+ .describe('Free-text search across study fields (server-supported subset).'),
99
+ loadLimit: LoadLimitInput,
100
+ extraFilters: ExtraFiltersInput,
101
+ }),
102
+ output: OutputSchema,
103
+ async handler(input, ctx) {
104
+ const registry = getServerRegistry();
105
+ const capabilities = getCapabilityRegistry();
106
+ const client = getBrapiClient();
107
+ const datasetStore = getDatasetStore();
108
+ const config = getServerConfig();
109
+ const connection = await registry.get(ctx, input.alias ?? DEFAULT_ALIAS);
110
+ const capabilityLookup = {};
111
+ if (connection.resolvedAuth)
112
+ capabilityLookup.auth = connection.resolvedAuth;
113
+ await capabilities.ensure(connection.baseUrl, { service: 'studies', method: 'GET' }, ctx, capabilityLookup);
114
+ const warnings = [];
115
+ const filters = mergeFilters({
116
+ commonCropNames: input.crop !== undefined ? [input.crop] : undefined,
117
+ studyTypes: input.trialTypes,
118
+ seasonDbIds: input.seasons,
119
+ locationDbIds: input.locations,
120
+ programDbIds: input.programs,
121
+ trialDbIds: input.trials,
122
+ studyNames: input.studyNames,
123
+ active: input.active,
124
+ searchText: input.text,
125
+ }, input.extraFilters, warnings);
126
+ const loadLimit = input.loadLimit ?? config.loadLimit;
127
+ const firstPage = await loadInitialPage(client, connection, '/studies', filters, loadLimit, ctx);
128
+ const { fullRows, dataset: datasetMeta } = await maybeSpill({
129
+ firstPage,
130
+ client,
131
+ connection,
132
+ path: '/studies',
133
+ filters,
134
+ source: 'find_studies',
135
+ loadLimit,
136
+ ctx,
137
+ store: datasetStore,
138
+ });
139
+ const distributions = {
140
+ programName: computeDistribution(fullRows, (r) => asString(r.programName)),
141
+ studyType: computeDistribution(fullRows, (r) => asString(r.studyType)),
142
+ seasons: computeDistribution(fullRows, (r) => asStringArray(r.seasons)),
143
+ locationName: computeDistribution(fullRows, (r) => asString(r.locationName)),
144
+ commonCropName: computeDistribution(fullRows, (r) => asString(r.commonCropName)),
145
+ };
146
+ const totalCount = firstPage.totalCount ?? firstPage.rows.length;
147
+ const refinementHint = buildRefinementHint(totalCount, loadLimit, distributions);
148
+ ctx.log.info('find_studies completed', {
149
+ baseUrl: connection.baseUrl,
150
+ totalCount,
151
+ returnedCount: firstPage.rows.length,
152
+ spilled: datasetMeta !== undefined,
153
+ });
154
+ const result = {
155
+ alias: connection.alias,
156
+ results: firstPage.rows,
157
+ returnedCount: firstPage.rows.length,
158
+ totalCount,
159
+ hasMore: firstPage.hasMore,
160
+ distributions,
161
+ warnings,
162
+ appliedFilters: filters,
163
+ };
164
+ if (refinementHint)
165
+ result.refinementHint = refinementHint;
166
+ if (datasetMeta)
167
+ result.dataset = datasetMeta;
168
+ return result;
169
+ },
170
+ format: (result) => {
171
+ const lines = [];
172
+ lines.push(`# ${result.returnedCount} of ${result.totalCount} studies — \`${result.alias}\``);
173
+ lines.push('');
174
+ if (result.hasMore) {
175
+ lines.push(`⚠ More rows exist beyond the returned set. ${result.dataset ? `Full set persisted as dataset \`${result.dataset.datasetId}\`.` : 'Narrow filters or raise loadLimit.'}`);
176
+ lines.push('');
177
+ }
178
+ if (result.refinementHint) {
179
+ lines.push(`**Refinement hint:** ${result.refinementHint}`);
180
+ lines.push('');
181
+ }
182
+ lines.push(`Applied filters: \`${JSON.stringify(result.appliedFilters)}\``);
183
+ lines.push('');
184
+ lines.push('## Distributions');
185
+ const rendered = renderDistributions(result.distributions);
186
+ lines.push(rendered || '_No values to summarize._');
187
+ lines.push('');
188
+ lines.push('## Studies');
189
+ if (result.results.length === 0) {
190
+ lines.push('_No rows returned._');
191
+ }
192
+ else {
193
+ for (const study of result.results) {
194
+ const parts = [`**${study.studyName ?? study.studyDbId}**`];
195
+ parts.push(`id=\`${study.studyDbId}\``);
196
+ if (study.studyType)
197
+ parts.push(`type=${study.studyType}`);
198
+ if (study.programName)
199
+ parts.push(`program=${study.programName}`);
200
+ if (study.programDbId)
201
+ parts.push(`programDbId=${study.programDbId}`);
202
+ if (study.trialName)
203
+ parts.push(`trial=${study.trialName}`);
204
+ if (study.trialDbId)
205
+ parts.push(`trialDbId=${study.trialDbId}`);
206
+ if (study.locationName)
207
+ parts.push(`location=${study.locationName}`);
208
+ if (study.locationDbId)
209
+ parts.push(`locationDbId=${study.locationDbId}`);
210
+ if (study.seasons?.length)
211
+ parts.push(`seasons=${study.seasons.join(',')}`);
212
+ if (study.commonCropName)
213
+ parts.push(`crop=${study.commonCropName}`);
214
+ if (study.active != null)
215
+ parts.push(`active=${study.active}`);
216
+ if (study.startDate)
217
+ parts.push(`start=${study.startDate}`);
218
+ if (study.endDate)
219
+ parts.push(`end=${study.endDate}`);
220
+ if (study.studyCode)
221
+ parts.push(`code=${study.studyCode}`);
222
+ if (study.studyPUI)
223
+ parts.push(`pui=${study.studyPUI}`);
224
+ if (study.studyDescription)
225
+ parts.push(`desc=${study.studyDescription}`);
226
+ lines.push(`- ${parts.join(' · ')}`);
227
+ }
228
+ }
229
+ if (result.dataset) {
230
+ lines.push('');
231
+ lines.push('## Dataset handle');
232
+ lines.push(...renderDatasetHandle(result.dataset));
233
+ }
234
+ if (result.warnings.length > 0) {
235
+ lines.push('');
236
+ lines.push('## Warnings');
237
+ for (const w of result.warnings)
238
+ lines.push(`- ${w}`);
239
+ }
240
+ return [{ type: 'text', text: lines.join('\n') }];
241
+ },
242
+ });
243
+ //# sourceMappingURL=brapi-find-studies.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-find-studies.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-find-studies.tool.ts"],"names":[],"mappings":"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"}