@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.
- package/CLAUDE.md +3 -2
- package/README.md +1 -1
- package/changelog/0.3.x/0.3.9.md +25 -0
- package/changelog/0.4.x/0.4.0.md +29 -0
- package/changelog/0.4.x/0.4.1.md +20 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts +11 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +5 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +11 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +53 -31
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +14 -2
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +4 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +45 -10
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +17 -2
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +0 -1
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +19 -11
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +16 -3
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +11 -2
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +7 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +19 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts +11 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/index.d.ts +37 -2
- package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -1
- package/dist/mcp-server/tools/shared/find-helpers.d.ts +28 -1
- package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -1
- package/dist/mcp-server/tools/shared/find-helpers.js +40 -3
- package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -1
- package/dist/mcp-server/tools/shared/orientation-envelope.d.ts +22 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.d.ts.map +1 -1
- package/dist/mcp-server/tools/shared/orientation-envelope.js +39 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.js.map +1 -1
- package/dist/services/brapi-dialect/cassavabase-dialect.d.ts +28 -0
- package/dist/services/brapi-dialect/cassavabase-dialect.d.ts.map +1 -0
- package/dist/services/brapi-dialect/cassavabase-dialect.js +193 -0
- package/dist/services/brapi-dialect/cassavabase-dialect.js.map +1 -0
- package/dist/services/brapi-dialect/detect.d.ts +53 -0
- package/dist/services/brapi-dialect/detect.d.ts.map +1 -0
- package/dist/services/brapi-dialect/detect.js +68 -0
- package/dist/services/brapi-dialect/detect.js.map +1 -0
- package/dist/services/brapi-dialect/index.d.ts +29 -0
- package/dist/services/brapi-dialect/index.d.ts.map +1 -0
- package/dist/services/brapi-dialect/index.js +31 -0
- package/dist/services/brapi-dialect/index.js.map +1 -0
- package/dist/services/brapi-dialect/registry.d.ts +25 -0
- package/dist/services/brapi-dialect/registry.d.ts.map +1 -0
- package/dist/services/brapi-dialect/registry.js +39 -0
- package/dist/services/brapi-dialect/registry.js.map +1 -0
- package/dist/services/brapi-dialect/spec-dialect.d.ts +13 -0
- package/dist/services/brapi-dialect/spec-dialect.d.ts.map +1 -0
- package/dist/services/brapi-dialect/spec-dialect.js +17 -0
- package/dist/services/brapi-dialect/spec-dialect.js.map +1 -0
- package/dist/services/brapi-dialect/types.d.ts +58 -0
- package/dist/services/brapi-dialect/types.d.ts.map +1 -0
- package/dist/services/brapi-dialect/types.js +18 -0
- package/dist/services/brapi-dialect/types.js.map +1 -0
- package/dist/services/ontology-resolver/ontology-resolver.d.ts +7 -0
- package/dist/services/ontology-resolver/ontology-resolver.d.ts.map +1 -1
- package/dist/services/ontology-resolver/ontology-resolver.js +6 -5
- package/dist/services/ontology-resolver/ontology-resolver.js.map +1 -1
- package/package.json +1 -1
- 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
|
|
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
|
-
|
|
81
|
-
|
|
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":"AAAA;;;;;;;;;GASG;
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
52
|
+
"version": "0.4.1",
|
|
53
53
|
"packageArguments": [
|
|
54
54
|
{ "type": "positional", "value": "run" },
|
|
55
55
|
{ "type": "positional", "value": "start:http" }
|