@cyanheads/brapi-mcp-server 0.3.8 → 0.4.1

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 (82) hide show
  1. package/CLAUDE.md +3 -2
  2. package/README.md +1 -1
  3. package/changelog/0.3.x/0.3.9.md +25 -0
  4. package/changelog/0.4.x/0.4.0.md +29 -0
  5. package/changelog/0.4.x/0.4.1.md +20 -0
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts +11 -0
  9. package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts.map +1 -1
  10. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +5 -0
  11. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
  12. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +11 -0
  13. package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
  14. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
  15. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +53 -31
  16. package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -1
  17. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
  18. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +14 -2
  19. package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -1
  20. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +4 -0
  21. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
  22. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +45 -10
  23. package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -1
  24. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
  25. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +17 -2
  26. package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -1
  27. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +0 -1
  28. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
  29. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +19 -11
  30. package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -1
  31. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
  32. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +16 -3
  33. package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -1
  34. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
  35. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +11 -2
  36. package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -1
  37. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +7 -1
  38. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -1
  39. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +19 -0
  40. package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -1
  41. package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts +11 -0
  42. package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts.map +1 -1
  43. package/dist/mcp-server/tools/definitions/index.d.ts +37 -2
  44. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
  45. package/dist/mcp-server/tools/shared/find-helpers.d.ts +28 -1
  46. package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
  47. package/dist/mcp-server/tools/shared/find-helpers.js +40 -3
  48. package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
  49. package/dist/mcp-server/tools/shared/orientation-envelope.d.ts +22 -0
  50. package/dist/mcp-server/tools/shared/orientation-envelope.d.ts.map +1 -1
  51. package/dist/mcp-server/tools/shared/orientation-envelope.js +39 -0
  52. package/dist/mcp-server/tools/shared/orientation-envelope.js.map +1 -1
  53. package/dist/services/brapi-dialect/cassavabase-dialect.d.ts +28 -0
  54. package/dist/services/brapi-dialect/cassavabase-dialect.d.ts.map +1 -0
  55. package/dist/services/brapi-dialect/cassavabase-dialect.js +193 -0
  56. package/dist/services/brapi-dialect/cassavabase-dialect.js.map +1 -0
  57. package/dist/services/brapi-dialect/detect.d.ts +53 -0
  58. package/dist/services/brapi-dialect/detect.d.ts.map +1 -0
  59. package/dist/services/brapi-dialect/detect.js +68 -0
  60. package/dist/services/brapi-dialect/detect.js.map +1 -0
  61. package/dist/services/brapi-dialect/index.d.ts +29 -0
  62. package/dist/services/brapi-dialect/index.d.ts.map +1 -0
  63. package/dist/services/brapi-dialect/index.js +31 -0
  64. package/dist/services/brapi-dialect/index.js.map +1 -0
  65. package/dist/services/brapi-dialect/registry.d.ts +25 -0
  66. package/dist/services/brapi-dialect/registry.d.ts.map +1 -0
  67. package/dist/services/brapi-dialect/registry.js +39 -0
  68. package/dist/services/brapi-dialect/registry.js.map +1 -0
  69. package/dist/services/brapi-dialect/spec-dialect.d.ts +13 -0
  70. package/dist/services/brapi-dialect/spec-dialect.d.ts.map +1 -0
  71. package/dist/services/brapi-dialect/spec-dialect.js +17 -0
  72. package/dist/services/brapi-dialect/spec-dialect.js.map +1 -0
  73. package/dist/services/brapi-dialect/types.d.ts +58 -0
  74. package/dist/services/brapi-dialect/types.d.ts.map +1 -0
  75. package/dist/services/brapi-dialect/types.js +18 -0
  76. package/dist/services/brapi-dialect/types.js.map +1 -0
  77. package/dist/services/ontology-resolver/ontology-resolver.d.ts +7 -0
  78. package/dist/services/ontology-resolver/ontology-resolver.d.ts.map +1 -1
  79. package/dist/services/ontology-resolver/ontology-resolver.js +6 -5
  80. package/dist/services/ontology-resolver/ontology-resolver.js.map +1 -1
  81. package/package.json +1 -1
  82. package/server.json +3 -3
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @fileoverview Public API for the BrAPI dialect service. Tools call
3
+ * `resolveDialect(connection, ctx)` to get a per-connection adapter, then
4
+ * `dialect.adaptGetFilters(endpoint, filters)` before serializing a GET
5
+ * call. Detection runs once per connection per ctx (the underlying
6
+ * capability profile is cached in `ctx.state`), so repeated calls are
7
+ * cheap.
8
+ *
9
+ * @module services/brapi-dialect
10
+ */
11
+ import type { Context } from '@cyanheads/mcp-ts-core';
12
+ import type { ResolvedAuth } from '../../services/brapi-client/index.js';
13
+ import type { RegisteredServer } from '../../services/server-registry/index.js';
14
+ import type { BrapiDialect } from './types.js';
15
+ export { cassavabaseDialect } from './cassavabase-dialect.js';
16
+ export { type DialectDetection, type DialectDetectionSource, detectDialectFromName, detectDialectId, dialectEnvVar, readDialectOverride, } from './detect.js';
17
+ export { getDialectById, initBrapiDialectRegistry, listRegisteredDialectIds, registerDialect, resetBrapiDialectRegistry, } from './registry.js';
18
+ export { specDialect } from './spec-dialect.js';
19
+ export type { BrapiDialect, DialectAdaptation } from './types.js';
20
+ /**
21
+ * Resolve the dialect for a registered connection. Reads the env override
22
+ * first (`BRAPI_<ALIAS>_DIALECT`); on miss, falls back to detection from
23
+ * the cached capability profile. The profile lookup is the same one tools
24
+ * already trigger via `capabilities.ensure()` so this adds zero HTTP.
25
+ */
26
+ export declare function resolveDialect(connection: RegisteredServer, ctx: Context, options?: {
27
+ auth?: ResolvedAuth | undefined;
28
+ }): Promise<BrapiDialect>;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-dialect/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAG5E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAElE;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,gBAAgB,EAC5B,GAAG,EAAE,OAAO,EACZ,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,YAAY,GAAG,SAAS,CAAA;CAAO,GAChD,OAAO,CAAC,YAAY,CAAC,CAKvB"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * @fileoverview Public API for the BrAPI dialect service. Tools call
3
+ * `resolveDialect(connection, ctx)` to get a per-connection adapter, then
4
+ * `dialect.adaptGetFilters(endpoint, filters)` before serializing a GET
5
+ * call. Detection runs once per connection per ctx (the underlying
6
+ * capability profile is cached in `ctx.state`), so repeated calls are
7
+ * cheap.
8
+ *
9
+ * @module services/brapi-dialect
10
+ */
11
+ import { getCapabilityRegistry } from '../../services/capability-registry/index.js';
12
+ import { detectDialectId } from './detect.js';
13
+ import { getDialectById } from './registry.js';
14
+ export { cassavabaseDialect } from './cassavabase-dialect.js';
15
+ export { detectDialectFromName, detectDialectId, dialectEnvVar, readDialectOverride, } from './detect.js';
16
+ export { getDialectById, initBrapiDialectRegistry, listRegisteredDialectIds, registerDialect, resetBrapiDialectRegistry, } from './registry.js';
17
+ export { specDialect } from './spec-dialect.js';
18
+ /**
19
+ * Resolve the dialect for a registered connection. Reads the env override
20
+ * first (`BRAPI_<ALIAS>_DIALECT`); on miss, falls back to detection from
21
+ * the cached capability profile. The profile lookup is the same one tools
22
+ * already trigger via `capabilities.ensure()` so this adds zero HTTP.
23
+ */
24
+ export async function resolveDialect(connection, ctx, options = {}) {
25
+ const lookup = {};
26
+ if (options.auth)
27
+ lookup.auth = options.auth;
28
+ const profile = await getCapabilityRegistry().profile(connection.baseUrl, ctx, lookup);
29
+ return getDialectById(detectDialectId(connection.alias, profile).id);
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/brapi-dialect/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAEhF,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAGL,qBAAqB,EACrB,eAAe,EACf,aAAa,EACb,mBAAmB,GACpB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,UAA4B,EAC5B,GAAY,EACZ,UAA+C,EAAE;IAEjD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,qBAAqB,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACvF,OAAO,cAAc,CAAC,eAAe,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @fileoverview Dialect registry — singleton map from dialect id to
3
+ * implementation. Initialized in `setup()` with the built-in dialects;
4
+ * future plugins can register additional ones before `createApp()` returns.
5
+ * Lookups never throw — unknown ids fall back to the `spec` dialect so a
6
+ * stale env override or typo can't crash a tool call mid-flight.
7
+ *
8
+ * @module services/brapi-dialect/registry
9
+ */
10
+ import type { BrapiDialect } from './types.js';
11
+ /** Register a dialect. Last-write-wins on id collision. */
12
+ export declare function registerDialect(dialect: BrapiDialect): void;
13
+ /**
14
+ * Look up a registered dialect by id. Falls back to the `spec` (passthrough)
15
+ * dialect when the id is unknown — keeps misconfiguration loud (the dialect
16
+ * still adapts its translations) while avoiding hard failures.
17
+ */
18
+ export declare function getDialectById(id: string): BrapiDialect;
19
+ /** Wire the built-in dialects. Idempotent — safe to call multiple times. */
20
+ export declare function initBrapiDialectRegistry(): void;
21
+ /** Test-only — clear all registrations between suites. */
22
+ export declare function resetBrapiDialectRegistry(): void;
23
+ /** Test-only — list registered ids. */
24
+ export declare function listRegisteredDialectIds(): string[];
25
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-dialect/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,2DAA2D;AAC3D,wBAAgB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI,CAE3D;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,CAEvD;AAED,4EAA4E;AAC5E,wBAAgB,wBAAwB,IAAI,IAAI,CAI/C;AAED,0DAA0D;AAC1D,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD;AAED,uCAAuC;AACvC,wBAAgB,wBAAwB,IAAI,MAAM,EAAE,CAEnD"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Dialect registry — singleton map from dialect id to
3
+ * implementation. Initialized in `setup()` with the built-in dialects;
4
+ * future plugins can register additional ones before `createApp()` returns.
5
+ * Lookups never throw — unknown ids fall back to the `spec` dialect so a
6
+ * stale env override or typo can't crash a tool call mid-flight.
7
+ *
8
+ * @module services/brapi-dialect/registry
9
+ */
10
+ import { cassavabaseDialect } from './cassavabase-dialect.js';
11
+ import { specDialect } from './spec-dialect.js';
12
+ const REGISTRY = new Map();
13
+ /** Register a dialect. Last-write-wins on id collision. */
14
+ export function registerDialect(dialect) {
15
+ REGISTRY.set(dialect.id, dialect);
16
+ }
17
+ /**
18
+ * Look up a registered dialect by id. Falls back to the `spec` (passthrough)
19
+ * dialect when the id is unknown — keeps misconfiguration loud (the dialect
20
+ * still adapts its translations) while avoiding hard failures.
21
+ */
22
+ export function getDialectById(id) {
23
+ return REGISTRY.get(id) ?? specDialect;
24
+ }
25
+ /** Wire the built-in dialects. Idempotent — safe to call multiple times. */
26
+ export function initBrapiDialectRegistry() {
27
+ REGISTRY.clear();
28
+ registerDialect(specDialect);
29
+ registerDialect(cassavabaseDialect);
30
+ }
31
+ /** Test-only — clear all registrations between suites. */
32
+ export function resetBrapiDialectRegistry() {
33
+ REGISTRY.clear();
34
+ }
35
+ /** Test-only — list registered ids. */
36
+ export function listRegisteredDialectIds() {
37
+ return Array.from(REGISTRY.keys()).sort();
38
+ }
39
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/services/brapi-dialect/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;AAEjD,2DAA2D;AAC3D,MAAM,UAAU,eAAe,CAAC,OAAqB;IACnD,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,WAAW,CAAC;AACzC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,wBAAwB;IACtC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,eAAe,CAAC,WAAW,CAAC,CAAC;IAC7B,eAAe,CAAC,kBAAkB,CAAC,CAAC;AACtC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,yBAAyB;IACvC,QAAQ,CAAC,KAAK,EAAE,CAAC;AACnB,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,wBAAwB;IACtC,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview The default `spec` dialect — passes filters through verbatim.
3
+ * Used for any server that implements BrAPI v2.1 query-string filters as
4
+ * specified (the BrAPI Community Test Server, modern PIPPA / GnpIS / Reference
5
+ * Server deployments). Selected when no server-specific dialect matches the
6
+ * detected `serverInfo.serverName`, or when an operator pins
7
+ * `BRAPI_<ALIAS>_DIALECT=spec` to override detection.
8
+ *
9
+ * @module services/brapi-dialect/spec-dialect
10
+ */
11
+ import type { BrapiDialect } from './types.js';
12
+ export declare const specDialect: BrapiDialect;
13
+ //# sourceMappingURL=spec-dialect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-dialect.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-dialect/spec-dialect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,eAAO,MAAM,WAAW,EAAE,YAKzB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @fileoverview The default `spec` dialect — passes filters through verbatim.
3
+ * Used for any server that implements BrAPI v2.1 query-string filters as
4
+ * specified (the BrAPI Community Test Server, modern PIPPA / GnpIS / Reference
5
+ * Server deployments). Selected when no server-specific dialect matches the
6
+ * detected `serverInfo.serverName`, or when an operator pins
7
+ * `BRAPI_<ALIAS>_DIALECT=spec` to override detection.
8
+ *
9
+ * @module services/brapi-dialect/spec-dialect
10
+ */
11
+ export const specDialect = {
12
+ id: 'spec',
13
+ adaptGetFilters(_endpoint, filters) {
14
+ return { filters: { ...filters }, warnings: [] };
15
+ },
16
+ };
17
+ //# sourceMappingURL=spec-dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-dialect.js","sourceRoot":"","sources":["../../../src/services/brapi-dialect/spec-dialect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,CAAC,MAAM,WAAW,GAAiB;IACvC,EAAE,EAAE,MAAM;IACV,eAAe,CAAC,SAAS,EAAE,OAAO;QAChC,OAAO,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IACnD,CAAC;CACF,CAAC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @fileoverview Types for BrAPI dialects — per-server adapters that translate
3
+ * spec-shape filters / payloads into whatever the upstream actually honors.
4
+ * BrAPI v2.1 normalized filter names to plural forms, but real implementations
5
+ * lag the spec by years. CassavaBase, BMS, GERMINATE, T3 each have their own
6
+ * quirks. The dialect interface is the single seam through which we adapt
7
+ * outbound traffic to those servers without bleeding the special cases into
8
+ * tool definitions.
9
+ *
10
+ * Start with one capability — `adaptGetFilters` — and add optional methods
11
+ * (`adaptSearchBody`, `normalizeRow`, etc.) as new quirk classes surface. Any
12
+ * method beyond the required core is optional so new dialects don't have to
13
+ * implement quirks they don't have.
14
+ *
15
+ * @module services/brapi-dialect/types
16
+ */
17
+ /**
18
+ * Result of adapting a filter map for a specific endpoint. `filters` is the
19
+ * wire-shape map (what gets serialized into the URL); `warnings` are
20
+ * operator-facing notes about lossy conversions (multi-value array downcast,
21
+ * filters dropped because the server doesn't honor them, etc.).
22
+ */
23
+ export interface DialectAdaptation {
24
+ filters: Record<string, unknown>;
25
+ warnings: string[];
26
+ }
27
+ /**
28
+ * Per-server filter / payload adapter. Implementations are stateless,
29
+ * registered by id, and selected per-connection via `resolveDialect`. The
30
+ * `id` should be a short, stable token (e.g. `spec`, `cassavabase`). Dialects
31
+ * registered later override earlier ones with the same id.
32
+ */
33
+ export interface BrapiDialect {
34
+ /**
35
+ * Adapt a merged filter map for a GET list endpoint. `endpoint` is the bare
36
+ * resource segment (e.g. `studies`, `germplasm`) — not the path. Filters
37
+ * are passed as a read-only record; implementations must return a fresh
38
+ * object rather than mutating the input.
39
+ *
40
+ * The default `spec` dialect returns the input untouched. Server-specific
41
+ * dialects translate, drop, or downcast filters so the upstream receives
42
+ * names and shapes it actually honors.
43
+ */
44
+ adaptGetFilters(endpoint: string, filters: Readonly<Record<string, unknown>>): DialectAdaptation;
45
+ /**
46
+ * POST `/search/{noun}` routes the dialect knows are dead — advertised in
47
+ * `/calls` but in practice unresponsive, broken, or returning malformed
48
+ * envelopes. Tools that would otherwise issue an async-search call should
49
+ * consult this set first and route around (or fail loudly with a recovery
50
+ * hint) rather than hanging or returning garbage. Nouns are bare resource
51
+ * segments (e.g. `germplasm`, `studies`), not full paths.
52
+ *
53
+ * Omit on dialects with no known dead routes (the default `spec` dialect).
54
+ */
55
+ readonly disabledSearchEndpoints?: ReadonlySet<string>;
56
+ readonly id: string;
57
+ }
58
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/brapi-dialect/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;;OASG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC;IACjG;;;;;;;;;OASG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * @fileoverview Types for BrAPI dialects — per-server adapters that translate
3
+ * spec-shape filters / payloads into whatever the upstream actually honors.
4
+ * BrAPI v2.1 normalized filter names to plural forms, but real implementations
5
+ * lag the spec by years. CassavaBase, BMS, GERMINATE, T3 each have their own
6
+ * quirks. The dialect interface is the single seam through which we adapt
7
+ * outbound traffic to those servers without bleeding the special cases into
8
+ * tool definitions.
9
+ *
10
+ * Start with one capability — `adaptGetFilters` — and add optional methods
11
+ * (`adaptSearchBody`, `normalizeRow`, etc.) as new quirk classes surface. Any
12
+ * method beyond the required core is optional so new dialects don't have to
13
+ * implement quirks they don't have.
14
+ *
15
+ * @module services/brapi-dialect/types
16
+ */
17
+ export {};
18
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/brapi-dialect/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG"}
@@ -12,6 +12,9 @@ import type { OntologyCandidate, ResolveOptions } from './types.js';
12
12
  /**
13
13
  * Loose shape of a BrAPI observation-variable record. Every field is
14
14
  * optional because server implementations vary in what they populate.
15
+ * Trait subobject fields follow BrAPI v2.1 naming (`traitName`,
16
+ * `traitDescription`); both legacy `name` / `description` aliases are
17
+ * accepted for older or non-conformant servers.
15
18
  */
16
19
  export interface VariableLike {
17
20
  method?: {
@@ -28,9 +31,13 @@ export interface VariableLike {
28
31
  synonyms?: string[] | undefined;
29
32
  trait?: {
30
33
  traitClass?: string;
34
+ /** Legacy alias for `traitDescription` — accepted for older servers. */
31
35
  description?: string;
36
+ /** Legacy alias for `traitName` — accepted for older servers. */
32
37
  name?: string;
33
38
  synonyms?: string[];
39
+ traitDescription?: string;
40
+ traitName?: string;
34
41
  };
35
42
  }
36
43
  export declare class OntologyResolver {
@@ -1 +1 @@
1
- {"version":3,"file":"ontology-resolver.d.ts","sourceRoot":"","sources":["../../../src/services/ontology-resolver/ontology-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;CACH;AAED,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,OAAO,GAAE,cAAmB,GAC3B,iBAAiB,EAAE;IAoBtB,OAAO,CAAC,QAAQ;CA4CjB;AAsBD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
1
+ {"version":3,"file":"ontology-resolver.d.ts","sourceRoot":"","sources":["../../../src/services/ontology-resolver/ontology-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAChC,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,wEAAwE;QACxE,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,iEAAiE;QACjE,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;CACH;AAED,qBAAa,gBAAgB;IAC3B;;;;;OAKG;IACH,KAAK,CACH,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,SAAS,YAAY,EAAE,EAClC,OAAO,GAAE,cAAmB,GAC3B,iBAAiB,EAAE;IAoBtB,OAAO,CAAC,QAAQ;CA8CjB;AAwBD,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C;AAED,wBAAgB,mBAAmB,IAAI,gBAAgB,CAKtD;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAE5C"}
@@ -52,7 +52,7 @@ export class OntologyResolver {
52
52
  if (traitSynonymMatch) {
53
53
  return { candidate: toCandidate(variable, 'synonymMatch'), score: 40 };
54
54
  }
55
- const traitName = variable.trait?.name?.toLowerCase();
55
+ const traitName = (variable.trait?.traitName ?? variable.trait?.name)?.toLowerCase();
56
56
  if (traitName?.includes(query)) {
57
57
  return { candidate: toCandidate(variable, 'nameMatch'), score: 35 };
58
58
  }
@@ -60,7 +60,7 @@ export class OntologyResolver {
60
60
  if (traitClass && traitClass === query) {
61
61
  return { candidate: toCandidate(variable, 'traitClassMatch'), score: 30 };
62
62
  }
63
- const traitDescription = variable.trait?.description?.toLowerCase();
63
+ const traitDescription = (variable.trait?.traitDescription ?? variable.trait?.description)?.toLowerCase();
64
64
  if (traitDescription?.includes(query)) {
65
65
  return { candidate: toCandidate(variable, 'nameMatch'), score: 20 };
66
66
  }
@@ -74,11 +74,12 @@ function toCandidate(variable, source) {
74
74
  }
75
75
  if (variable.observationVariablePUI)
76
76
  candidate.termId = variable.observationVariablePUI;
77
- const name = variable.observationVariableName ?? variable.trait?.name;
77
+ const name = variable.observationVariableName ?? variable.trait?.traitName ?? variable.trait?.name;
78
78
  if (name)
79
79
  candidate.name = name;
80
- if (variable.trait?.description)
81
- candidate.description = variable.trait.description;
80
+ const description = variable.trait?.traitDescription ?? variable.trait?.description;
81
+ if (description)
82
+ candidate.description = description;
82
83
  if (variable.ontologyDbId)
83
84
  candidate.ontologyDbId = variable.ontologyDbId;
84
85
  const combinedSynonyms = [...(variable.synonyms ?? []), ...(variable.trait?.synonyms ?? [])];
@@ -1 +1 @@
1
- {"version":3,"file":"ontology-resolver.js","sourceRoot":"","sources":["../../../src/services/ontology-resolver/ontology-resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ontology-resolver.js","sourceRoot":"","sources":["../../../src/services/ontology-resolver/ontology-resolver.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cyanheads/brapi-mcp-server",
3
3
  "mcpName": "io.github.cyanheads/brapi-mcp-server",
4
- "version": "0.3.8",
4
+ "version": "0.4.1",
5
5
  "description": "BrAPI v2.1 MCP server — studies, germplasm, observations, genotypes, images, and pedigrees.",
6
6
  "author": "Casey Hand @cyanheads (https://github.com/cyanheads/brapi-mcp-server#readme)",
7
7
  "type": "module",
package/server.json CHANGED
@@ -6,14 +6,14 @@
6
6
  "url": "https://github.com/cyanheads/brapi-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.3.8",
9
+ "version": "0.4.1",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "registryBaseUrl": "https://registry.npmjs.org",
14
14
  "identifier": "@cyanheads/brapi-mcp-server",
15
15
  "runtimeHint": "bun",
16
- "version": "0.3.8",
16
+ "version": "0.4.1",
17
17
  "packageArguments": [
18
18
  { "type": "positional", "value": "run" },
19
19
  { "type": "positional", "value": "start:stdio" }
@@ -49,7 +49,7 @@
49
49
  "registryBaseUrl": "https://registry.npmjs.org",
50
50
  "identifier": "@cyanheads/brapi-mcp-server",
51
51
  "runtimeHint": "bun",
52
- "version": "0.3.8",
52
+ "version": "0.4.1",
53
53
  "packageArguments": [
54
54
  { "type": "positional", "value": "run" },
55
55
  { "type": "positional", "value": "start:http" }