@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,290 @@
1
+ /**
2
+ * @fileoverview `brapi_find_germplasm` — search germplasm by name, synonym,
3
+ * accession, attribute, or free text. Matches BrAPI's registered-synonym
4
+ * semantics. Returns distributions for crop / genus / species / collection
5
+ * and spills to DatasetStore when the upstream total exceeds loadLimit.
6
+ *
7
+ * @module mcp-server/tools/definitions/brapi-find-germplasm.tool
8
+ */
9
+ import { tool, z } from '@cyanheads/mcp-ts-core';
10
+ import { getServerConfig } from '../../../config/server-config.js';
11
+ import { getBrapiClient } from '../../../services/brapi-client/index.js';
12
+ import { getCapabilityRegistry } from '../../../services/capability-registry/index.js';
13
+ import { getDatasetStore } from '../../../services/dataset-store/index.js';
14
+ import { DEFAULT_ALIAS, getServerRegistry } from '../../../services/server-registry/index.js';
15
+ import { AliasInput, asString, buildRefinementHint, computeDistribution, DatasetHandleSchema, ExtraFiltersInput, LoadLimitInput, loadInitialPage, maybeSpill, mergeFilters, renderDatasetHandle, renderDistributions, } from '../shared/find-helpers.js';
16
+ const GermplasmRowSchema = z
17
+ .object({
18
+ germplasmDbId: z.string().describe('Server-side identifier for the germplasm.'),
19
+ germplasmName: z.string().nullish().describe('Display name.'),
20
+ germplasmPUI: z.string().nullish().describe('Persistent unique identifier (URI).'),
21
+ commonCropName: z.string().nullish().describe('Common crop name (e.g. "Maize", "Wheat").'),
22
+ accessionNumber: z.string().nullish().describe('Gene-bank catalog number.'),
23
+ genus: z.string().nullish().describe('Botanical genus.'),
24
+ species: z.string().nullish().describe('Botanical species.'),
25
+ subtaxa: z.string().nullish().describe('Botanical subtaxa (subspecies, variety, etc.).'),
26
+ defaultDisplayName: z.string().nullish().describe('Preferred display label.'),
27
+ pedigree: z.string().nullish().describe('Pedigree as a free-text string (e.g. "A/B//C").'),
28
+ biologicalStatusOfAccessionDescription: z
29
+ .string()
30
+ .nullish()
31
+ .describe('MCPD biological-status label (wild / landrace / breeding / cultivar, etc.).'),
32
+ germplasmOrigin: z
33
+ .array(z
34
+ .object({})
35
+ .passthrough()
36
+ .describe('One origin record (collection coordinates and uncertainty per BrAPI v2).'))
37
+ .nullish()
38
+ .describe('Origin records — array of collection-site objects per BrAPI v2.'),
39
+ countryOfOriginCode: z.string().nullish().describe('ISO 3166-1 alpha-3 country code.'),
40
+ collection: z.string().nullish().describe('Collection name this accession belongs to.'),
41
+ instituteCode: z
42
+ .string()
43
+ .nullish()
44
+ .describe('FAO WIEWS institute code of the holding institute.'),
45
+ instituteName: z.string().nullish().describe('Display name of the holding institute.'),
46
+ synonyms: z
47
+ .array(z
48
+ .object({
49
+ synonym: z.string().nullish().describe('Synonym value.'),
50
+ type: z.string().nullish().describe('Synonym type (e.g. "COMMON", "SYNONYM").'),
51
+ })
52
+ .passthrough()
53
+ .describe('Registered synonym for this germplasm.'))
54
+ .nullish()
55
+ .describe('All registered synonyms (alternative names).'),
56
+ })
57
+ .passthrough()
58
+ .describe('One BrAPI germplasm record.');
59
+ const OutputSchema = z.object({
60
+ alias: z.string().describe('Alias of the registered BrAPI connection the call used.'),
61
+ results: z
62
+ .array(GermplasmRowSchema)
63
+ .describe('Germplasm rows returned in-context (up to loadLimit).'),
64
+ returnedCount: z.number().int().nonnegative().describe('Length of `results[]`.'),
65
+ totalCount: z.number().int().nonnegative().describe('Total rows reported by the server.'),
66
+ hasMore: z.boolean().describe('True when more rows exist beyond the returned set.'),
67
+ distributions: z
68
+ .object({
69
+ commonCropName: z
70
+ .record(z.string(), z.number())
71
+ .describe('Common crop name → count of rows for that crop.'),
72
+ genus: z.record(z.string(), z.number()).describe('Genus → count of rows with that genus.'),
73
+ species: z
74
+ .record(z.string(), z.number())
75
+ .describe('Species → count of rows with that species.'),
76
+ collection: z
77
+ .record(z.string(), z.number())
78
+ .describe('Collection name → count of rows in that collection.'),
79
+ countryOfOriginCode: z
80
+ .record(z.string(), z.number())
81
+ .describe('ISO country code → count of rows from that country.'),
82
+ })
83
+ .describe('Value frequency per field across the full result set.'),
84
+ refinementHint: z
85
+ .string()
86
+ .optional()
87
+ .describe('Suggested next-step query refinement when the result set is large.'),
88
+ dataset: DatasetHandleSchema.optional().describe('Dataset handle when the full result set was persisted to DatasetStore.'),
89
+ warnings: z
90
+ .array(z.string())
91
+ .describe('Advisory messages (filter overrides, partial data, capability gaps, etc.).'),
92
+ appliedFilters: z
93
+ .record(z.string(), z.unknown())
94
+ .describe('The final filter map sent to the server (named + extraFilters).'),
95
+ });
96
+ export const brapiFindGermplasm = tool('brapi_find_germplasm', {
97
+ description: 'Find germplasm by name, synonym, accession number, PUI, crop, or free-text query. Matches across registered synonyms. Returns a dataset handle when the upstream total exceeds loadLimit.',
98
+ annotations: { readOnlyHint: true, openWorldHint: true },
99
+ input: z.object({
100
+ alias: AliasInput,
101
+ names: z.array(z.string()).optional().describe('Filter by germplasm display names.'),
102
+ germplasmDbIds: z.array(z.string()).optional().describe('Filter by DbIds.'),
103
+ germplasmPUIs: z.array(z.string()).optional().describe('Persistent unique identifiers.'),
104
+ accessionNumbers: z
105
+ .array(z.string())
106
+ .optional()
107
+ .describe('Filter by accession numbers (gene-bank catalog codes).'),
108
+ crops: z.array(z.string()).optional().describe('Filter by common crop names.'),
109
+ synonyms: z.array(z.string()).optional().describe('Match registered synonyms.'),
110
+ collections: z.array(z.string()).optional().describe('Filter by germplasm collection names.'),
111
+ genus: z.string().optional().describe('Botanical genus.'),
112
+ species: z.string().optional().describe('Botanical species.'),
113
+ text: z.string().optional().describe('Free-text query. Server-supported subset.'),
114
+ loadLimit: LoadLimitInput,
115
+ extraFilters: ExtraFiltersInput,
116
+ }),
117
+ output: OutputSchema,
118
+ async handler(input, ctx) {
119
+ const registry = getServerRegistry();
120
+ const capabilities = getCapabilityRegistry();
121
+ const client = getBrapiClient();
122
+ const datasetStore = getDatasetStore();
123
+ const config = getServerConfig();
124
+ const connection = await registry.get(ctx, input.alias ?? DEFAULT_ALIAS);
125
+ const capabilityLookup = {};
126
+ if (connection.resolvedAuth)
127
+ capabilityLookup.auth = connection.resolvedAuth;
128
+ await capabilities.ensure(connection.baseUrl, { service: 'germplasm', method: 'GET' }, ctx, capabilityLookup);
129
+ const warnings = [];
130
+ const filters = mergeFilters({
131
+ germplasmNames: input.names,
132
+ germplasmDbIds: input.germplasmDbIds,
133
+ germplasmPUIs: input.germplasmPUIs,
134
+ accessionNumbers: input.accessionNumbers,
135
+ commonCropNames: input.crops,
136
+ synonyms: input.synonyms,
137
+ collections: input.collections,
138
+ genus: input.genus,
139
+ species: input.species,
140
+ searchText: input.text,
141
+ }, input.extraFilters, warnings);
142
+ const loadLimit = input.loadLimit ?? config.loadLimit;
143
+ const firstPage = await loadInitialPage(client, connection, '/germplasm', filters, loadLimit, ctx);
144
+ const { fullRows, dataset: datasetMeta } = await maybeSpill({
145
+ firstPage,
146
+ client,
147
+ connection,
148
+ path: '/germplasm',
149
+ filters,
150
+ source: 'find_germplasm',
151
+ loadLimit,
152
+ ctx,
153
+ store: datasetStore,
154
+ });
155
+ const distributions = {
156
+ commonCropName: computeDistribution(fullRows, (r) => asString(r.commonCropName)),
157
+ genus: computeDistribution(fullRows, (r) => asString(r.genus)),
158
+ species: computeDistribution(fullRows, (r) => asString(r.species)),
159
+ collection: computeDistribution(fullRows, (r) => asString(r.collection)),
160
+ countryOfOriginCode: computeDistribution(fullRows, (r) => asString(r.countryOfOriginCode)),
161
+ };
162
+ const totalCount = firstPage.totalCount ?? firstPage.rows.length;
163
+ const refinementHint = buildRefinementHint(totalCount, loadLimit, distributions);
164
+ // Heuristic: if the user asked for a text filter and the upstream returned
165
+ // every row that matches all the *other* filters (i.e. the text didn't
166
+ // narrow anything), the server probably doesn't honor the filter.
167
+ if (input.text &&
168
+ totalCount > 0 &&
169
+ firstPage.totalCount !== undefined &&
170
+ firstPage.rows.length === firstPage.totalCount &&
171
+ !hasRowsMatchingText(firstPage.rows, input.text)) {
172
+ warnings.push(`Free-text filter '${input.text}' may not be honored by this server — none of the returned rows obviously match the query string.`);
173
+ }
174
+ const result = {
175
+ alias: connection.alias,
176
+ results: firstPage.rows,
177
+ returnedCount: firstPage.rows.length,
178
+ totalCount,
179
+ hasMore: firstPage.hasMore,
180
+ distributions,
181
+ warnings,
182
+ appliedFilters: filters,
183
+ };
184
+ if (refinementHint)
185
+ result.refinementHint = refinementHint;
186
+ if (datasetMeta)
187
+ result.dataset = datasetMeta;
188
+ return result;
189
+ },
190
+ format: (result) => {
191
+ const lines = [];
192
+ lines.push(`# ${result.returnedCount} of ${result.totalCount} germplasm — \`${result.alias}\``);
193
+ lines.push('');
194
+ if (result.hasMore) {
195
+ lines.push(`⚠ More rows exist beyond the returned set. ${result.dataset ? `Full set persisted as dataset \`${result.dataset.datasetId}\`.` : 'Narrow filters or raise loadLimit.'}`);
196
+ lines.push('');
197
+ }
198
+ if (result.refinementHint) {
199
+ lines.push(`**Refinement hint:** ${result.refinementHint}`);
200
+ lines.push('');
201
+ }
202
+ lines.push(`Applied filters: \`${JSON.stringify(result.appliedFilters)}\``);
203
+ lines.push('');
204
+ lines.push('## Distributions');
205
+ lines.push(renderDistributions(result.distributions) || '_No values to summarize._');
206
+ lines.push('');
207
+ lines.push('## Germplasm');
208
+ if (result.results.length === 0) {
209
+ lines.push('_No rows returned._');
210
+ }
211
+ else {
212
+ for (const g of result.results) {
213
+ const parts = [
214
+ `**${g.germplasmName ?? g.defaultDisplayName ?? g.germplasmDbId}**`,
215
+ ];
216
+ parts.push(`id=\`${g.germplasmDbId}\``);
217
+ if (g.germplasmPUI)
218
+ parts.push(`pui=${g.germplasmPUI}`);
219
+ if (g.accessionNumber)
220
+ parts.push(`accession=${g.accessionNumber}`);
221
+ if (g.commonCropName)
222
+ parts.push(`crop=${g.commonCropName}`);
223
+ if (g.genus)
224
+ parts.push(`genus=${g.genus}`);
225
+ if (g.species)
226
+ parts.push(`species=${g.species}`);
227
+ if (g.subtaxa)
228
+ parts.push(`subtaxa=${g.subtaxa}`);
229
+ if (g.countryOfOriginCode)
230
+ parts.push(`country=${g.countryOfOriginCode}`);
231
+ if (g.collection)
232
+ parts.push(`collection=${g.collection}`);
233
+ if (g.instituteCode)
234
+ parts.push(`institute=${g.instituteCode}`);
235
+ if (g.instituteName)
236
+ parts.push(`instituteName=${g.instituteName}`);
237
+ if (g.germplasmOrigin?.length)
238
+ parts.push(`germplasmOrigin=${g.germplasmOrigin.length} record(s)`);
239
+ if (g.biologicalStatusOfAccessionDescription)
240
+ parts.push(`status=${g.biologicalStatusOfAccessionDescription}`);
241
+ if (g.pedigree)
242
+ parts.push(`pedigree=${g.pedigree}`);
243
+ if (g.defaultDisplayName)
244
+ parts.push(`displayName=${g.defaultDisplayName}`);
245
+ if (g.synonyms?.length) {
246
+ const synStr = g.synonyms
247
+ .map((s) => `${s.synonym ?? '?'}${s.type ? ` (${s.type})` : ''}`)
248
+ .join(',');
249
+ parts.push(`synonyms=${synStr}`);
250
+ }
251
+ lines.push(`- ${parts.join(' · ')}`);
252
+ }
253
+ }
254
+ if (result.dataset) {
255
+ lines.push('');
256
+ lines.push('## Dataset handle');
257
+ lines.push(...renderDatasetHandle(result.dataset));
258
+ }
259
+ if (result.warnings.length > 0) {
260
+ lines.push('');
261
+ lines.push('## Warnings');
262
+ for (const w of result.warnings)
263
+ lines.push(`- ${w}`);
264
+ }
265
+ return [{ type: 'text', text: lines.join('\n') }];
266
+ },
267
+ });
268
+ function hasRowsMatchingText(rows, text) {
269
+ const needle = text.toLowerCase();
270
+ const containsNeedle = (value) => typeof value === 'string' && value.toLowerCase().includes(needle);
271
+ for (const row of rows) {
272
+ if (containsNeedle(row.germplasmName) ||
273
+ containsNeedle(row.germplasmPUI) ||
274
+ containsNeedle(row.accessionNumber) ||
275
+ containsNeedle(row.defaultDisplayName)) {
276
+ return true;
277
+ }
278
+ if (Array.isArray(row.synonyms)) {
279
+ for (const entry of row.synonyms) {
280
+ if (entry &&
281
+ typeof entry === 'object' &&
282
+ containsNeedle(entry.synonym)) {
283
+ return true;
284
+ }
285
+ }
286
+ }
287
+ }
288
+ return false;
289
+ }
290
+ //# sourceMappingURL=brapi-find-germplasm.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-find-germplasm.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-find-germplasm.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @fileoverview `brapi_find_images` — filter images by observation unit,
3
+ * study, observation, descriptive ontology, file name, or MIME type. Returns
4
+ * metadata only; pull bytes via `brapi_get_image`. Spills the full set to
5
+ * DatasetStore when the upstream total exceeds loadLimit.
6
+ *
7
+ * @module mcp-server/tools/definitions/brapi-find-images.tool
8
+ */
9
+ import { z } from '@cyanheads/mcp-ts-core';
10
+ export declare const brapiFindImages: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
11
+ alias: z.ZodOptional<z.ZodString>;
12
+ images: z.ZodOptional<z.ZodArray<z.ZodString>>;
13
+ observationUnits: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ observations: z.ZodOptional<z.ZodArray<z.ZodString>>;
15
+ studies: z.ZodOptional<z.ZodArray<z.ZodString>>;
16
+ imageFileNames: z.ZodOptional<z.ZodArray<z.ZodString>>;
17
+ mimeTypes: z.ZodOptional<z.ZodArray<z.ZodString>>;
18
+ descriptiveOntologyTerms: z.ZodOptional<z.ZodArray<z.ZodString>>;
19
+ loadLimit: z.ZodOptional<z.ZodNumber>;
20
+ extraFilters: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
21
+ }, z.core.$strip>, z.ZodObject<{
22
+ alias: z.ZodString;
23
+ results: z.ZodArray<z.ZodObject<{
24
+ imageDbId: z.ZodString;
25
+ imageName: z.ZodOptional<z.ZodString>;
26
+ imageFileName: z.ZodOptional<z.ZodString>;
27
+ imageFileSize: z.ZodOptional<z.ZodNumber>;
28
+ imageHeight: z.ZodOptional<z.ZodNumber>;
29
+ imageWidth: z.ZodOptional<z.ZodNumber>;
30
+ mimeType: z.ZodOptional<z.ZodString>;
31
+ imageTimeStamp: z.ZodOptional<z.ZodString>;
32
+ imageURL: z.ZodOptional<z.ZodString>;
33
+ observationUnitDbId: z.ZodOptional<z.ZodString>;
34
+ observationUnitName: z.ZodOptional<z.ZodString>;
35
+ observationDbIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
36
+ studyDbId: z.ZodOptional<z.ZodString>;
37
+ studyName: z.ZodOptional<z.ZodString>;
38
+ descriptiveOntologyTerms: z.ZodOptional<z.ZodArray<z.ZodString>>;
39
+ copyright: z.ZodOptional<z.ZodString>;
40
+ description: z.ZodOptional<z.ZodString>;
41
+ }, z.core.$loose>>;
42
+ returnedCount: z.ZodNumber;
43
+ totalCount: z.ZodNumber;
44
+ hasMore: z.ZodBoolean;
45
+ distributions: z.ZodObject<{
46
+ mimeType: z.ZodRecord<z.ZodString, z.ZodNumber>;
47
+ studyName: z.ZodRecord<z.ZodString, z.ZodNumber>;
48
+ observationUnitName: z.ZodRecord<z.ZodString, z.ZodNumber>;
49
+ descriptiveOntologyTerms: z.ZodRecord<z.ZodString, z.ZodNumber>;
50
+ }, z.core.$strip>;
51
+ refinementHint: z.ZodOptional<z.ZodString>;
52
+ dataset: z.ZodOptional<z.ZodObject<{
53
+ datasetId: z.ZodString;
54
+ rowCount: z.ZodNumber;
55
+ sizeBytes: z.ZodNumber;
56
+ columns: z.ZodArray<z.ZodString>;
57
+ createdAt: z.ZodString;
58
+ expiresAt: z.ZodString;
59
+ truncated: z.ZodOptional<z.ZodBoolean>;
60
+ maxRows: z.ZodOptional<z.ZodNumber>;
61
+ }, z.core.$strip>>;
62
+ warnings: z.ZodArray<z.ZodString>;
63
+ appliedFilters: z.ZodRecord<z.ZodString, z.ZodUnknown>;
64
+ }, z.core.$strip>, undefined>;
65
+ //# sourceMappingURL=brapi-find-images.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-find-images.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-find-images.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAiGjD,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6BAuK1B,CAAC"}
@@ -0,0 +1,243 @@
1
+ /**
2
+ * @fileoverview `brapi_find_images` — filter images by observation unit,
3
+ * study, observation, descriptive ontology, file name, or MIME type. Returns
4
+ * metadata only; pull bytes via `brapi_get_image`. Spills the full set to
5
+ * DatasetStore when the upstream total exceeds loadLimit.
6
+ *
7
+ * @module mcp-server/tools/definitions/brapi-find-images.tool
8
+ */
9
+ import { tool, z } from '@cyanheads/mcp-ts-core';
10
+ import { getServerConfig } from '../../../config/server-config.js';
11
+ import { getBrapiClient } from '../../../services/brapi-client/index.js';
12
+ import { getCapabilityRegistry } from '../../../services/capability-registry/index.js';
13
+ import { getDatasetStore } from '../../../services/dataset-store/index.js';
14
+ import { DEFAULT_ALIAS, getServerRegistry } from '../../../services/server-registry/index.js';
15
+ import { AliasInput, asString, buildRefinementHint, computeDistribution, DatasetHandleSchema, ExtraFiltersInput, LoadLimitInput, loadInitialPage, maybeSpill, mergeFilters, renderDatasetHandle, renderDistributions, } from '../shared/find-helpers.js';
16
+ const ImageRowSchema = z
17
+ .object({
18
+ imageDbId: z.string().describe('Server-side identifier for the image.'),
19
+ imageName: z.string().optional().describe('Display name.'),
20
+ imageFileName: z.string().optional().describe('Original uploaded filename.'),
21
+ imageFileSize: z.number().optional().describe('File size in bytes.'),
22
+ imageHeight: z.number().optional().describe('Pixel height.'),
23
+ imageWidth: z.number().optional().describe('Pixel width.'),
24
+ mimeType: z.string().optional().describe('MIME type (e.g. "image/jpeg").'),
25
+ imageTimeStamp: z.string().optional().describe('ISO 8601 capture timestamp.'),
26
+ imageURL: z
27
+ .string()
28
+ .optional()
29
+ .describe('URL where the bytes live (may be relative to baseUrl or absolute).'),
30
+ observationUnitDbId: z
31
+ .string()
32
+ .optional()
33
+ .describe('FK to the observation unit this image depicts.'),
34
+ observationUnitName: z.string().optional().describe('Display name of the observation unit.'),
35
+ observationDbIds: z
36
+ .array(z.string().describe('Observation identifier.'))
37
+ .optional()
38
+ .describe('FKs to observations this image is evidence for.'),
39
+ studyDbId: z.string().optional().describe('FK to the study the image belongs to.'),
40
+ studyName: z.string().optional().describe('Display name of the study.'),
41
+ descriptiveOntologyTerms: z
42
+ .array(z.string().describe('Ontology term ID or label.'))
43
+ .optional()
44
+ .describe('Descriptive ontology tags (e.g. "CO_334:plot").'),
45
+ copyright: z.string().optional().describe('Copyright or rights notice.'),
46
+ description: z.string().optional().describe('Free-text description.'),
47
+ })
48
+ .passthrough()
49
+ .describe('One BrAPI image metadata record.');
50
+ const OutputSchema = z.object({
51
+ alias: z.string().describe('Alias of the registered BrAPI connection the call used.'),
52
+ results: z
53
+ .array(ImageRowSchema)
54
+ .describe('Image metadata rows returned in-context (up to loadLimit).'),
55
+ returnedCount: z.number().int().nonnegative().describe('Length of `results[]`.'),
56
+ totalCount: z.number().int().nonnegative().describe('Total rows reported by the server.'),
57
+ hasMore: z.boolean().describe('True when more rows exist beyond the returned set.'),
58
+ distributions: z
59
+ .object({
60
+ mimeType: z
61
+ .record(z.string(), z.number())
62
+ .describe('MIME type → count of images with that type.'),
63
+ studyName: z
64
+ .record(z.string(), z.number())
65
+ .describe('Study name → count of images in that study.'),
66
+ observationUnitName: z
67
+ .record(z.string(), z.number())
68
+ .describe('Observation unit name → count of images tied to that unit.'),
69
+ descriptiveOntologyTerms: z
70
+ .record(z.string(), z.number())
71
+ .describe('Ontology term → count of images tagged with that term.'),
72
+ })
73
+ .describe('Value frequency per field across the full result set.'),
74
+ refinementHint: z
75
+ .string()
76
+ .optional()
77
+ .describe('Suggested next-step query refinement when the result set is large.'),
78
+ dataset: DatasetHandleSchema.optional().describe('Dataset handle when the full result set was persisted to DatasetStore.'),
79
+ warnings: z
80
+ .array(z.string())
81
+ .describe('Advisory messages (filter overrides, partial data, capability gaps, etc.).'),
82
+ appliedFilters: z
83
+ .record(z.string(), z.unknown())
84
+ .describe('The final filter map sent to the server (named + extraFilters).'),
85
+ });
86
+ export const brapiFindImages = tool('brapi_find_images', {
87
+ description: 'Filter images by observation unit, observation, study, descriptive ontology term, file name, or MIME type. Returns metadata only — use brapi_get_image to fetch bytes inline. Returns a dataset handle when the upstream total exceeds loadLimit.',
88
+ annotations: { readOnlyHint: true, openWorldHint: true },
89
+ input: z.object({
90
+ alias: AliasInput,
91
+ images: z.array(z.string()).optional().describe('Filter by imageDbIds.'),
92
+ observationUnits: z.array(z.string()).optional().describe('Filter by observationUnitDbIds.'),
93
+ observations: z.array(z.string()).optional().describe('Filter by observationDbIds.'),
94
+ studies: z.array(z.string()).optional().describe('Filter by studyDbIds.'),
95
+ imageFileNames: z.array(z.string()).optional().describe('Filter by uploaded file name.'),
96
+ mimeTypes: z
97
+ .array(z.string())
98
+ .optional()
99
+ .describe('Filter by MIME type — e.g. "image/jpeg", "image/png".'),
100
+ descriptiveOntologyTerms: z
101
+ .array(z.string())
102
+ .optional()
103
+ .describe('Filter by ontology tags (e.g. "CO_334:plot").'),
104
+ loadLimit: LoadLimitInput,
105
+ extraFilters: ExtraFiltersInput,
106
+ }),
107
+ output: OutputSchema,
108
+ async handler(input, ctx) {
109
+ const registry = getServerRegistry();
110
+ const capabilities = getCapabilityRegistry();
111
+ const client = getBrapiClient();
112
+ const datasetStore = getDatasetStore();
113
+ const config = getServerConfig();
114
+ const connection = await registry.get(ctx, input.alias ?? DEFAULT_ALIAS);
115
+ const capabilityLookup = {};
116
+ if (connection.resolvedAuth)
117
+ capabilityLookup.auth = connection.resolvedAuth;
118
+ await capabilities.ensure(connection.baseUrl, { service: 'images', method: 'GET' }, ctx, capabilityLookup);
119
+ const warnings = [];
120
+ const filters = mergeFilters({
121
+ imageDbIds: input.images,
122
+ observationUnitDbIds: input.observationUnits,
123
+ observationDbIds: input.observations,
124
+ studyDbIds: input.studies,
125
+ imageFileNames: input.imageFileNames,
126
+ mimeTypes: input.mimeTypes,
127
+ descriptiveOntologyTerms: input.descriptiveOntologyTerms,
128
+ }, input.extraFilters, warnings);
129
+ const loadLimit = input.loadLimit ?? config.loadLimit;
130
+ const firstPage = await loadInitialPage(client, connection, '/images', filters, loadLimit, ctx);
131
+ const { fullRows, dataset: datasetMeta } = await maybeSpill({
132
+ firstPage,
133
+ client,
134
+ connection,
135
+ path: '/images',
136
+ filters,
137
+ source: 'find_images',
138
+ loadLimit,
139
+ ctx,
140
+ store: datasetStore,
141
+ });
142
+ const distributions = {
143
+ mimeType: computeDistribution(fullRows, (r) => asString(r.mimeType)),
144
+ studyName: computeDistribution(fullRows, (r) => asString(r.studyName)),
145
+ observationUnitName: computeDistribution(fullRows, (r) => asString(r.observationUnitName)),
146
+ descriptiveOntologyTerms: computeDistribution(fullRows, (r) => {
147
+ const terms = r.descriptiveOntologyTerms;
148
+ if (!Array.isArray(terms))
149
+ return;
150
+ return terms.filter((t) => typeof t === 'string' && t.length > 0);
151
+ }),
152
+ };
153
+ const totalCount = firstPage.totalCount ?? firstPage.rows.length;
154
+ const refinementHint = buildRefinementHint(totalCount, loadLimit, distributions);
155
+ const result = {
156
+ alias: connection.alias,
157
+ results: firstPage.rows,
158
+ returnedCount: firstPage.rows.length,
159
+ totalCount,
160
+ hasMore: firstPage.hasMore,
161
+ distributions,
162
+ warnings,
163
+ appliedFilters: filters,
164
+ };
165
+ if (refinementHint)
166
+ result.refinementHint = refinementHint;
167
+ if (datasetMeta)
168
+ result.dataset = datasetMeta;
169
+ return result;
170
+ },
171
+ format: (result) => {
172
+ const lines = [];
173
+ lines.push(`# ${result.returnedCount} of ${result.totalCount} images — \`${result.alias}\``);
174
+ lines.push('');
175
+ if (result.hasMore) {
176
+ lines.push(`⚠ More rows exist beyond the returned set. ${result.dataset ? `Full set persisted as dataset \`${result.dataset.datasetId}\`.` : 'Narrow filters or raise loadLimit.'}`);
177
+ lines.push('');
178
+ }
179
+ if (result.refinementHint) {
180
+ lines.push(`**Refinement hint:** ${result.refinementHint}`);
181
+ lines.push('');
182
+ }
183
+ lines.push(`Applied filters: \`${JSON.stringify(result.appliedFilters)}\``);
184
+ lines.push('');
185
+ lines.push('## Distributions');
186
+ lines.push(renderDistributions(result.distributions) || '_No values to summarize._');
187
+ lines.push('');
188
+ lines.push('## Images');
189
+ if (result.results.length === 0) {
190
+ lines.push('_No rows returned._');
191
+ }
192
+ else {
193
+ for (const img of result.results) {
194
+ const parts = [`**${img.imageName ?? img.imageFileName ?? img.imageDbId}**`];
195
+ parts.push(`id=\`${img.imageDbId}\``);
196
+ if (img.imageFileName)
197
+ parts.push(`file=${img.imageFileName}`);
198
+ if (img.mimeType)
199
+ parts.push(`mime=${img.mimeType}`);
200
+ if (img.imageWidth && img.imageHeight) {
201
+ parts.push(`${img.imageWidth}×${img.imageHeight}`);
202
+ }
203
+ if (img.imageFileSize)
204
+ parts.push(`size=${img.imageFileSize}B`);
205
+ if (img.observationUnitName)
206
+ parts.push(`unit=${img.observationUnitName}`);
207
+ if (img.observationUnitDbId)
208
+ parts.push(`unitDbId=${img.observationUnitDbId}`);
209
+ if (img.observationDbIds?.length)
210
+ parts.push(`obs=${img.observationDbIds.join(',')}`);
211
+ if (img.studyName)
212
+ parts.push(`study=${img.studyName}`);
213
+ if (img.studyDbId)
214
+ parts.push(`studyDbId=${img.studyDbId}`);
215
+ if (img.descriptiveOntologyTerms?.length) {
216
+ parts.push(`terms=${img.descriptiveOntologyTerms.join(',')}`);
217
+ }
218
+ if (img.imageTimeStamp)
219
+ parts.push(`time=${img.imageTimeStamp}`);
220
+ if (img.imageURL)
221
+ parts.push(`url=${img.imageURL}`);
222
+ if (img.copyright)
223
+ parts.push(`©${img.copyright}`);
224
+ if (img.description)
225
+ parts.push(`desc=${img.description}`);
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-images.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-find-images.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-find-images.tool.ts"],"names":[],"mappings":"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"}