@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,320 @@
1
+ /**
2
+ * @fileoverview Low-level HTTP client for BrAPI v2 servers. Handles URL
3
+ * construction, header assembly, JSON envelope parsing, retry with exponential
4
+ * backoff, and the async-search poll loop
5
+ * (`POST /search/{noun}` → `searchResultsDbId` → `GET /search/{noun}/{id}`).
6
+ * Stateless across connections — callers pass `baseUrl` and resolved auth per
7
+ * call; connection state is owned by `ServerRegistry` (added in a later phase).
8
+ *
9
+ * @module services/brapi-client/brapi-client
10
+ */
11
+ import { forbidden, internalError, JsonRpcErrorCode, McpError, notFound, rateLimited, serviceUnavailable, unauthorized, validationError, } from '@cyanheads/mcp-ts-core/errors';
12
+ import { fetchWithTimeout, withRetry } from '@cyanheads/mcp-ts-core/utils';
13
+ /**
14
+ * The framework's `Context` and `RequestContext` are structurally compatible
15
+ * at runtime — framework docs confirm passing `Context` to `fetchWithTimeout`
16
+ * and `withRetry` is safe. The types diverge only under
17
+ * `exactOptionalPropertyTypes` (Context marks some fields as `| undefined`).
18
+ * One cast, one place.
19
+ */
20
+ const asRequestContext = (ctx) => ctx;
21
+ const defaultFetcher = (url, timeoutMs, context, options) => fetchWithTimeout(url, timeoutMs, asRequestContext(context), options);
22
+ export class BrapiClient {
23
+ serverConfig;
24
+ fetcher;
25
+ constructor(serverConfig, fetcher = defaultFetcher) {
26
+ this.serverConfig = serverConfig;
27
+ this.fetcher = fetcher;
28
+ }
29
+ /** GET /{path} with optional query params and auth. */
30
+ get(baseUrl, path, ctx, options = {}) {
31
+ return withRetry(async () => {
32
+ const response = await this.doFetch(this.buildUrl(baseUrl, path, options.params), ctx, { method: 'GET', headers: this.buildHeaders(options.auth) }, options.timeoutMs);
33
+ return this.parseEnvelope(response);
34
+ }, {
35
+ operation: `brapi.get ${path}`,
36
+ context: asRequestContext(ctx),
37
+ maxRetries: this.serverConfig.retryMaxAttempts,
38
+ baseDelayMs: this.serverConfig.retryBaseDelayMs,
39
+ signal: ctx.signal,
40
+ });
41
+ }
42
+ /**
43
+ * GET /{path} returning raw bytes — used for image content and other binary
44
+ * payloads. Honors the same retry policy as `get()`. The `accept` option
45
+ * overrides the default `image/*`.
46
+ */
47
+ getBinary(baseUrl, path, ctx, options = {}) {
48
+ return withRetry(async () => {
49
+ const headers = this.buildHeaders(options.auth);
50
+ headers.Accept = options.accept ?? 'image/*';
51
+ const response = await this.doFetch(this.buildUrl(baseUrl, path, options.params), ctx, { method: 'GET', headers }, options.timeoutMs);
52
+ const buffer = await response.arrayBuffer();
53
+ const contentType = response.headers.get('Content-Type') ?? 'application/octet-stream';
54
+ return { bytes: new Uint8Array(buffer), contentType };
55
+ }, {
56
+ operation: `brapi.getBinary ${path}`,
57
+ context: asRequestContext(ctx),
58
+ maxRetries: this.serverConfig.retryMaxAttempts,
59
+ baseDelayMs: this.serverConfig.retryBaseDelayMs,
60
+ signal: ctx.signal,
61
+ });
62
+ }
63
+ /**
64
+ * Fetch binary bytes from an arbitrary URL — used as a fallback when a
65
+ * BrAPI server doesn't expose `/images/{id}/imagecontent` but the image's
66
+ * metadata carries an `imageURL` (CDN, S3, etc.). No auth is attached; the
67
+ * assumption is that these URLs are publicly reachable. Still honors the
68
+ * private-IP guard and request timeout.
69
+ */
70
+ async fetchBinaryUrl(url, ctx, accept = 'image/*') {
71
+ const response = await this.doFetch(url, ctx, { method: 'GET', headers: { Accept: accept } }, this.serverConfig.requestTimeoutMs);
72
+ const buffer = await response.arrayBuffer();
73
+ const contentType = response.headers.get('Content-Type') ?? 'application/octet-stream';
74
+ return { bytes: new Uint8Array(buffer), contentType };
75
+ }
76
+ /**
77
+ * POST /search/{noun}. Returns a discriminated union — `sync` when the
78
+ * server returns full results inline, `async` when it returns a
79
+ * `searchResultsDbId` the caller must poll via `getSearchResults`.
80
+ */
81
+ postSearch(baseUrl, noun, body, ctx, options = {}) {
82
+ return withRetry(async () => {
83
+ const response = await this.doFetch(this.buildUrl(baseUrl, `/search/${noun}`), ctx, {
84
+ method: 'POST',
85
+ headers: {
86
+ ...this.buildHeaders(options.auth),
87
+ 'Content-Type': 'application/json',
88
+ },
89
+ body: JSON.stringify(body),
90
+ }, options.timeoutMs);
91
+ const envelope = await this.parseEnvelope(response);
92
+ const asyncId = extractAsyncId(envelope);
93
+ if (asyncId !== undefined) {
94
+ return { kind: 'async', searchResultsDbId: asyncId };
95
+ }
96
+ return { kind: 'sync', envelope: envelope };
97
+ }, {
98
+ operation: `brapi.postSearch ${noun}`,
99
+ context: asRequestContext(ctx),
100
+ maxRetries: this.serverConfig.retryMaxAttempts,
101
+ baseDelayMs: this.serverConfig.retryBaseDelayMs,
102
+ signal: ctx.signal,
103
+ });
104
+ }
105
+ /**
106
+ * POST /{path} with a JSON body. Used for write endpoints (e.g. creating
107
+ * observations). Same retry + classification policy as `get()`. The body is
108
+ * serialized as JSON and `Content-Type: application/json` is forced.
109
+ */
110
+ post(baseUrl, path, body, ctx, options = {}) {
111
+ return this.sendJson('POST', baseUrl, path, body, ctx, options);
112
+ }
113
+ /**
114
+ * PUT /{path} with a JSON body. Used for upsert / update endpoints. BrAPI
115
+ * routes update calls (`PUT /observations`, `PUT /germplasm`) through this.
116
+ */
117
+ put(baseUrl, path, body, ctx, options = {}) {
118
+ return this.sendJson('PUT', baseUrl, path, body, ctx, options);
119
+ }
120
+ sendJson(method, baseUrl, path, body, ctx, options = {}) {
121
+ return withRetry(async () => {
122
+ const response = await this.doFetch(this.buildUrl(baseUrl, path, options.params), ctx, {
123
+ method,
124
+ headers: {
125
+ ...this.buildHeaders(options.auth),
126
+ 'Content-Type': 'application/json',
127
+ },
128
+ body: JSON.stringify(body),
129
+ }, options.timeoutMs);
130
+ return this.parseEnvelope(response);
131
+ }, {
132
+ operation: `brapi.${method.toLowerCase()} ${path}`,
133
+ context: asRequestContext(ctx),
134
+ maxRetries: this.serverConfig.retryMaxAttempts,
135
+ baseDelayMs: this.serverConfig.retryBaseDelayMs,
136
+ signal: ctx.signal,
137
+ });
138
+ }
139
+ /**
140
+ * Poll `GET /search/{noun}/{searchResultsDbId}`. Returns the envelope once
141
+ * the server replies with 200. 202 means "still processing" — the method
142
+ * sleeps `searchPollIntervalMs` and retries until `searchPollTimeoutMs`.
143
+ */
144
+ async getSearchResults(baseUrl, noun, searchResultsDbId, ctx, options = {}) {
145
+ const url = this.buildUrl(baseUrl, `/search/${noun}/${encodeURIComponent(searchResultsDbId)}`);
146
+ const pollTimeoutMs = this.serverConfig.searchPollTimeoutMs;
147
+ const pollIntervalMs = this.serverConfig.searchPollIntervalMs;
148
+ const startedAt = Date.now();
149
+ for (;;) {
150
+ if (ctx.signal.aborted) {
151
+ throw internalError('Async search polling aborted by caller', {
152
+ noun,
153
+ searchResultsDbId,
154
+ });
155
+ }
156
+ if (Date.now() - startedAt > pollTimeoutMs) {
157
+ throw serviceUnavailable(`Async search ${noun}/${searchResultsDbId} timed out after ${pollTimeoutMs}ms`, { noun, searchResultsDbId, pollTimeoutMs });
158
+ }
159
+ const response = await this.doFetch(url, ctx, { method: 'GET', headers: this.buildHeaders(options.auth) }, options.timeoutMs);
160
+ if (response.status === 202) {
161
+ await sleep(pollIntervalMs, ctx);
162
+ continue;
163
+ }
164
+ return this.parseEnvelope(response);
165
+ }
166
+ }
167
+ async doFetch(url, ctx, init, timeoutMs) {
168
+ try {
169
+ return await this.fetcher(url, timeoutMs ?? this.serverConfig.requestTimeoutMs, ctx, {
170
+ ...init,
171
+ signal: ctx.signal,
172
+ rejectPrivateIPs: !this.serverConfig.allowPrivateIps,
173
+ });
174
+ }
175
+ catch (err) {
176
+ reclassifyHttpError(err);
177
+ throw err;
178
+ }
179
+ }
180
+ buildUrl(baseUrl, path, params) {
181
+ const trimmedBase = baseUrl.replace(/\/$/, '');
182
+ const prefixedPath = path.startsWith('/') ? path : `/${path}`;
183
+ const url = new URL(`${trimmedBase}${prefixedPath}`);
184
+ if (params) {
185
+ for (const [key, value] of Object.entries(params)) {
186
+ if (value === undefined)
187
+ continue;
188
+ if (Array.isArray(value)) {
189
+ for (const v of value)
190
+ url.searchParams.append(key, String(v));
191
+ }
192
+ else {
193
+ url.searchParams.set(key, String(value));
194
+ }
195
+ }
196
+ }
197
+ return url.toString();
198
+ }
199
+ buildHeaders(auth) {
200
+ const headers = { Accept: 'application/json' };
201
+ if (auth) {
202
+ headers[auth.headerName] = auth.headerValue;
203
+ }
204
+ return headers;
205
+ }
206
+ async parseEnvelope(response) {
207
+ const text = await response.text();
208
+ if (!text) {
209
+ throw validationError('BrAPI returned an empty response body', {
210
+ httpStatus: response.status,
211
+ });
212
+ }
213
+ let parsed;
214
+ try {
215
+ parsed = JSON.parse(text);
216
+ }
217
+ catch (cause) {
218
+ throw serviceUnavailable('BrAPI returned non-JSON response', { bodyPreview: text.slice(0, 500), httpStatus: response.status }, { cause });
219
+ }
220
+ if (!isEnvelope(parsed)) {
221
+ throw validationError('BrAPI response did not match v2 envelope shape', {
222
+ received: parsed,
223
+ httpStatus: response.status,
224
+ });
225
+ }
226
+ return parsed;
227
+ }
228
+ }
229
+ /**
230
+ * Map the `ServiceUnavailable` thrown by `fetchWithTimeout` to the correct
231
+ * non-transient code when the underlying HTTP status is a 4xx. 429 is promoted
232
+ * to `RateLimited` so the default retry policy still kicks in; 5xx stays as
233
+ * `ServiceUnavailable` (also retryable). Network-level errors, which have no
234
+ * `statusCode`, pass through untouched.
235
+ */
236
+ function reclassifyHttpError(err) {
237
+ if (!(err instanceof McpError))
238
+ return;
239
+ if (err.code !== JsonRpcErrorCode.ServiceUnavailable)
240
+ return;
241
+ const status = extractHttpStatus(err);
242
+ if (status === undefined)
243
+ return;
244
+ if (status >= 500)
245
+ return;
246
+ const data = asRecord(err.data) ?? {};
247
+ if (status === 429) {
248
+ throw rateLimited(err.message, { ...data, reason: 'upstream_rate_limited' });
249
+ }
250
+ if (status === 401)
251
+ throw unauthorized(err.message, { ...data, reason: 'upstream_unauthorized' });
252
+ if (status === 403)
253
+ throw forbidden(err.message, { ...data, reason: 'upstream_forbidden' });
254
+ if (status === 404)
255
+ throw notFound(err.message, { ...data, reason: 'upstream_not_found' });
256
+ throw validationError(err.message, { ...data, reason: 'upstream_bad_request' });
257
+ }
258
+ function extractHttpStatus(err) {
259
+ const data = asRecord(err.data);
260
+ if (!data)
261
+ return;
262
+ const status = data.statusCode;
263
+ return typeof status === 'number' ? status : undefined;
264
+ }
265
+ function asRecord(value) {
266
+ if (typeof value !== 'object' || value === null || Array.isArray(value))
267
+ return;
268
+ return value;
269
+ }
270
+ function isEnvelope(value) {
271
+ return typeof value === 'object' && value !== null && 'metadata' in value && 'result' in value;
272
+ }
273
+ /**
274
+ * Some BrAPI servers embed `searchResultsDbId` inside the `result` object on
275
+ * an otherwise empty payload. Detect that case.
276
+ */
277
+ function extractAsyncId(envelope) {
278
+ const result = envelope.result;
279
+ if (typeof result !== 'object' || result === null)
280
+ return;
281
+ const id = result.searchResultsDbId;
282
+ if (typeof id !== 'string')
283
+ return;
284
+ const data = result.data;
285
+ if (Array.isArray(data) && data.length > 0)
286
+ return;
287
+ return id;
288
+ }
289
+ function sleep(ms, ctx) {
290
+ return new Promise((resolve, reject) => {
291
+ if (ctx.signal.aborted) {
292
+ reject(internalError('Sleep aborted by caller'));
293
+ return;
294
+ }
295
+ const timer = setTimeout(() => {
296
+ ctx.signal.removeEventListener('abort', onAbort);
297
+ resolve();
298
+ }, ms);
299
+ const onAbort = () => {
300
+ clearTimeout(timer);
301
+ reject(internalError('Sleep aborted by caller'));
302
+ };
303
+ ctx.signal.addEventListener('abort', onAbort, { once: true });
304
+ });
305
+ }
306
+ let _client;
307
+ export function initBrapiClient(serverConfig, fetcher) {
308
+ _client = new BrapiClient(serverConfig, fetcher);
309
+ }
310
+ export function getBrapiClient() {
311
+ if (!_client) {
312
+ throw new Error('BrapiClient not initialized — call initBrapiClient() in setup()');
313
+ }
314
+ return _client;
315
+ }
316
+ /** Test-only — clears the singleton so successive suites start clean. */
317
+ export function resetBrapiClient() {
318
+ _client = undefined;
319
+ }
320
+ //# sourceMappingURL=brapi-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"brapi-client.js","sourceRoot":"","sources":["../../../src/services/brapi-client/brapi-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * @fileoverview Public API barrel for the BrapiClient service.
3
+ *
4
+ * @module services/brapi-client
5
+ */
6
+ export type { Fetcher } from './brapi-client.js';
7
+ export { BrapiClient, getBrapiClient, initBrapiClient, resetBrapiClient, } from './brapi-client.js';
8
+ export type { BinaryResponse, BrapiAuth, BrapiEnvelope, BrapiMetadata, BrapiPagination, BrapiRequestOptions, BrapiStatus, ResolvedAuth, SearchResponse, } from './types.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,cAAc,EACd,SAAS,EACT,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,WAAW,EACX,YAAY,EACZ,cAAc,GACf,MAAM,YAAY,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @fileoverview Public API barrel for the BrapiClient service.
3
+ *
4
+ * @module services/brapi-client
5
+ */
6
+ export { BrapiClient, getBrapiClient, initBrapiClient, resetBrapiClient, } from './brapi-client.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/brapi-client/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,WAAW,EACX,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * @fileoverview Shared types for the BrapiClient service — envelope shape,
3
+ * request options, auth config, and search response variants.
4
+ *
5
+ * @module services/brapi-client/types
6
+ */
7
+ /** BrAPI v2 standard response envelope. */
8
+ export interface BrapiEnvelope<T> {
9
+ metadata: BrapiMetadata;
10
+ result: T;
11
+ }
12
+ export interface BrapiMetadata {
13
+ datafiles?: unknown[];
14
+ pagination?: BrapiPagination;
15
+ status?: BrapiStatus[];
16
+ }
17
+ export interface BrapiPagination {
18
+ currentPage: number;
19
+ pageSize: number;
20
+ totalCount: number;
21
+ totalPages: number;
22
+ }
23
+ export interface BrapiStatus {
24
+ message: string;
25
+ messageType: 'INFO' | 'WARNING' | 'ERROR';
26
+ }
27
+ /**
28
+ * Configured auth for a BrAPI connection. `sgn` and `oauth2` are resolved to
29
+ * a bearer token before being handed to the client; `api_key` and `none` are
30
+ * used verbatim.
31
+ */
32
+ export type BrapiAuth = {
33
+ mode: 'none';
34
+ } | {
35
+ mode: 'sgn';
36
+ username: string;
37
+ password: string;
38
+ } | {
39
+ mode: 'oauth2';
40
+ clientId: string;
41
+ clientSecret: string;
42
+ tokenUrl?: string;
43
+ } | {
44
+ mode: 'api_key';
45
+ apiKey: string;
46
+ headerName?: string;
47
+ } | {
48
+ mode: 'bearer';
49
+ token: string;
50
+ };
51
+ /** Resolved auth header ready to attach to a request. */
52
+ export interface ResolvedAuth {
53
+ /** ISO 8601 timestamp — caller may refresh before this. */
54
+ expiresAt?: string;
55
+ headerName: string;
56
+ headerValue: string;
57
+ }
58
+ export interface BrapiRequestOptions {
59
+ auth?: ResolvedAuth;
60
+ /** Query params. Arrays are repeated per BrAPI convention. */
61
+ params?: Record<string, string | number | boolean | readonly (string | number)[] | undefined>;
62
+ /** Override the config default timeout. */
63
+ timeoutMs?: number;
64
+ }
65
+ /**
66
+ * POST /search/{noun} returns either full results inline, or a
67
+ * `searchResultsDbId` that the caller polls via getSearchResults.
68
+ */
69
+ export type SearchResponse<T> = {
70
+ kind: 'sync';
71
+ envelope: BrapiEnvelope<T>;
72
+ } | {
73
+ kind: 'async';
74
+ searchResultsDbId: string;
75
+ };
76
+ /** Raw bytes returned from a binary fetch (e.g. image content). */
77
+ export interface BinaryResponse {
78
+ bytes: Uint8Array;
79
+ /** `Content-Type` header as reported by the server; falls back to octet-stream. */
80
+ contentType: string;
81
+ }
82
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,aAAa,CAAC,CAAC;IAC9B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,CAAC,CAAC;CACX;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,yDAAyD;AACzD,MAAM,WAAW,YAAY;IAC3B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC;IAC9F,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IACxB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;CAAE,GAC5C;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,mEAAmE;AACnE,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @fileoverview Shared types for the BrapiClient service — envelope shape,
3
+ * request options, auth config, and search response variants.
4
+ *
5
+ * @module services/brapi-client/types
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/brapi-client/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * @fileoverview Static BrAPI v2.1 filter catalog. Covers the endpoints the
3
+ * goal-shaped tools target plus the common escape-hatch nouns. Agents use
4
+ * this via `brapi_describe_filters` to discover valid filter names before
5
+ * constructing `extraFilters` on `find_*` tools. Catalog entries reflect the
6
+ * BrAPI v2.1 spec — individual servers may implement subsets; filter failures
7
+ * surface through the upstream 400 body, not a static check.
8
+ *
9
+ * @module services/brapi-filters/catalog
10
+ */
11
+ import type { FilterCatalog } from './types.js';
12
+ export declare function getFilterCatalog(endpoint: string): FilterCatalog | undefined;
13
+ export declare function listFilterEndpoints(): string[];
14
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-filters/catalog.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,YAAY,CAAC;AAmelE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAI5E;AAED,wBAAgB,mBAAmB,IAAI,MAAM,EAAE,CAE9C"}