@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.
- package/CLAUDE.md +391 -0
- package/Dockerfile +99 -0
- package/LICENSE +201 -0
- package/README.md +590 -0
- package/changelog/0.1.x/0.1.0.md +19 -0
- package/changelog/0.1.x/0.1.1.md +27 -0
- package/changelog/0.1.x/0.1.2.md +22 -0
- package/changelog/0.2.x/0.2.0.md +35 -0
- package/changelog/0.2.x/0.2.1.md +36 -0
- package/changelog/0.3.x/0.3.0.md +38 -0
- package/changelog/0.3.x/0.3.1.md +40 -0
- package/changelog/0.3.x/0.3.2.md +29 -0
- package/changelog/0.3.x/0.3.3.md +19 -0
- package/changelog/0.3.x/0.3.4.md +33 -0
- package/changelog/0.3.x/0.3.5.md +24 -0
- package/changelog/template.md +51 -0
- package/dist/config/alias-credentials.d.ts +82 -0
- package/dist/config/alias-credentials.d.ts.map +1 -0
- package/dist/config/alias-credentials.js +159 -0
- package/dist/config/alias-credentials.js.map +1 -0
- package/dist/config/server-config.d.ts +39 -0
- package/dist/config/server-config.d.ts.map +1 -0
- package/dist/config/server-config.js +128 -0
- package/dist/config/server-config.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.d.ts +14 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js +75 -0
- package/dist/mcp-server/prompts/definitions/brapi-eda-study.prompt.js.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.d.ts +16 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.d.ts.map +1 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js +109 -0
- package/dist/mcp-server/prompts/definitions/brapi-meta-analysis.prompt.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.d.ts +11 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.js +46 -0
- package/dist/mcp-server/resources/definitions/brapi-calls.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts +13 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js +26 -0
- package/dist/mcp-server/resources/definitions/brapi-dataset.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.d.ts +19 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.js +45 -0
- package/dist/mcp-server/resources/definitions/brapi-filters.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.d.ts +18 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.js +34 -0
- package/dist/mcp-server/resources/definitions/brapi-germplasm.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.d.ts +11 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.js +28 -0
- package/dist/mcp-server/resources/definitions/brapi-server-info.resource.js.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.d.ts +18 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.d.ts.map +1 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.js +34 -0
- package/dist/mcp-server/resources/definitions/brapi-study.resource.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts +82 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.js +106 -0
- package/dist/mcp-server/tools/definitions/brapi-connect.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.d.ts +41 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.js +88 -0
- package/dist/mcp-server/tools/definitions/brapi-describe-filters.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts +74 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js +386 -0
- package/dist/mcp-server/tools/definitions/brapi-find-genotype-calls.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts +72 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js +290 -0
- package/dist/mcp-server/tools/definitions/brapi-find-germplasm.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts +65 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js +243 -0
- package/dist/mcp-server/tools/definitions/brapi-find-images.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts +63 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js +278 -0
- package/dist/mcp-server/tools/definitions/brapi-find-locations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts +74 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js +288 -0
- package/dist/mcp-server/tools/definitions/brapi-find-observations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts +69 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js +243 -0
- package/dist/mcp-server/tools/definitions/brapi-find-studies.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts +86 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js +337 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variables.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js +248 -0
- package/dist/mcp-server/tools/definitions/brapi-find-variants.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts +59 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js +306 -0
- package/dist/mcp-server/tools/definitions/brapi-get-germplasm.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.d.ts +57 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.js +291 -0
- package/dist/mcp-server/tools/definitions/brapi-get-image.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.d.ts +75 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.js +323 -0
- package/dist/mcp-server/tools/definitions/brapi-get-study.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts +87 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js +296 -0
- package/dist/mcp-server/tools/definitions/brapi-manage-dataset.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts +35 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js +148 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-get.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts +33 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js +126 -0
- package/dist/mcp-server/tools/definitions/brapi-raw-search.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts +51 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.js +41 -0
- package/dist/mcp-server/tools/definitions/brapi-server-info.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.d.ts +117 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.js +574 -0
- package/dist/mcp-server/tools/definitions/brapi-submit-observations.tool.js.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.d.ts +52 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.d.ts.map +1 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.js +420 -0
- package/dist/mcp-server/tools/definitions/brapi-walk-pedigree.tool.js.map +1 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.d.ts +29 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.js +55 -0
- package/dist/mcp-server/tools/shared/connect-auth-schema.js.map +1 -0
- package/dist/mcp-server/tools/shared/find-helpers.d.ts +143 -0
- package/dist/mcp-server/tools/shared/find-helpers.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/find-helpers.js +319 -0
- package/dist/mcp-server/tools/shared/find-helpers.js.map +1 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.d.ts +97 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.js +254 -0
- package/dist/mcp-server/tools/shared/orientation-envelope.js.map +1 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts +10 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.d.ts.map +1 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.js +46 -0
- package/dist/mcp-server/tools/shared/raw-routing-hints.js.map +1 -0
- package/dist/services/brapi-client/brapi-client.d.ts +76 -0
- package/dist/services/brapi-client/brapi-client.d.ts.map +1 -0
- package/dist/services/brapi-client/brapi-client.js +320 -0
- package/dist/services/brapi-client/brapi-client.js.map +1 -0
- package/dist/services/brapi-client/index.d.ts +9 -0
- package/dist/services/brapi-client/index.d.ts.map +1 -0
- package/dist/services/brapi-client/index.js +7 -0
- package/dist/services/brapi-client/index.js.map +1 -0
- package/dist/services/brapi-client/types.d.ts +82 -0
- package/dist/services/brapi-client/types.d.ts.map +1 -0
- package/dist/services/brapi-client/types.js +8 -0
- package/dist/services/brapi-client/types.js.map +1 -0
- package/dist/services/brapi-filters/catalog.d.ts +14 -0
- package/dist/services/brapi-filters/catalog.d.ts.map +1 -0
- package/dist/services/brapi-filters/catalog.js +490 -0
- package/dist/services/brapi-filters/catalog.js.map +1 -0
- package/dist/services/brapi-filters/index.d.ts +8 -0
- package/dist/services/brapi-filters/index.d.ts.map +1 -0
- package/dist/services/brapi-filters/index.js +7 -0
- package/dist/services/brapi-filters/index.js.map +1 -0
- package/dist/services/brapi-filters/types.d.ts +23 -0
- package/dist/services/brapi-filters/types.d.ts.map +1 -0
- package/dist/services/brapi-filters/types.js +9 -0
- package/dist/services/brapi-filters/types.js.map +1 -0
- package/dist/services/capability-registry/capability-registry.d.ts +51 -0
- package/dist/services/capability-registry/capability-registry.d.ts.map +1 -0
- package/dist/services/capability-registry/capability-registry.js +234 -0
- package/dist/services/capability-registry/capability-registry.js.map +1 -0
- package/dist/services/capability-registry/index.d.ts +9 -0
- package/dist/services/capability-registry/index.d.ts.map +1 -0
- package/dist/services/capability-registry/index.js +7 -0
- package/dist/services/capability-registry/index.js.map +1 -0
- package/dist/services/capability-registry/types.d.ts +67 -0
- package/dist/services/capability-registry/types.d.ts.map +1 -0
- package/dist/services/capability-registry/types.js +9 -0
- package/dist/services/capability-registry/types.js.map +1 -0
- package/dist/services/dataset-store/dataset-store.d.ts +35 -0
- package/dist/services/dataset-store/dataset-store.d.ts.map +1 -0
- package/dist/services/dataset-store/dataset-store.js +190 -0
- package/dist/services/dataset-store/dataset-store.js.map +1 -0
- package/dist/services/dataset-store/index.d.ts +8 -0
- package/dist/services/dataset-store/index.d.ts.map +1 -0
- package/dist/services/dataset-store/index.js +7 -0
- package/dist/services/dataset-store/index.js.map +1 -0
- package/dist/services/dataset-store/types.d.ts +65 -0
- package/dist/services/dataset-store/types.d.ts.map +1 -0
- package/dist/services/dataset-store/types.js +8 -0
- package/dist/services/dataset-store/types.js.map +1 -0
- package/dist/services/ontology-resolver/index.d.ts +8 -0
- package/dist/services/ontology-resolver/index.d.ts.map +1 -0
- package/dist/services/ontology-resolver/index.js +7 -0
- package/dist/services/ontology-resolver/index.js.map +1 -0
- package/dist/services/ontology-resolver/ontology-resolver.d.ts +49 -0
- package/dist/services/ontology-resolver/ontology-resolver.d.ts.map +1 -0
- package/dist/services/ontology-resolver/ontology-resolver.js +99 -0
- package/dist/services/ontology-resolver/ontology-resolver.js.map +1 -0
- package/dist/services/ontology-resolver/types.d.ts +38 -0
- package/dist/services/ontology-resolver/types.d.ts.map +1 -0
- package/dist/services/ontology-resolver/types.js +8 -0
- package/dist/services/ontology-resolver/types.js.map +1 -0
- package/dist/services/reference-data-cache/index.d.ts +9 -0
- package/dist/services/reference-data-cache/index.d.ts.map +1 -0
- package/dist/services/reference-data-cache/index.js +7 -0
- package/dist/services/reference-data-cache/index.js.map +1 -0
- package/dist/services/reference-data-cache/reference-data-cache.d.ts +31 -0
- package/dist/services/reference-data-cache/reference-data-cache.d.ts.map +1 -0
- package/dist/services/reference-data-cache/reference-data-cache.js +131 -0
- package/dist/services/reference-data-cache/reference-data-cache.js.map +1 -0
- package/dist/services/reference-data-cache/types.d.ts +42 -0
- package/dist/services/reference-data-cache/types.d.ts.map +1 -0
- package/dist/services/reference-data-cache/types.js +9 -0
- package/dist/services/reference-data-cache/types.js.map +1 -0
- package/dist/services/server-registry/index.d.ts +9 -0
- package/dist/services/server-registry/index.d.ts.map +1 -0
- package/dist/services/server-registry/index.js +7 -0
- package/dist/services/server-registry/index.js.map +1 -0
- package/dist/services/server-registry/server-registry.d.ts +57 -0
- package/dist/services/server-registry/server-registry.d.ts.map +1 -0
- package/dist/services/server-registry/server-registry.js +210 -0
- package/dist/services/server-registry/server-registry.js.map +1 -0
- package/dist/services/server-registry/types.d.ts +43 -0
- package/dist/services/server-registry/types.d.ts.map +1 -0
- package/dist/services/server-registry/types.js +10 -0
- package/dist/services/server-registry/types.js.map +1 -0
- package/package.json +86 -0
- package/server.json +99 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared building blocks for `find_*` tools — Zod fragments for
|
|
3
|
+
* common inputs (alias, loadLimit, extraFilters), utilities to merge named
|
|
4
|
+
* filters with the passthrough map, a generic distribution aggregator, and
|
|
5
|
+
* the dataset-spillover handler that turns a "too many rows" result into a
|
|
6
|
+
* DatasetStore handle.
|
|
7
|
+
*
|
|
8
|
+
* @module mcp-server/tools/shared/find-helpers
|
|
9
|
+
*/
|
|
10
|
+
import { type Context, z } from '@cyanheads/mcp-ts-core';
|
|
11
|
+
import type { ServerConfig } from '../../../config/server-config.js';
|
|
12
|
+
import type { BrapiClient, BrapiEnvelope, BrapiPagination, BrapiRequestOptions, ResolvedAuth } from '../../../services/brapi-client/index.js';
|
|
13
|
+
import type { DatasetMetadata, DatasetStore } from '../../../services/dataset-store/index.js';
|
|
14
|
+
import type { RegisteredServer } from '../../../services/server-registry/index.js';
|
|
15
|
+
/** True when the thrown value is an upstream 404 surfaced by the BrAPI client. */
|
|
16
|
+
export declare function isUpstreamNotFound(err: unknown): boolean;
|
|
17
|
+
/** Upper cap on how many rows we'll pull for DatasetStore spillover per call. */
|
|
18
|
+
export declare const MAX_SPILLOVER_ROWS = 50000;
|
|
19
|
+
/** Hard cap on how many BrAPI pages we'll traverse when building a dataset. */
|
|
20
|
+
export declare const MAX_SPILLOVER_PAGES = 50;
|
|
21
|
+
export declare const AliasInput: z.ZodOptional<z.ZodString>;
|
|
22
|
+
export declare const LoadLimitInput: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
export declare const ExtraFiltersInput: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
24
|
+
/**
|
|
25
|
+
* Merge named params with the user-supplied extraFilters map. Named params
|
|
26
|
+
* win on conflict; conflicts are surfaced as warnings.
|
|
27
|
+
*/
|
|
28
|
+
export declare function mergeFilters(named: Record<string, unknown>, extra: Record<string, unknown> | undefined, warnings: string[]): Record<string, unknown>;
|
|
29
|
+
/** Build request options with optional auth. */
|
|
30
|
+
export declare function buildRequestOptions(connection: RegisteredServer, params?: BrapiRequestOptions['params']): BrapiRequestOptions;
|
|
31
|
+
/**
|
|
32
|
+
* Compute a frequency distribution for one field across a result set.
|
|
33
|
+
* Accepts a field accessor that may return a scalar or array; arrays are
|
|
34
|
+
* exploded. Returns `{value -> count}` sorted by count desc.
|
|
35
|
+
*/
|
|
36
|
+
export declare function computeDistribution<T>(rows: readonly T[], accessor: (row: T) => string | readonly string[] | undefined | null): Record<string, number>;
|
|
37
|
+
/** Cheap sanity-render for a distributions block in markdown. */
|
|
38
|
+
export declare function renderDistributions(distributions: Record<string, Record<string, number>>): string;
|
|
39
|
+
export interface LoadedRows<T> {
|
|
40
|
+
/** True when we pulled a single page and the server has more. */
|
|
41
|
+
hasMore: boolean;
|
|
42
|
+
/** Pages actually consumed — useful for telemetry. */
|
|
43
|
+
pagesFetched: number;
|
|
44
|
+
rows: T[];
|
|
45
|
+
/** Total rows advertised by the server (may be larger than `rows.length`). */
|
|
46
|
+
totalCount?: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Pull rows up to `loadLimit` on a single page. If the server reports more
|
|
50
|
+
* rows than the limit, leave the rest behind — callers decide whether to
|
|
51
|
+
* spill via `spillToDataset`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function loadInitialPage<T>(client: BrapiClient, connection: RegisteredServer, path: string, filters: Record<string, unknown>, loadLimit: number, ctx: Context): Promise<LoadedRows<T>>;
|
|
54
|
+
export interface SpillInput<T> {
|
|
55
|
+
client: BrapiClient;
|
|
56
|
+
connection: RegisteredServer;
|
|
57
|
+
ctx: Context;
|
|
58
|
+
filters: Record<string, unknown>;
|
|
59
|
+
/** First-page rows already loaded. Avoids a re-fetch. */
|
|
60
|
+
firstPage: T[];
|
|
61
|
+
loadLimit: number;
|
|
62
|
+
path: string;
|
|
63
|
+
source: string;
|
|
64
|
+
store: DatasetStore;
|
|
65
|
+
/** Total reported by the server on the first page. */
|
|
66
|
+
totalCount: number;
|
|
67
|
+
}
|
|
68
|
+
export interface SpillResult<T> {
|
|
69
|
+
dataset: DatasetMetadata;
|
|
70
|
+
/** All rows that were persisted — used for distributions. */
|
|
71
|
+
fullRows: T[];
|
|
72
|
+
pagesFetched: number;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Shape of the dataset handle returned inline by `find_*` tools. Drops the
|
|
76
|
+
* provenance fields (source/baseUrl/query) since those are internal and
|
|
77
|
+
* available via `brapi_manage_dataset summary`.
|
|
78
|
+
*/
|
|
79
|
+
export declare const DatasetHandleSchema: z.ZodObject<{
|
|
80
|
+
datasetId: z.ZodString;
|
|
81
|
+
rowCount: z.ZodNumber;
|
|
82
|
+
sizeBytes: z.ZodNumber;
|
|
83
|
+
columns: z.ZodArray<z.ZodString>;
|
|
84
|
+
createdAt: z.ZodString;
|
|
85
|
+
expiresAt: z.ZodString;
|
|
86
|
+
truncated: z.ZodOptional<z.ZodBoolean>;
|
|
87
|
+
maxRows: z.ZodOptional<z.ZodNumber>;
|
|
88
|
+
}, z.core.$strip>;
|
|
89
|
+
export type DatasetHandle = z.infer<typeof DatasetHandleSchema>;
|
|
90
|
+
/**
|
|
91
|
+
* Render a DatasetHandle as bullet lines, matching the existing find_* tool
|
|
92
|
+
* format. Centralized so the truncated/maxRows fields surface consistently.
|
|
93
|
+
*/
|
|
94
|
+
export declare function renderDatasetHandle(handle: DatasetHandle): string[];
|
|
95
|
+
/** Project a `DatasetMetadata` to the in-context handle shape. */
|
|
96
|
+
export declare function toDatasetHandle(metadata: DatasetMetadata): DatasetHandle;
|
|
97
|
+
export interface MaybeSpillInput<T> {
|
|
98
|
+
client: BrapiClient;
|
|
99
|
+
connection: RegisteredServer;
|
|
100
|
+
ctx: Context;
|
|
101
|
+
filters: Record<string, unknown>;
|
|
102
|
+
firstPage: LoadedRows<T>;
|
|
103
|
+
loadLimit: number;
|
|
104
|
+
path: string;
|
|
105
|
+
source: string;
|
|
106
|
+
store: DatasetStore;
|
|
107
|
+
}
|
|
108
|
+
export interface MaybeSpillResult<T> {
|
|
109
|
+
dataset?: DatasetHandle;
|
|
110
|
+
/** Full row set if a spillover happened, otherwise the first-page rows. */
|
|
111
|
+
fullRows: T[];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Wrap `spillToDataset` with the "only spill when hasMore and totalCount >
|
|
115
|
+
* loadLimit" guard that every `find_*` tool replicates. When no spillover is
|
|
116
|
+
* needed, returns the first-page rows untouched. When it is, persists the
|
|
117
|
+
* union to DatasetStore and returns both the full set and the handle.
|
|
118
|
+
*/
|
|
119
|
+
export declare function maybeSpill<T extends Record<string, unknown>>(input: MaybeSpillInput<T>): Promise<MaybeSpillResult<T>>;
|
|
120
|
+
/**
|
|
121
|
+
* Pull every remaining page up to MAX_SPILLOVER_* caps, then persist the
|
|
122
|
+
* union to DatasetStore. Returns the dataset metadata plus the full row set
|
|
123
|
+
* (so callers can compute honest distributions from the whole result).
|
|
124
|
+
*/
|
|
125
|
+
export declare function spillToDataset<T extends Record<string, unknown>>(input: SpillInput<T>): Promise<SpillResult<T>>;
|
|
126
|
+
/** BrAPI list endpoints return `{data: T[], ...}`. Some omit the wrapper. */
|
|
127
|
+
export interface BrapiListResult<T> {
|
|
128
|
+
data?: T[];
|
|
129
|
+
[key: string]: unknown;
|
|
130
|
+
}
|
|
131
|
+
export declare function extractRows<T>(result: BrapiListResult<T> | T[]): T[];
|
|
132
|
+
/** Return the input as a non-empty string, or undefined. Used in distribution accessors. */
|
|
133
|
+
export declare function asString(value: unknown): string | undefined;
|
|
134
|
+
/** Return the input as a non-empty string array, or undefined. */
|
|
135
|
+
export declare function asStringArray(value: unknown): string[] | undefined;
|
|
136
|
+
/**
|
|
137
|
+
* Compose a refinement hint for a too-large result set. Picks the highest-
|
|
138
|
+
* cardinality non-empty distribution to suggest as a narrower. Returns
|
|
139
|
+
* undefined when the result set fits under `loadLimit`.
|
|
140
|
+
*/
|
|
141
|
+
export declare function buildRefinementHint(totalCount: number, loadLimit: number, distributions: Record<string, Record<string, number>>): string | undefined;
|
|
142
|
+
export type { BrapiEnvelope, BrapiPagination, ResolvedAuth, ServerConfig };
|
|
143
|
+
//# sourceMappingURL=find-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-helpers.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/shared/find-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared building blocks for `find_*` tools — Zod fragments for
|
|
3
|
+
* common inputs (alias, loadLimit, extraFilters), utilities to merge named
|
|
4
|
+
* filters with the passthrough map, a generic distribution aggregator, and
|
|
5
|
+
* the dataset-spillover handler that turns a "too many rows" result into a
|
|
6
|
+
* DatasetStore handle.
|
|
7
|
+
*
|
|
8
|
+
* @module mcp-server/tools/shared/find-helpers
|
|
9
|
+
*/
|
|
10
|
+
import { z } from '@cyanheads/mcp-ts-core';
|
|
11
|
+
import { JsonRpcErrorCode, McpError } from '@cyanheads/mcp-ts-core/errors';
|
|
12
|
+
/** True when the thrown value is an upstream 404 surfaced by the BrAPI client. */
|
|
13
|
+
export function isUpstreamNotFound(err) {
|
|
14
|
+
return err instanceof McpError && err.code === JsonRpcErrorCode.NotFound;
|
|
15
|
+
}
|
|
16
|
+
/** Upper cap on how many rows we'll pull for DatasetStore spillover per call. */
|
|
17
|
+
export const MAX_SPILLOVER_ROWS = 50_000;
|
|
18
|
+
/** Hard cap on how many BrAPI pages we'll traverse when building a dataset. */
|
|
19
|
+
export const MAX_SPILLOVER_PAGES = 50;
|
|
20
|
+
export const AliasInput = z
|
|
21
|
+
.string()
|
|
22
|
+
.regex(/^[a-zA-Z0-9_-]+$/)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe('Connection alias registered via brapi_connect. Omit to use the default connection.');
|
|
25
|
+
export const LoadLimitInput = z
|
|
26
|
+
.number()
|
|
27
|
+
.int()
|
|
28
|
+
.positive()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe('Override the in-context row cap (BRAPI_LOAD_LIMIT). Rows beyond the cap return as a dataset handle.');
|
|
31
|
+
export const ExtraFiltersInput = z
|
|
32
|
+
.record(z.string(), z.unknown())
|
|
33
|
+
.optional()
|
|
34
|
+
.describe('Extra BrAPI filters forwarded verbatim. Valid keys vary by endpoint; brapi_describe_filters enumerates them. Named params on this tool take precedence on conflict.');
|
|
35
|
+
/**
|
|
36
|
+
* Merge named params with the user-supplied extraFilters map. Named params
|
|
37
|
+
* win on conflict; conflicts are surfaced as warnings.
|
|
38
|
+
*/
|
|
39
|
+
export function mergeFilters(named, extra, warnings) {
|
|
40
|
+
if (!extra)
|
|
41
|
+
return pruneUndefined(named);
|
|
42
|
+
const merged = {};
|
|
43
|
+
for (const [key, value] of Object.entries(extra)) {
|
|
44
|
+
if (value === undefined)
|
|
45
|
+
continue;
|
|
46
|
+
merged[key] = value;
|
|
47
|
+
}
|
|
48
|
+
for (const [key, value] of Object.entries(named)) {
|
|
49
|
+
if (value === undefined)
|
|
50
|
+
continue;
|
|
51
|
+
if (key in merged && !deepEqual(merged[key], value)) {
|
|
52
|
+
warnings.push(`extraFilters.${key} was overridden by the named param (named params take precedence).`);
|
|
53
|
+
}
|
|
54
|
+
merged[key] = value;
|
|
55
|
+
}
|
|
56
|
+
return merged;
|
|
57
|
+
}
|
|
58
|
+
function pruneUndefined(record) {
|
|
59
|
+
const pruned = {};
|
|
60
|
+
for (const [key, value] of Object.entries(record)) {
|
|
61
|
+
if (value !== undefined)
|
|
62
|
+
pruned[key] = value;
|
|
63
|
+
}
|
|
64
|
+
return pruned;
|
|
65
|
+
}
|
|
66
|
+
function deepEqual(a, b) {
|
|
67
|
+
if (a === b)
|
|
68
|
+
return true;
|
|
69
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
|
70
|
+
if (a.length !== b.length)
|
|
71
|
+
return false;
|
|
72
|
+
return a.every((v, i) => deepEqual(v, b[i]));
|
|
73
|
+
}
|
|
74
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
75
|
+
}
|
|
76
|
+
/** Build request options with optional auth. */
|
|
77
|
+
export function buildRequestOptions(connection, params) {
|
|
78
|
+
const opts = {};
|
|
79
|
+
if (connection.resolvedAuth)
|
|
80
|
+
opts.auth = connection.resolvedAuth;
|
|
81
|
+
if (params)
|
|
82
|
+
opts.params = params;
|
|
83
|
+
return opts;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Compute a frequency distribution for one field across a result set.
|
|
87
|
+
* Accepts a field accessor that may return a scalar or array; arrays are
|
|
88
|
+
* exploded. Returns `{value -> count}` sorted by count desc.
|
|
89
|
+
*/
|
|
90
|
+
export function computeDistribution(rows, accessor) {
|
|
91
|
+
const counts = new Map();
|
|
92
|
+
for (const row of rows) {
|
|
93
|
+
const value = accessor(row);
|
|
94
|
+
if (value === undefined || value === null)
|
|
95
|
+
continue;
|
|
96
|
+
const values = Array.isArray(value) ? value : [value];
|
|
97
|
+
for (const v of values) {
|
|
98
|
+
if (typeof v !== 'string' || v.length === 0)
|
|
99
|
+
continue;
|
|
100
|
+
counts.set(v, (counts.get(v) ?? 0) + 1);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return Object.fromEntries([...counts.entries()].sort(([, a], [, b]) => b - a));
|
|
104
|
+
}
|
|
105
|
+
/** Cheap sanity-render for a distributions block in markdown. */
|
|
106
|
+
export function renderDistributions(distributions) {
|
|
107
|
+
const lines = [];
|
|
108
|
+
for (const [field, counts] of Object.entries(distributions)) {
|
|
109
|
+
const entries = Object.entries(counts);
|
|
110
|
+
if (entries.length === 0)
|
|
111
|
+
continue;
|
|
112
|
+
const summary = entries
|
|
113
|
+
.slice(0, 5)
|
|
114
|
+
.map(([value, count]) => `${value} (${count})`)
|
|
115
|
+
.join(', ');
|
|
116
|
+
const suffix = entries.length > 5 ? `, …+${entries.length - 5} more` : '';
|
|
117
|
+
lines.push(`- **${field}:** ${summary}${suffix}`);
|
|
118
|
+
}
|
|
119
|
+
return lines.join('\n');
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Pull rows up to `loadLimit` on a single page. If the server reports more
|
|
123
|
+
* rows than the limit, leave the rest behind — callers decide whether to
|
|
124
|
+
* spill via `spillToDataset`.
|
|
125
|
+
*/
|
|
126
|
+
export async function loadInitialPage(client, connection, path, filters, loadLimit, ctx) {
|
|
127
|
+
const params = {
|
|
128
|
+
...filters,
|
|
129
|
+
};
|
|
130
|
+
params.pageSize = loadLimit;
|
|
131
|
+
const envelope = await client.get(connection.baseUrl, path, ctx, buildRequestOptions(connection, params));
|
|
132
|
+
const rows = extractRows(envelope.result);
|
|
133
|
+
const pagination = envelope.metadata?.pagination;
|
|
134
|
+
const totalCount = pagination?.totalCount;
|
|
135
|
+
const hasMore = typeof totalCount === 'number' && totalCount > rows.length && totalCount > 0;
|
|
136
|
+
const result = { rows, hasMore, pagesFetched: 1 };
|
|
137
|
+
if (totalCount !== undefined)
|
|
138
|
+
result.totalCount = totalCount;
|
|
139
|
+
return result;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Shape of the dataset handle returned inline by `find_*` tools. Drops the
|
|
143
|
+
* provenance fields (source/baseUrl/query) since those are internal and
|
|
144
|
+
* available via `brapi_manage_dataset summary`.
|
|
145
|
+
*/
|
|
146
|
+
export const DatasetHandleSchema = z.object({
|
|
147
|
+
datasetId: z.string().describe('Use with brapi_manage_dataset to page or export.'),
|
|
148
|
+
rowCount: z.number().int().nonnegative().describe('Number of rows persisted in the dataset.'),
|
|
149
|
+
sizeBytes: z.number().int().nonnegative().describe('Serialized size of the dataset in bytes.'),
|
|
150
|
+
columns: z
|
|
151
|
+
.array(z.string().describe('Column name from the persisted rows.'))
|
|
152
|
+
.describe('Full column list of the persisted rows.'),
|
|
153
|
+
createdAt: z.string().describe('ISO 8601 timestamp the dataset was created.'),
|
|
154
|
+
expiresAt: z.string().describe('ISO 8601 timestamp after which the dataset will be purged.'),
|
|
155
|
+
truncated: z
|
|
156
|
+
.boolean()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe('True when the dataset hit a row cap before exhausting upstream.'),
|
|
159
|
+
maxRows: z
|
|
160
|
+
.number()
|
|
161
|
+
.int()
|
|
162
|
+
.positive()
|
|
163
|
+
.optional()
|
|
164
|
+
.describe('Cap that was applied at create time, when truncation occurred.'),
|
|
165
|
+
});
|
|
166
|
+
/**
|
|
167
|
+
* Render a DatasetHandle as bullet lines, matching the existing find_* tool
|
|
168
|
+
* format. Centralized so the truncated/maxRows fields surface consistently.
|
|
169
|
+
*/
|
|
170
|
+
export function renderDatasetHandle(handle) {
|
|
171
|
+
const lines = [
|
|
172
|
+
`- datasetId: \`${handle.datasetId}\``,
|
|
173
|
+
`- rowCount: ${handle.rowCount}`,
|
|
174
|
+
`- sizeBytes: ${handle.sizeBytes}`,
|
|
175
|
+
`- columns: ${handle.columns.join(', ')}`,
|
|
176
|
+
`- createdAt: ${handle.createdAt}`,
|
|
177
|
+
`- expiresAt: ${handle.expiresAt}`,
|
|
178
|
+
];
|
|
179
|
+
if (handle.truncated)
|
|
180
|
+
lines.push(`- truncated: true`);
|
|
181
|
+
if (typeof handle.maxRows === 'number')
|
|
182
|
+
lines.push(`- maxRows: ${handle.maxRows}`);
|
|
183
|
+
return lines;
|
|
184
|
+
}
|
|
185
|
+
/** Project a `DatasetMetadata` to the in-context handle shape. */
|
|
186
|
+
export function toDatasetHandle(metadata) {
|
|
187
|
+
const handle = {
|
|
188
|
+
datasetId: metadata.datasetId,
|
|
189
|
+
rowCount: metadata.rowCount,
|
|
190
|
+
sizeBytes: metadata.sizeBytes,
|
|
191
|
+
columns: metadata.columns,
|
|
192
|
+
createdAt: metadata.createdAt,
|
|
193
|
+
expiresAt: metadata.expiresAt,
|
|
194
|
+
};
|
|
195
|
+
if (metadata.truncated)
|
|
196
|
+
handle.truncated = true;
|
|
197
|
+
if (typeof metadata.maxRows === 'number')
|
|
198
|
+
handle.maxRows = metadata.maxRows;
|
|
199
|
+
return handle;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Wrap `spillToDataset` with the "only spill when hasMore and totalCount >
|
|
203
|
+
* loadLimit" guard that every `find_*` tool replicates. When no spillover is
|
|
204
|
+
* needed, returns the first-page rows untouched. When it is, persists the
|
|
205
|
+
* union to DatasetStore and returns both the full set and the handle.
|
|
206
|
+
*/
|
|
207
|
+
export async function maybeSpill(input) {
|
|
208
|
+
const { firstPage } = input;
|
|
209
|
+
if (!firstPage.hasMore ||
|
|
210
|
+
firstPage.totalCount === undefined ||
|
|
211
|
+
firstPage.totalCount <= input.loadLimit) {
|
|
212
|
+
return { fullRows: firstPage.rows };
|
|
213
|
+
}
|
|
214
|
+
const spill = await spillToDataset({
|
|
215
|
+
store: input.store,
|
|
216
|
+
client: input.client,
|
|
217
|
+
connection: input.connection,
|
|
218
|
+
path: input.path,
|
|
219
|
+
filters: input.filters,
|
|
220
|
+
source: input.source,
|
|
221
|
+
loadLimit: input.loadLimit,
|
|
222
|
+
ctx: input.ctx,
|
|
223
|
+
firstPage: firstPage.rows,
|
|
224
|
+
totalCount: firstPage.totalCount,
|
|
225
|
+
});
|
|
226
|
+
return {
|
|
227
|
+
fullRows: spill.fullRows,
|
|
228
|
+
dataset: toDatasetHandle(spill.dataset),
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Pull every remaining page up to MAX_SPILLOVER_* caps, then persist the
|
|
233
|
+
* union to DatasetStore. Returns the dataset metadata plus the full row set
|
|
234
|
+
* (so callers can compute honest distributions from the whole result).
|
|
235
|
+
*/
|
|
236
|
+
export async function spillToDataset(input) {
|
|
237
|
+
const remainingTarget = Math.min(input.totalCount, MAX_SPILLOVER_ROWS);
|
|
238
|
+
const pageSize = input.loadLimit;
|
|
239
|
+
const totalPages = Math.min(Math.ceil(remainingTarget / pageSize), MAX_SPILLOVER_PAGES);
|
|
240
|
+
const rows = [...input.firstPage];
|
|
241
|
+
let pagesFetched = 1;
|
|
242
|
+
// Page 0 is already fetched by caller; continue from page 1.
|
|
243
|
+
for (let page = 1; page < totalPages; page++) {
|
|
244
|
+
if (rows.length >= remainingTarget)
|
|
245
|
+
break;
|
|
246
|
+
if (input.ctx.signal.aborted)
|
|
247
|
+
break;
|
|
248
|
+
const params = {
|
|
249
|
+
...input.filters,
|
|
250
|
+
};
|
|
251
|
+
params.pageSize = pageSize;
|
|
252
|
+
params.page = page;
|
|
253
|
+
const envelope = await input.client.get(input.connection.baseUrl, input.path, input.ctx, buildRequestOptions(input.connection, params));
|
|
254
|
+
const pageRows = extractRows(envelope.result);
|
|
255
|
+
rows.push(...pageRows);
|
|
256
|
+
pagesFetched += 1;
|
|
257
|
+
if (pageRows.length < pageSize)
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
const reachedRowCap = rows.length >= remainingTarget && input.totalCount > rows.length;
|
|
261
|
+
const reachedPageCap = pagesFetched >= MAX_SPILLOVER_PAGES && input.totalCount > rows.length;
|
|
262
|
+
const truncated = reachedRowCap || reachedPageCap;
|
|
263
|
+
const createInput = {
|
|
264
|
+
source: input.source,
|
|
265
|
+
baseUrl: input.connection.baseUrl,
|
|
266
|
+
query: input.filters,
|
|
267
|
+
rows,
|
|
268
|
+
};
|
|
269
|
+
if (truncated) {
|
|
270
|
+
createInput.truncated = true;
|
|
271
|
+
createInput.maxRows = MAX_SPILLOVER_ROWS;
|
|
272
|
+
}
|
|
273
|
+
const dataset = await input.store.create(input.ctx, createInput);
|
|
274
|
+
return { dataset, fullRows: rows, pagesFetched };
|
|
275
|
+
}
|
|
276
|
+
export function extractRows(result) {
|
|
277
|
+
if (Array.isArray(result))
|
|
278
|
+
return result;
|
|
279
|
+
if (result && Array.isArray(result.data))
|
|
280
|
+
return result.data;
|
|
281
|
+
return [];
|
|
282
|
+
}
|
|
283
|
+
/** Return the input as a non-empty string, or undefined. Used in distribution accessors. */
|
|
284
|
+
export function asString(value) {
|
|
285
|
+
return typeof value === 'string' && value.length > 0 ? value : undefined;
|
|
286
|
+
}
|
|
287
|
+
/** Return the input as a non-empty string array, or undefined. */
|
|
288
|
+
export function asStringArray(value) {
|
|
289
|
+
if (!Array.isArray(value))
|
|
290
|
+
return;
|
|
291
|
+
return value.filter((v) => typeof v === 'string' && v.length > 0);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Compose a refinement hint for a too-large result set. Picks the highest-
|
|
295
|
+
* cardinality non-empty distribution to suggest as a narrower. Returns
|
|
296
|
+
* undefined when the result set fits under `loadLimit`.
|
|
297
|
+
*/
|
|
298
|
+
export function buildRefinementHint(totalCount, loadLimit, distributions) {
|
|
299
|
+
if (totalCount <= loadLimit)
|
|
300
|
+
return;
|
|
301
|
+
let best;
|
|
302
|
+
for (const [field, counts] of Object.entries(distributions)) {
|
|
303
|
+
const entries = Object.entries(counts);
|
|
304
|
+
if (entries.length < 2)
|
|
305
|
+
continue;
|
|
306
|
+
const top = entries[0];
|
|
307
|
+
if (!top)
|
|
308
|
+
continue;
|
|
309
|
+
const [topValue, count] = top;
|
|
310
|
+
if (!best || entries.length > best.cardinality) {
|
|
311
|
+
best = { field, topValue, count, cardinality: entries.length };
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
if (!best) {
|
|
315
|
+
return `${totalCount} rows exceed loadLimit=${loadLimit}. Add more specific filters or raise loadLimit.`;
|
|
316
|
+
}
|
|
317
|
+
return `${totalCount} rows exceed loadLimit=${loadLimit}. The ${best.field} distribution spans ${best.cardinality} values — narrowing to \`${best.topValue}\` would cut to ~${best.count} rows.`;
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=find-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find-helpers.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/shared/find-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared builder for the BrAPI orientation envelope returned
|
|
3
|
+
* by both `brapi_connect` (inlined after registration) and
|
|
4
|
+
* `brapi_server_info` (on-demand). Pulls from CapabilityRegistry and the
|
|
5
|
+
* active ServerRegistry entry, then layers in cheap opportunistic counts via
|
|
6
|
+
* `pageSize=0` probes. Counts degrade silently — a server that doesn't
|
|
7
|
+
* honor the probe just omits the field rather than failing the whole call.
|
|
8
|
+
*
|
|
9
|
+
* @module mcp-server/tools/shared/orientation-envelope
|
|
10
|
+
*/
|
|
11
|
+
import { type Context, z } from '@cyanheads/mcp-ts-core';
|
|
12
|
+
import type { BrapiClient } from '../../../services/brapi-client/index.js';
|
|
13
|
+
import type { CapabilityRegistry } from '../../../services/capability-registry/index.js';
|
|
14
|
+
import type { RegisteredServer } from '../../../services/server-registry/index.js';
|
|
15
|
+
export declare const ServerIdentitySchema: z.ZodObject<{
|
|
16
|
+
name: z.ZodOptional<z.ZodString>;
|
|
17
|
+
description: z.ZodOptional<z.ZodString>;
|
|
18
|
+
organizationName: z.ZodOptional<z.ZodString>;
|
|
19
|
+
organizationURL: z.ZodOptional<z.ZodString>;
|
|
20
|
+
documentationURL: z.ZodOptional<z.ZodString>;
|
|
21
|
+
contactEmail: z.ZodOptional<z.ZodString>;
|
|
22
|
+
brapiVersion: z.ZodOptional<z.ZodString>;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
export declare const OrientationAuthSchema: z.ZodObject<{
|
|
25
|
+
mode: z.ZodEnum<{
|
|
26
|
+
none: "none";
|
|
27
|
+
sgn: "sgn";
|
|
28
|
+
oauth2: "oauth2";
|
|
29
|
+
api_key: "api_key";
|
|
30
|
+
bearer: "bearer";
|
|
31
|
+
}>;
|
|
32
|
+
headerName: z.ZodOptional<z.ZodString>;
|
|
33
|
+
expiresAt: z.ZodOptional<z.ZodString>;
|
|
34
|
+
}, z.core.$strip>;
|
|
35
|
+
export declare const OrientationCapabilitiesSchema: z.ZodObject<{
|
|
36
|
+
supportedCount: z.ZodNumber;
|
|
37
|
+
supported: z.ZodArray<z.ZodString>;
|
|
38
|
+
notableGaps: z.ZodArray<z.ZodString>;
|
|
39
|
+
}, z.core.$strip>;
|
|
40
|
+
export declare const OrientationContentSchema: z.ZodObject<{
|
|
41
|
+
crops: z.ZodArray<z.ZodString>;
|
|
42
|
+
studyCount: z.ZodOptional<z.ZodNumber>;
|
|
43
|
+
germplasmCount: z.ZodOptional<z.ZodNumber>;
|
|
44
|
+
programCount: z.ZodOptional<z.ZodNumber>;
|
|
45
|
+
locationCount: z.ZodOptional<z.ZodNumber>;
|
|
46
|
+
}, z.core.$strip>;
|
|
47
|
+
export declare const OrientationEnvelopeSchema: z.ZodObject<{
|
|
48
|
+
alias: z.ZodString;
|
|
49
|
+
baseUrl: z.ZodString;
|
|
50
|
+
server: z.ZodObject<{
|
|
51
|
+
name: z.ZodOptional<z.ZodString>;
|
|
52
|
+
description: z.ZodOptional<z.ZodString>;
|
|
53
|
+
organizationName: z.ZodOptional<z.ZodString>;
|
|
54
|
+
organizationURL: z.ZodOptional<z.ZodString>;
|
|
55
|
+
documentationURL: z.ZodOptional<z.ZodString>;
|
|
56
|
+
contactEmail: z.ZodOptional<z.ZodString>;
|
|
57
|
+
brapiVersion: z.ZodOptional<z.ZodString>;
|
|
58
|
+
}, z.core.$strip>;
|
|
59
|
+
auth: z.ZodObject<{
|
|
60
|
+
mode: z.ZodEnum<{
|
|
61
|
+
none: "none";
|
|
62
|
+
sgn: "sgn";
|
|
63
|
+
oauth2: "oauth2";
|
|
64
|
+
api_key: "api_key";
|
|
65
|
+
bearer: "bearer";
|
|
66
|
+
}>;
|
|
67
|
+
headerName: z.ZodOptional<z.ZodString>;
|
|
68
|
+
expiresAt: z.ZodOptional<z.ZodString>;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
capabilities: z.ZodObject<{
|
|
71
|
+
supportedCount: z.ZodNumber;
|
|
72
|
+
supported: z.ZodArray<z.ZodString>;
|
|
73
|
+
notableGaps: z.ZodArray<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>;
|
|
75
|
+
content: z.ZodObject<{
|
|
76
|
+
crops: z.ZodArray<z.ZodString>;
|
|
77
|
+
studyCount: z.ZodOptional<z.ZodNumber>;
|
|
78
|
+
germplasmCount: z.ZodOptional<z.ZodNumber>;
|
|
79
|
+
programCount: z.ZodOptional<z.ZodNumber>;
|
|
80
|
+
locationCount: z.ZodOptional<z.ZodNumber>;
|
|
81
|
+
}, z.core.$strip>;
|
|
82
|
+
notes: z.ZodArray<z.ZodString>;
|
|
83
|
+
fetchedAt: z.ZodString;
|
|
84
|
+
}, z.core.$strip>;
|
|
85
|
+
export type OrientationEnvelope = z.infer<typeof OrientationEnvelopeSchema>;
|
|
86
|
+
export interface BuildEnvelopeDeps {
|
|
87
|
+
client: BrapiClient;
|
|
88
|
+
registry: CapabilityRegistry;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Compose the orientation envelope for a connected server. Runs the
|
|
92
|
+
* CapabilityRegistry profile (cached after the first call) plus a parallel
|
|
93
|
+
* set of cheap `pageSize=0` probes for totals.
|
|
94
|
+
*/
|
|
95
|
+
export declare function buildOrientationEnvelope(ctx: Context, connection: RegisteredServer, deps: BuildEnvelopeDeps): Promise<OrientationEnvelope>;
|
|
96
|
+
export declare function formatOrientationEnvelope(envelope: OrientationEnvelope): string;
|
|
97
|
+
//# sourceMappingURL=orientation-envelope.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orientation-envelope.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/shared/orientation-envelope.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,kCAAkC,CAAC;AACzF,OAAO,KAAK,EAEV,kBAAkB,EACnB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAsB5E,eAAO,MAAM,oBAAoB;;;;;;;;iBAUmD,CAAC;AAErF,eAAO,MAAM,qBAAqB;;;;;;;;;;iBAQ0C,CAAC;AAE7E,eAAO,MAAM,6BAA6B;;;;iBAciD,CAAC;AAE5F,eAAO,MAAM,wBAAwB;;;;;;iBA8B2D,CAAC;AAEjG,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAapC,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,kBAAkB,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,OAAO,EACZ,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,mBAAmB,CAAC,CAwD9B;AAqDD,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,CA6D/E"}
|