@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,26 @@
1
+ /**
2
+ * @fileoverview `brapi://dataset/{datasetId}` — metadata + provenance for a
3
+ * persisted dataset (rows omitted; use `brapi_manage_dataset` mode `load` to
4
+ * page through rows). Dataset IDs are unbounded and tenant-scoped — clients
5
+ * obtain them from a `find_*` tool's spillover handle, then read this URI.
6
+ *
7
+ * @module mcp-server/resources/definitions/brapi-dataset.resource
8
+ */
9
+ import { resource, z } from '@cyanheads/mcp-ts-core';
10
+ import { getDatasetStore } from '../../../services/dataset-store/index.js';
11
+ export const brapiDatasetResource = resource('brapi://dataset/{datasetId}', {
12
+ name: 'brapi-dataset',
13
+ title: 'BrAPI dataset metadata',
14
+ description: 'Persisted dataset metadata + provenance (source tool, baseUrl, original query, row count, columns, expiry). Rows themselves are accessible via brapi_manage_dataset (mode: load). IDs come from the spillover handle on find_* tools.',
15
+ mimeType: 'application/json',
16
+ params: z.object({
17
+ datasetId: z.string().min(1).describe('Dataset UUID returned by a find_* tool spillover.'),
18
+ }),
19
+ handler(params, ctx) {
20
+ return getDatasetStore().summary(ctx, params.datasetId);
21
+ },
22
+ list: async () => ({
23
+ resources: [],
24
+ }),
25
+ });
26
+ //# sourceMappingURL=brapi-dataset.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-dataset.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-dataset.resource.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,6BAA6B,EAAE;IAC1E,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,uOAAuO;IACzO,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC3F,CAAC;IACF,OAAO,CAAC,MAAM,EAAE,GAAG;QACjB,OAAO,eAAe,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE,EAAE;KACd,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * @fileoverview `brapi://filters/{endpoint}` — filter catalog for a BrAPI
3
+ * endpoint (studies, germplasm, observations, variables, images, variants,
4
+ * locations). Mirror of `brapi_describe_filters`. Static catalog — no
5
+ * connection or auth required.
6
+ *
7
+ * @module mcp-server/resources/definitions/brapi-filters.resource
8
+ */
9
+ import { z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
11
+ export declare const brapiFiltersResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
12
+ endpoint: z.ZodString;
13
+ }, z.core.$strip>, undefined, readonly [{
14
+ readonly reason: "unknown_endpoint";
15
+ readonly code: JsonRpcErrorCode.NotFound;
16
+ readonly when: "No filter catalog is registered for the requested endpoint";
17
+ readonly recovery: `Pick a known endpoint (${string}) \u2014 listing brapi://filters returns one resource per supported endpoint.`;
18
+ }]>;
19
+ //# sourceMappingURL=brapi-filters.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-filters.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-filters.resource.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAMjE,eAAO,MAAM,oBAAoB;;;;;;;GAkC/B,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview `brapi://filters/{endpoint}` — filter catalog for a BrAPI
3
+ * endpoint (studies, germplasm, observations, variables, images, variants,
4
+ * locations). Mirror of `brapi_describe_filters`. Static catalog — no
5
+ * connection or auth required.
6
+ *
7
+ * @module mcp-server/resources/definitions/brapi-filters.resource
8
+ */
9
+ import { resource, z } from '@cyanheads/mcp-ts-core';
10
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
11
+ import { brapiDescribeFilters } from '../../../mcp-server/tools/definitions/brapi-describe-filters.tool.js';
12
+ import { listFilterEndpoints } from '../../../services/brapi-filters/index.js';
13
+ const ENDPOINTS = listFilterEndpoints();
14
+ export const brapiFiltersResource = resource('brapi://filters/{endpoint}', {
15
+ name: 'brapi-filters',
16
+ title: 'BrAPI filter catalog',
17
+ description: 'BrAPI filter catalog for a single endpoint (name, type, description, example per filter). Mirrors the brapi_describe_filters tool.',
18
+ mimeType: 'application/json',
19
+ errors: [
20
+ {
21
+ reason: 'unknown_endpoint',
22
+ code: JsonRpcErrorCode.NotFound,
23
+ when: 'No filter catalog is registered for the requested endpoint',
24
+ recovery: `Pick a known endpoint (${ENDPOINTS.join(', ')}) — listing brapi://filters returns one resource per supported endpoint.`,
25
+ },
26
+ ],
27
+ params: z.object({
28
+ endpoint: z
29
+ .string()
30
+ .min(1)
31
+ .describe(`BrAPI endpoint to describe filters for. Known values: ${ENDPOINTS.join(', ')}.`),
32
+ }),
33
+ async handler(params, ctx) {
34
+ return await brapiDescribeFilters.handler(brapiDescribeFilters.input.parse({ endpoint: params.endpoint }), ctx);
35
+ },
36
+ list: async () => ({
37
+ resources: ENDPOINTS.map((endpoint) => ({
38
+ uri: `brapi://filters/${endpoint}`,
39
+ name: `BrAPI filter catalog · ${endpoint}`,
40
+ description: `Filter names accepted by /${endpoint} on a BrAPI v2.1 server.`,
41
+ mimeType: 'application/json',
42
+ })),
43
+ }),
44
+ });
45
+ //# sourceMappingURL=brapi-filters.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-filters.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-filters.resource.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,+DAA+D,CAAC;AACrG,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAExE,MAAM,SAAS,GAAG,mBAAmB,EAAE,CAAC;AAExC,MAAM,CAAC,MAAM,oBAAoB,GAAG,QAAQ,CAAC,4BAA4B,EAAE;IACzE,IAAI,EAAE,eAAe;IACrB,KAAK,EAAE,sBAAsB;IAC7B,WAAW,EACT,oIAAoI;IACtI,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE;QACN;YACE,MAAM,EAAE,kBAAkB;YAC1B,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,4DAA4D;YAClE,QAAQ,EAAE,0BAA0B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,0EAA0E;SACnI;KACO;IACV,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,QAAQ,CAAC,yDAAyD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;KAC9F,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,OAAO,MAAM,oBAAoB,CAAC,OAAO,CACvC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,EAC/D,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACtC,GAAG,EAAE,mBAAmB,QAAQ,EAAE;YAClC,IAAI,EAAE,0BAA0B,QAAQ,EAAE;YAC1C,WAAW,EAAE,6BAA6B,QAAQ,0BAA0B;YAC5E,QAAQ,EAAE,kBAAkB;SAC7B,CAAC,CAAC;KACJ,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview `brapi://germplasm/{germplasmDbId}` — single-germplasm record
3
+ * on the default connection, with attributes, parents, and companion counts.
4
+ * Mirror of `brapi_get_germplasm`.
5
+ *
6
+ * @module mcp-server/resources/definitions/brapi-germplasm.resource
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ export declare const brapiGermplasmResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
11
+ germplasmDbId: z.ZodString;
12
+ }, z.core.$strip>, undefined, readonly [{
13
+ readonly reason: "germplasm_not_found";
14
+ readonly code: JsonRpcErrorCode.NotFound;
15
+ readonly when: "Upstream returned no germplasm record for the requested DbId";
16
+ readonly recovery: "Verify the germplasmDbId on the target server, or run brapi_find_germplasm to discover valid IDs.";
17
+ }]>;
18
+ //# sourceMappingURL=brapi-germplasm.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-germplasm.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-germplasm.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,sBAAsB;;;;;;;GA2BjC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview `brapi://germplasm/{germplasmDbId}` — single-germplasm record
3
+ * on the default connection, with attributes, parents, and companion counts.
4
+ * Mirror of `brapi_get_germplasm`.
5
+ *
6
+ * @module mcp-server/resources/definitions/brapi-germplasm.resource
7
+ */
8
+ import { resource, z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ import { brapiGetGermplasm } from '../../../mcp-server/tools/definitions/brapi-get-germplasm.tool.js';
11
+ export const brapiGermplasmResource = resource('brapi://germplasm/{germplasmDbId}', {
12
+ name: 'brapi-germplasm',
13
+ title: 'BrAPI germplasm record',
14
+ description: 'Single-germplasm resource on the default BrAPI connection — same payload as the brapi_get_germplasm tool, addressable by URI.',
15
+ mimeType: 'application/json',
16
+ errors: [
17
+ {
18
+ reason: 'germplasm_not_found',
19
+ code: JsonRpcErrorCode.NotFound,
20
+ when: 'Upstream returned no germplasm record for the requested DbId',
21
+ recovery: 'Verify the germplasmDbId on the target server, or run brapi_find_germplasm to discover valid IDs.',
22
+ },
23
+ ],
24
+ params: z.object({
25
+ germplasmDbId: z.string().min(1).describe('Germplasm identifier on the default connection.'),
26
+ }),
27
+ async handler(params, ctx) {
28
+ return await brapiGetGermplasm.handler(brapiGetGermplasm.input.parse({ germplasmDbId: params.germplasmDbId }), ctx);
29
+ },
30
+ list: async () => ({
31
+ resources: [],
32
+ }),
33
+ });
34
+ //# sourceMappingURL=brapi-germplasm.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-germplasm.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-germplasm.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4DAA4D,CAAC;AAE/F,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,mCAAmC,EAAE;IAClF,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,wBAAwB;IAC/B,WAAW,EACT,+HAA+H;IACjI,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE;QACN;YACE,MAAM,EAAE,qBAAqB;YAC7B,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,8DAA8D;YACpE,QAAQ,EACN,mGAAmG;SACtG;KACO;IACV,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;KAC7F,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,OAAO,MAAM,iBAAiB,CAAC,OAAO,CACpC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,EACtE,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE,EAAE;KACd,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview `brapi://server/info` — orientation envelope for the default
3
+ * connection. Mirror of `brapi_server_info` for clients that prefer the
4
+ * resource surface. Reads the cached capability profile.
5
+ *
6
+ * @module mcp-server/resources/definitions/brapi-server-info.resource
7
+ */
8
+ export declare const brapiServerInfoResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<import("zod").ZodObject<Readonly<{
9
+ [k: string]: import("zod/v4/core").$ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>;
10
+ }>, import("zod/v4/core").$strip>, undefined, undefined>;
11
+ //# sourceMappingURL=brapi-server-info.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-server-info.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-server-info.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,eAAO,MAAM,uBAAuB;;wDAkBlC,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fileoverview `brapi://server/info` — orientation envelope for the default
3
+ * connection. Mirror of `brapi_server_info` for clients that prefer the
4
+ * resource surface. Reads the cached capability profile.
5
+ *
6
+ * @module mcp-server/resources/definitions/brapi-server-info.resource
7
+ */
8
+ import { resource } from '@cyanheads/mcp-ts-core';
9
+ import { brapiServerInfo } from '../../../mcp-server/tools/definitions/brapi-server-info.tool.js';
10
+ export const brapiServerInfoResource = resource('brapi://server/info', {
11
+ name: 'brapi-server-info',
12
+ title: 'BrAPI server orientation envelope',
13
+ description: 'Orientation envelope for the default BrAPI connection — identity, capabilities, content counts, notes. Same payload as the brapi_server_info tool.',
14
+ mimeType: 'application/json',
15
+ async handler(_params, ctx) {
16
+ return await brapiServerInfo.handler(brapiServerInfo.input.parse({}), ctx);
17
+ },
18
+ list: async () => ({
19
+ resources: [
20
+ {
21
+ uri: 'brapi://server/info',
22
+ name: 'BrAPI server orientation envelope',
23
+ mimeType: 'application/json',
24
+ },
25
+ ],
26
+ }),
27
+ });
28
+ //# sourceMappingURL=brapi-server-info.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-server-info.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-server-info.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAE3F,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,qBAAqB,EAAE;IACrE,IAAI,EAAE,mBAAmB;IACzB,KAAK,EAAE,mCAAmC;IAC1C,WAAW,EACT,oJAAoJ;IACtJ,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG;QACxB,OAAO,MAAM,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE;YACT;gBACE,GAAG,EAAE,qBAAqB;gBAC1B,IAAI,EAAE,mCAAmC;gBACzC,QAAQ,EAAE,kBAAkB;aAC7B;SACF;KACF,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview `brapi://study/{studyDbId}` — single-study record on the
3
+ * default connection, with program / trial / location resolved and
4
+ * companion counts attached. Mirror of `brapi_get_study`.
5
+ *
6
+ * @module mcp-server/resources/definitions/brapi-study.resource
7
+ */
8
+ import { z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ export declare const brapiStudyResource: import("@cyanheads/mcp-ts-core").ResourceDefinition<z.ZodObject<{
11
+ studyDbId: z.ZodString;
12
+ }, z.core.$strip>, undefined, readonly [{
13
+ readonly reason: "study_not_found";
14
+ readonly code: JsonRpcErrorCode.NotFound;
15
+ readonly when: "Upstream returned no study record for the requested DbId";
16
+ readonly recovery: "Verify the studyDbId on the target server, or run brapi_find_studies to discover valid IDs.";
17
+ }]>;
18
+ //# sourceMappingURL=brapi-study.resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-study.resource.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-study.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAY,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAGjE,eAAO,MAAM,kBAAkB;;;;;;;GA2B7B,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @fileoverview `brapi://study/{studyDbId}` — single-study record on the
3
+ * default connection, with program / trial / location resolved and
4
+ * companion counts attached. Mirror of `brapi_get_study`.
5
+ *
6
+ * @module mcp-server/resources/definitions/brapi-study.resource
7
+ */
8
+ import { resource, z } from '@cyanheads/mcp-ts-core';
9
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
10
+ import { brapiGetStudy } from '../../../mcp-server/tools/definitions/brapi-get-study.tool.js';
11
+ export const brapiStudyResource = resource('brapi://study/{studyDbId}', {
12
+ name: 'brapi-study',
13
+ title: 'BrAPI study record',
14
+ description: 'Single-study resource on the default BrAPI connection — same payload as the brapi_get_study tool, addressable by URI.',
15
+ mimeType: 'application/json',
16
+ errors: [
17
+ {
18
+ reason: 'study_not_found',
19
+ code: JsonRpcErrorCode.NotFound,
20
+ when: 'Upstream returned no study record for the requested DbId',
21
+ recovery: 'Verify the studyDbId on the target server, or run brapi_find_studies to discover valid IDs.',
22
+ },
23
+ ],
24
+ params: z.object({
25
+ studyDbId: z.string().min(1).describe('Study identifier on the default connection.'),
26
+ }),
27
+ async handler(params, ctx) {
28
+ return await brapiGetStudy.handler(brapiGetStudy.input.parse({ studyDbId: params.studyDbId }), ctx);
29
+ },
30
+ list: async () => ({
31
+ resources: [],
32
+ }),
33
+ });
34
+ //# sourceMappingURL=brapi-study.resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-study.resource.js","sourceRoot":"","sources":["../../../../src/mcp-server/resources/definitions/brapi-study.resource.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,wDAAwD,CAAC;AAEvF,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,2BAA2B,EAAE;IACtE,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,oBAAoB;IAC3B,WAAW,EACT,uHAAuH;IACzH,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE;QACN;YACE,MAAM,EAAE,iBAAiB;YACzB,IAAI,EAAE,gBAAgB,CAAC,QAAQ;YAC/B,IAAI,EAAE,0DAA0D;YAChE,QAAQ,EACN,6FAA6F;SAChG;KACO;IACV,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,6CAA6C,CAAC;KACrF,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG;QACvB,OAAO,MAAM,aAAa,CAAC,OAAO,CAChC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,EAC1D,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;QACjB,SAAS,EAAE,EAAE;KACd,CAAC;CACH,CAAC,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview `brapi_connect` — session-bootstrap tool. Authenticates to a
3
+ * BrAPI v2 server, registers the connection under a named alias, loads the
4
+ * capability profile (via CapabilityRegistry), and returns the full
5
+ * orientation envelope inline. One call fully orients the agent — the same
6
+ * envelope is available on-demand via `brapi_server_info`.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-connect.tool
9
+ */
10
+ import { z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
12
+ export declare const brapiConnect: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
13
+ baseUrl: z.ZodOptional<z.ZodString>;
14
+ auth: z.ZodOptional<z.ZodDiscriminatedUnion<[z.ZodObject<{
15
+ mode: z.ZodLiteral<"none">;
16
+ }, z.core.$strip>, z.ZodObject<{
17
+ mode: z.ZodLiteral<"bearer">;
18
+ token: z.ZodString;
19
+ }, z.core.$strip>, z.ZodObject<{
20
+ mode: z.ZodLiteral<"api_key">;
21
+ apiKey: z.ZodString;
22
+ headerName: z.ZodOptional<z.ZodString>;
23
+ }, z.core.$strip>, z.ZodObject<{
24
+ mode: z.ZodLiteral<"sgn">;
25
+ username: z.ZodString;
26
+ password: z.ZodString;
27
+ }, z.core.$strip>, z.ZodObject<{
28
+ mode: z.ZodLiteral<"oauth2">;
29
+ clientId: z.ZodString;
30
+ clientSecret: z.ZodString;
31
+ tokenUrl: z.ZodOptional<z.ZodString>;
32
+ }, z.core.$strip>], "mode">>;
33
+ alias: z.ZodDefault<z.ZodString>;
34
+ }, z.core.$strip>, z.ZodObject<{
35
+ alias: z.ZodString;
36
+ baseUrl: z.ZodString;
37
+ server: z.ZodObject<{
38
+ name: z.ZodOptional<z.ZodString>;
39
+ description: z.ZodOptional<z.ZodString>;
40
+ organizationName: z.ZodOptional<z.ZodString>;
41
+ organizationURL: z.ZodOptional<z.ZodString>;
42
+ documentationURL: z.ZodOptional<z.ZodString>;
43
+ contactEmail: z.ZodOptional<z.ZodString>;
44
+ brapiVersion: z.ZodOptional<z.ZodString>;
45
+ }, z.core.$strip>;
46
+ auth: z.ZodObject<{
47
+ mode: z.ZodEnum<{
48
+ none: "none";
49
+ sgn: "sgn";
50
+ oauth2: "oauth2";
51
+ api_key: "api_key";
52
+ bearer: "bearer";
53
+ }>;
54
+ headerName: z.ZodOptional<z.ZodString>;
55
+ expiresAt: z.ZodOptional<z.ZodString>;
56
+ }, z.core.$strip>;
57
+ capabilities: z.ZodObject<{
58
+ supportedCount: z.ZodNumber;
59
+ supported: z.ZodArray<z.ZodString>;
60
+ notableGaps: z.ZodArray<z.ZodString>;
61
+ }, z.core.$strip>;
62
+ content: z.ZodObject<{
63
+ crops: z.ZodArray<z.ZodString>;
64
+ studyCount: z.ZodOptional<z.ZodNumber>;
65
+ germplasmCount: z.ZodOptional<z.ZodNumber>;
66
+ programCount: z.ZodOptional<z.ZodNumber>;
67
+ locationCount: z.ZodOptional<z.ZodNumber>;
68
+ }, z.core.$strip>;
69
+ notes: z.ZodArray<z.ZodString>;
70
+ fetchedAt: z.ZodString;
71
+ }, z.core.$strip>, readonly [{
72
+ readonly reason: "auth_token_exchange_failed";
73
+ readonly code: JsonRpcErrorCode.Forbidden;
74
+ readonly when: "SGN or OAuth token exchange against the BrAPI /token endpoint failed";
75
+ readonly recovery: "Verify the credentials and that the server exposes /token before retrying.";
76
+ }, {
77
+ readonly reason: "auth_no_access_token";
78
+ readonly code: JsonRpcErrorCode.Forbidden;
79
+ readonly when: "Token endpoint responded but did not return an access_token";
80
+ readonly recovery: "Confirm the credentials are valid and the upstream IdP issues access tokens for this grant.";
81
+ }]>;
82
+ //# sourceMappingURL=brapi-connect.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-connect.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-connect.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAqBjE,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0FvB,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * @fileoverview `brapi_connect` — session-bootstrap tool. Authenticates to a
3
+ * BrAPI v2 server, registers the connection under a named alias, loads the
4
+ * capability profile (via CapabilityRegistry), and returns the full
5
+ * orientation envelope inline. One call fully orients the agent — the same
6
+ * envelope is available on-demand via `brapi_server_info`.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-connect.tool
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
12
+ import { discoverConfiguredAliases, formatConfiguredAliasesHint, resolveConnectInput, } from '../../../config/alias-credentials.js';
13
+ import { getBrapiClient } from '../../../services/brapi-client/index.js';
14
+ import { getCapabilityRegistry } from '../../../services/capability-registry/index.js';
15
+ import { getServerRegistry } from '../../../services/server-registry/index.js';
16
+ import { ConnectAuthSchema } from '../shared/connect-auth-schema.js';
17
+ import { buildOrientationEnvelope, formatOrientationEnvelope, OrientationEnvelopeSchema, } from '../shared/orientation-envelope.js';
18
+ const BASE_DESCRIPTION = 'Open a connection to a BrAPI v2 server, authenticate, and return the full orientation envelope (server identity, capability profile, content summary). Required handshake before other BrAPI tools. Supports multiple concurrent connections via named aliases. Credentials can be configured server-side and omitted from this call.';
19
+ const CONFIGURED_ALIASES_HINT = formatConfiguredAliasesHint(discoverConfiguredAliases());
20
+ export const brapiConnect = tool('brapi_connect', {
21
+ description: CONFIGURED_ALIASES_HINT
22
+ ? `${BASE_DESCRIPTION} ${CONFIGURED_ALIASES_HINT}`
23
+ : BASE_DESCRIPTION,
24
+ annotations: {
25
+ openWorldHint: true,
26
+ readOnlyHint: false,
27
+ idempotentHint: true,
28
+ },
29
+ errors: [
30
+ {
31
+ reason: 'auth_token_exchange_failed',
32
+ code: JsonRpcErrorCode.Forbidden,
33
+ when: 'SGN or OAuth token exchange against the BrAPI /token endpoint failed',
34
+ recovery: 'Verify the credentials and that the server exposes /token before retrying.',
35
+ },
36
+ {
37
+ reason: 'auth_no_access_token',
38
+ code: JsonRpcErrorCode.Forbidden,
39
+ when: 'Token endpoint responded but did not return an access_token',
40
+ recovery: 'Confirm the credentials are valid and the upstream IdP issues access tokens for this grant.',
41
+ },
42
+ ],
43
+ input: z.object({
44
+ baseUrl: z
45
+ .string()
46
+ .url()
47
+ .optional()
48
+ .describe('BrAPI v2 base URL including any path prefix — e.g. https://test-server.brapi.org/brapi/v2. Falls back to BRAPI_<ALIAS>_BASE_URL, then BRAPI_DEFAULT_BASE_URL.'),
49
+ auth: ConnectAuthSchema.optional().describe('Auth payload. When omitted, derived from BRAPI_<ALIAS>_* env vars (USERNAME+PASSWORD → sgn; BEARER_TOKEN → bearer; API_KEY → api_key; OAUTH_CLIENT_ID+OAUTH_CLIENT_SECRET → oauth2), then BRAPI_DEFAULT_*, then no auth.'),
50
+ alias: z
51
+ .string()
52
+ .regex(/^[a-zA-Z0-9_-]+$/)
53
+ .default('default')
54
+ .describe('Alias for this connection. Use distinct aliases to register multiple BrAPI servers in one session. Drives env-var lookup: alias `cassava` reads `BRAPI_CASSAVA_*`.'),
55
+ }),
56
+ output: OrientationEnvelopeSchema,
57
+ async handler(input, ctx) {
58
+ const registry = getServerRegistry();
59
+ const capabilities = getCapabilityRegistry();
60
+ const client = getBrapiClient();
61
+ const resolved = resolveConnectInput(input.alias, {
62
+ baseUrl: input.baseUrl,
63
+ auth: input.auth,
64
+ });
65
+ const connection = await registry.register(ctx, {
66
+ alias: input.alias,
67
+ baseUrl: resolved.baseUrl,
68
+ auth: resolved.auth,
69
+ });
70
+ ctx.log.info('BrAPI connection registered', {
71
+ alias: connection.alias,
72
+ baseUrl: connection.baseUrl,
73
+ authMode: connection.authMode,
74
+ authSource: input.auth ? 'agent' : 'env',
75
+ });
76
+ if (isMultiTenantHttpDeployment() && connection.authMode !== 'none') {
77
+ ctx.log.notice('Connection credentials persisted under shared `default` tenant — set MCP_AUTH_MODE=jwt|oauth for per-client isolation.', {
78
+ alias: connection.alias,
79
+ baseUrl: connection.baseUrl,
80
+ authMode: connection.authMode,
81
+ mcpTransport: process.env.MCP_TRANSPORT_TYPE,
82
+ mcpAuthMode: process.env.MCP_AUTH_MODE ?? 'none',
83
+ });
84
+ }
85
+ // Force a fresh capability load on connect — the agent expects current state.
86
+ await capabilities.invalidate(connection.baseUrl, ctx);
87
+ return buildOrientationEnvelope(ctx, connection, {
88
+ registry: capabilities,
89
+ client,
90
+ });
91
+ },
92
+ format: (result) => [{ type: 'text', text: formatOrientationEnvelope(result) }],
93
+ });
94
+ /**
95
+ * True when the server is running over HTTP without per-client auth, in which
96
+ * case `ctx.state` collapses every caller into the shared `default` tenant —
97
+ * including the bearer token resolved by SGN/OAuth at connection time.
98
+ */
99
+ function isMultiTenantHttpDeployment() {
100
+ const transport = (process.env.MCP_TRANSPORT_TYPE ?? 'stdio').toLowerCase();
101
+ if (transport !== 'http')
102
+ return false;
103
+ const authMode = (process.env.MCP_AUTH_MODE ?? 'none').toLowerCase();
104
+ return authMode !== 'jwt' && authMode !== 'oauth';
105
+ }
106
+ //# sourceMappingURL=brapi-connect.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-connect.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-connect.tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * @fileoverview `brapi_describe_filters` — list valid filter names for a
3
+ * BrAPI endpoint. Powers dynamic discovery before constructing
4
+ * `extraFilters` on `find_*` tools. Returns a filter catalog with name,
5
+ * type, description, and example per filter. Catalog entries reflect the
6
+ * BrAPI v2.1 spec; individual servers may implement subsets.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-describe-filters.tool
9
+ */
10
+ import { z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
12
+ export declare const brapiDescribeFilters: import("@cyanheads/mcp-ts-core").ToolDefinition<z.ZodObject<{
13
+ endpoint: z.ZodEnum<{
14
+ [x: string]: string;
15
+ }>;
16
+ }, z.core.$strip>, z.ZodObject<{
17
+ endpoint: z.ZodString;
18
+ filterCount: z.ZodNumber;
19
+ filters: z.ZodArray<z.ZodObject<{
20
+ name: z.ZodString;
21
+ type: z.ZodEnum<{
22
+ string: "string";
23
+ number: "number";
24
+ boolean: "boolean";
25
+ date: "date";
26
+ integer: "integer";
27
+ "string[]": "string[]";
28
+ "integer[]": "integer[]";
29
+ }>;
30
+ description: z.ZodString;
31
+ example: z.ZodString;
32
+ }, z.core.$strip>>;
33
+ specReference: z.ZodOptional<z.ZodString>;
34
+ availableEndpoints: z.ZodArray<z.ZodString>;
35
+ }, z.core.$strip>, readonly [{
36
+ readonly reason: "unknown_endpoint";
37
+ readonly code: JsonRpcErrorCode.NotFound;
38
+ readonly when: "No filter catalog is registered for the requested endpoint";
39
+ readonly recovery: "Pick an endpoint from data.availableEndpoints — same set as the input enum (studies, germplasm, observations, variables, images, variants, locations).";
40
+ }]>;
41
+ //# sourceMappingURL=brapi-describe-filters.tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-describe-filters.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-describe-filters.tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAgBjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2E/B,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * @fileoverview `brapi_describe_filters` — list valid filter names for a
3
+ * BrAPI endpoint. Powers dynamic discovery before constructing
4
+ * `extraFilters` on `find_*` tools. Returns a filter catalog with name,
5
+ * type, description, and example per filter. Catalog entries reflect the
6
+ * BrAPI v2.1 spec; individual servers may implement subsets.
7
+ *
8
+ * @module mcp-server/tools/definitions/brapi-describe-filters.tool
9
+ */
10
+ import { tool, z } from '@cyanheads/mcp-ts-core';
11
+ import { JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
12
+ import { getFilterCatalog, listFilterEndpoints } from '../../../services/brapi-filters/index.js';
13
+ const ENDPOINT_VALUES = listFilterEndpoints();
14
+ const FilterDescriptorSchema = z
15
+ .object({
16
+ name: z.string().describe('Filter parameter name (as accepted by the BrAPI endpoint).'),
17
+ type: z
18
+ .enum(['string', 'integer', 'number', 'boolean', 'date', 'string[]', 'integer[]'])
19
+ .describe('Expected value type.'),
20
+ description: z.string().describe('Short description of what the filter does.'),
21
+ example: z.string().describe('Example value (stringified).'),
22
+ })
23
+ .describe('One filter entry — name, type, description, and an example value.');
24
+ export const brapiDescribeFilters = tool('brapi_describe_filters', {
25
+ description: 'List the valid filter names for a BrAPI endpoint (studies, germplasm, observations, variables, images, variants, locations) — companion lookup for the `extraFilters` passthrough on any `find_*` tool. Entries reflect the BrAPI v2.1 spec; individual servers may implement subsets.',
26
+ annotations: { readOnlyHint: true, idempotentHint: true },
27
+ errors: [
28
+ {
29
+ reason: 'unknown_endpoint',
30
+ code: JsonRpcErrorCode.NotFound,
31
+ when: 'No filter catalog is registered for the requested endpoint',
32
+ recovery: 'Pick an endpoint from data.availableEndpoints — same set as the input enum (studies, germplasm, observations, variables, images, variants, locations).',
33
+ },
34
+ ],
35
+ input: z.object({
36
+ endpoint: z
37
+ .enum(ENDPOINT_VALUES)
38
+ .describe('BrAPI endpoint to describe filters for.'),
39
+ }),
40
+ output: z.object({
41
+ endpoint: z.string().describe('The endpoint the filters apply to.'),
42
+ filterCount: z.number().int().nonnegative().describe('Number of filters in the catalog.'),
43
+ filters: z.array(FilterDescriptorSchema).describe('Filter catalog entries.'),
44
+ specReference: z
45
+ .string()
46
+ .optional()
47
+ .describe('Pointer to the BrAPI v2 spec section for this endpoint.'),
48
+ availableEndpoints: z
49
+ .array(z.string())
50
+ .describe('Every endpoint this tool can describe — useful for discovery.'),
51
+ }),
52
+ handler(input, ctx) {
53
+ const catalog = getFilterCatalog(input.endpoint);
54
+ if (!catalog) {
55
+ throw ctx.fail('unknown_endpoint', `No filter catalog for endpoint '${input.endpoint}'. Available: ${ENDPOINT_VALUES.join(', ')}.`, {
56
+ endpoint: input.endpoint,
57
+ availableEndpoints: ENDPOINT_VALUES,
58
+ ...ctx.recoveryFor('unknown_endpoint'),
59
+ });
60
+ }
61
+ return {
62
+ endpoint: catalog.endpoint,
63
+ filterCount: catalog.filters.length,
64
+ filters: catalog.filters,
65
+ ...(catalog.specReference !== undefined ? { specReference: catalog.specReference } : {}),
66
+ availableEndpoints: ENDPOINT_VALUES,
67
+ };
68
+ },
69
+ format: (result) => {
70
+ const lines = [];
71
+ lines.push(`# Filters for \`${result.endpoint}\` (${result.filterCount} total)`);
72
+ if (result.specReference) {
73
+ lines.push('');
74
+ lines.push(`**Spec:** ${result.specReference}`);
75
+ }
76
+ lines.push('');
77
+ lines.push('| Name | Type | Description | Example |');
78
+ lines.push('|:-----|:-----|:------------|:--------|');
79
+ for (const filter of result.filters) {
80
+ const description = filter.description.replace(/\|/g, '\\|');
81
+ lines.push(`| \`${filter.name}\` | \`${filter.type}\` | ${description} | \`${filter.example}\` |`);
82
+ }
83
+ lines.push('');
84
+ lines.push(`_Available endpoints: ${result.availableEndpoints.map((e) => `\`${e}\``).join(', ')}._`);
85
+ return [{ type: 'text', text: lines.join('\n') }];
86
+ },
87
+ });
88
+ //# sourceMappingURL=brapi-describe-filters.tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-describe-filters.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/brapi-describe-filters.tool.ts"],"names":[],"mappings":"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"}